@microi.net/cli 5.8.4 → 5.8.6

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 (212) 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/.mcp.json +1 -1
  5. package/.workbuddy-plugin/marketplace.json +2 -2
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/LICENSE +21 -21
  8. package/README.md +71 -71
  9. package/assets/build-meta.json +7 -7
  10. package/assets/feature-matrix.json +138 -138
  11. package/assets/logo.svg +4 -4
  12. package/cordis.patch.yml +1 -1
  13. package/package.json +1 -1
  14. package/scripts/codex-marketplace.json +20 -20
  15. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  16. package/scripts/mcp-server.js +5 -0
  17. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  18. package/scripts/microi-cli-mcp.js +7 -7
  19. package/scripts/microi-cli.js +67 -66
  20. package/scripts/microi-codex-broker.js +450 -450
  21. package/scripts/microi-codex-router.js +618 -582
  22. package/scripts/microi-skills.meta.json +384 -384
  23. package/skills/.microi-skills-version.json +2 -2
  24. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  25. package/skills/README.md +287 -287
  26. package/skills/ai-engine/SKILL.md +269 -265
  27. package/skills/ai-engine/agents/openai.yaml +4 -4
  28. package/skills/ai-engine/references/ai-employees.md +48 -48
  29. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  30. package/skills/ai-platform-governance/SKILL.md +177 -177
  31. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  32. package/skills/app-store/SKILL.md +525 -525
  33. package/skills/app-store/agents/openai.yaml +4 -4
  34. package/skills/business-blueprint/SKILL.md +193 -193
  35. package/skills/datasource-engine/SKILL.md +93 -93
  36. package/skills/datasource-engine/agents/openai.yaml +4 -4
  37. package/skills/dos-orm/SKILL.md +97 -97
  38. package/skills/dos-orm/references/api-reference.md +229 -229
  39. package/skills/email-engine/SKILL.md +81 -81
  40. package/skills/email-engine/references/v8-email.md +34 -34
  41. package/skills/job-engine/SKILL.md +176 -176
  42. package/skills/job-engine/agents/openai.yaml +4 -4
  43. package/skills/message-notification/SKILL.md +156 -156
  44. package/skills/message-notification/agents/openai.yaml +5 -5
  45. package/skills/message-notification/references/contracts.md +102 -102
  46. package/skills/microi/SKILL.md +14 -14
  47. package/skills/microi-ai-app-auth.js +652 -652
  48. package/skills/microi-ai-application/SKILL.md +115 -115
  49. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  50. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  51. package/skills/microi-client-frontend/SKILL.md +244 -244
  52. 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
  53. 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
  54. 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
  55. package/skills/microi-codex/SKILL.md +102 -100
  56. package/skills/microi-codex-installer/SKILL.md +231 -227
  57. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  58. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  59. package/skills/microi-db-schema/SKILL.md +175 -175
  60. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  61. package/skills/microi-db-schema/references/core-tables.md +695 -695
  62. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  63. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  64. package/skills/microi-db-schema/references/schema.md +646 -646
  65. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  66. package/skills/microi-deployment/SKILL.md +221 -221
  67. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  68. package/skills/microi-docs-coverage/SKILL.md +133 -133
  69. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  70. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  71. package/skills/microi-form-engine/SKILL.md +333 -333
  72. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  73. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  74. package/skills/microi-form-layout/SKILL.md +205 -205
  75. 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
  76. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  77. 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
  78. package/skills/microi-left-right-layout/SKILL.md +141 -141
  79. package/skills/microi-microservice/SKILL.md +326 -324
  80. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  81. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  82. 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
  83. 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
  84. package/skills/microi-solution-quotation/SKILL.md +78 -78
  85. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  86. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  87. package/skills/microi-sso/SKILL.md +92 -92
  88. package/skills/microi-sso/references/acceptance.md +49 -49
  89. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  90. package/skills/microi-sso/references/inbound.md +53 -53
  91. package/skills/microi-sso/references/outbound.md +39 -39
  92. package/skills/microi-system-delivery/SKILL.md +137 -137
  93. 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
  94. 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
  95. package/skills/microi-ui/SKILL.md +192 -192
  96. 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
  97. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  98. 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
  99. 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
  100. package/skills/microi.v8.js +1921 -1921
  101. package/skills/module-engine/SKILL.md +255 -255
  102. package/skills/module-engine/references/module-config.md +204 -204
  103. package/skills/ocr-engine/SKILL.md +113 -113
  104. package/skills/ocr-engine/agents/openai.yaml +4 -4
  105. package/skills/page-engine/SKILL.md +206 -206
  106. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  107. 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
  108. 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
  109. package/skills/performance-testing/SKILL.md +221 -221
  110. package/skills/playwright-e2e/SKILL.md +196 -196
  111. 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
  112. 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
  113. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  114. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  115. package/skills/print-engine/SKILL.md +259 -259
  116. package/skills/production-readonly-audit/SKILL.md +41 -41
  117. package/skills/report-engine/SKILL.md +71 -71
  118. package/skills/report-engine/agents/openai.yaml +4 -4
  119. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  120. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  121. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  122. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  123. package/skills/search-engine/SKILL.md +75 -75
  124. package/skills/search-engine/agents/openai.yaml +4 -4
  125. package/skills/spider-engine/SKILL.md +190 -190
  126. package/skills/system-observability/SKILL.md +248 -248
  127. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  128. package/skills/translate-engine/SKILL.md +140 -140
  129. package/skills/translate-engine/agents/openai.yaml +4 -4
  130. package/skills/ui-design/SKILL.md +223 -223
  131. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  132. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  133. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  134. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  135. package/skills/ui-design/references/design-pattern-library.md +184 -184
  136. package/skills/ui-design/references/mci-design-contract.md +163 -163
  137. package/skills/ui-design/references/motion-and-media.md +78 -78
  138. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  139. 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
  140. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. 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
  147. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  148. package/skills/unity-integration/SKILL.md +171 -171
  149. package/skills/unity-integration/agents/openai.yaml +4 -4
  150. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  151. package/skills/unity-integration/references/sdk-api.md +82 -82
  152. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  153. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  154. package/skills/v8-api-config/SKILL.md +388 -388
  155. package/skills/v8-cache-pattern/SKILL.md +312 -312
  156. package/skills/v8-crud-api/SKILL.md +178 -178
  157. 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
  158. 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
  159. package/skills/v8-debugging/SKILL.md +284 -284
  160. package/skills/v8-explorer-tree/SKILL.md +228 -228
  161. package/skills/v8-export-import/SKILL.md +219 -219
  162. 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
  163. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  164. 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
  165. package/skills/v8-file-upload/SKILL.md +284 -284
  166. 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
  167. 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
  168. package/skills/v8-formengine-http/SKILL.md +238 -238
  169. package/skills/v8-frontend-events/SKILL.md +180 -180
  170. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  171. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  172. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  173. package/skills/v8-http-integration/SKILL.md +182 -182
  174. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  175. 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
  176. package/skills/v8-image-processing/SKILL.md +190 -190
  177. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  178. package/skills/v8-image-processing/references/api-reference.md +623 -623
  179. package/skills/v8-menu-buttons/SKILL.md +186 -186
  180. 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
  181. 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
  182. 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
  183. package/skills/v8-mongodb/SKILL.md +200 -200
  184. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  185. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  186. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  187. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  188. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  189. package/skills/v8-security/SKILL.md +210 -210
  190. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  191. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  192. package/skills/v8-sql-query/SKILL.md +302 -302
  193. package/skills/v8-table-event/SKILL.md +176 -176
  194. 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
  195. 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
  196. package/skills/v8-tcp-integration/SKILL.md +147 -147
  197. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  198. package/skills/v8-template-engine/SKILL.md +167 -167
  199. package/skills/v8-utilities/SKILL.md +104 -104
  200. package/skills/v8-utilities/references/client-api-index.md +143 -143
  201. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  202. package/skills/v8-utilities/references/server-api-index.md +188 -188
  203. package/skills/v8-workflow/SKILL.md +252 -252
  204. 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
  205. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  206. package/skills/vision-engine/SKILL.md +160 -160
  207. package/skills/vision-engine/agents/openai.yaml +4 -4
  208. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  209. package/skills/workspace-conventions/SKILL.md +273 -270
  210. 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
  211. 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
  212. 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 -->