@microi.net/cli 5.9.2 → 5.9.4

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