@microi.net/cli 5.7.8 → 5.8.0

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 (189) 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 +6 -6
  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 +113 -112
  15. package/scripts/microi-cli.js +57 -57
  16. package/scripts/microi-codex-broker.js +450 -450
  17. package/scripts/microi-codex-router.js +0 -0
  18. package/scripts/microi-skills.meta.json +364 -364
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/README.md +286 -286
  21. package/skills/ai-engine/SKILL.md +265 -265
  22. package/skills/ai-engine/agents/openai.yaml +4 -4
  23. package/skills/ai-platform-governance/SKILL.md +177 -177
  24. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  25. package/skills/app-store/SKILL.md +396 -396
  26. package/skills/app-store/agents/openai.yaml +4 -4
  27. package/skills/business-blueprint/SKILL.md +193 -193
  28. package/skills/datasource-engine/SKILL.md +90 -90
  29. package/skills/datasource-engine/agents/openai.yaml +4 -4
  30. package/skills/dos-orm/references/api-reference.md +229 -229
  31. package/skills/email-engine/SKILL.md +78 -78
  32. package/skills/email-engine/references/v8-email.md +34 -34
  33. package/skills/job-engine/SKILL.md +172 -172
  34. package/skills/job-engine/agents/openai.yaml +4 -4
  35. package/skills/message-notification/SKILL.md +156 -156
  36. package/skills/message-notification/agents/openai.yaml +5 -5
  37. package/skills/message-notification/references/contracts.md +102 -102
  38. package/skills/microi-ai-app-auth.js +652 -652
  39. package/skills/microi-ai-application/SKILL.md +106 -106
  40. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  41. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  42. package/skills/microi-client-frontend/SKILL.md +237 -237
  43. 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
  44. 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
  45. 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
  46. package/skills/microi-codex/SKILL.md +72 -70
  47. package/skills/microi-codex-installer/SKILL.md +225 -223
  48. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  49. package/skills/microi-datasource-mapping/SKILL.md +108 -108
  50. package/skills/microi-db-schema/SKILL.md +175 -175
  51. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  52. package/skills/microi-db-schema/references/core-tables.md +695 -695
  53. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  54. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  55. package/skills/microi-db-schema/references/schema.md +646 -646
  56. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  57. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  58. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  59. package/skills/microi-form-engine/SKILL.md +226 -226
  60. package/skills/microi-form-engine/references/component-catalog.md +216 -216
  61. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  62. package/skills/microi-form-layout/SKILL.md +205 -205
  63. 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
  64. package/skills/microi-frontend-sdk/SKILL.md +188 -188
  65. 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
  66. package/skills/microi-left-right-layout/SKILL.md +141 -141
  67. package/skills/microi-microservice/SKILL.md +323 -323
  68. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  69. package/skills/microi-mobile-app-quality/SKILL.md +181 -181
  70. 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
  71. 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
  72. package/skills/microi-solution-quotation/SKILL.md +78 -78
  73. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  74. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  75. package/skills/microi-sso/references/acceptance.md +49 -49
  76. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  77. package/skills/microi-sso/references/inbound.md +53 -53
  78. package/skills/microi-sso/references/outbound.md +39 -39
  79. package/skills/microi-system-delivery/SKILL.md +134 -134
  80. 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
  81. 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 +189 -189
  82. package/skills/microi-ui/SKILL.md +174 -174
  83. 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
  84. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  85. 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
  86. 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
  87. package/skills/microi.v8.js +1921 -1921
  88. package/skills/module-engine/SKILL.md +250 -250
  89. package/skills/module-engine/references/module-config.md +204 -204
  90. package/skills/ocr-engine/SKILL.md +113 -113
  91. package/skills/ocr-engine/agents/openai.yaml +4 -4
  92. package/skills/page-engine/SKILL.md +182 -182
  93. 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
  94. 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
  95. package/skills/performance-testing/SKILL.md +221 -221
  96. package/skills/playwright-e2e/SKILL.md +197 -197
  97. 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
  98. 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
  99. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  100. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  101. package/skills/print-engine/SKILL.md +259 -259
  102. package/skills/production-readonly-audit/SKILL.md +41 -41
  103. package/skills/report-engine/SKILL.md +71 -71
  104. package/skills/report-engine/agents/openai.yaml +4 -4
  105. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  106. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  107. package/skills/search-engine/SKILL.md +75 -75
  108. package/skills/search-engine/agents/openai.yaml +4 -4
  109. package/skills/spider-engine/SKILL.md +190 -190
  110. package/skills/system-observability/SKILL.md +238 -238
  111. package/skills/system-observability/references/memory-incident-triage.md +70 -70
  112. package/skills/translate-engine/SKILL.md +140 -140
  113. package/skills/translate-engine/agents/openai.yaml +4 -4
  114. package/skills/ui-design/SKILL.md +191 -191
  115. package/skills/ui-design/assets/templates/MCI-DESIGN.md +198 -198
  116. package/skills/ui-design/references/design-pattern-library.md +184 -184
  117. package/skills/ui-design/references/mci-design-contract.md +163 -163
  118. 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
  119. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +137 -137
  120. 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
  121. 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
  122. 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
  123. 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
  124. 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
  125. 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 +117 -117
  126. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  127. package/skills/unity-integration/SKILL.md +155 -155
  128. package/skills/unity-integration/agents/openai.yaml +4 -4
  129. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  130. package/skills/unity-integration/references/sdk-api.md +82 -82
  131. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  132. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  133. package/skills/v8-cache-pattern/SKILL.md +306 -306
  134. package/skills/v8-crud-api/SKILL.md +175 -175
  135. 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
  136. 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
  137. package/skills/v8-debugging/SKILL.md +284 -284
  138. package/skills/v8-explorer-tree/SKILL.md +228 -228
  139. package/skills/v8-export-import/SKILL.md +209 -209
  140. 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
  141. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  142. 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
  143. package/skills/v8-file-upload/SKILL.md +263 -263
  144. 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 +101 -101
  145. 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 +150 -150
  146. package/skills/v8-formengine-http/SKILL.md +219 -219
  147. package/skills/v8-frontend-events/SKILL.md +178 -178
  148. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  149. package/skills/v8-frontend-events/references/bluetooth-print.md +246 -246
  150. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  151. package/skills/v8-http-integration/SKILL.md +182 -182
  152. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  153. 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
  154. package/skills/v8-image-processing/SKILL.md +190 -190
  155. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  156. package/skills/v8-image-processing/references/api-reference.md +623 -623
  157. package/skills/v8-menu-buttons/SKILL.md +180 -180
  158. 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
  159. 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
  160. 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
  161. package/skills/v8-mongodb/SKILL.md +192 -192
  162. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  163. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  164. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  165. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  166. package/skills/v8-saas-multi-tenant/SKILL.md +219 -219
  167. package/skills/v8-security/SKILL.md +168 -168
  168. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +198 -198
  169. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -158
  170. package/skills/v8-sql-query/SKILL.md +302 -302
  171. package/skills/v8-table-event/SKILL.md +144 -144
  172. 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 +197 -197
  173. 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
  174. package/skills/v8-tcp-integration/SKILL.md +147 -147
  175. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  176. package/skills/v8-template-engine/SKILL.md +167 -167
  177. package/skills/v8-utilities/SKILL.md +90 -90
  178. package/skills/v8-utilities/references/client-api-index.md +143 -143
  179. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  180. package/skills/v8-utilities/references/server-api-index.md +188 -188
  181. package/skills/v8-workflow/SKILL.md +243 -243
  182. 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
  183. package/skills/vision-engine/SKILL.md +159 -159
  184. package/skills/vision-engine/agents/openai.yaml +4 -4
  185. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  186. package/skills/workspace-conventions/SKILL.md +261 -261
  187. 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 +208 -208
  188. 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 +216 -216
  189. 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,109 +1,109 @@
1
- # v8-table-event 详细参考 1
2
-
3
- > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
-
5
- <!-- microi-progressive:chunk id=v8-table-event-005 sha256=38d1253f165733f4d1064dea9d381c087848f715da8acda7d5aa3bbbee464a86 -->
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=e62b20919da58241cbe816a3b62d9a8eef5b713f8afab776f69c26f87df691c7 -->
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=4187c2ed36373b1ee239c5668c2ec898a52029b3ce5443aba688ffec4a690a8e -->
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=be4accafd23b39c0a2be912d4c0b4f3bc79e43c88604d7a0bfc5637357e13550 -->
101
- ## SubmitAfterServerV8.js — 服务端提交后
102
-
103
- ```javascript
104
- // 此时数据已成功写入数据库(仍在事务中)
105
- // 返回 { Code: 0 } 仍可回滚事务
106
-
1
+ # v8-table-event 详细参考 1
2
+
3
+ > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
+
5
+ <!-- microi-progressive:chunk id=v8-table-event-005 sha256=38d1253f165733f4d1064dea9d381c087848f715da8acda7d5aa3bbbee464a86 -->
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=e62b20919da58241cbe816a3b62d9a8eef5b713f8afab776f69c26f87df691c7 -->
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=4187c2ed36373b1ee239c5668c2ec898a52029b3ce5443aba688ffec4a690a8e -->
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=be4accafd23b39c0a2be912d4c0b4f3bc79e43c88604d7a0bfc5637357e13550 -->
101
+ ## SubmitAfterServerV8.js — 服务端提交后
102
+
103
+ ```javascript
104
+ // 此时数据已成功写入数据库(仍在事务中)
105
+ // 返回 { Code: 0 } 仍可回滚事务
106
+
107
107
  // 新增后:自动创建关联数据。保持默认 Server 调用,不触发目标表事件
108
108
  if (V8.FormSubmitAction === 'Insert') {
109
109
  V8.FormEngine.AddFormData('UserProfile', {
@@ -111,106 +111,106 @@ if (V8.FormSubmitAction === 'Insert') {
111
111
  NickName: V8.Form.Name
112
112
  }, V8.DbTrans);
113
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
- // 记录操作日志
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
132
  V8.Method.AddSysLog({
133
- Title: V8.FormSubmitAction + ' ' + V8.TableModel.Name,
134
- Content: JSON.stringify({ Id: V8.Form.Id }),
135
- Type: '业务日志'
133
+ Title: V8.FormSubmitAction + ' ' + V8.TableModel.Name,
134
+ Content: JSON.stringify({ Id: V8.Form.Id }),
135
+ Type: '业务日志'
136
136
  });
137
137
  ```
138
138
 
139
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=d415302a8108d9e11755a046bdbffe0c84a135ec6ed0e6b1dc3fc128a8ef38b6 -->
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=98cd7d87efe30386f8ddfdd52e6d6f3a13e7b69ab4b9b83663aa05472ee144f2 -->
178
- ## 事件上下文变量
179
-
180
- ### 前端事件
181
-
182
- | 变量 | 说明 | 可用事件 |
183
- |------|------|---------|
140
+
141
+ <!-- /microi-progressive:chunk -->
142
+ <!-- microi-progressive:chunk id=v8-table-event-009 sha256=d415302a8108d9e11755a046bdbffe0c84a135ec6ed0e6b1dc3fc128a8ef38b6 -->
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=98cd7d87efe30386f8ddfdd52e6d6f3a13e7b69ab4b9b83663aa05472ee144f2 -->
178
+ ## 事件上下文变量
179
+
180
+ ### 前端事件
181
+
182
+ | 变量 | 说明 | 可用事件 |
183
+ |------|------|---------|
184
184
  | `V8.Form` | 当前表单数据;原生新增提交前可能没有 Id,依赖真实主键的跨表写入在提交后事件执行 | 全部 |
185
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 | 全部 |
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
192
  | `V8.SelectedData` / `V8.TableRowSelected` | 选中的行数组 | 列表/批量按钮 |
193
- | `V8.CurrentTableData` | 当前表当页数据 | 全部 |
194
- | `V8.ClientType` | `'PC'`/`'IOS'`/`'Android'`/`'H5'`/`'WeChat'` | 全部 |
193
+ | `V8.CurrentTableData` | 当前表当页数据 | 全部 |
194
+ | `V8.ClientType` | `'PC'`/`'IOS'`/`'Android'`/`'H5'`/`'WeChat'` | 全部 |
195
195
  | `V8.ThisValue` | 当前字段新值:可能是对象、原始值或行内 `{New,Old}` | FieldValueChange |
196
196
  | `V8.OldValue` | 当前字段旧值,仅行内编辑可靠 | 表格行内 FieldValueChange |
197
197
  | `V8.KeyCode` | 键盘事件的键码 | FieldOnKeyup |
198
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 -->
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=80a4d5538406b23ac45b463def94ef977e365b4dffdefdcbb1d31af0cac71830 -->
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=eb7de1dc530ad35ea2b8d9538ef9e6e687bf93f58cf8d278e5db9034085c3abf -->
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=80a4d5538406b23ac45b463def94ef977e365b4dffdefdcbb1d31af0cac71830 -->
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=eb7de1dc530ad35ea2b8d9538ef9e6e687bf93f58cf8d278e5db9034085c3abf -->
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 -->