@microi.net/cli 5.8.5 → 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 (211) 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 +6 -6
  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-trae-windows-launcher.cmd +21 -21
  17. package/scripts/microi-cli-mcp.js +7 -7
  18. package/scripts/microi-cli.js +66 -65
  19. package/scripts/microi-codex-broker.js +450 -450
  20. package/scripts/microi-codex-router.js +618 -618
  21. package/scripts/microi-skills.meta.json +384 -384
  22. package/skills/.microi-skills-version.json +2 -2
  23. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  24. package/skills/README.md +287 -287
  25. package/skills/ai-engine/SKILL.md +269 -265
  26. package/skills/ai-engine/agents/openai.yaml +4 -4
  27. package/skills/ai-engine/references/ai-employees.md +48 -48
  28. package/skills/ai-engine/references/self-hosted-digital-human.md +59 -59
  29. package/skills/ai-platform-governance/SKILL.md +177 -177
  30. package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -190
  31. package/skills/app-store/SKILL.md +525 -525
  32. package/skills/app-store/agents/openai.yaml +4 -4
  33. package/skills/business-blueprint/SKILL.md +193 -193
  34. package/skills/datasource-engine/SKILL.md +93 -93
  35. package/skills/datasource-engine/agents/openai.yaml +4 -4
  36. package/skills/dos-orm/SKILL.md +97 -97
  37. package/skills/dos-orm/references/api-reference.md +229 -229
  38. package/skills/email-engine/SKILL.md +81 -81
  39. package/skills/email-engine/references/v8-email.md +34 -34
  40. package/skills/job-engine/SKILL.md +176 -176
  41. package/skills/job-engine/agents/openai.yaml +4 -4
  42. package/skills/message-notification/SKILL.md +156 -156
  43. package/skills/message-notification/agents/openai.yaml +5 -5
  44. package/skills/message-notification/references/contracts.md +102 -102
  45. package/skills/microi/SKILL.md +14 -14
  46. package/skills/microi-ai-app-auth.js +652 -652
  47. package/skills/microi-ai-application/SKILL.md +115 -115
  48. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  49. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  50. package/skills/microi-client-frontend/SKILL.md +244 -244
  51. 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
  52. 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
  53. 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
  54. package/skills/microi-codex/SKILL.md +102 -102
  55. package/skills/microi-codex-installer/SKILL.md +231 -231
  56. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  57. package/skills/microi-datasource-mapping/SKILL.md +122 -122
  58. package/skills/microi-db-schema/SKILL.md +175 -175
  59. package/skills/microi-db-schema/agents/openai.yaml +4 -4
  60. package/skills/microi-db-schema/references/core-tables.md +695 -695
  61. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  62. package/skills/microi-db-schema/references/schema-overview.md +202 -202
  63. package/skills/microi-db-schema/references/schema.md +646 -646
  64. package/skills/microi-db-schema/references/table-catalog.md +1599 -1599
  65. package/skills/microi-deployment/SKILL.md +221 -221
  66. package/skills/microi-deployment/references/deployment-matrix.md +109 -109
  67. package/skills/microi-docs-coverage/SKILL.md +133 -133
  68. package/skills/microi-docs-coverage/references/capability-map.md +91 -91
  69. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  70. package/skills/microi-form-engine/SKILL.md +333 -333
  71. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  72. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  73. package/skills/microi-form-layout/SKILL.md +205 -205
  74. 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
  75. package/skills/microi-frontend-sdk/SKILL.md +194 -194
  76. 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
  77. package/skills/microi-left-right-layout/SKILL.md +141 -141
  78. package/skills/microi-microservice/SKILL.md +326 -324
  79. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  80. package/skills/microi-mobile-app-quality/SKILL.md +185 -185
  81. 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
  82. 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
  83. package/skills/microi-solution-quotation/SKILL.md +78 -78
  84. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  85. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  86. package/skills/microi-sso/SKILL.md +92 -92
  87. package/skills/microi-sso/references/acceptance.md +49 -49
  88. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  89. package/skills/microi-sso/references/inbound.md +53 -53
  90. package/skills/microi-sso/references/outbound.md +39 -39
  91. package/skills/microi-system-delivery/SKILL.md +137 -137
  92. 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
  93. 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
  94. package/skills/microi-ui/SKILL.md +192 -192
  95. 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
  96. package/skills/microi-uniapp-frontend/SKILL.md +193 -193
  97. 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
  98. 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
  99. package/skills/microi.v8.js +1921 -1921
  100. package/skills/module-engine/SKILL.md +255 -255
  101. package/skills/module-engine/references/module-config.md +204 -204
  102. package/skills/ocr-engine/SKILL.md +113 -113
  103. package/skills/ocr-engine/agents/openai.yaml +4 -4
  104. package/skills/page-engine/SKILL.md +206 -206
  105. package/skills/page-engine/examples/compact-dashboard.json +1444 -1444
  106. 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
  107. 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
  108. package/skills/performance-testing/SKILL.md +221 -221
  109. package/skills/playwright-e2e/SKILL.md +196 -196
  110. 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
  111. 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
  112. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -221
  113. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +115 -115
  114. package/skills/print-engine/SKILL.md +259 -259
  115. package/skills/production-readonly-audit/SKILL.md +41 -41
  116. package/skills/report-engine/SKILL.md +71 -71
  117. package/skills/report-engine/agents/openai.yaml +4 -4
  118. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  119. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  120. package/skills/scripts/sync-embedded-skills.mjs +46 -46
  121. package/skills/scripts/validate-progressive-disclosure.mjs +57 -57
  122. package/skills/search-engine/SKILL.md +75 -75
  123. package/skills/search-engine/agents/openai.yaml +4 -4
  124. package/skills/spider-engine/SKILL.md +190 -190
  125. package/skills/system-observability/SKILL.md +248 -248
  126. package/skills/system-observability/references/memory-incident-triage.md +77 -77
  127. package/skills/translate-engine/SKILL.md +140 -140
  128. package/skills/translate-engine/agents/openai.yaml +4 -4
  129. package/skills/ui-design/SKILL.md +223 -223
  130. package/skills/ui-design/assets/pattern-showcase/app.js +54 -54
  131. package/skills/ui-design/assets/pattern-showcase/index.html +163 -163
  132. package/skills/ui-design/assets/pattern-showcase/styles.css +311 -311
  133. package/skills/ui-design/assets/templates/MCI-DESIGN.md +206 -206
  134. package/skills/ui-design/references/design-pattern-library.md +184 -184
  135. package/skills/ui-design/references/mci-design-contract.md +163 -163
  136. package/skills/ui-design/references/motion-and-media.md +78 -78
  137. package/skills/ui-design/references/product-flow-recipes.md +94 -94
  138. 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
  139. package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +164 -164
  140. 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
  141. 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
  142. 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
  143. 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
  144. 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
  145. 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
  146. package/skills/uniapp-mall-assets/SKILL.md +176 -176
  147. package/skills/unity-integration/SKILL.md +171 -171
  148. package/skills/unity-integration/agents/openai.yaml +4 -4
  149. package/skills/unity-integration/references/ai-app-delivery.md +119 -119
  150. package/skills/unity-integration/references/sdk-api.md +82 -82
  151. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  152. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  153. package/skills/v8-api-config/SKILL.md +388 -388
  154. package/skills/v8-cache-pattern/SKILL.md +312 -312
  155. package/skills/v8-crud-api/SKILL.md +178 -178
  156. 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
  157. 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
  158. package/skills/v8-debugging/SKILL.md +284 -284
  159. package/skills/v8-explorer-tree/SKILL.md +228 -228
  160. package/skills/v8-export-import/SKILL.md +219 -219
  161. 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
  162. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -202
  163. 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
  164. package/skills/v8-file-upload/SKILL.md +284 -284
  165. 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
  166. 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
  167. package/skills/v8-formengine-http/SKILL.md +238 -238
  168. package/skills/v8-frontend-events/SKILL.md +180 -180
  169. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  170. package/skills/v8-frontend-events/references/bluetooth-print.md +258 -258
  171. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -219
  172. package/skills/v8-http-integration/SKILL.md +182 -182
  173. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -220
  174. 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
  175. package/skills/v8-image-processing/SKILL.md +190 -190
  176. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  177. package/skills/v8-image-processing/references/api-reference.md +623 -623
  178. package/skills/v8-menu-buttons/SKILL.md +186 -186
  179. 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
  180. 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
  181. 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
  182. package/skills/v8-mongodb/SKILL.md +200 -200
  183. package/skills/v8-mq-mqtt/SKILL.md +176 -176
  184. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  185. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -181
  186. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  187. package/skills/v8-saas-multi-tenant/SKILL.md +305 -305
  188. package/skills/v8-security/SKILL.md +210 -210
  189. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +200 -200
  190. package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +160 -160
  191. package/skills/v8-sql-query/SKILL.md +302 -302
  192. package/skills/v8-table-event/SKILL.md +176 -176
  193. 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
  194. 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
  195. package/skills/v8-tcp-integration/SKILL.md +147 -147
  196. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  197. package/skills/v8-template-engine/SKILL.md +167 -167
  198. package/skills/v8-utilities/SKILL.md +104 -104
  199. package/skills/v8-utilities/references/client-api-index.md +143 -143
  200. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  201. package/skills/v8-utilities/references/server-api-index.md +188 -188
  202. package/skills/v8-workflow/SKILL.md +252 -252
  203. 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
  204. package/skills/v8-workflow/references/workflow-configuration.md +49 -49
  205. package/skills/vision-engine/SKILL.md +160 -160
  206. package/skills/vision-engine/agents/openai.yaml +4 -4
  207. package/skills/vision-engine/references/architecture-and-acceptance.md +194 -194
  208. package/skills/workspace-conventions/SKILL.md +273 -273
  209. 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
  210. 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
  211. 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,244 +1,244 @@
1
- ---
2
- name: microi-client-frontend
3
- description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue 前端代码,尤其是本地 ApiBase/OsClient URL 切换、浏览器租户隔离、表单引擎、diy-table、diy-form-full、工作流面板、sys_menu 按钮、前端 V8 事件、路由、微服务宿主 keep-alive/TagsView 缓存/白屏恢复,以及页面、弹窗和抽屉行为。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi.Client 前台源码架构说明
9
-
10
- 表单设计保存请求必须使用 `DiyCommon.GetOsClient()`,不能将导入表定义残留的 `OsClient`
11
- 作为传输租户;元数据来源与当前会话租户是不同概念。回归应覆盖从另一租户迁入的表定义,
12
- 验证表和字段保存成功且会话保持有效,不通过放宽后端租户鉴权修复。
13
- 右上角授权类型优先读取公开启动配置 `SysConfig.PlatformEdition`,兼容旧版会话查询;
14
- `SysConfig.HideSystemLicenseVersion` 缺省关闭,标签可点击跳转 `/license`,不能因一次请求失败永久消失。
15
-
16
- <!-- microi-progressive:begin -->
17
- <!-- microi-progressive:chunk id=microi-client-frontend-000 sha256=ea9cdd10772c42cc8202aa50ed3f8bec0a41588b16539b2968f256c7ee05cd3a -->
18
- ## 单行文本插槽按钮约定
19
-
20
- - `diy-input.vue` 的插槽按钮行为存储在 `diy_field.Config.SlotButtonV8Code`。
21
- - 点击事件通过 `CallbackRunV8Code` 进入 `diy-form.vue` 的统一前端 V8 上下文,事件名为 `FieldSlotButtonClick`。
22
- - 禁止再新增或依赖 `OpenTableId` 一类硬编码目标;打开表格、表单、微服务或调用接口均由 V8 代码决定。
23
- - 历史键 `ReadOnlyButton` 继续兼容,设计器显示为【禁用插槽按钮】。
24
-
25
- > 适用于修改 `Microi.Client/` 前台源码。新 AI 对话在动 `Microi.Client/src/views/form-engine` 前,应先阅读本 Skill,避免把分散在 SFC、mixins、utils、路由和低代码配置里的逻辑误判成不存在。
26
-
27
- ---
28
-
29
- <!-- /microi-progressive:chunk -->
30
- <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=83fb9902ca2edddfc8b72de9578f28a6a7df5cadb2626e5ffb0321d62caa0bb0 -->
31
- ## 1. 技术栈和源码入口
32
-
33
- ### 详情评论与代码版本的按需读取
34
-
35
- - 评论用 `/api/FormEngine/AddFormComment`,只传 `ParentFormEngineKey/ParentTableRowId/_SysMenuId/Content/ParentCommentId/RequestId`。服务端固定作者、父表及回复上下文;同一提交重试必须复用 RequestId,兼容 GUID 与平台 `DiyCommon.NewGuid()` 实际生成的 ULID。
36
- - 评论归属为 `diy_comment.ParentTableId + TableRowId`,新表字段与复合索引通过表单引擎应用交付,主库回读保证写后可见。已有 TableId 绑定兼容,空归属历史评论禁止仅按记录 Id 自动猜测或后台回填。
37
- - `/api/FormEngine/GetFormRelatedData` 的版本列表只含元信息;`HistoryContentMode=OnDemand` 时,点击动作再传 `VersionId` 读取一条,并要求返回 `Authorized`。不要把 Data 缓存到列表,不要并发预取全部正文。
38
- - 代码历史只向当前有效的平台管理员开放代码字段白名单;当前行可读不等于历史秘密可读。局部版本比较/加载只涉及快照中的字段,保存继续走正常表单鉴权和事件。
39
- - 不得为了修复右栏恢复调度器通用 FormEngine 状态写回、启动历史回填或无变化版本写入。必须同时运行评论归属/去重、按需读取以及 ScheduleRuntimeTimeWriter、V8CodeVersionService 的性能回归。
40
-
41
- - Vue 3 + Options API + mixins,构建工具是 Vite。
42
- - UI 主要使用 Element Plus、FontAwesome、项目内 `dynamic-icon`。
43
- - 状态入口:`src/pinia`,常用 `useDiyStore()` 读取 `GetCurrentUser`、`OsClient`、终端类型等。
44
- - 低代码主入口集中在 `src/views/form-engine/`,不要只看一个 `.vue` 文件就下结论。
45
-
46
- 常见入口:
47
-
48
- | 场景 | 关键文件 |
49
- |------|----------|
50
- | 列表页 | `diy-table.vue` + `mixins/diy-table-*.mixin.js` |
51
- | 表单容器 | `diy-form-full.vue` + `mixins/diy-form-full-*.mixin.js` |
52
- | 表单字段渲染 | `diy-form.vue` + `mixins/diy-form-*.mixin.js` |
53
- | 字段组件 | `diy-field-component/*.vue` |
54
- | 工作流右侧面板 | `form-right-panel.vue`、`workflow/wf-work-handler.vue` |
55
- | 表单设计器 | `diy-design.vue`、`diy-components/*` |
56
- | 通用 V8/低代码工具 | `src/utils/diy.common.js`、`src/utils/v8-*.js` |
57
-
58
- ---
59
-
60
- <!-- /microi-progressive:chunk -->
61
- <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=794b802f6d332bf124d4b3e1c92e68b785299f4ef5d5b4f58e00ce84bb69488c -->
62
- ## 2. 表单引擎三层结构
63
-
64
- ### 模块级跨端视图
65
-
66
- - Detail/Edit/List/Card 视图属于 `sys_menu`,使用物理字段 `EnableViewSchema`、`ViewSchemaVersion`、`ViewConfigVersion`、`ViewSchema`。其中 `EnableViewSchema` 只控制 Detail/Edit 自定义表单视图,List/Card 有有效配置时始终生效;两个版本字段可空,默认按 `1.0/1` 处理。
67
- - 顶层 PC `diy-table` 即使没有 List ViewSchema,也默认显示约 40 至 52px 的紧凑模块标题。`selectModuleView()` 只能对 List/Card 绕过 `EnableViewSchema`;Detail/Edit 必须继续显式启用,不能被列表 fallback 误接管。
68
- - 存量模块没有 Hero 配置时,PC/移动端从真实 `StatisticsFields`、`DataCount/PageCount`、当前页数值求和或当前页真实状态分布生成兜底指标;当前页口径必须写进标签,严禁随机值或伪造全表汇总。
69
- - `Layout.List.Columns[].MinWidth` 优先于普通 `diy_field.TableWidth` 和末列自适应;缺少持久宽度时按标题/地址、日期/编码、数值、状态等字段语义稳定推断。
70
- - `diy_table.DiyConfig`、`diy_field.DiyConfig`、`sys_menu.DiyConfig` 均为废弃兼容字段;禁止向其中写入任何新功能配置。
71
- - Text、Select、ImgUpload、Map 等数据控件继续放在 `diy-field-component`。
72
- - EntityHero、MetricStrip、ActionGrid、ResponsiveSection 是独立展示区块,放在 `form-view-blocks`,禁止用虚拟字段或 DevComponent 模拟。
73
- - PC 详情使用只读视图渲染器,编辑继续复用完整 `DiyForm`。未被视图区块引用的字段必须有兜底分组,不能因移动端视图精简而丢失 PC 字段。
74
- - 小程序只执行白名单 ActionSchema,不执行任意前端 V8。复杂业务统一调用接口引擎,重要提交校验放在后端表单事件。
75
- - 新视图缺失、禁用或解析失败时必须回退到现有模块/表单,禁止白屏。
76
-
77
- ### `diy-table.vue`
78
-
79
- 列表页/模块页容器,负责:
80
-
81
- - 读取 `sys_menu` 得到 `SysMenuModel`。
82
- - 读取 `diy_table` / `diy_field` 得到表结构和字段列表。
83
- - 渲染搜索、表格、卡片、行按钮、批量按钮、页面按钮、PageTabs。
84
- - 打开表单:通过 `refDiyTable_DiyFormDialog.Init({...})` 调用 `diy-form-full.vue`。
85
- - 权限:`SysMenuId`、`GetCurrentUser._RoleLimits`、`Permission` 控制增删改查和动态按钮。
86
-
87
- 定制页嵌入标准列表时,优先复用 `diy-table` 的运行时 props,不要复制表格实现:
88
-
89
- - `PropsSelectApi`、`PropsRequestParams`:覆盖列表接口并追加业务参数;禁止透传 Token/Authorization。
90
- - `PropsVirtualFields`、`PropsSelectFields`、`PropsSearchFields`:补充接口虚拟字段并精确控制列和搜索项。
91
- - `PropsMenuModelPatch`:仅在当前实例覆盖 `MoreBtns`、`BatchSelectMoreBtns`、`PageTabs`、显隐代码等,不写回 `sys_menu`。
92
- - `PropsHideImportExport`、`PropsHideMoreFunctions`、`PropsHideAdminDesign`:嵌入页需要保持原业务工具边界时隐藏标准辅助工具。
93
- - 业务动作仍由 `ParentV8` 暴露给按钮/模板 V8;`diy-table` 只负责通用渲染、权限和分页。
94
-
95
- ### `diy-form-full.vue`
96
-
97
- 表单外壳,不直接渲染字段。它负责:
98
-
99
- - Page/Dialog/Drawer 三种打开方式。
100
- - 顶部保存、编辑、关闭、删除、`sys_menu.FormBtns` 动态按钮。
101
- - 移动端 FAB 菜单。
102
- - 右侧数据日志、评论、工作流面板。
103
- - 调用内部 `DiyForm` 并接收 `CallbackSetFormData`、`CallbackSetDiyTableModel`。
104
- - 自身根据 `SysMenuId` 拉取 `sys_menu`,再执行 `HandlerBtns/HandlerBtnsAsync` 计算 `FormBtns` 显隐。
105
-
106
- 注意:`diy-form-full.vue` 的方法大量来自 mixins:
107
-
108
- | mixin | 职责 |
109
- |-------|------|
110
- | `diy-form-full-state.mixin.js` | data/computed、路由 Page 模式、mounted/activated/deactivated |
111
- | `diy-form-full-dialog.mixin.js` | OpenDetail、Dialog/Drawer/Page 初始化、关闭和重载 |
112
- | `diy-form-full-data.mixin.js` | 保存、删除、刷新表单/子表等数据操作 |
113
- | `diy-form-full-workflow.mixin.js` | StartWork/SendWork 与表单提交整合 |
114
- | `diy-form-full-mobile.mixin.js` | 移动端 FAB、手势返回、位置保存 |
115
- | `diy-form-full-permission.mixin.js` | 权限判断 |
116
- | `diy-form-full-cleanup.mixin.js` | 清理 watcher、全局事件、引用 |
117
-
118
- ### `diy-form.vue`
119
-
120
- 真正的字段表单,负责:
121
-
122
- - 根据 `diy_field` 分组/Tab/布局渲染字段组件。
123
- - 执行字段前端 V8、表单前端 V8、模板 V8。
124
- - 维护 `FormDiyTableModel`、`OldForm`、`DiyFieldList`。
125
- - 对外 emit `CallbackSetFormData` 和 `CallbackSetDiyTableModel` 给 `diy-form-full.vue`。
126
-
127
- ### 前端 V8 上下文不是固定 DTO
128
-
129
- `DiyCommon.SetV8DefaultValue()` 只创建基础能力,`diy-table.vue`、`diy-form.vue`、`diy-form-full.vue` 和各 mixin 会按事件再挂载动态属性。新增 API 或修正文档时必须同时核对这些入口,不能只看一个 `V8` 对象字面量。
130
-
131
- 常见上下文差异:
132
-
133
- | 场景 | 可靠上下文 |
134
- |------|------------|
135
- | 表单字段值变化 | `V8.Form`、`V8.ThisValue`、`V8.EventName='FieldValueChange'` |
136
- | 普通 `diy-form` 字段变化 | 不保证存在 `V8.OldValue`;需要旧值时应由业务代码自己保存 |
137
- | 列表行内编辑 | `V8.Row`、`V8.RowIndex`、`V8.ThisValue`、`V8.OldValue` |
138
- | 表单字段键盘事件 | `V8.EventName='FieldOnKeyup'`、`V8.KeyCode` |
139
- | 列表字段键盘事件 | `V8.EventName='TableFieldOnKeyup'`、`V8.KeyCode` |
140
- | 字段插槽按钮 | `V8.EventName='FieldSlotButtonClick'`、`V8.Event` |
141
- | 列表按钮/批量按钮 | `V8.Row` 或 `V8.Rows`、`V8.TableRowSelected`、`V8.SysMenuId` |
142
-
143
- `V8.FormSet()` 在普通 `diy-form` 中可能继续触发目标字段 V8;在 `diy-table` 行/模板上下文中通常只更新当前行或模板数据。需要静默赋值时直接修改当前上下文模型,并防止字段事件递归。
144
-
145
- 标准前端 V8 会挂载 `FormEngine`、`ApiEngine`、`DataSourceEngine`、`Http`、`Base64` 等能力;虽然 `DiyCommon.ModuleEngine` 有底层实现,标准全局 V8 当前并未挂载 `V8.ModuleEngine`,文档和编辑器提示不得把它当作可用 API。
146
-
147
- `V8.SysConfig` 是面向浏览器的脱敏公开配置投影,不得依赖其中出现数据库连接串、对象存储密钥、短信/邮件密码或其它 SaaS 私密字段。
148
-
149
- ### 框架来源标识与水印(强制)
150
-
151
- - 微服务和定制组件的来源标识必须由 Microi.Client 宿主统一渲染,子应用不得各自实现。来源标识是框架内置的常驻可发现能力,不得再创建 `RenderSourceBadgeMode`、自动收起、全局关闭等租户配置。
152
- - `V8.OpenAppDialog` / Drawer 等标准弹层的来源标识放在标题文字之后,始终显示且不提供关闭按钮;菜单/整页微服务由 `micro-app/host.vue` 在内容区右上角直接渲染,必须提供只作用于当前页面实例的手动关闭按钮,切换实例后恢复显示。不得依赖外围路由组件猜测菜单微服务,避免动态路由元数据不同步导致漏标。
153
- - 来源标识必须使用可点击的 `button` 语义与 `cursor:pointer`。点击后用可拖动、居中、亮/暗色适配的大圆角 Element Plus 弹层展示 AppKey、PageKey、应用内/框架路由、版本、源码定位、运行入口、发布/挂载状态和租户坐标,并生成可复制的 MCP 修改指令;公开详情不得包含 DiyToken、访问密钥、私有配置或用户敏感字段。
154
- - 框架水印覆盖 `100vw × 100vh` 且固定 `pointer-events:none`。开启后内容空值默认 `$SysTitle$ - $UserName$`(用户名为空回退账号)、方向默认 `DiagonalUp`、密度默认 `Comfortable`、字号空值/0 默认 14,透明度空值/0 默认 30;亮色、深色、弹层、键盘和减少动态效果模式都要验收。
155
-
156
- ### 用户级界面偏好(强制)
157
-
158
- 右上角主题设置的边角风格默认圆角;已安装 `sys_user.CornerStyle` 时从账号偏好恢复,旧租户才使用浏览器本地兼容值。根元素 `data-mci-corner-style` 控制全局角半径,覆盖动态挂载的 Element Plus 弹层。顶栏入口统一使用 40px 触控区域和 20px 图标,AI 入口使用图标组件,不使用图片。模块 `HideTableBanner`、`HideFormBanner` 只在值明确为 `1/true` 时隐藏对应 Banner,并跳过其专属统计请求;未安装开关字段的旧菜单继续显示。
159
-
160
- - 边角风格先读取当前用户 `CornerStyle`:`round/square` 显式覆盖;空值或 `System` 继承租户 `sys_config.CornerStyle`,租户空值默认为圆角。不得把空个人值提前归一为 `round`,否则会阻断租户直角设置。
161
- - 桌面经典布局使用 `NavigationLayout=Side/Top`,个人空值或 `System` 继承租户,租户空值为侧边导航。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。右上角同时配置 `MenuChildExpandMode=System/Down/Right`,通过同一个个人偏好接口跨设备保存。
162
- - 桌面壳层使用视口高度与可收缩的 flex 内容区,只有路由内容滚动,导航和 Tab 不随页面滚动;移动端仍保留文档滚动。用户入口含头像与姓名,不能使用纯图标的固定 flex 宽度;异步图表须在真实 DOM 挂载后观察尺寸变化,避免侧边/顶部导航切换后撑破卡片。
163
- - 主题色、浅色/深色、菜单子级展开方式等需要“换设备仍生效”的选择必须保存到当前 DiyToken 用户的 `sys_user` 白名单字段;`localStorage` 只作为未安装新字段租户和匿名启动阶段的兼容回退,不能作为跨设备事实源。
164
- - 已安装用户偏好字段时优先级固定为“当前用户显式值 → 租户 `sys_config` → 平台安全默认”;个人菜单值 `System` 表示继承租户配置。不得让上一位用户的浏览器本地主题覆盖下一位已登录用户。
165
- - 自助保存优先使用官方 `Managed` 接口引擎,由 `V8.CurrentUser.Id` 与 `V8.OsClient` 推导用户和租户,并在服务端构造固定白名单更新对象;接口参数禁止决定目标 Id/OsClient,也禁止写入 Account、Phone、Tenant、Dept、Role、Level、State、Pwd、认证因子和登录审计字段。只有缺少可复用可信原子能力时才新增 C# DTO/端点。保存成功后调用 `V8.Method.RefreshLoginUser` 刷新登录缓存,并让微服务宿主重新同步 `CurrentUser`。
166
- - 右上角即时切换可以乐观应用并短防抖保存;远端保存失败时保留当前设备效果并明确提示。个人中心和右上角必须调用同一个应用包交付的白名单接口引擎(当前为 `platform-user-update-preferences`),不能分别形成两套字段、枚举或优先级。
167
-
168
- ---
169
-
170
- <!-- /microi-progressive:chunk -->
171
- <!-- microi-progressive:chunk id=microi-client-frontend-003 sha256=301f766dc1ab1c6b021aa861a76b44844905d432393ab407472f58f00d6283cd -->
172
- ## 4. 工作流与表单提交
173
-
174
- 工作流相关文件:
175
-
176
- | 文件 | 说明 |
177
- |------|------|
178
- | `form-right-panel.vue` | 右侧 Tab 容器,展示日志/评论/工作流 |
179
- | `workflow/wf-work-handler.vue` | StartWork/SendWork UI 与提交参数构建 |
180
- | `mixins/diy-form-full-workflow.mixin.js` | 把工作流提交接到 `diy-form-full` 的保存链路 |
181
- | `diy-components/diy-workflow-line-condition.vue` | 条件路线图形配置与 V8 marker 生成 |
182
-
183
- 关键规则:
184
-
185
- - 首次发起流程时,前端可能已经生成 `Id`,但业务表还没有行;必须走 `Add` 或传 `_NoLineForAdd=true`。
186
- - `StartWorkWithForm` 用于“保存表单 + 发起流程”原子化提交。
187
- - 工作流路线标题是拓扑关系 `{起点节点} 到 {终点节点}`,条件名称不能覆盖 `wf_line.LineName`。
188
- - 条件 V8 推荐设置 `V8.NextNodeId`,兼容 `V8.LineValue`。
189
-
190
- ---
191
-
192
- <!-- /microi-progressive:chunk -->
193
- <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=ab17865c6032884ccd896a0eb62387cf7f89edcf337c024f2251563f3bd0e4d9 -->
194
- ## 7. 验证建议
195
-
196
- ### 本地 ApiBase 与 OsClient 解析(强制)
197
-
198
- - 域名发现先于租户确定,固定 `platform-os-client-by-domain` 请求不能自动注入默认或缓存租户,也不能携带旧 Token;显式调用租户仍保持。没有 URL/index.html 租户时,每次冷启动重新发现域名,成功后更新缓存,失败立即停止,不写入 `iTdos` 继续请求配置。配置业务失败不是连接故障,健康检查成功不能触发循环重载;只有确认连接故障后的恢复才重载失败启动页。回归覆盖无缓存、错误缓存、显式租户及失败不重载,使用 `domain-tenant-bootstrap.spec.mjs`。
199
- - 登录回跳使用 Vue Router 解析完整深链接后合并 query/hash;对象式 `push({path, query})` 的 query 会覆盖 path 中原有参数,不能直接传空对象导致记录 Id 丢失。使用 `login-deep-link-query.spec.mjs` 验证编号、编码参数、重复参数和锚点。
200
-
201
- - `app.use(router)` 会立即触发首个路由守卫。守卫中的 SSO、认证、菜单请求必须等待 `initApp()` 完成真实租户和系统配置初始化;初始化失败时取消导航并保留启动错误界面。释放初始化等待必须早于 `router.isReady()`,避免彼此等待;禁止将缓存尚未建立时的 `GetOsClient()` 默认值 `iTdos` 发给客户服务器。
202
-
203
- - 身份和菜单只读初始化的短暂失败最多读取三次,间隔 300/1000ms;认证失效立即回登录页并保留原深链接,HTTP 403 和已耗尽的菜单依赖重试不得继续重试。重试期间退出登录应停止后续读取,不得用清空 Token、伪造角色或放行保护路由掩盖错误。持续失败用 `next(error)` 保留身份/菜单阶段和原始原因,禁止用 `next(false)` 把它替换为 `Navigation aborted`;启动界面不能据此断言后端断网。当前用户请求的传输失败必须 reject,不能留下永久 pending 的 Promise。修改这条链路时运行 `route-bootstrap-recovery.spec.mjs`,并用真实路由验证健康登录、短暂失败恢复、持续失败提示和过期会话跳转。
204
-
205
- - `ApiServiceUnavailable` 确认连接故障后,每轮探测结束 5 秒后继续请求固定匿名健康接口;单次请求超时 5 秒,自动与手动检测共用在途请求。后端返回有效健康正文后停止轮询,启动失败的页面只重载一次原 URL,已经就绪的业务页面原地撤掉异常层并保留输入,禁止重放失败的业务写入。旧版健康接口也必须返回有效的 Healthy 正文,不能把反向代理 HTML/404 当作恢复。安全拦截继续按后端解除时间检查,不用连接故障轮询缩短封禁。定向回归使用 `api-service-recovery.spec.mjs` 与 `api-service-status.spec.mjs`,浏览器必须验证断连到自动恢复全过程。
206
-
207
- - `src/config.json.ApiBaseDev` 是本地默认 API;URL 中 `#` 之前的 `ApiBase`、`OsClient` 必须同时
208
- 高于 `index.html`、config、Pinia 与 localStorage。解析统一走
209
- `src/utils/runtime-endpoint-query.js`,禁止在新入口另写正则形成不同优先级。
210
- - URL 只允许有效的 HTTP(S) ApiBase 和安全 OsClient。页面初始化后通过不含 Token 的
211
- `window.__MICROI_RUNTIME_ENDPOINT__` 暴露实际值,便于 AI/自动化确认没有误连配置文件中的服务器。
212
- - 页面已解析的租户必须进入真实 HTTP 请求。`DiyCommon.UseAxios/UseAxiosAll` 与共享 axios 请求层统一通过 `request-tenant-context.js` 补当前 API 的 `osclient` 请求头;保留调用者显式的路径、Query、参数或 Header 租户,不给其它服务器或相邻 API 子路径自动添加页面租户。JSON 正文在动态路由阶段可能尚未读取,不能只依赖正文或旧 Token 选择租户。验收必须增加同源旧 Token 指向其它/不存在租户的真实后端场景:`platform-current-user` 应走页面租户并返回登录失效,保留原深链接进入登录页,不得显示“无法确认接口配置”或让 SSO 发现返回错误租户的 404;定向回归为 `request-tenant-context.spec.mjs`。
213
- - 首次身份读取的业务/传输失败交给路由守卫处理,`getInfo` 不调用带全局通知副作用的 `DiyCommon.Result`,同时抑制请求层通知和抢先登录跳转;`App.PageInit` 等待首次导航成功后再启动续签/用户刷新,导航失败时结束。既要验证干净会话,也要验证旧登录缓存和失败后重复刷新,不能以隔离浏览器成功代替用户当前会话验收。
214
- - 同源浏览器窗口仍共享 Token、CurrentUser 等持久化状态。不同 `ApiBase + OsClient` 并行测试必须
215
- 使用独立 browser context/profile;URL 最高优先级不等于登录态隔离。
216
- - 修改该链路时运行 `node --test tests/runtime-endpoint-query.spec.mjs`,再使用两个独立
217
- `browser.newContext()` 验证两组运行目标互不串号。
218
-
219
- ### 菜单微服务缓存与恢复(强制)
220
-
221
- - 首次挂载分开检查资源下载与渲染:下载最多 60 秒,`beforemount` 资源齐备后才开始原有 12 秒渲染期限;不得在资源正常下载时提前销毁沙箱。成功仍要求真实可见 DOM,保留一次自愈与旧实例保护。回归覆盖超过 12 秒的真实下载、下载停滞、渲染停滞和陈旧实例事件。
222
-
223
- - 动态菜单宿主的 Vue 路由保持 `keepAlive:false`,由 `<micro-app keep-alive>` 独占运行时状态;契约固定为 `runtime-keep-alive`,禁止 Vue `KeepAlive` 和 micro-app 双层缓存。
224
- - 每个顶部 Tab 按完整路由生成稳定实例身份,最多保留 5 个隐藏实例并按 LRU 淘汰。关闭 Tab、退出登录、Token/角色变化以及版本或入口变化时必须精确销毁对应运行时。
225
- - 恢复时强制同步宿主上下文并检查真实可见 DOM;子应用监听 `appstate-change`,在 `afterhidden` 幂等暂停轮询、WebSocket 和观察器,在 `aftershow` 幂等恢复并重新测量布局,同时保留用户输入、筛选、滚动和内部路由。
226
- - 修改宿主、TagsView 或权限路由时,必须同时读取 [Vue3 前端微服务宿主规则](references/progressive-03-vue3-前端微服务宿主规则.md) 并运行微服务缓存契约测试。
227
-
228
- - 修改 Vue/JS 后先跑 VS Code Problems 或 `get_errors`。
229
- - 宿主按钮重置只作用于 `button:not(:focus-visible)`,不能用全局 `outline:none !important` 覆盖组件或微应用的键盘焦点。微应用保留自己的边框形状,焦点色使用已适配明暗表面的 `--mci-text-link`(缺省回退正文语义色),不能直接用浅品牌色。真实 Tab/Shift+Tab 回归须核对 `:focus-visible`、实际 `outline-style`、宽度、颜色与至少 3:1 对比度;`outline-style:none` 即使宽度非零也不可见。使用阴影焦点时另验实际 `box-shadow`,不能只看焦点状态。平台样式组件回归归 Full,应用自身按钮继续在真实业务页面验收。
230
- - 影响核心前端时跑 `Microi.Client` 的 `npm run build`。
231
- - 如果改了工作流、表单保存、按钮 V8,建议用实际 `sys_menu` 配置测试:
232
- - `FormBtns` 是否出现在表单右上角/FAB。
233
-
234
- ---
235
-
236
- <!-- /microi-progressive:chunk -->
237
- ## 详细参考路由(渐进披露)
238
-
239
- 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
240
-
241
- - [references/progressive-01-3-动态按钮系统.md](references/progressive-01-3-动态按钮系统.md):3. 动态按钮系统;5. 路由与打开方式;6. 修改前必查清单
242
- - [references/progressive-02-8-运行时高频坑复盘.md](references/progressive-02-8-运行时高频坑复盘.md):8. 运行时高频坑复盘;7.1 登录验证码与 Sys_Config;Microi 前端 SDK 约束
243
- - [references/progressive-03-vue3-前端微服务宿主规则.md](references/progressive-03-vue3-前端微服务宿主规则.md):Vue3 前端微服务宿主规则;在线 AI 应用与微服务页面协作;浏览器访问密钥路由
244
- <!-- microi-progressive:end -->
1
+ ---
2
+ name: microi-client-frontend
3
+ description: Microi.Client 源码架构指南。用于修改 Microi.Client Vue 前端代码,尤其是本地 ApiBase/OsClient URL 切换、浏览器租户隔离、表单引擎、diy-table、diy-form-full、工作流面板、sys_menu 按钮、前端 V8 事件、路由、微服务宿主 keep-alive/TagsView 缓存/白屏恢复,以及页面、弹窗和抽屉行为。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi.Client 前台源码架构说明
9
+
10
+ 表单设计保存请求必须使用 `DiyCommon.GetOsClient()`,不能将导入表定义残留的 `OsClient`
11
+ 作为传输租户;元数据来源与当前会话租户是不同概念。回归应覆盖从另一租户迁入的表定义,
12
+ 验证表和字段保存成功且会话保持有效,不通过放宽后端租户鉴权修复。
13
+ 右上角授权类型优先读取公开启动配置 `SysConfig.PlatformEdition`,兼容旧版会话查询;
14
+ `SysConfig.HideSystemLicenseVersion` 缺省关闭,标签可点击跳转 `/license`,不能因一次请求失败永久消失。
15
+
16
+ <!-- microi-progressive:begin -->
17
+ <!-- microi-progressive:chunk id=microi-client-frontend-000 sha256=ea9cdd10772c42cc8202aa50ed3f8bec0a41588b16539b2968f256c7ee05cd3a -->
18
+ ## 单行文本插槽按钮约定
19
+
20
+ - `diy-input.vue` 的插槽按钮行为存储在 `diy_field.Config.SlotButtonV8Code`。
21
+ - 点击事件通过 `CallbackRunV8Code` 进入 `diy-form.vue` 的统一前端 V8 上下文,事件名为 `FieldSlotButtonClick`。
22
+ - 禁止再新增或依赖 `OpenTableId` 一类硬编码目标;打开表格、表单、微服务或调用接口均由 V8 代码决定。
23
+ - 历史键 `ReadOnlyButton` 继续兼容,设计器显示为【禁用插槽按钮】。
24
+
25
+ > 适用于修改 `Microi.Client/` 前台源码。新 AI 对话在动 `Microi.Client/src/views/form-engine` 前,应先阅读本 Skill,避免把分散在 SFC、mixins、utils、路由和低代码配置里的逻辑误判成不存在。
26
+
27
+ ---
28
+
29
+ <!-- /microi-progressive:chunk -->
30
+ <!-- microi-progressive:chunk id=microi-client-frontend-001 sha256=83fb9902ca2edddfc8b72de9578f28a6a7df5cadb2626e5ffb0321d62caa0bb0 -->
31
+ ## 1. 技术栈和源码入口
32
+
33
+ ### 详情评论与代码版本的按需读取
34
+
35
+ - 评论用 `/api/FormEngine/AddFormComment`,只传 `ParentFormEngineKey/ParentTableRowId/_SysMenuId/Content/ParentCommentId/RequestId`。服务端固定作者、父表及回复上下文;同一提交重试必须复用 RequestId,兼容 GUID 与平台 `DiyCommon.NewGuid()` 实际生成的 ULID。
36
+ - 评论归属为 `diy_comment.ParentTableId + TableRowId`,新表字段与复合索引通过表单引擎应用交付,主库回读保证写后可见。已有 TableId 绑定兼容,空归属历史评论禁止仅按记录 Id 自动猜测或后台回填。
37
+ - `/api/FormEngine/GetFormRelatedData` 的版本列表只含元信息;`HistoryContentMode=OnDemand` 时,点击动作再传 `VersionId` 读取一条,并要求返回 `Authorized`。不要把 Data 缓存到列表,不要并发预取全部正文。
38
+ - 代码历史只向当前有效的平台管理员开放代码字段白名单;当前行可读不等于历史秘密可读。局部版本比较/加载只涉及快照中的字段,保存继续走正常表单鉴权和事件。
39
+ - 不得为了修复右栏恢复调度器通用 FormEngine 状态写回、启动历史回填或无变化版本写入。必须同时运行评论归属/去重、按需读取以及 ScheduleRuntimeTimeWriter、V8CodeVersionService 的性能回归。
40
+
41
+ - Vue 3 + Options API + mixins,构建工具是 Vite。
42
+ - UI 主要使用 Element Plus、FontAwesome、项目内 `dynamic-icon`。
43
+ - 状态入口:`src/pinia`,常用 `useDiyStore()` 读取 `GetCurrentUser`、`OsClient`、终端类型等。
44
+ - 低代码主入口集中在 `src/views/form-engine/`,不要只看一个 `.vue` 文件就下结论。
45
+
46
+ 常见入口:
47
+
48
+ | 场景 | 关键文件 |
49
+ |------|----------|
50
+ | 列表页 | `diy-table.vue` + `mixins/diy-table-*.mixin.js` |
51
+ | 表单容器 | `diy-form-full.vue` + `mixins/diy-form-full-*.mixin.js` |
52
+ | 表单字段渲染 | `diy-form.vue` + `mixins/diy-form-*.mixin.js` |
53
+ | 字段组件 | `diy-field-component/*.vue` |
54
+ | 工作流右侧面板 | `form-right-panel.vue`、`workflow/wf-work-handler.vue` |
55
+ | 表单设计器 | `diy-design.vue`、`diy-components/*` |
56
+ | 通用 V8/低代码工具 | `src/utils/diy.common.js`、`src/utils/v8-*.js` |
57
+
58
+ ---
59
+
60
+ <!-- /microi-progressive:chunk -->
61
+ <!-- microi-progressive:chunk id=microi-client-frontend-002 sha256=794b802f6d332bf124d4b3e1c92e68b785299f4ef5d5b4f58e00ce84bb69488c -->
62
+ ## 2. 表单引擎三层结构
63
+
64
+ ### 模块级跨端视图
65
+
66
+ - Detail/Edit/List/Card 视图属于 `sys_menu`,使用物理字段 `EnableViewSchema`、`ViewSchemaVersion`、`ViewConfigVersion`、`ViewSchema`。其中 `EnableViewSchema` 只控制 Detail/Edit 自定义表单视图,List/Card 有有效配置时始终生效;两个版本字段可空,默认按 `1.0/1` 处理。
67
+ - 顶层 PC `diy-table` 即使没有 List ViewSchema,也默认显示约 40 至 52px 的紧凑模块标题。`selectModuleView()` 只能对 List/Card 绕过 `EnableViewSchema`;Detail/Edit 必须继续显式启用,不能被列表 fallback 误接管。
68
+ - 存量模块没有 Hero 配置时,PC/移动端从真实 `StatisticsFields`、`DataCount/PageCount`、当前页数值求和或当前页真实状态分布生成兜底指标;当前页口径必须写进标签,严禁随机值或伪造全表汇总。
69
+ - `Layout.List.Columns[].MinWidth` 优先于普通 `diy_field.TableWidth` 和末列自适应;缺少持久宽度时按标题/地址、日期/编码、数值、状态等字段语义稳定推断。
70
+ - `diy_table.DiyConfig`、`diy_field.DiyConfig`、`sys_menu.DiyConfig` 均为废弃兼容字段;禁止向其中写入任何新功能配置。
71
+ - Text、Select、ImgUpload、Map 等数据控件继续放在 `diy-field-component`。
72
+ - EntityHero、MetricStrip、ActionGrid、ResponsiveSection 是独立展示区块,放在 `form-view-blocks`,禁止用虚拟字段或 DevComponent 模拟。
73
+ - PC 详情使用只读视图渲染器,编辑继续复用完整 `DiyForm`。未被视图区块引用的字段必须有兜底分组,不能因移动端视图精简而丢失 PC 字段。
74
+ - 小程序只执行白名单 ActionSchema,不执行任意前端 V8。复杂业务统一调用接口引擎,重要提交校验放在后端表单事件。
75
+ - 新视图缺失、禁用或解析失败时必须回退到现有模块/表单,禁止白屏。
76
+
77
+ ### `diy-table.vue`
78
+
79
+ 列表页/模块页容器,负责:
80
+
81
+ - 读取 `sys_menu` 得到 `SysMenuModel`。
82
+ - 读取 `diy_table` / `diy_field` 得到表结构和字段列表。
83
+ - 渲染搜索、表格、卡片、行按钮、批量按钮、页面按钮、PageTabs。
84
+ - 打开表单:通过 `refDiyTable_DiyFormDialog.Init({...})` 调用 `diy-form-full.vue`。
85
+ - 权限:`SysMenuId`、`GetCurrentUser._RoleLimits`、`Permission` 控制增删改查和动态按钮。
86
+
87
+ 定制页嵌入标准列表时,优先复用 `diy-table` 的运行时 props,不要复制表格实现:
88
+
89
+ - `PropsSelectApi`、`PropsRequestParams`:覆盖列表接口并追加业务参数;禁止透传 Token/Authorization。
90
+ - `PropsVirtualFields`、`PropsSelectFields`、`PropsSearchFields`:补充接口虚拟字段并精确控制列和搜索项。
91
+ - `PropsMenuModelPatch`:仅在当前实例覆盖 `MoreBtns`、`BatchSelectMoreBtns`、`PageTabs`、显隐代码等,不写回 `sys_menu`。
92
+ - `PropsHideImportExport`、`PropsHideMoreFunctions`、`PropsHideAdminDesign`:嵌入页需要保持原业务工具边界时隐藏标准辅助工具。
93
+ - 业务动作仍由 `ParentV8` 暴露给按钮/模板 V8;`diy-table` 只负责通用渲染、权限和分页。
94
+
95
+ ### `diy-form-full.vue`
96
+
97
+ 表单外壳,不直接渲染字段。它负责:
98
+
99
+ - Page/Dialog/Drawer 三种打开方式。
100
+ - 顶部保存、编辑、关闭、删除、`sys_menu.FormBtns` 动态按钮。
101
+ - 移动端 FAB 菜单。
102
+ - 右侧数据日志、评论、工作流面板。
103
+ - 调用内部 `DiyForm` 并接收 `CallbackSetFormData`、`CallbackSetDiyTableModel`。
104
+ - 自身根据 `SysMenuId` 拉取 `sys_menu`,再执行 `HandlerBtns/HandlerBtnsAsync` 计算 `FormBtns` 显隐。
105
+
106
+ 注意:`diy-form-full.vue` 的方法大量来自 mixins:
107
+
108
+ | mixin | 职责 |
109
+ |-------|------|
110
+ | `diy-form-full-state.mixin.js` | data/computed、路由 Page 模式、mounted/activated/deactivated |
111
+ | `diy-form-full-dialog.mixin.js` | OpenDetail、Dialog/Drawer/Page 初始化、关闭和重载 |
112
+ | `diy-form-full-data.mixin.js` | 保存、删除、刷新表单/子表等数据操作 |
113
+ | `diy-form-full-workflow.mixin.js` | StartWork/SendWork 与表单提交整合 |
114
+ | `diy-form-full-mobile.mixin.js` | 移动端 FAB、手势返回、位置保存 |
115
+ | `diy-form-full-permission.mixin.js` | 权限判断 |
116
+ | `diy-form-full-cleanup.mixin.js` | 清理 watcher、全局事件、引用 |
117
+
118
+ ### `diy-form.vue`
119
+
120
+ 真正的字段表单,负责:
121
+
122
+ - 根据 `diy_field` 分组/Tab/布局渲染字段组件。
123
+ - 执行字段前端 V8、表单前端 V8、模板 V8。
124
+ - 维护 `FormDiyTableModel`、`OldForm`、`DiyFieldList`。
125
+ - 对外 emit `CallbackSetFormData` 和 `CallbackSetDiyTableModel` 给 `diy-form-full.vue`。
126
+
127
+ ### 前端 V8 上下文不是固定 DTO
128
+
129
+ `DiyCommon.SetV8DefaultValue()` 只创建基础能力,`diy-table.vue`、`diy-form.vue`、`diy-form-full.vue` 和各 mixin 会按事件再挂载动态属性。新增 API 或修正文档时必须同时核对这些入口,不能只看一个 `V8` 对象字面量。
130
+
131
+ 常见上下文差异:
132
+
133
+ | 场景 | 可靠上下文 |
134
+ |------|------------|
135
+ | 表单字段值变化 | `V8.Form`、`V8.ThisValue`、`V8.EventName='FieldValueChange'` |
136
+ | 普通 `diy-form` 字段变化 | 不保证存在 `V8.OldValue`;需要旧值时应由业务代码自己保存 |
137
+ | 列表行内编辑 | `V8.Row`、`V8.RowIndex`、`V8.ThisValue`、`V8.OldValue` |
138
+ | 表单字段键盘事件 | `V8.EventName='FieldOnKeyup'`、`V8.KeyCode` |
139
+ | 列表字段键盘事件 | `V8.EventName='TableFieldOnKeyup'`、`V8.KeyCode` |
140
+ | 字段插槽按钮 | `V8.EventName='FieldSlotButtonClick'`、`V8.Event` |
141
+ | 列表按钮/批量按钮 | `V8.Row` 或 `V8.Rows`、`V8.TableRowSelected`、`V8.SysMenuId` |
142
+
143
+ `V8.FormSet()` 在普通 `diy-form` 中可能继续触发目标字段 V8;在 `diy-table` 行/模板上下文中通常只更新当前行或模板数据。需要静默赋值时直接修改当前上下文模型,并防止字段事件递归。
144
+
145
+ 标准前端 V8 会挂载 `FormEngine`、`ApiEngine`、`DataSourceEngine`、`Http`、`Base64` 等能力;虽然 `DiyCommon.ModuleEngine` 有底层实现,标准全局 V8 当前并未挂载 `V8.ModuleEngine`,文档和编辑器提示不得把它当作可用 API。
146
+
147
+ `V8.SysConfig` 是面向浏览器的脱敏公开配置投影,不得依赖其中出现数据库连接串、对象存储密钥、短信/邮件密码或其它 SaaS 私密字段。
148
+
149
+ ### 框架来源标识与水印(强制)
150
+
151
+ - 微服务和定制组件的来源标识必须由 Microi.Client 宿主统一渲染,子应用不得各自实现。来源标识是框架内置的常驻可发现能力,不得再创建 `RenderSourceBadgeMode`、自动收起、全局关闭等租户配置。
152
+ - `V8.OpenAppDialog` / Drawer 等标准弹层的来源标识放在标题文字之后,始终显示且不提供关闭按钮;菜单/整页微服务由 `micro-app/host.vue` 在内容区右上角直接渲染,必须提供只作用于当前页面实例的手动关闭按钮,切换实例后恢复显示。不得依赖外围路由组件猜测菜单微服务,避免动态路由元数据不同步导致漏标。
153
+ - 来源标识必须使用可点击的 `button` 语义与 `cursor:pointer`。点击后用可拖动、居中、亮/暗色适配的大圆角 Element Plus 弹层展示 AppKey、PageKey、应用内/框架路由、版本、源码定位、运行入口、发布/挂载状态和租户坐标,并生成可复制的 MCP 修改指令;公开详情不得包含 DiyToken、访问密钥、私有配置或用户敏感字段。
154
+ - 框架水印覆盖 `100vw × 100vh` 且固定 `pointer-events:none`。开启后内容空值默认 `$SysTitle$ - $UserName$`(用户名为空回退账号)、方向默认 `DiagonalUp`、密度默认 `Comfortable`、字号空值/0 默认 14,透明度空值/0 默认 30;亮色、深色、弹层、键盘和减少动态效果模式都要验收。
155
+
156
+ ### 用户级界面偏好(强制)
157
+
158
+ 右上角主题设置的边角风格默认圆角;已安装 `sys_user.CornerStyle` 时从账号偏好恢复,旧租户才使用浏览器本地兼容值。根元素 `data-mci-corner-style` 控制全局角半径,覆盖动态挂载的 Element Plus 弹层。顶栏入口统一使用 40px 触控区域和 20px 图标,AI 入口使用图标组件,不使用图片。模块 `HideTableBanner`、`HideFormBanner` 只在值明确为 `1/true` 时隐藏对应 Banner,并跳过其专属统计请求;未安装开关字段的旧菜单继续显示。
159
+
160
+ - 边角风格先读取当前用户 `CornerStyle`:`round/square` 显式覆盖;空值或 `System` 继承租户 `sys_config.CornerStyle`,租户空值默认为圆角。不得把空个人值提前归一为 `round`,否则会阻断租户直角设置。
161
+ - 桌面经典布局使用 `NavigationLayout=Side/Top`,个人空值或 `System` 继承租户,租户空值为侧边导航。顶部导航复用当前权限路由、角标与外链,空间不足收纳到更多菜单;移动端仍采用底部导航。右上角同时配置 `MenuChildExpandMode=System/Down/Right`,通过同一个个人偏好接口跨设备保存。
162
+ - 桌面壳层使用视口高度与可收缩的 flex 内容区,只有路由内容滚动,导航和 Tab 不随页面滚动;移动端仍保留文档滚动。用户入口含头像与姓名,不能使用纯图标的固定 flex 宽度;异步图表须在真实 DOM 挂载后观察尺寸变化,避免侧边/顶部导航切换后撑破卡片。
163
+ - 主题色、浅色/深色、菜单子级展开方式等需要“换设备仍生效”的选择必须保存到当前 DiyToken 用户的 `sys_user` 白名单字段;`localStorage` 只作为未安装新字段租户和匿名启动阶段的兼容回退,不能作为跨设备事实源。
164
+ - 已安装用户偏好字段时优先级固定为“当前用户显式值 → 租户 `sys_config` → 平台安全默认”;个人菜单值 `System` 表示继承租户配置。不得让上一位用户的浏览器本地主题覆盖下一位已登录用户。
165
+ - 自助保存优先使用官方 `Managed` 接口引擎,由 `V8.CurrentUser.Id` 与 `V8.OsClient` 推导用户和租户,并在服务端构造固定白名单更新对象;接口参数禁止决定目标 Id/OsClient,也禁止写入 Account、Phone、Tenant、Dept、Role、Level、State、Pwd、认证因子和登录审计字段。只有缺少可复用可信原子能力时才新增 C# DTO/端点。保存成功后调用 `V8.Method.RefreshLoginUser` 刷新登录缓存,并让微服务宿主重新同步 `CurrentUser`。
166
+ - 右上角即时切换可以乐观应用并短防抖保存;远端保存失败时保留当前设备效果并明确提示。个人中心和右上角必须调用同一个应用包交付的白名单接口引擎(当前为 `platform-user-update-preferences`),不能分别形成两套字段、枚举或优先级。
167
+
168
+ ---
169
+
170
+ <!-- /microi-progressive:chunk -->
171
+ <!-- microi-progressive:chunk id=microi-client-frontend-003 sha256=301f766dc1ab1c6b021aa861a76b44844905d432393ab407472f58f00d6283cd -->
172
+ ## 4. 工作流与表单提交
173
+
174
+ 工作流相关文件:
175
+
176
+ | 文件 | 说明 |
177
+ |------|------|
178
+ | `form-right-panel.vue` | 右侧 Tab 容器,展示日志/评论/工作流 |
179
+ | `workflow/wf-work-handler.vue` | StartWork/SendWork UI 与提交参数构建 |
180
+ | `mixins/diy-form-full-workflow.mixin.js` | 把工作流提交接到 `diy-form-full` 的保存链路 |
181
+ | `diy-components/diy-workflow-line-condition.vue` | 条件路线图形配置与 V8 marker 生成 |
182
+
183
+ 关键规则:
184
+
185
+ - 首次发起流程时,前端可能已经生成 `Id`,但业务表还没有行;必须走 `Add` 或传 `_NoLineForAdd=true`。
186
+ - `StartWorkWithForm` 用于“保存表单 + 发起流程”原子化提交。
187
+ - 工作流路线标题是拓扑关系 `{起点节点} 到 {终点节点}`,条件名称不能覆盖 `wf_line.LineName`。
188
+ - 条件 V8 推荐设置 `V8.NextNodeId`,兼容 `V8.LineValue`。
189
+
190
+ ---
191
+
192
+ <!-- /microi-progressive:chunk -->
193
+ <!-- microi-progressive:chunk id=microi-client-frontend-004 sha256=ab17865c6032884ccd896a0eb62387cf7f89edcf337c024f2251563f3bd0e4d9 -->
194
+ ## 7. 验证建议
195
+
196
+ ### 本地 ApiBase 与 OsClient 解析(强制)
197
+
198
+ - 域名发现先于租户确定,固定 `platform-os-client-by-domain` 请求不能自动注入默认或缓存租户,也不能携带旧 Token;显式调用租户仍保持。没有 URL/index.html 租户时,每次冷启动重新发现域名,成功后更新缓存,失败立即停止,不写入 `iTdos` 继续请求配置。配置业务失败不是连接故障,健康检查成功不能触发循环重载;只有确认连接故障后的恢复才重载失败启动页。回归覆盖无缓存、错误缓存、显式租户及失败不重载,使用 `domain-tenant-bootstrap.spec.mjs`。
199
+ - 登录回跳使用 Vue Router 解析完整深链接后合并 query/hash;对象式 `push({path, query})` 的 query 会覆盖 path 中原有参数,不能直接传空对象导致记录 Id 丢失。使用 `login-deep-link-query.spec.mjs` 验证编号、编码参数、重复参数和锚点。
200
+
201
+ - `app.use(router)` 会立即触发首个路由守卫。守卫中的 SSO、认证、菜单请求必须等待 `initApp()` 完成真实租户和系统配置初始化;初始化失败时取消导航并保留启动错误界面。释放初始化等待必须早于 `router.isReady()`,避免彼此等待;禁止将缓存尚未建立时的 `GetOsClient()` 默认值 `iTdos` 发给客户服务器。
202
+
203
+ - 身份和菜单只读初始化的短暂失败最多读取三次,间隔 300/1000ms;认证失效立即回登录页并保留原深链接,HTTP 403 和已耗尽的菜单依赖重试不得继续重试。重试期间退出登录应停止后续读取,不得用清空 Token、伪造角色或放行保护路由掩盖错误。持续失败用 `next(error)` 保留身份/菜单阶段和原始原因,禁止用 `next(false)` 把它替换为 `Navigation aborted`;启动界面不能据此断言后端断网。当前用户请求的传输失败必须 reject,不能留下永久 pending 的 Promise。修改这条链路时运行 `route-bootstrap-recovery.spec.mjs`,并用真实路由验证健康登录、短暂失败恢复、持续失败提示和过期会话跳转。
204
+
205
+ - `ApiServiceUnavailable` 确认连接故障后,每轮探测结束 5 秒后继续请求固定匿名健康接口;单次请求超时 5 秒,自动与手动检测共用在途请求。后端返回有效健康正文后停止轮询,启动失败的页面只重载一次原 URL,已经就绪的业务页面原地撤掉异常层并保留输入,禁止重放失败的业务写入。旧版健康接口也必须返回有效的 Healthy 正文,不能把反向代理 HTML/404 当作恢复。安全拦截继续按后端解除时间检查,不用连接故障轮询缩短封禁。定向回归使用 `api-service-recovery.spec.mjs` 与 `api-service-status.spec.mjs`,浏览器必须验证断连到自动恢复全过程。
206
+
207
+ - `src/config.json.ApiBaseDev` 是本地默认 API;URL 中 `#` 之前的 `ApiBase`、`OsClient` 必须同时
208
+ 高于 `index.html`、config、Pinia 与 localStorage。解析统一走
209
+ `src/utils/runtime-endpoint-query.js`,禁止在新入口另写正则形成不同优先级。
210
+ - URL 只允许有效的 HTTP(S) ApiBase 和安全 OsClient。页面初始化后通过不含 Token 的
211
+ `window.__MICROI_RUNTIME_ENDPOINT__` 暴露实际值,便于 AI/自动化确认没有误连配置文件中的服务器。
212
+ - 页面已解析的租户必须进入真实 HTTP 请求。`DiyCommon.UseAxios/UseAxiosAll` 与共享 axios 请求层统一通过 `request-tenant-context.js` 补当前 API 的 `osclient` 请求头;保留调用者显式的路径、Query、参数或 Header 租户,不给其它服务器或相邻 API 子路径自动添加页面租户。JSON 正文在动态路由阶段可能尚未读取,不能只依赖正文或旧 Token 选择租户。验收必须增加同源旧 Token 指向其它/不存在租户的真实后端场景:`platform-current-user` 应走页面租户并返回登录失效,保留原深链接进入登录页,不得显示“无法确认接口配置”或让 SSO 发现返回错误租户的 404;定向回归为 `request-tenant-context.spec.mjs`。
213
+ - 首次身份读取的业务/传输失败交给路由守卫处理,`getInfo` 不调用带全局通知副作用的 `DiyCommon.Result`,同时抑制请求层通知和抢先登录跳转;`App.PageInit` 等待首次导航成功后再启动续签/用户刷新,导航失败时结束。既要验证干净会话,也要验证旧登录缓存和失败后重复刷新,不能以隔离浏览器成功代替用户当前会话验收。
214
+ - 同源浏览器窗口仍共享 Token、CurrentUser 等持久化状态。不同 `ApiBase + OsClient` 并行测试必须
215
+ 使用独立 browser context/profile;URL 最高优先级不等于登录态隔离。
216
+ - 修改该链路时运行 `node --test tests/runtime-endpoint-query.spec.mjs`,再使用两个独立
217
+ `browser.newContext()` 验证两组运行目标互不串号。
218
+
219
+ ### 菜单微服务缓存与恢复(强制)
220
+
221
+ - 首次挂载分开检查资源下载与渲染:下载最多 60 秒,`beforemount` 资源齐备后才开始原有 12 秒渲染期限;不得在资源正常下载时提前销毁沙箱。成功仍要求真实可见 DOM,保留一次自愈与旧实例保护。回归覆盖超过 12 秒的真实下载、下载停滞、渲染停滞和陈旧实例事件。
222
+
223
+ - 动态菜单宿主的 Vue 路由保持 `keepAlive:false`,由 `<micro-app keep-alive>` 独占运行时状态;契约固定为 `runtime-keep-alive`,禁止 Vue `KeepAlive` 和 micro-app 双层缓存。
224
+ - 每个顶部 Tab 按完整路由生成稳定实例身份,最多保留 5 个隐藏实例并按 LRU 淘汰。关闭 Tab、退出登录、Token/角色变化以及版本或入口变化时必须精确销毁对应运行时。
225
+ - 恢复时强制同步宿主上下文并检查真实可见 DOM;子应用监听 `appstate-change`,在 `afterhidden` 幂等暂停轮询、WebSocket 和观察器,在 `aftershow` 幂等恢复并重新测量布局,同时保留用户输入、筛选、滚动和内部路由。
226
+ - 修改宿主、TagsView 或权限路由时,必须同时读取 [Vue3 前端微服务宿主规则](references/progressive-03-vue3-前端微服务宿主规则.md) 并运行微服务缓存契约测试。
227
+
228
+ - 修改 Vue/JS 后先跑 VS Code Problems 或 `get_errors`。
229
+ - 宿主按钮重置只作用于 `button:not(:focus-visible)`,不能用全局 `outline:none !important` 覆盖组件或微应用的键盘焦点。微应用保留自己的边框形状,焦点色使用已适配明暗表面的 `--mci-text-link`(缺省回退正文语义色),不能直接用浅品牌色。真实 Tab/Shift+Tab 回归须核对 `:focus-visible`、实际 `outline-style`、宽度、颜色与至少 3:1 对比度;`outline-style:none` 即使宽度非零也不可见。使用阴影焦点时另验实际 `box-shadow`,不能只看焦点状态。平台样式组件回归归 Full,应用自身按钮继续在真实业务页面验收。
230
+ - 影响核心前端时跑 `Microi.Client` 的 `npm run build`。
231
+ - 如果改了工作流、表单保存、按钮 V8,建议用实际 `sys_menu` 配置测试:
232
+ - `FormBtns` 是否出现在表单右上角/FAB。
233
+
234
+ ---
235
+
236
+ <!-- /microi-progressive:chunk -->
237
+ ## 详细参考路由(渐进披露)
238
+
239
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
240
+
241
+ - [references/progressive-01-3-动态按钮系统.md](references/progressive-01-3-动态按钮系统.md):3. 动态按钮系统;5. 路由与打开方式;6. 修改前必查清单
242
+ - [references/progressive-02-8-运行时高频坑复盘.md](references/progressive-02-8-运行时高频坑复盘.md):8. 运行时高频坑复盘;7.1 登录验证码与 Sys_Config;Microi 前端 SDK 约束
243
+ - [references/progressive-03-vue3-前端微服务宿主规则.md](references/progressive-03-vue3-前端微服务宿主规则.md):Vue3 前端微服务宿主规则;在线 AI 应用与微服务页面协作;浏览器访问密钥路由
244
+ <!-- microi-progressive:end -->