@microi.net/cli 5.8.5 → 5.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/LICENSE +21 -21
  7. package/README.md +71 -71
  8. package/assets/build-meta.json +7 -7
  9. package/assets/feature-matrix.json +138 -138
  10. package/assets/logo.svg +4 -4
  11. package/cordis.patch.yml +1 -1
  12. package/package.json +1 -1
  13. package/scripts/mcp-codex-stdio-adapter.js +0 -0
  14. package/scripts/mcp-server.js +1 -1
  15. package/scripts/microi-cli.js +66 -65
  16. package/scripts/microi-codex-broker.js +450 -450
  17. package/scripts/microi-codex-router.js +618 -618
  18. package/scripts/microi-skills.meta.json +384 -384
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +21 -21
  21. package/skills/README.md +287 -287
  22. package/skills/ai-engine/SKILL.md +269 -265
  23. package/skills/ai-engine/agents/openai.yaml +4 -4
  24. package/skills/ai-engine/references/ai-employees.md +48 -48
  25. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  26. package/skills/ai-platform-governance/SKILL.md +177 -177
  27. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  28. package/skills/app-store/SKILL.md +525 -525
  29. package/skills/app-store/agents/openai.yaml +4 -4
  30. package/skills/business-blueprint/SKILL.md +193 -193
  31. package/skills/datasource-engine/SKILL.md +93 -93
  32. package/skills/datasource-engine/agents/openai.yaml +4 -4
  33. package/skills/dos-orm/SKILL.md +97 -95
  34. package/skills/dos-orm/references/api-reference.md +229 -229
  35. package/skills/email-engine/SKILL.md +81 -81
  36. package/skills/email-engine/references/v8-email.md +34 -34
  37. package/skills/job-engine/SKILL.md +176 -176
  38. package/skills/job-engine/agents/openai.yaml +4 -4
  39. package/skills/message-notification/SKILL.md +156 -156
  40. package/skills/message-notification/agents/openai.yaml +5 -5
  41. package/skills/message-notification/references/contracts.md +102 -102
  42. package/skills/microi/SKILL.md +14 -14
  43. package/skills/microi-ai-app-auth.js +652 -652
  44. package/skills/microi-ai-application/SKILL.md +115 -115
  45. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  46. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  47. package/skills/microi-client-frontend/SKILL.md +246 -244
  48. package/skills/microi-client-frontend/references/progressive-01-3-/345/212/250/346/200/201/346/214/211/351/222/256/347/263/273/347/273/237.md +144 -144
  49. package/skills/microi-client-frontend/references/progressive-02-8-/350/277/220/350/241/214/346/227/266/351/253/230/351/242/221/345/235/221/345/244/215/347/233/230.md +196 -196
  50. package/skills/microi-client-frontend/references/progressive-03-vue3-/345/211/215/347/253/257/345/276/256/346/234/215/345/212/241/345/256/277/344/270/273/350/247/204/345/210/231.md +167 -167
  51. package/skills/microi-codex/SKILL.md +102 -100
  52. package/skills/microi-codex-installer/SKILL.md +231 -231
  53. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  54. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  55. package/skills/microi-db-schema/SKILL.md +175 -175
  56. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  57. package/skills/microi-db-schema/references/core-tables.md +695 -695
  58. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  59. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  60. package/skills/microi-db-schema/references/schema.md +646 -646
  61. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  62. package/skills/microi-deployment/SKILL.md +222 -220
  63. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  64. package/skills/microi-docs-coverage/SKILL.md +133 -133
  65. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  66. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  67. package/skills/microi-form-engine/SKILL.md +333 -333
  68. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  69. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  70. package/skills/microi-form-layout/SKILL.md +205 -205
  71. package/skills/microi-form-layout/references/progressive-01-3-/344/270/211/347/247/215/345/210/206/347/273/204/347/232/204/345/255/230/345/202/250/344/270/216/351/205/215/347/275/256.md +235 -235
  72. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  73. package/skills/microi-frontend-sdk/references/progressive-01-token-/345/275/223/345/211/215/347/231/273/345/275/225/347/224/250/346/210/267/344/270/216/345/275/223/345/211/215/347/273/210/347/253/257/347/231/273/345/275/225/345/215/217/350/256/256.md +176 -176
  74. package/skills/microi-left-right-layout/SKILL.md +141 -141
  75. package/skills/microi-microservice/SKILL.md +328 -326
  76. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  77. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  78. package/skills/microi-mobile-app-quality/references/progressive-01-4-/351/207/215/350/246/201/346/214/211/351/222/256/345/277/205/351/241/273/345/270/246/345/233/276/346/240/207.md +213 -213
  79. package/skills/microi-mobile-app-quality/references/progressive-02-9-/344/270/273/351/242/230/345/210/207/346/215/242/345/277/205/351/241/273/347/234/237/345/256/236/344/270/224/345/205/250/345/261/200/347/224/237/346/225/210.md +128 -128
  80. package/skills/microi-solution-quotation/SKILL.md +78 -78
  81. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  82. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  83. package/skills/microi-sso/SKILL.md +96 -90
  84. package/skills/microi-sso/references/acceptance.md +49 -49
  85. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  86. package/skills/microi-sso/references/inbound.md +53 -53
  87. package/skills/microi-sso/references/outbound.md +39 -39
  88. package/skills/microi-system-delivery/SKILL.md +137 -137
  89. package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +193 -193
  90. package/skills/microi-system-delivery/references/progressive-02-/350/207/252/345/212/250/345/214/226/346/265/213/350/257/225/345/277/205/351/241/273/350/246/206/347/233/226/347/232/204/345/235/221.md +217 -217
  91. package/skills/microi-ui/SKILL.md +192 -192
  92. package/skills/microi-ui/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/234/272/346/231/257/350/223/235/345/233/276.md +183 -183
  93. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  94. package/skills/microi-uniapp-frontend/references/progressive-01-/347/247/273/345/212/250/347/253/257/345/210/206/347/261/273-/345/217/214/346/240/217/345/210/227/350/241/250/347/213/254/347/253/213/346/273/232/345/212/250.md +225 -225
  95. package/skills/microi-uniapp-frontend/references/progressive-02-/345/205/263/351/224/256/344/270/232/345/212/241/350/265/204/344/272/247/344/270/215/345/276/227/351/273/230/350/256/244/351/200/211/344/270/255.md +154 -154
  96. package/skills/microi.v8.js +1921 -1921
  97. package/skills/module-engine/SKILL.md +255 -255
  98. package/skills/module-engine/references/module-config.md +204 -204
  99. package/skills/ocr-engine/SKILL.md +113 -113
  100. package/skills/ocr-engine/agents/openai.yaml +4 -4
  101. package/skills/page-engine/SKILL.md +206 -206
  102. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  103. package/skills/page-engine/references/progressive-01-/346/211/200/346/234/211/347/273/204/344/273/266/347/261/273/345/236/213.md +234 -234
  104. package/skills/page-engine/references/progressive-02-/347/211/210/346/234/254/345/216/206/345/217/262-/345/271/266/345/217/221/344/277/235/345/255/230/344/270/216/345/233/236/346/273/232.md +60 -60
  105. package/skills/performance-testing/SKILL.md +221 -221
  106. package/skills/playwright-e2e/SKILL.md +196 -196
  107. package/skills/playwright-e2e/references/progressive-01-/345/205/250/350/207/252/345/212/250/347/231/273/345/275/225-/345/205/215/351/252/214/350/257/201/347/240/201-/344/275/206/344/270/215/345/205/215/345/257/206/347/240/201-/345/277/205/350/257/273.md +173 -173
  108. package/skills/playwright-e2e/references/progressive-02-/346/226/207/345/255/227/345/257/271/346/257/224/345/272/246/344/270/216/345/217/257/350/257/273/346/200/247/350/207/252/345/212/250/345/214/226/346/243/200/346/237/245-/345/277/205/345/201/232.md +183 -183
  109. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  110. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  111. package/skills/print-engine/SKILL.md +259 -259
  112. package/skills/production-readonly-audit/SKILL.md +41 -41
  113. package/skills/report-engine/SKILL.md +71 -71
  114. package/skills/report-engine/agents/openai.yaml +4 -4
  115. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  116. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  117. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  118. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  119. package/skills/search-engine/SKILL.md +75 -75
  120. package/skills/search-engine/agents/openai.yaml +4 -4
  121. package/skills/spider-engine/SKILL.md +190 -190
  122. package/skills/system-observability/SKILL.md +249 -246
  123. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  124. package/skills/translate-engine/SKILL.md +140 -140
  125. package/skills/translate-engine/agents/openai.yaml +4 -4
  126. package/skills/ui-design/SKILL.md +223 -223
  127. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  128. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  129. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  130. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  131. package/skills/ui-design/references/design-pattern-library.md +184 -184
  132. package/skills/ui-design/references/mci-design-contract.md +163 -163
  133. package/skills/ui-design/references/motion-and-media.md +78 -78
  134. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  135. package/skills/ui-design/references/progressive-01-/351/242/234/350/211/262/344/275/223/347/263/273-css-variables-/346/224/257/346/214/201/344/270/273/351/242/230/345/210/207/346/215/242.md +218 -218
  136. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  137. package/skills/ui-design/references/progressive-03-/345/212/250/346/225/210/350/247/204/350/214/203-/344/270/260/345/257/214/344/275/206/344/270/215/345/215/241.md +235 -235
  138. package/skills/ui-design/references/progressive-04-/347/273/204/344/273/266/351/243/216/346/240/274/351/200/237/346/237/245.md +152 -152
  139. package/skills/ui-design/references/progressive-05-/347/247/273/345/212/250/347/253/257/344/270/223/347/224/250/350/247/204/350/214/203.md +238 -238
  140. package/skills/ui-design/references/progressive-06-/344/270/273/351/242/230/345/210/207/346/215/242/345/256/236/347/216/260.md +194 -194
  141. package/skills/ui-design/references/progressive-07-/351/200/237/346/237/245-/344/273/216/345/244/264/346/220/255/345/273/272/344/270/200/344/270/252/347/247/273/345/212/250/347/253/257/351/241/265/351/235/242.md +207 -207
  142. package/skills/ui-design/references/progressive-08-/350/241/250/345/215/225/345/210/206/347/273/204/350/247/204/350/214/203-tabs-vs-collapsegroup-/345/274/272/345/210/266.md +142 -142
  143. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  144. package/skills/unity-integration/SKILL.md +171 -171
  145. package/skills/unity-integration/agents/openai.yaml +4 -4
  146. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  147. package/skills/unity-integration/references/sdk-api.md +82 -82
  148. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  149. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  150. package/skills/v8-api-config/SKILL.md +388 -388
  151. package/skills/v8-cache-pattern/SKILL.md +312 -312
  152. package/skills/v8-crud-api/SKILL.md +178 -178
  153. package/skills/v8-crud-api/references/progressive-01-/346/237/245/350/257/242/345/210/227/350/241/250-/345/210/206/351/241/265.md +226 -226
  154. package/skills/v8-crud-api/references/progressive-02-where-/346/235/241/344/273/266/350/257/255/346/263/225/351/200/237/346/237/245.md +49 -49
  155. package/skills/v8-debugging/SKILL.md +284 -284
  156. package/skills/v8-explorer-tree/SKILL.md +228 -228
  157. package/skills/v8-export-import/SKILL.md +219 -219
  158. package/skills/v8-export-import/references/progressive-01-excellayout-/351/253/230/347/272/247/350/207/252/347/224/261/345/270/203/345/261/200.md +211 -211
  159. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  160. package/skills/v8-export-import/references/progressive-03-/345/256/211/345/205/250-/346/200/247/350/203/275/346/263/250/346/204/217.md +42 -42
  161. package/skills/v8-file-upload/SKILL.md +284 -284
  162. package/skills/v8-file-upload/references/progressive-01-/345/205/254/346/234/211/346/241/266-vs-/347/247/201/346/234/211/346/241/266.md +263 -263
  163. package/skills/v8-file-upload/references/progressive-02-office-/346/226/207/344/273/266/345/234/250/347/272/277/347/274/226/350/276/221/347/211/210/346/234/254/345/217/267/350/247/204/345/210/231.md +161 -161
  164. package/skills/v8-formengine-http/SKILL.md +238 -238
  165. package/skills/v8-frontend-events/SKILL.md +180 -180
  166. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  167. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  168. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  169. package/skills/v8-http-integration/SKILL.md +182 -182
  170. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  171. package/skills/v8-http-integration/references/progressive-02-/351/224/231/350/257/257/345/244/204/347/220/206/346/250/241/345/274/217.md +44 -44
  172. package/skills/v8-image-processing/SKILL.md +190 -190
  173. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  174. package/skills/v8-image-processing/references/api-reference.md +623 -623
  175. package/skills/v8-menu-buttons/SKILL.md +186 -186
  176. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +222 -222
  177. package/skills/v8-menu-buttons/references/progressive-02-8-/346/250/241/345/274/217-f-/345/220/216/345/217/260/344/273/273/345/212/241/346/214/211/351/222/256-/351/225/277/344/273/273/345/212/241.md +228 -228
  178. package/skills/v8-menu-buttons/references/progressive-03-10-/345/217/215/346/250/241/345/274/217-/351/201/277/345/205/215.md +104 -104
  179. package/skills/v8-mongodb/SKILL.md +200 -200
  180. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  181. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  182. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  183. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  184. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  185. package/skills/v8-security/SKILL.md +210 -210
  186. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  187. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  188. package/skills/v8-sql-query/SKILL.md +302 -302
  189. package/skills/v8-table-event/SKILL.md +176 -176
  190. package/skills/v8-table-event/references/progressive-01-informv8-js-/350/241/250/345/215/225/346/211/223/345/274/200/344/272/213/344/273/266.md +216 -216
  191. package/skills/v8-table-event/references/progressive-02-/345/211/215/347/253/257/344/272/213/344/273/266/345/220/215-v8-eventname-/345/217/257/350/203/275/347/232/204/345/200/274.md +46 -46
  192. package/skills/v8-tcp-integration/SKILL.md +147 -147
  193. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  194. package/skills/v8-template-engine/SKILL.md +167 -167
  195. package/skills/v8-utilities/SKILL.md +104 -104
  196. package/skills/v8-utilities/references/client-api-index.md +143 -143
  197. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  198. package/skills/v8-utilities/references/server-api-index.md +188 -188
  199. package/skills/v8-workflow/SKILL.md +252 -252
  200. package/skills/v8-workflow/references/progressive-01-/350/212/202/347/202/271/345/274/200/345/247/213-v8-/344/272/213/344/273/266.md +180 -180
  201. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  202. package/skills/vision-engine/SKILL.md +160 -160
  203. package/skills/vision-engine/agents/openai.yaml +4 -4
  204. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  205. package/skills/workspace-conventions/SKILL.md +273 -273
  206. package/skills/workspace-conventions/references/progressive-01-/347/211/210/346/234/254/346/233/264/346/226/260/346/227/245/345/277/227/344/277/235/346/212/244/350/247/204/345/210/231-/345/274/272/345/210/266.md +209 -209
  207. package/skills/workspace-conventions/references/progressive-02-microi-net-api-/346/234/254/345/234/260/345/220/257/345/212/250/347/272/246/345/256/232.md +217 -217
  208. package/skills/workspace-conventions/references/progressive-03-cli-/344/270/216-ide-/346/217/222/344/273/266/351/224/231/347/211/210/345/205/261/345/255/230/347/272/246/345/256/232.md +27 -27
@@ -1,216 +1,216 @@
1
- # v8-table-event 详细参考 1
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=v8-table-event-005 sha256=e4b6982f63971cf590b635f89643ba437bfd714cb78fe5d9690d43100e07c2c1 -->
6
- ## InFormV8.js — 表单打开事件
7
-
8
- ```javascript
9
- // 新增时设置默认值
10
- if (V8.FormMode === 'Add') {
11
- V8.FormSet('Status', 1);
12
- V8.FormSet('CreateTime', DateNow('yyyy-MM-dd HH:mm:ss'));
13
- V8.FormSet('CreatorId', V8.CurrentUser.Id);
14
- V8.FormSet('CreatorName', V8.CurrentUser.Name);
15
- }
16
-
17
- // 编辑时禁用某些字段
18
- if (V8.FormMode === 'Edit') {
19
- V8.FieldSet('Account', 'Readonly', true); // 账号不可修改
20
- }
21
-
22
- // 查看模式隐藏操作按钮
23
- if (V8.FormMode === 'View') {
24
- V8.HideFormBtn('Save');
25
- }
26
-
27
- // 根据角色控制字段可见性
28
- if (V8.CurrentUser.RoleName.indexOf('管理员') === -1) {
29
- V8.FieldSet('AuditField', 'Visible', false);
30
- }
31
- ```
32
-
33
- <!-- /microi-progressive:chunk -->
34
- <!-- microi-progressive:chunk id=v8-table-event-006 sha256=961c57d02a597e26abddc7c4d3b9f8f2f0b1f4ba6f8164ee3bbe7800bd78804b -->
35
- ## SubmitFormV8.js — 前端提交校验
36
-
37
- ```javascript
38
- // 自定义校验
39
- var phone = V8.Form.Phone;
40
- if (phone && !/^1[3-9]\d{9}$/.test(phone)) {
41
- V8.Tips('手机号格式不正确', false);
42
- return false; // 返回 false 阻止提交
43
- }
44
-
45
- // 业务逻辑校验
46
- if (V8.Form.StartDate > V8.Form.EndDate) {
47
- V8.Tips('开始日期不能大于结束日期', false);
48
- return false;
49
- }
50
- ```
51
-
52
- <!-- /microi-progressive:chunk -->
53
- <!-- microi-progressive:chunk id=v8-table-event-007 sha256=e074fbd1736d4a80e58c4b4c06338a40b5f8f89045eddf0d09f325ff1d48a7d4 -->
54
- ## SubmitBeforeServerV8.js — 服务端提交前
55
-
56
- ```javascript
57
- // V8.Form 是即将写入数据库的数据
58
- // V8.OldForm 是修改前的旧数据(仅更新时有值)
59
- // V8.FormSubmitAction:'Insert' / 'Update' / 'Delete'
60
-
61
- // 新增时:自动填充审计字段
62
- if (V8.FormSubmitAction === 'Insert') {
63
- V8.Form.CreateTime = DateNow('yyyy-MM-dd HH:mm:ss');
64
- V8.Form.CreateUserId = V8.CurrentUser.Id;
65
- }
66
-
67
- // 更新时:记录修改人
68
- if (V8.FormSubmitAction === 'Update') {
69
- V8.Form.UpdateTime = DateNow('yyyy-MM-dd HH:mm:ss');
70
- V8.Form.UpdateUserId = V8.CurrentUser.Id;
71
- }
72
-
73
- // 删除时:校验是否允许删除
74
- if (V8.FormSubmitAction === 'Delete') {
75
- var related = V8.FormEngine.GetTableDataCount('OrderDetail', {
76
- _Where: [['OrderId', '=', V8.Form.Id]]
77
- });
78
- if (related.DataCount > 0) {
79
- return { Code: 0, Msg: '该订单下有明细数据,不允许删除' };
80
- }
81
- }
82
-
83
- // 唯一性校验
84
- if (V8.FormSubmitAction === 'Insert' || V8.FormSubmitAction === 'Update') {
85
- var where = [['Code', '=', V8.Form.Code]];
86
- if (V8.FormSubmitAction === 'Update') {
87
- where.push(['AND', 'Id', '<>', V8.Form.Id]);
88
- }
89
- var exist = V8.FormEngine.GetFormData('Product', { _Where: where });
90
- if (exist.Code === 1 && exist.Data) {
91
- return { Code: 0, Msg: '编码已存在' };
92
- }
93
- }
94
-
95
- // 返回 { Code: 0, Msg: '...' } 阻止提交并自动回滚事务
96
- // 无需手动调用 V8.DbTrans.Rollback()
97
- ```
98
-
99
- <!-- /microi-progressive:chunk -->
100
- <!-- microi-progressive:chunk id=v8-table-event-008 sha256=d013a6f8b5cc1c114e7563fc98322ea6fa5ffce93e10d6bdf489c82344985082 -->
101
- ## SubmitAfterServerV8.js — 服务端提交后
102
-
103
- ```javascript
104
- // 此时数据已成功写入数据库(仍在事务中)
105
- // 返回 { Code: 0 } 仍可回滚事务
106
-
107
- // 新增后:自动创建关联数据。保持默认 Server 调用,不触发目标表事件
108
- if (V8.FormSubmitAction === 'Insert') {
109
- V8.FormEngine.AddFormData('UserProfile', {
110
- UserId: V8.Form.Id,
111
- NickName: V8.Form.Name
112
- }, V8.DbTrans);
113
- }
114
-
115
- // 更新后:同步更新其它表的冗余字段
116
- if (V8.FormSubmitAction === 'Update') {
117
- if (V8.OldForm.Name !== V8.Form.Name) {
118
- V8.FormEngine.UptFormDataByWhere('OrderHeader', {
119
- _Where: [['CustomerId', '=', V8.Form.Id]],
120
- CustomerName: V8.Form.Name
121
- });
122
- }
123
- }
124
-
125
- // 通知(调用其他接口引擎,可共享事务)
126
- V8.ApiEngine.Run('send-notification', {
127
- userId: V8.Form.Id,
128
- type: V8.FormSubmitAction
129
- }, V8.DbTrans);
130
-
131
- // 记录操作日志
132
- V8.Method.AddSysLog({
133
- Title: V8.FormSubmitAction + ' ' + V8.TableModel.Name,
134
- Content: JSON.stringify({ Id: V8.Form.Id }),
135
- Type: '业务日志'
136
- });
137
- ```
138
-
139
- `SubmitAfterServerV8` 的“After”仍是“写入后、提交前”。需要在事务真正提交后才发布的缓存版本、跨节点通知等副作用,不能直接在事件中执行。平台为 `microi_database` 提供专用 `V8.Method.RefreshExtensionDatabases()`:事件调用时只登记提交后回调,提交成功才递增当前租户共享 Redis 版本,回滚时自动丢弃。普通业务的外部消息仍优先使用同事务 outbox,不能把任意不可撤销副作用都塞进内存回调。
140
-
141
- <!-- /microi-progressive:chunk -->
142
- <!-- microi-progressive:chunk id=v8-table-event-009 sha256=406c88d14167773a0d7597d4b622f9a53c2046f4d4cfd740cfb5addd13f80434 -->
143
- ## DataFilterV8.js — 服务端数据处理事件
144
-
145
- 获取列表/表单数据后,每行数据都会执行一次此事件。
146
-
147
- ```javascript
148
- // V8.RowIndex — 当前行索引(从 0 开始)
149
- // V8.Form — 当前行数据
150
- // V8.NotSaveField — 指定哪些字段编辑时不保存(数组)
151
- // V8.CacheData — 用于缓存数据,避免每行重复查询
152
-
153
- // 补充计算字段
154
- V8.Form.TotalPrice = V8.Form.Price * V8.Form.Quantity;
155
-
156
- // 指定某些字段不保存(仅在编辑表单时有效)
157
- V8.NotSaveField = ['TotalPrice', 'CompanyName'];
158
-
159
- // 使用 CacheData 避免 N+1 查询
160
- if (!V8.CacheData.deptMap) {
161
- var depts = V8.FormEngine.GetTableData('Department', {});
162
- var map = {};
163
- for (var i = 0; i < depts.Data.length; i++) {
164
- map[depts.Data[i].Id] = depts.Data[i].Name;
165
- }
166
- V8.CacheData.deptMap = map;
167
- }
168
- V8.Form.DeptName = V8.CacheData.deptMap[V8.Form.DeptId] || '';
169
-
170
- // 数据脱敏
171
- if (V8.Form.Phone) {
172
- V8.Form.Phone = V8.Form.Phone.substring(0, 3) + '****' + V8.Form.Phone.substring(7);
173
- }
174
- ```
175
-
176
- <!-- /microi-progressive:chunk -->
177
- <!-- microi-progressive:chunk id=v8-table-event-010 sha256=e41feb40c52d46b7df9c18bf19fe3800194bbc92ce7415864529c69e09b335bc -->
178
- ## 事件上下文变量
179
-
180
- ### 前端事件
181
-
182
- | 变量 | 说明 | 可用事件 |
183
- |------|------|---------|
184
- | `V8.Form` | 当前表单数据;原生新增提交前可能没有 Id,依赖真实主键的跨表写入在提交后事件执行 | 全部 |
185
- | `V8.OldForm` | 已加载的修改前旧数据 | 普通表单;提交前/后 |
186
- | `V8.FormMode` | `'Add'` / `'Edit'` / `'View'` | 全部 |
187
- | `V8.FormOutAction` | `'Insert'`/`'Update'`/`'Close'`/`'Delete'` | FormOut |
188
- | `V8.FormSubmitAction` | `'Insert'` / `'Update'` / `'Delete'` | SubmitBefore |
189
- | `V8.EventName` | 当前事件名 | 全部 |
190
- | `V8.CurrentUser` | 当前用户 | 全部 |
191
- | `V8.TableId` / `V8.TableName` | 当前表 Id / Name | 全部 |
192
- | `V8.SelectedData` / `V8.TableRowSelected` | 选中的行数组 | 列表/批量按钮 |
193
- | `V8.CurrentTableData` | 当前表当页数据 | 全部 |
194
- | `V8.ClientType` | `'PC'`/`'IOS'`/`'Android'`/`'H5'`/`'WeChat'` | 全部 |
195
- | `V8.ThisValue` | 当前字段新值:可能是对象、原始值或行内 `{New,Old}` | FieldValueChange |
196
- | `V8.OldValue` | 当前字段旧值,仅行内编辑可靠 | 表格行内 FieldValueChange |
197
- | `V8.KeyCode` | 键盘事件的键码 | FieldOnKeyup |
198
- | `V8.Event` | 原生事件;键盘事件目前不提供 | FieldSlotButtonClick 等显式事件 |
199
- | `V8.ParentV8` | 子表中访问父表 V8 对象 | 子表事件 |
200
-
201
- ### 后端事件
202
-
203
- | 变量 | 说明 | 可用事件 |
204
- |------|------|---------|
205
- | `V8.Form` | 当前表单/行数据 | 全部 |
206
- | `V8.OldForm` | 提交前旧数据 | SubmitBefore/After |
207
- | `V8.FormSubmitAction` | `'Insert'`/`'Update'`/`'Delete'` | SubmitBefore/After |
208
- | `V8.TableModel` | 表模型(Id, Name 等) | SubmitBefore/After |
209
- | `V8.EventName` | 当前事件名 | 全部 |
210
- | `V8.InvokeType` | `'Server'`/`'Client'` | 全部 |
211
- | `V8.CurrentUser` | 当前用户 | 全部 |
212
- | `V8.RowIndex` | 行索引(从 0) | DataFilter |
213
- | `V8.NotSaveField` | 不保存的字段(数组,可写) | DataFilter |
214
- | `V8.CacheData` | 缓存数据(避免 N+1,可写) | DataFilter |
215
-
216
- <!-- /microi-progressive:chunk -->
1
+ # v8-table-event 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-table-event-005 sha256=e4b6982f63971cf590b635f89643ba437bfd714cb78fe5d9690d43100e07c2c1 -->
6
+ ## InFormV8.js — 表单打开事件
7
+
8
+ ```javascript
9
+ // 新增时设置默认值
10
+ if (V8.FormMode === 'Add') {
11
+ V8.FormSet('Status', 1);
12
+ V8.FormSet('CreateTime', DateNow('yyyy-MM-dd HH:mm:ss'));
13
+ V8.FormSet('CreatorId', V8.CurrentUser.Id);
14
+ V8.FormSet('CreatorName', V8.CurrentUser.Name);
15
+ }
16
+
17
+ // 编辑时禁用某些字段
18
+ if (V8.FormMode === 'Edit') {
19
+ V8.FieldSet('Account', 'Readonly', true); // 账号不可修改
20
+ }
21
+
22
+ // 查看模式隐藏操作按钮
23
+ if (V8.FormMode === 'View') {
24
+ V8.HideFormBtn('Save');
25
+ }
26
+
27
+ // 根据角色控制字段可见性
28
+ if (V8.CurrentUser.RoleName.indexOf('管理员') === -1) {
29
+ V8.FieldSet('AuditField', 'Visible', false);
30
+ }
31
+ ```
32
+
33
+ <!-- /microi-progressive:chunk -->
34
+ <!-- microi-progressive:chunk id=v8-table-event-006 sha256=961c57d02a597e26abddc7c4d3b9f8f2f0b1f4ba6f8164ee3bbe7800bd78804b -->
35
+ ## SubmitFormV8.js — 前端提交校验
36
+
37
+ ```javascript
38
+ // 自定义校验
39
+ var phone = V8.Form.Phone;
40
+ if (phone && !/^1[3-9]\d{9}$/.test(phone)) {
41
+ V8.Tips('手机号格式不正确', false);
42
+ return false; // 返回 false 阻止提交
43
+ }
44
+
45
+ // 业务逻辑校验
46
+ if (V8.Form.StartDate > V8.Form.EndDate) {
47
+ V8.Tips('开始日期不能大于结束日期', false);
48
+ return false;
49
+ }
50
+ ```
51
+
52
+ <!-- /microi-progressive:chunk -->
53
+ <!-- microi-progressive:chunk id=v8-table-event-007 sha256=e074fbd1736d4a80e58c4b4c06338a40b5f8f89045eddf0d09f325ff1d48a7d4 -->
54
+ ## SubmitBeforeServerV8.js — 服务端提交前
55
+
56
+ ```javascript
57
+ // V8.Form 是即将写入数据库的数据
58
+ // V8.OldForm 是修改前的旧数据(仅更新时有值)
59
+ // V8.FormSubmitAction:'Insert' / 'Update' / 'Delete'
60
+
61
+ // 新增时:自动填充审计字段
62
+ if (V8.FormSubmitAction === 'Insert') {
63
+ V8.Form.CreateTime = DateNow('yyyy-MM-dd HH:mm:ss');
64
+ V8.Form.CreateUserId = V8.CurrentUser.Id;
65
+ }
66
+
67
+ // 更新时:记录修改人
68
+ if (V8.FormSubmitAction === 'Update') {
69
+ V8.Form.UpdateTime = DateNow('yyyy-MM-dd HH:mm:ss');
70
+ V8.Form.UpdateUserId = V8.CurrentUser.Id;
71
+ }
72
+
73
+ // 删除时:校验是否允许删除
74
+ if (V8.FormSubmitAction === 'Delete') {
75
+ var related = V8.FormEngine.GetTableDataCount('OrderDetail', {
76
+ _Where: [['OrderId', '=', V8.Form.Id]]
77
+ });
78
+ if (related.DataCount > 0) {
79
+ return { Code: 0, Msg: '该订单下有明细数据,不允许删除' };
80
+ }
81
+ }
82
+
83
+ // 唯一性校验
84
+ if (V8.FormSubmitAction === 'Insert' || V8.FormSubmitAction === 'Update') {
85
+ var where = [['Code', '=', V8.Form.Code]];
86
+ if (V8.FormSubmitAction === 'Update') {
87
+ where.push(['AND', 'Id', '<>', V8.Form.Id]);
88
+ }
89
+ var exist = V8.FormEngine.GetFormData('Product', { _Where: where });
90
+ if (exist.Code === 1 && exist.Data) {
91
+ return { Code: 0, Msg: '编码已存在' };
92
+ }
93
+ }
94
+
95
+ // 返回 { Code: 0, Msg: '...' } 阻止提交并自动回滚事务
96
+ // 无需手动调用 V8.DbTrans.Rollback()
97
+ ```
98
+
99
+ <!-- /microi-progressive:chunk -->
100
+ <!-- microi-progressive:chunk id=v8-table-event-008 sha256=d013a6f8b5cc1c114e7563fc98322ea6fa5ffce93e10d6bdf489c82344985082 -->
101
+ ## SubmitAfterServerV8.js — 服务端提交后
102
+
103
+ ```javascript
104
+ // 此时数据已成功写入数据库(仍在事务中)
105
+ // 返回 { Code: 0 } 仍可回滚事务
106
+
107
+ // 新增后:自动创建关联数据。保持默认 Server 调用,不触发目标表事件
108
+ if (V8.FormSubmitAction === 'Insert') {
109
+ V8.FormEngine.AddFormData('UserProfile', {
110
+ UserId: V8.Form.Id,
111
+ NickName: V8.Form.Name
112
+ }, V8.DbTrans);
113
+ }
114
+
115
+ // 更新后:同步更新其它表的冗余字段
116
+ if (V8.FormSubmitAction === 'Update') {
117
+ if (V8.OldForm.Name !== V8.Form.Name) {
118
+ V8.FormEngine.UptFormDataByWhere('OrderHeader', {
119
+ _Where: [['CustomerId', '=', V8.Form.Id]],
120
+ CustomerName: V8.Form.Name
121
+ });
122
+ }
123
+ }
124
+
125
+ // 通知(调用其他接口引擎,可共享事务)
126
+ V8.ApiEngine.Run('send-notification', {
127
+ userId: V8.Form.Id,
128
+ type: V8.FormSubmitAction
129
+ }, V8.DbTrans);
130
+
131
+ // 记录操作日志
132
+ V8.Method.AddSysLog({
133
+ Title: V8.FormSubmitAction + ' ' + V8.TableModel.Name,
134
+ Content: JSON.stringify({ Id: V8.Form.Id }),
135
+ Type: '业务日志'
136
+ });
137
+ ```
138
+
139
+ `SubmitAfterServerV8` 的“After”仍是“写入后、提交前”。需要在事务真正提交后才发布的缓存版本、跨节点通知等副作用,不能直接在事件中执行。平台为 `microi_database` 提供专用 `V8.Method.RefreshExtensionDatabases()`:事件调用时只登记提交后回调,提交成功才递增当前租户共享 Redis 版本,回滚时自动丢弃。普通业务的外部消息仍优先使用同事务 outbox,不能把任意不可撤销副作用都塞进内存回调。
140
+
141
+ <!-- /microi-progressive:chunk -->
142
+ <!-- microi-progressive:chunk id=v8-table-event-009 sha256=406c88d14167773a0d7597d4b622f9a53c2046f4d4cfd740cfb5addd13f80434 -->
143
+ ## DataFilterV8.js — 服务端数据处理事件
144
+
145
+ 获取列表/表单数据后,每行数据都会执行一次此事件。
146
+
147
+ ```javascript
148
+ // V8.RowIndex — 当前行索引(从 0 开始)
149
+ // V8.Form — 当前行数据
150
+ // V8.NotSaveField — 指定哪些字段编辑时不保存(数组)
151
+ // V8.CacheData — 用于缓存数据,避免每行重复查询
152
+
153
+ // 补充计算字段
154
+ V8.Form.TotalPrice = V8.Form.Price * V8.Form.Quantity;
155
+
156
+ // 指定某些字段不保存(仅在编辑表单时有效)
157
+ V8.NotSaveField = ['TotalPrice', 'CompanyName'];
158
+
159
+ // 使用 CacheData 避免 N+1 查询
160
+ if (!V8.CacheData.deptMap) {
161
+ var depts = V8.FormEngine.GetTableData('Department', {});
162
+ var map = {};
163
+ for (var i = 0; i < depts.Data.length; i++) {
164
+ map[depts.Data[i].Id] = depts.Data[i].Name;
165
+ }
166
+ V8.CacheData.deptMap = map;
167
+ }
168
+ V8.Form.DeptName = V8.CacheData.deptMap[V8.Form.DeptId] || '';
169
+
170
+ // 数据脱敏
171
+ if (V8.Form.Phone) {
172
+ V8.Form.Phone = V8.Form.Phone.substring(0, 3) + '****' + V8.Form.Phone.substring(7);
173
+ }
174
+ ```
175
+
176
+ <!-- /microi-progressive:chunk -->
177
+ <!-- microi-progressive:chunk id=v8-table-event-010 sha256=e41feb40c52d46b7df9c18bf19fe3800194bbc92ce7415864529c69e09b335bc -->
178
+ ## 事件上下文变量
179
+
180
+ ### 前端事件
181
+
182
+ | 变量 | 说明 | 可用事件 |
183
+ |------|------|---------|
184
+ | `V8.Form` | 当前表单数据;原生新增提交前可能没有 Id,依赖真实主键的跨表写入在提交后事件执行 | 全部 |
185
+ | `V8.OldForm` | 已加载的修改前旧数据 | 普通表单;提交前/后 |
186
+ | `V8.FormMode` | `'Add'` / `'Edit'` / `'View'` | 全部 |
187
+ | `V8.FormOutAction` | `'Insert'`/`'Update'`/`'Close'`/`'Delete'` | FormOut |
188
+ | `V8.FormSubmitAction` | `'Insert'` / `'Update'` / `'Delete'` | SubmitBefore |
189
+ | `V8.EventName` | 当前事件名 | 全部 |
190
+ | `V8.CurrentUser` | 当前用户 | 全部 |
191
+ | `V8.TableId` / `V8.TableName` | 当前表 Id / Name | 全部 |
192
+ | `V8.SelectedData` / `V8.TableRowSelected` | 选中的行数组 | 列表/批量按钮 |
193
+ | `V8.CurrentTableData` | 当前表当页数据 | 全部 |
194
+ | `V8.ClientType` | `'PC'`/`'IOS'`/`'Android'`/`'H5'`/`'WeChat'` | 全部 |
195
+ | `V8.ThisValue` | 当前字段新值:可能是对象、原始值或行内 `{New,Old}` | FieldValueChange |
196
+ | `V8.OldValue` | 当前字段旧值,仅行内编辑可靠 | 表格行内 FieldValueChange |
197
+ | `V8.KeyCode` | 键盘事件的键码 | FieldOnKeyup |
198
+ | `V8.Event` | 原生事件;键盘事件目前不提供 | FieldSlotButtonClick 等显式事件 |
199
+ | `V8.ParentV8` | 子表中访问父表 V8 对象 | 子表事件 |
200
+
201
+ ### 后端事件
202
+
203
+ | 变量 | 说明 | 可用事件 |
204
+ |------|------|---------|
205
+ | `V8.Form` | 当前表单/行数据 | 全部 |
206
+ | `V8.OldForm` | 提交前旧数据 | SubmitBefore/After |
207
+ | `V8.FormSubmitAction` | `'Insert'`/`'Update'`/`'Delete'` | SubmitBefore/After |
208
+ | `V8.TableModel` | 表模型(Id, Name 等) | SubmitBefore/After |
209
+ | `V8.EventName` | 当前事件名 | 全部 |
210
+ | `V8.InvokeType` | `'Server'`/`'Client'` | 全部 |
211
+ | `V8.CurrentUser` | 当前用户 | 全部 |
212
+ | `V8.RowIndex` | 行索引(从 0) | DataFilter |
213
+ | `V8.NotSaveField` | 不保存的字段(数组,可写) | DataFilter |
214
+ | `V8.CacheData` | 缓存数据(避免 N+1,可写) | DataFilter |
215
+
216
+ <!-- /microi-progressive:chunk -->
@@ -1,46 +1,46 @@
1
- # v8-table-event 详细参考 2
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=v8-table-event-011 sha256=80a852d31b69084c28828f124a83a2240d82309642619bc72debe3e7c271b3db -->
6
- ## 前端事件名(V8.EventName 可能的值)
7
-
8
- | 值 | 说明 |
9
- |---|---|
10
- | `FormIn` | 进入表单事件 |
11
- | `FormSubmitBefore` | 提交前事件 |
12
- | `FormOut` | 离开表单事件 |
13
- | `FieldValueChange` | 字段值变更事件 |
14
- | `FieldOnKeyup` | 文本框键盘事件 |
15
- | `TableFieldOnKeyup` | 表格行内文本框键盘事件 |
16
- | `FieldSlotButtonClick` | 单行文本插槽按钮点击事件 |
17
- | `V8BtnRun` | V8 按钮执行事件 |
18
- | `V8BtnLimit` | V8 按钮是否显示事件 |
19
- | `BtnFormDetailRun` | 详情按钮 V8 按钮 |
20
- | `TableRowClick` | 表格行点击 V8 事件 |
21
- | `OpenTableBefore` | 弹出表格前事件 |
22
- | `OpenTableSubmit` | 弹出表格提交事件 |
23
- | `PageTab` | 多 Tab 页签 V8 事件 |
24
- | `WFNodeStart` | 流程节点开始 V8 事件 |
25
- | `WFNodeEnd` | 流程节点结束 V8 事件 |
26
-
27
- <!-- /microi-progressive:chunk -->
28
- <!-- microi-progressive:chunk id=v8-table-event-012 sha256=405c8a081022ffa2cc977bc80a591a7315ba208e5b49e176c7708a8037a35cf6 -->
29
- ## 注意事项
30
-
31
- - 前端事件可使用 `window` 对象和 `async/await`,后端事件不可以
32
- - 后端提交前/后事件返回 `{ Code: 0, Msg: '...' }` 可阻止数据写入并回滚事务
33
- - 直接修改 `V8.Form` 的字段值即可改变最终写入的数据
34
- - 后端事件中使用 `V8.FormEngine` 默认是 Server 调用,不触发目标表事件;`_InvokeType:'Client'` 恰好会触发目标表事件,不能用于“避免递归”
35
- - `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
36
- - `V8.FormSubmitAction` 的值是 `'Insert'`/`'Update'`/`'Delete'`(非 Add/Upt/Del)
37
- - 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
38
- - 表事件调用下游接口时,表级正向 `diy_table.V8Limit` 不会改变下游接口;下游接口独立读取正向 `sys_apiengine.V8Limit`(两者均默认 0 表示不限 Jint 单次预算,1 表示启用限制)
39
-
40
- ### 复盘:提交后事件误把增量表单当作完整记录
41
-
42
- - 触发场景:插件、MCP 或后端只更新代码等少数字段时,`SubmitAfterServerV8` 直接对 `V8.Form.Id`、业务 Key 调用 `toLowerCase()`,保存动作因字段未出现在增量参数中而异常。
43
- - 根因:事件假设 `V8.Form` 始终包含整行数据,没有兼容稀疏更新(sparse patch)。
44
- - 通用规则:提交后事件使用非本次必传字段前,必须从 `V8.OldForm` 合并兜底,或凭已有 `Id` 回查当前记录;调用字符串方法前先显式 `String(...)` 并校验空值。写缓存时应缓存合并后的完整模型,不能用稀疏对象覆盖整行缓存。
45
- - 自动化检查:分别只更新一个普通字段、只更新大文本代码字段并执行一次完整表单保存;事件均不得报错,按 Id、唯一 Key 和可选地址回读缓存都应得到完整记录。
46
- <!-- /microi-progressive:chunk -->
1
+ # v8-table-event 详细参考 2
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-table-event-011 sha256=80a852d31b69084c28828f124a83a2240d82309642619bc72debe3e7c271b3db -->
6
+ ## 前端事件名(V8.EventName 可能的值)
7
+
8
+ | 值 | 说明 |
9
+ |---|---|
10
+ | `FormIn` | 进入表单事件 |
11
+ | `FormSubmitBefore` | 提交前事件 |
12
+ | `FormOut` | 离开表单事件 |
13
+ | `FieldValueChange` | 字段值变更事件 |
14
+ | `FieldOnKeyup` | 文本框键盘事件 |
15
+ | `TableFieldOnKeyup` | 表格行内文本框键盘事件 |
16
+ | `FieldSlotButtonClick` | 单行文本插槽按钮点击事件 |
17
+ | `V8BtnRun` | V8 按钮执行事件 |
18
+ | `V8BtnLimit` | V8 按钮是否显示事件 |
19
+ | `BtnFormDetailRun` | 详情按钮 V8 按钮 |
20
+ | `TableRowClick` | 表格行点击 V8 事件 |
21
+ | `OpenTableBefore` | 弹出表格前事件 |
22
+ | `OpenTableSubmit` | 弹出表格提交事件 |
23
+ | `PageTab` | 多 Tab 页签 V8 事件 |
24
+ | `WFNodeStart` | 流程节点开始 V8 事件 |
25
+ | `WFNodeEnd` | 流程节点结束 V8 事件 |
26
+
27
+ <!-- /microi-progressive:chunk -->
28
+ <!-- microi-progressive:chunk id=v8-table-event-012 sha256=405c8a081022ffa2cc977bc80a591a7315ba208e5b49e176c7708a8037a35cf6 -->
29
+ ## 注意事项
30
+
31
+ - 前端事件可使用 `window` 对象和 `async/await`,后端事件不可以
32
+ - 后端提交前/后事件返回 `{ Code: 0, Msg: '...' }` 可阻止数据写入并回滚事务
33
+ - 直接修改 `V8.Form` 的字段值即可改变最终写入的数据
34
+ - 后端事件中使用 `V8.FormEngine` 默认是 Server 调用,不触发目标表事件;`_InvokeType:'Client'` 恰好会触发目标表事件,不能用于“避免递归”
35
+ - `_InvokeType:'Server'` 只表达事件调用语义,不是客户端授权开关;浏览器伪造它不会获得受信任权限
36
+ - `V8.FormSubmitAction` 的值是 `'Insert'`/`'Update'`/`'Delete'`(非 Add/Upt/Del)
37
+ - 在 DataFilterV8 中使用 `V8.CacheData` 缓存查询结果,避免每行执行 N+1 查询
38
+ - 表事件调用下游接口时,表级正向 `diy_table.V8Limit` 不会改变下游接口;下游接口独立读取正向 `sys_apiengine.V8Limit`(两者均默认 0 表示不限 Jint 单次预算,1 表示启用限制)
39
+
40
+ ### 复盘:提交后事件误把增量表单当作完整记录
41
+
42
+ - 触发场景:插件、MCP 或后端只更新代码等少数字段时,`SubmitAfterServerV8` 直接对 `V8.Form.Id`、业务 Key 调用 `toLowerCase()`,保存动作因字段未出现在增量参数中而异常。
43
+ - 根因:事件假设 `V8.Form` 始终包含整行数据,没有兼容稀疏更新(sparse patch)。
44
+ - 通用规则:提交后事件使用非本次必传字段前,必须从 `V8.OldForm` 合并兜底,或凭已有 `Id` 回查当前记录;调用字符串方法前先显式 `String(...)` 并校验空值。写缓存时应缓存合并后的完整模型,不能用稀疏对象覆盖整行缓存。
45
+ - 自动化检查:分别只更新一个普通字段、只更新大文本代码字段并执行一次完整表单保存;事件均不得报错,按 Id、唯一 Key 和可选地址回读缓存都应得到完整记录。
46
+ <!-- /microi-progressive:chunk -->