@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,185 +1,185 @@
1
- ---
2
- name: microi-mobile-app-quality
3
- description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序。用于创建、重设计、修复、测试或交付任何 Microi 移动端项目,覆盖登录、底部导航、快捷入口、按钮、动效、菜单层级与移动端视觉验收。
4
- ---
5
-
6
- > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
-
8
- # Microi 移动端质量门禁
9
-
10
- 每次交付 Microi UniApp/H5/微信小程序时都必须应用本 skill。这里记录的是移动端项目反复出现、必须避免的问题。
11
-
12
- 自动触发:只要任务涉及 Microi 移动端应用、H5、微信小程序、App 构建、uni-app 项目、登录页、tabbar、首页、我的页、工作台、报告页、视觉重设计或移动端验收,即使用户没有明确点名,也要应用本 skill。
13
-
14
- <!-- microi-progressive:begin -->
15
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=9f83607349ba6e305c3d2993de8eeceab70c344557e5dfa2a5be964492ef4685 -->
16
- ## 1. 导航和快捷入口必须使用真实图标
17
-
18
- 底部导航、首页快捷入口、会员中心快捷项、九宫格操作和悬浮操作,必须在文字上方或旁边显示可识别的图标。
19
-
20
- 要求:
21
- - 使用 Microi.UI 图标、项目 `mci-icon-*` CSS 图标、iconfont 或稳定的本地图标组件。
22
- - 首页、订单、报告、报修、我的等底部导航项必须显示图标,不能用 `首` / `单` / `报` / `我` 这类单字代替。
23
- - 首页入口宫格和我的/个人中心快捷项同样适用。
24
- - 主题、租户、版本、账号、关于、客户绑定、服务入口等个人中心/设置/信息块必须使用真实图标,不能用 `租` / `版` / `客` 这类单字代替。
25
- - 图标必须是真实视觉符号,不能依赖远程占位图。
26
- - tabBar、返回、关闭等小型交互图标若使用 SVG 或图片,必须本地化、纳入版本管理并检查小程序打包结果;Hero、Banner、音视频、字体等大资源遵守 `microi-uniapp-frontend` 的租户 HDFS/CDN 规则,不得为“本地化”无边界增大主包。
27
- - 彩色圆形、胶囊、浮动快捷入口必须同时定义图标底色和内部图标色,不能只依赖继承。红、绿、灰等深色背景优先白色图标;黄色、浅色背景必须使用深色图标。
28
- - 如果基础样式里存在 `.entry:nth-child(n)`、`.mci-bubble:nth-child(n)` 等颜色规则,主题覆盖必须同时覆盖 `background` 和 `color`,避免只换圆底但图标仍沿用旧主题色。
29
- - 主题图标色覆盖必须具备不低于基础规则的 CSS 优先级;构建压缩后仍要检查产物。如果压缩器移除了同值 `color`,可对图标对比度兜底规则使用 `!important`,但只限这类可读性护栏。
30
-
31
- 禁止:
32
- - 纯文字导航图标。
33
- - 用单个汉字冒充图标。
34
- - 缺失图标占位、404 远程图标或只靠 emoji 的图标体系。
35
-
36
- 验收:
37
- - 截图检查每个底部导航、首页快捷入口和会员快捷入口。
38
- - 确认 H5、微信小程序和 App 构建目标中,图标加文字可见、对齐且可点击。
39
- - 主题切换后重新截图底部导航、首页快捷入口和个人中心快捷入口;任何一个图标在圆底上看不清,都算验收失败。
40
- - UniApp H5 桌面预览可以显示手机壳;真机和浏览器移动设备仿真必须自动去壳并铺满视口。自动化测试要分别断言桌面手机壳存在、移动端手机壳标题隐藏,同时检查所有底部菜单包含真实图标节点。
41
-
42
- <!-- /microi-progressive:chunk -->
43
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=4e1b247852aa9f235a26f756d415ebb9fb922f2fea0569bda1bdc8e0b91c4d1c -->
44
- ## 1.1 包体资源必须按用途分层
45
-
46
- - 构建前扫描图片、音频、视频、字体和第三方资源;公开的大资源优先上传到当前租户 HDFS 公有桶并通过 `sys_config.FileServer`/CDN 引用,敏感资源使用私有桶。
47
- - 只保留小型交互图标和离线关键资源在主包。任何远程迁移都必须同步检查小程序下载域名、失败占位、缓存策略和弱网首屏。
48
- - 压缩以用户可感知质量为边界:图片检查文字与主体细节,音频抽听,视频抽播;禁止仅为满足扫描数字而过度压缩。
49
- - 验收必须同时给出包体扫描、CDN 匿名 `200`、正确媒体类型和多尺寸截图证据。缺任一层都不能宣称资源问题已通过。
50
- - 微信小程序上传前增加硬门禁:扫描 `dist/build/mp-weixin` 的真实文件;单个非关键静态资源超过 `256 KB`、主包静态资源达到 `1.5 MB`,或主包距微信当前硬上限不足 `300 KB` 时,发布步骤必须失败并列出最大文件,不能等开发者工具上传后才发现超限。
51
- - 迁移到 HDFS/CDN 后必须从构建产物确认原大文件已经消失,并从业务记录/配置回读相对 `Path`;页面要先加载当前租户 `SysConfig.FileServer`,不得以源码硬编码 CDN 域名替代运行期配置。远程资源加载失败时只能回退到轻量本地占位,不得把原大图重新塞回主包。
52
-
53
- <!-- /microi-progressive:chunk -->
54
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=b8e83d75588362899921af62996577277ba77b2fab86767317d62607cec80a84 -->
55
- ## 2. 不要猜测 Microi 前端 SDK 登录接口
56
-
57
- 编写登录代码前,先检查本地项目 SDK 封装,例如 `src/utils/microi.v8.js`、`src/utils/api.js`,或标准 `microi.uniapp` 登录实现。
58
-
59
- 要求:
60
- - 使用实际导出的接口。如果 SDK 暴露的是 `V8.Login(param)`,不要写 `V8.Login.Login(...)`。
61
- - 员工/账号登录应通过项目 SDK 封装调用平台登录端点,通常是 `/api/SysUser/Login` 或 `V8.Login(param)`。
62
- - Token 提取必须同时支持响应头和响应体兜底。
63
- - 登录成功必须同时满足 `Code=1`、已获取有效 token、已获取有效用户对象且存在 `Id`。任一条件缺失都必须清理 token、用户缓存和本地会话,并以失败处理;不能只因为接口返回成功或缓存了账号名就显示为半登录。
64
- - 会话恢复必须重新校验 token 和用户 `Id`。如果本地只有 `staffUser.Account/Name` 但没有 token,必须清空缓存,不能出现“姓名是 admin、状态是未登录”的矛盾界面。
65
- - 登录后所有页面的 `isLogin`、头像姓名、角色文本、未登录提示和可见按钮必须来自同一个 session store,不要让单页自己读取旧缓存。
66
- - 登录实现后的第一个测试必须包含真实点击登录按钮,并检查控制台和网络请求。
67
- - 登录必须传移动端 `_ClientType` 和稳定 `did`,并在 `App.onShow` 调用标准 SDK 的 `resumeAuthSession(false)`。系统休眠后不能只等定时器恢复。
68
- - 登录失效提示必须原样展示后端 `Msg`;如果 Token 已过期,显示过期分钟/小时/天,如果 Token 属于其它租户,显示 Token 租户与当前租户。详细协议读取 `microi-frontend-sdk/SKILL.md`。
69
- - 业务守卫、分享接收、手动登录与鉴权失效必须共用登录导航锁;导航失败或登录页真实到达后释放,不能依赖固定延时。UniApp `invoke` 返回 `false` 不会调用 `complete`,被去重的入口不得保留自己的等待锁。
70
- - 登录完成优先恢复原业务实例,连续登录页一次移出;历史登录页夹在业务栈中时清栈进入目标。成功返回任务必须去重、在页面销毁时取消,并在执行前复核会话;迟到的失效弹窗不能打断新登录。
71
- - 业务页先保存入口参数再鉴权;`onLoad` 未登录早退后,`onShow` 必须恢复一次初始化,并合并并发加载。初始化期间会话失效后仍需允许登录返回重取,不能永久显示骨架屏或丢失分享的记录 Id。
72
-
73
- 禁止:
74
- - 凭空编造 SDK 子对象。
75
- - 把接口引擎登录和 `SysUser` 账号登录当作同一个契约。
76
- - 未测试真实按钮路径就交付登录页。
77
-
78
- 验收:
79
- - H5 路由 `/pages/login/login` 或项目登录路由打开时无控制台错误。
80
- - 点击账号登录不会抛出 `V8.Login.Login is not a function`。
81
- - 使用真实系统账号登录后,必须验证“我的”页显示已登录角色,首页/工单/报告不再出现未登录提示,刷新页面或切换底部导航后仍保持一致。
82
- - 自动回归覆盖并发引导、去重取消无 `complete`、失败重试、历史重复登录栈、登录成功后返回及业务页继续初始化、旧弹窗迟到和页面销毁;真实开发者工具与真机另验冷启动及分享接收,不能用模拟会话代替授权登录。
83
-
84
- <!-- /microi-progressive:chunk -->
85
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=a35f20404acbf61814f9475610f881f7c60effc0ce3bb8797cee300cd3349ba7 -->
86
- ## 2.1 登录验证码必须跟随 Sys_Config.EnableCaptcha
87
-
88
- PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)`,都必须先读取 `Sys_Config` 的 `EnableCaptcha` 配置,并按配置决定是否展示和提交图形验证码。
89
-
90
- 要求:
91
- - 启动登录页时调用 `/apiengine/platform-sys-config` 或项目 SDK 的 `V8.GetSysConfig(true)`,读取当前租户启用状态;旧 Controller 路由只作兼容转发。
92
- - `EnableCaptcha` 可能是 `1`、`true`、`'1'`、`'true'`,也可能是大小写不同的字符串。必须使用统一的 `isEnabledFlag(value)` 或等价函数判断,不能直接 `!!value`,否则字符串 `'0'` 会被误判为开启。
93
- - 开启验证码时,登录表单必须显示验证码输入框和验证码图片;验证码图片通过 `GET /api/Captcha/GetCaptcha` 获取,读取响应头 `captchaid`,提交登录时附加 `_CaptchaId` 和 `_CaptchaValue`。
94
- - 登录失败、验证码错误、网络错误后必须刷新验证码并清空验证码输入;验证码未填写时前端直接阻止提交并提示用户。
95
- - 未开启验证码时不得显示验证码输入,也不得提交空 `_CaptchaId/_CaptchaValue` 影响正常登录。
96
- - 微信小程序默认手机号授权登录仍是主路径;账号/手机号 + 密码兜底入口如果调用 `SysUser/login`,同样要遵守验证码规则。
97
-
98
- 禁止:
99
- - 不读取 `Sys_Config.EnableCaptcha` 就直接调用账号登录。
100
- - 只在 PC 端做验证码,移动端缺失验证码。
101
- - 直接写 `if (SysConfig.EnableCaptcha)` 或 `!!cfg.EnableCaptcha`,没有兼容 `'0'`、`'1'`、`'true'` 等字符串。
102
- - 登录失败后继续使用旧 `captchaid` 和旧验证码值。
103
-
104
- 验收:
105
- - 人工或自动化把 `EnableCaptcha` 分别模拟为 `1`、`true`、`'1'`、`'true'`,确认验证码出现并随登录提交。
106
- - 模拟 `EnableCaptcha` 为 `0`、`false`、`'0'`、空值,确认验证码不出现且登录请求不带空验证码字段。
107
- - 检查网络请求:`/api/Captcha/GetCaptcha` 返回后已保存 `captchaid`;登录请求体包含 `_CaptchaId/_CaptchaValue`。
108
- - 参考标准实现:`microi.uniapp/src/pages/login/index.vue`。
109
-
110
- <!-- /microi-progressive:chunk -->
111
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=22bdaf38588f251016e115f1ad15a433e827fb2191041d55ecad42cda94253d1 -->
112
- ## 3. OsClient 请求头不得重复
113
-
114
- Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览器、代理或服务端运行时可能把 `OsClient` 和 `osclient` 这类大小写重复键合并成 `demo, demo`,导致租户识别失败。
115
-
116
- 要求:
117
- - 通过统一工具构建请求头,设置 `osclient` 前先删除已有的不区分大小写匹配项。标准 SDK 的 `buildHeaders` 必须使用单值写入函数,不得直接写 `headers.OsClient = ...`。
118
- - 优先使用一个标准键,通常是小写 `osclient`,并且只传一个运行期值,例如 `demo`。
119
- - `Authorization` / `authorization` 以及其它单值鉴权头也要做同样的大小写去重。
120
- - 当 Microi 端点契约需要时,请求体或查询参数可以包含 `OsClient`,但请求头仍只能包含一个 `osclient` 值。
121
-
122
- 禁止:
123
- - 同时设置 `headers.OsClient` 和 `headers.osclient`。
124
- - 同时设置 `headers.Authorization` 和 `headers.authorization`。
125
- - 网络面板里已经看到 `demo, demo` 仍然交付。
126
-
127
- 验收:
128
- - 在网络面板或请求适配器日志里检查登录请求。
129
- - 确认目标租户请求头正好是一个运行期值(例如 `osclient: demo`),没有被逗号合并。
130
- - 微信/支付宝/飞书/抖音等小程序授权登录接口也必须检查,例如 `/apiengine/miniprogram-login`,不得出现 `osclient: demo, demo` 这类合并值。
131
-
132
- <!-- /microi-progressive:chunk -->
133
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=1394c7fb8e59b25553e2f9b71ab7f8cf03290b6930c8d8436123bc6048ad2435 -->
134
- ## 3.1 小程序授权登录必须可追踪、可读错误
135
-
136
- 微信开发者工具的模拟授权与体验版真机调用不是同一条真实链路。手机号授权登录接口必须按阶段诊断,不能只返回“手机号登录失败”。
137
-
138
- 要求:
139
- - 接口入口生成短追踪号,并在微信身份交换、AccessToken、手机号交换、账号匹配、用户更新/注册、兼容映射、系统 Token 签发前更新阶段名。
140
- - 每个失败出口和顶层 `catch` 都调用统一 `fail(stage, message, detail)`:写 `V8.Method.AddSysLog`,同时返回包含“阶段 + 原因 + 追踪号”的 `Msg`。系统日志使用独立 MongoDB 日志,不依赖业务事务提交。
141
- - 日志只记录 OsClient、AppId、阶段、微信 `errcode/errmsg`、是否收到授权码、脱敏手机号和必要业务 Id;严禁记录小程序 Secret、AccessToken、完整手机号、`detail.code`、`LoginCode`、OpenId 或请求头 Token。
142
- - 微信 `jscode2session`、AccessToken、`getuserphonenumber` 必须分别捕获 HTTP 异常与微信业务错误,保留官方 `errmsg`,不要用一个大 `catch` 抹掉失败位置。
143
- - 前端请求适配器必须把 `uni.request.fail.errMsg`、HTTP 状态、后端 `Msg` 归一化;手机号登录失败使用可完整阅读的模态框展示,不用会截断长文本的短 Toast。
144
- - 用户拒绝授权可以使用简短提示;非拒绝类授权错误、网络错误、后端错误必须显示真实原因和追踪号。
145
-
146
- 验收:
147
- - 用无效 `LoginCode` 和无效手机号授权码分别烟测,响应包含不同阶段和追踪号,并能在系统日志按追踪号查到对应记录。
148
- - 模拟 `uni.request` 域名未配置、超时、HTTP 500、接口 `Code=0`,前端均显示具体原因,loading 在 `finally` 中恢复。
149
- - 体验版真机复测授权登录;不能只以开发者工具模拟成功作为上线依据。
150
-
151
- <!-- /microi-progressive:chunk -->
152
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=feb9ba3267bdf1f6394c425b45dd71e19ac4382ae05549d6e1b6b664c6517a19 -->
153
- ## 3.1.1 手机号快速验证前置页不得混淆腾讯官方
154
-
155
- - 调用手机号快速验证组件前展示的登录页、弹窗、按钮、说明、分享标题和失败提示中,禁止出现“微信”“微信官方”“微信登录”“一键登录”等可能让用户误认为腾讯官方功能或官方产品的文案。
156
- - 前置页不得使用微信官方 Logo、相似绿色气泡图标、仿官方按钮或其它腾讯官方视觉元素;只允许展示小程序自身主体名称、品牌 Logo 和通用手机/验证图标。
157
- - 推荐统一使用“手机号快捷登录”“手机号快速验证”“验证中”等中性文案。底层仍按平台要求保留 `open-type="getPhoneNumber"`、`provider:'weixin'` 等技术实现,不能为改文案破坏真实授权链路。
158
- - `build:mp-weixin` 后必须扫描登录页源码和 `dist/build/mp-weixin/pages/login/` 产物中的可见文案,并对手机号快速验证前置页截图;发现混淆词、官方 Logo 或近似元素时阻止上传和提审。
159
-
160
- <!-- /microi-progressive:chunk -->
161
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=7598db1fdabfe127c2be7593b83dc3a246b1db852d9c0d4001f849d3e97aa273 -->
162
- ## 3.2 微信小程序每个页面默认支持分享
163
-
164
- 小程序项目必须默认支持转发给朋友和分享到朋友圈,不能只给首页或公开页添加分享。登录和权限控制属于访问阶段,不得用来隐藏分享能力。
165
-
166
- 要求:
167
- - 以 `pages.json` 为路由清单逐页接入 `onShareAppMessage` 与 `onShareTimeline`;Vue3 组合式 API 页面必须从 `@dcloudio/uni-app` 直接导入并注册两个生命周期,不能只写一个全局工具后假设编译器会自动发现。
168
- - 页面显示时确保微信分享菜单包含 `shareAppMessage`、`shareTimeline`;分享标题使用业务标题或稳定页面标题,资讯/报告等内容页优先带预览图。
169
- - 好友转发返回以 `/` 开头的完整 `path`;朋友圈返回当前页面业务 `query`。保留 `id`、分类、公开报告 ShareToken 等定位参数,剔除 Authorization、AccessToken、CustomerToken、手机号授权码、LoginCode、OpenId、验证码等敏感或一次性参数。
170
- - 需要登录或角色权限的页面仍允许分享原页面。接收者打开后再由页面鉴权提示登录/无权限,不能把所有受保护页面的分享地址强制改成首页。
171
- - 登录页本身也必须支持分享,避免接收者被鉴权重定向后失去转发入口。
172
-
173
- 验收:
174
- - 静态扫描 `pages.json` 与页面源码,页面总数必须等于同时注册两种分享生命周期的页面数。
175
- - 执行 `build:mp-weixin`,逐页检查编译后的页面 JS 存在 `onShareAppMessage`、`onShareTimeline`,不能只检查源码或只确认构建成功。
176
- - 在微信开发者工具和体验版各抽测公开页、登录页、一个需登录详情页:朋友转发和朋友圈入口都存在,接收者路径参数正确;未登录接收者看到登录提示而不是白屏或 404。
177
-
178
- <!-- /microi-progressive:chunk -->
179
- ## 详细参考路由(渐进披露)
180
-
181
- 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
182
-
183
- - [references/progressive-01-4-重要按钮必须带图标.md](references/progressive-01-4-重要按钮必须带图标.md):4. 重要按钮必须带图标;4.1 模块列表优先使用声明式业务卡片;5. 首屏文字和浮层不得重叠;5.1 未登录/授权提示必须在可用内容区居中;5.2 自定义导航页面必须通过安全区与微信胶囊门禁;5.3 全屏工具页必须遵守返回状态栈;5.4 微信浮动入口必须通过真实事件桥门禁;6. 后台菜单必须规划为至少两级;7. 移动端页面需要动效,但动效必须有用;8. 登录页必须是直接登录界面
184
- - [references/progressive-02-9-主题切换必须真实且全局生效.md](references/progressive-02-9-主题切换必须真实且全局生效.md):9. 主题切换必须真实且全局生效;10. 报告/列表详情必须保留用户身份;11. 角色与权限必须基于 sys_user.RoleIds 建模;最终交付清单
185
- <!-- microi-progressive:end -->
1
+ ---
2
+ name: microi-mobile-app-quality
3
+ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序。用于创建、重设计、修复、测试或交付任何 Microi 移动端项目,覆盖登录、底部导航、快捷入口、按钮、动效、菜单层级与移动端视觉验收。
4
+ ---
5
+
6
+ > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
7
+
8
+ # Microi 移动端质量门禁
9
+
10
+ 每次交付 Microi UniApp/H5/微信小程序时都必须应用本 skill。这里记录的是移动端项目反复出现、必须避免的问题。
11
+
12
+ 自动触发:只要任务涉及 Microi 移动端应用、H5、微信小程序、App 构建、uni-app 项目、登录页、tabbar、首页、我的页、工作台、报告页、视觉重设计或移动端验收,即使用户没有明确点名,也要应用本 skill。
13
+
14
+ <!-- microi-progressive:begin -->
15
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=9f83607349ba6e305c3d2993de8eeceab70c344557e5dfa2a5be964492ef4685 -->
16
+ ## 1. 导航和快捷入口必须使用真实图标
17
+
18
+ 底部导航、首页快捷入口、会员中心快捷项、九宫格操作和悬浮操作,必须在文字上方或旁边显示可识别的图标。
19
+
20
+ 要求:
21
+ - 使用 Microi.UI 图标、项目 `mci-icon-*` CSS 图标、iconfont 或稳定的本地图标组件。
22
+ - 首页、订单、报告、报修、我的等底部导航项必须显示图标,不能用 `首` / `单` / `报` / `我` 这类单字代替。
23
+ - 首页入口宫格和我的/个人中心快捷项同样适用。
24
+ - 主题、租户、版本、账号、关于、客户绑定、服务入口等个人中心/设置/信息块必须使用真实图标,不能用 `租` / `版` / `客` 这类单字代替。
25
+ - 图标必须是真实视觉符号,不能依赖远程占位图。
26
+ - tabBar、返回、关闭等小型交互图标若使用 SVG 或图片,必须本地化、纳入版本管理并检查小程序打包结果;Hero、Banner、音视频、字体等大资源遵守 `microi-uniapp-frontend` 的租户 HDFS/CDN 规则,不得为“本地化”无边界增大主包。
27
+ - 彩色圆形、胶囊、浮动快捷入口必须同时定义图标底色和内部图标色,不能只依赖继承。红、绿、灰等深色背景优先白色图标;黄色、浅色背景必须使用深色图标。
28
+ - 如果基础样式里存在 `.entry:nth-child(n)`、`.mci-bubble:nth-child(n)` 等颜色规则,主题覆盖必须同时覆盖 `background` 和 `color`,避免只换圆底但图标仍沿用旧主题色。
29
+ - 主题图标色覆盖必须具备不低于基础规则的 CSS 优先级;构建压缩后仍要检查产物。如果压缩器移除了同值 `color`,可对图标对比度兜底规则使用 `!important`,但只限这类可读性护栏。
30
+
31
+ 禁止:
32
+ - 纯文字导航图标。
33
+ - 用单个汉字冒充图标。
34
+ - 缺失图标占位、404 远程图标或只靠 emoji 的图标体系。
35
+
36
+ 验收:
37
+ - 截图检查每个底部导航、首页快捷入口和会员快捷入口。
38
+ - 确认 H5、微信小程序和 App 构建目标中,图标加文字可见、对齐且可点击。
39
+ - 主题切换后重新截图底部导航、首页快捷入口和个人中心快捷入口;任何一个图标在圆底上看不清,都算验收失败。
40
+ - UniApp H5 桌面预览可以显示手机壳;真机和浏览器移动设备仿真必须自动去壳并铺满视口。自动化测试要分别断言桌面手机壳存在、移动端手机壳标题隐藏,同时检查所有底部菜单包含真实图标节点。
41
+
42
+ <!-- /microi-progressive:chunk -->
43
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=4e1b247852aa9f235a26f756d415ebb9fb922f2fea0569bda1bdc8e0b91c4d1c -->
44
+ ## 1.1 包体资源必须按用途分层
45
+
46
+ - 构建前扫描图片、音频、视频、字体和第三方资源;公开的大资源优先上传到当前租户 HDFS 公有桶并通过 `sys_config.FileServer`/CDN 引用,敏感资源使用私有桶。
47
+ - 只保留小型交互图标和离线关键资源在主包。任何远程迁移都必须同步检查小程序下载域名、失败占位、缓存策略和弱网首屏。
48
+ - 压缩以用户可感知质量为边界:图片检查文字与主体细节,音频抽听,视频抽播;禁止仅为满足扫描数字而过度压缩。
49
+ - 验收必须同时给出包体扫描、CDN 匿名 `200`、正确媒体类型和多尺寸截图证据。缺任一层都不能宣称资源问题已通过。
50
+ - 微信小程序上传前增加硬门禁:扫描 `dist/build/mp-weixin` 的真实文件;单个非关键静态资源超过 `256 KB`、主包静态资源达到 `1.5 MB`,或主包距微信当前硬上限不足 `300 KB` 时,发布步骤必须失败并列出最大文件,不能等开发者工具上传后才发现超限。
51
+ - 迁移到 HDFS/CDN 后必须从构建产物确认原大文件已经消失,并从业务记录/配置回读相对 `Path`;页面要先加载当前租户 `SysConfig.FileServer`,不得以源码硬编码 CDN 域名替代运行期配置。远程资源加载失败时只能回退到轻量本地占位,不得把原大图重新塞回主包。
52
+
53
+ <!-- /microi-progressive:chunk -->
54
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=b8e83d75588362899921af62996577277ba77b2fab86767317d62607cec80a84 -->
55
+ ## 2. 不要猜测 Microi 前端 SDK 登录接口
56
+
57
+ 编写登录代码前,先检查本地项目 SDK 封装,例如 `src/utils/microi.v8.js`、`src/utils/api.js`,或标准 `microi.uniapp` 登录实现。
58
+
59
+ 要求:
60
+ - 使用实际导出的接口。如果 SDK 暴露的是 `V8.Login(param)`,不要写 `V8.Login.Login(...)`。
61
+ - 员工/账号登录应通过项目 SDK 封装调用平台登录端点,通常是 `/api/SysUser/Login` 或 `V8.Login(param)`。
62
+ - Token 提取必须同时支持响应头和响应体兜底。
63
+ - 登录成功必须同时满足 `Code=1`、已获取有效 token、已获取有效用户对象且存在 `Id`。任一条件缺失都必须清理 token、用户缓存和本地会话,并以失败处理;不能只因为接口返回成功或缓存了账号名就显示为半登录。
64
+ - 会话恢复必须重新校验 token 和用户 `Id`。如果本地只有 `staffUser.Account/Name` 但没有 token,必须清空缓存,不能出现“姓名是 admin、状态是未登录”的矛盾界面。
65
+ - 登录后所有页面的 `isLogin`、头像姓名、角色文本、未登录提示和可见按钮必须来自同一个 session store,不要让单页自己读取旧缓存。
66
+ - 登录实现后的第一个测试必须包含真实点击登录按钮,并检查控制台和网络请求。
67
+ - 登录必须传移动端 `_ClientType` 和稳定 `did`,并在 `App.onShow` 调用标准 SDK 的 `resumeAuthSession(false)`。系统休眠后不能只等定时器恢复。
68
+ - 登录失效提示必须原样展示后端 `Msg`;如果 Token 已过期,显示过期分钟/小时/天,如果 Token 属于其它租户,显示 Token 租户与当前租户。详细协议读取 `microi-frontend-sdk/SKILL.md`。
69
+ - 业务守卫、分享接收、手动登录与鉴权失效必须共用登录导航锁;导航失败或登录页真实到达后释放,不能依赖固定延时。UniApp `invoke` 返回 `false` 不会调用 `complete`,被去重的入口不得保留自己的等待锁。
70
+ - 登录完成优先恢复原业务实例,连续登录页一次移出;历史登录页夹在业务栈中时清栈进入目标。成功返回任务必须去重、在页面销毁时取消,并在执行前复核会话;迟到的失效弹窗不能打断新登录。
71
+ - 业务页先保存入口参数再鉴权;`onLoad` 未登录早退后,`onShow` 必须恢复一次初始化,并合并并发加载。初始化期间会话失效后仍需允许登录返回重取,不能永久显示骨架屏或丢失分享的记录 Id。
72
+
73
+ 禁止:
74
+ - 凭空编造 SDK 子对象。
75
+ - 把接口引擎登录和 `SysUser` 账号登录当作同一个契约。
76
+ - 未测试真实按钮路径就交付登录页。
77
+
78
+ 验收:
79
+ - H5 路由 `/pages/login/login` 或项目登录路由打开时无控制台错误。
80
+ - 点击账号登录不会抛出 `V8.Login.Login is not a function`。
81
+ - 使用真实系统账号登录后,必须验证“我的”页显示已登录角色,首页/工单/报告不再出现未登录提示,刷新页面或切换底部导航后仍保持一致。
82
+ - 自动回归覆盖并发引导、去重取消无 `complete`、失败重试、历史重复登录栈、登录成功后返回及业务页继续初始化、旧弹窗迟到和页面销毁;真实开发者工具与真机另验冷启动及分享接收,不能用模拟会话代替授权登录。
83
+
84
+ <!-- /microi-progressive:chunk -->
85
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=a35f20404acbf61814f9475610f881f7c60effc0ce3bb8797cee300cd3349ba7 -->
86
+ ## 2.1 登录验证码必须跟随 Sys_Config.EnableCaptcha
87
+
88
+ PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)`,都必须先读取 `Sys_Config` 的 `EnableCaptcha` 配置,并按配置决定是否展示和提交图形验证码。
89
+
90
+ 要求:
91
+ - 启动登录页时调用 `/apiengine/platform-sys-config` 或项目 SDK 的 `V8.GetSysConfig(true)`,读取当前租户启用状态;旧 Controller 路由只作兼容转发。
92
+ - `EnableCaptcha` 可能是 `1`、`true`、`'1'`、`'true'`,也可能是大小写不同的字符串。必须使用统一的 `isEnabledFlag(value)` 或等价函数判断,不能直接 `!!value`,否则字符串 `'0'` 会被误判为开启。
93
+ - 开启验证码时,登录表单必须显示验证码输入框和验证码图片;验证码图片通过 `GET /api/Captcha/GetCaptcha` 获取,读取响应头 `captchaid`,提交登录时附加 `_CaptchaId` 和 `_CaptchaValue`。
94
+ - 登录失败、验证码错误、网络错误后必须刷新验证码并清空验证码输入;验证码未填写时前端直接阻止提交并提示用户。
95
+ - 未开启验证码时不得显示验证码输入,也不得提交空 `_CaptchaId/_CaptchaValue` 影响正常登录。
96
+ - 微信小程序默认手机号授权登录仍是主路径;账号/手机号 + 密码兜底入口如果调用 `SysUser/login`,同样要遵守验证码规则。
97
+
98
+ 禁止:
99
+ - 不读取 `Sys_Config.EnableCaptcha` 就直接调用账号登录。
100
+ - 只在 PC 端做验证码,移动端缺失验证码。
101
+ - 直接写 `if (SysConfig.EnableCaptcha)` 或 `!!cfg.EnableCaptcha`,没有兼容 `'0'`、`'1'`、`'true'` 等字符串。
102
+ - 登录失败后继续使用旧 `captchaid` 和旧验证码值。
103
+
104
+ 验收:
105
+ - 人工或自动化把 `EnableCaptcha` 分别模拟为 `1`、`true`、`'1'`、`'true'`,确认验证码出现并随登录提交。
106
+ - 模拟 `EnableCaptcha` 为 `0`、`false`、`'0'`、空值,确认验证码不出现且登录请求不带空验证码字段。
107
+ - 检查网络请求:`/api/Captcha/GetCaptcha` 返回后已保存 `captchaid`;登录请求体包含 `_CaptchaId/_CaptchaValue`。
108
+ - 参考标准实现:`microi.uniapp/src/pages/login/index.vue`。
109
+
110
+ <!-- /microi-progressive:chunk -->
111
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=22bdaf38588f251016e115f1ad15a433e827fb2191041d55ecad42cda94253d1 -->
112
+ ## 3. OsClient 请求头不得重复
113
+
114
+ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览器、代理或服务端运行时可能把 `OsClient` 和 `osclient` 这类大小写重复键合并成 `demo, demo`,导致租户识别失败。
115
+
116
+ 要求:
117
+ - 通过统一工具构建请求头,设置 `osclient` 前先删除已有的不区分大小写匹配项。标准 SDK 的 `buildHeaders` 必须使用单值写入函数,不得直接写 `headers.OsClient = ...`。
118
+ - 优先使用一个标准键,通常是小写 `osclient`,并且只传一个运行期值,例如 `demo`。
119
+ - `Authorization` / `authorization` 以及其它单值鉴权头也要做同样的大小写去重。
120
+ - 当 Microi 端点契约需要时,请求体或查询参数可以包含 `OsClient`,但请求头仍只能包含一个 `osclient` 值。
121
+
122
+ 禁止:
123
+ - 同时设置 `headers.OsClient` 和 `headers.osclient`。
124
+ - 同时设置 `headers.Authorization` 和 `headers.authorization`。
125
+ - 网络面板里已经看到 `demo, demo` 仍然交付。
126
+
127
+ 验收:
128
+ - 在网络面板或请求适配器日志里检查登录请求。
129
+ - 确认目标租户请求头正好是一个运行期值(例如 `osclient: demo`),没有被逗号合并。
130
+ - 微信/支付宝/飞书/抖音等小程序授权登录接口也必须检查,例如 `/apiengine/miniprogram-login`,不得出现 `osclient: demo, demo` 这类合并值。
131
+
132
+ <!-- /microi-progressive:chunk -->
133
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=1394c7fb8e59b25553e2f9b71ab7f8cf03290b6930c8d8436123bc6048ad2435 -->
134
+ ## 3.1 小程序授权登录必须可追踪、可读错误
135
+
136
+ 微信开发者工具的模拟授权与体验版真机调用不是同一条真实链路。手机号授权登录接口必须按阶段诊断,不能只返回“手机号登录失败”。
137
+
138
+ 要求:
139
+ - 接口入口生成短追踪号,并在微信身份交换、AccessToken、手机号交换、账号匹配、用户更新/注册、兼容映射、系统 Token 签发前更新阶段名。
140
+ - 每个失败出口和顶层 `catch` 都调用统一 `fail(stage, message, detail)`:写 `V8.Method.AddSysLog`,同时返回包含“阶段 + 原因 + 追踪号”的 `Msg`。系统日志使用独立 MongoDB 日志,不依赖业务事务提交。
141
+ - 日志只记录 OsClient、AppId、阶段、微信 `errcode/errmsg`、是否收到授权码、脱敏手机号和必要业务 Id;严禁记录小程序 Secret、AccessToken、完整手机号、`detail.code`、`LoginCode`、OpenId 或请求头 Token。
142
+ - 微信 `jscode2session`、AccessToken、`getuserphonenumber` 必须分别捕获 HTTP 异常与微信业务错误,保留官方 `errmsg`,不要用一个大 `catch` 抹掉失败位置。
143
+ - 前端请求适配器必须把 `uni.request.fail.errMsg`、HTTP 状态、后端 `Msg` 归一化;手机号登录失败使用可完整阅读的模态框展示,不用会截断长文本的短 Toast。
144
+ - 用户拒绝授权可以使用简短提示;非拒绝类授权错误、网络错误、后端错误必须显示真实原因和追踪号。
145
+
146
+ 验收:
147
+ - 用无效 `LoginCode` 和无效手机号授权码分别烟测,响应包含不同阶段和追踪号,并能在系统日志按追踪号查到对应记录。
148
+ - 模拟 `uni.request` 域名未配置、超时、HTTP 500、接口 `Code=0`,前端均显示具体原因,loading 在 `finally` 中恢复。
149
+ - 体验版真机复测授权登录;不能只以开发者工具模拟成功作为上线依据。
150
+
151
+ <!-- /microi-progressive:chunk -->
152
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=feb9ba3267bdf1f6394c425b45dd71e19ac4382ae05549d6e1b6b664c6517a19 -->
153
+ ## 3.1.1 手机号快速验证前置页不得混淆腾讯官方
154
+
155
+ - 调用手机号快速验证组件前展示的登录页、弹窗、按钮、说明、分享标题和失败提示中,禁止出现“微信”“微信官方”“微信登录”“一键登录”等可能让用户误认为腾讯官方功能或官方产品的文案。
156
+ - 前置页不得使用微信官方 Logo、相似绿色气泡图标、仿官方按钮或其它腾讯官方视觉元素;只允许展示小程序自身主体名称、品牌 Logo 和通用手机/验证图标。
157
+ - 推荐统一使用“手机号快捷登录”“手机号快速验证”“验证中”等中性文案。底层仍按平台要求保留 `open-type="getPhoneNumber"`、`provider:'weixin'` 等技术实现,不能为改文案破坏真实授权链路。
158
+ - `build:mp-weixin` 后必须扫描登录页源码和 `dist/build/mp-weixin/pages/login/` 产物中的可见文案,并对手机号快速验证前置页截图;发现混淆词、官方 Logo 或近似元素时阻止上传和提审。
159
+
160
+ <!-- /microi-progressive:chunk -->
161
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=7598db1fdabfe127c2be7593b83dc3a246b1db852d9c0d4001f849d3e97aa273 -->
162
+ ## 3.2 微信小程序每个页面默认支持分享
163
+
164
+ 小程序项目必须默认支持转发给朋友和分享到朋友圈,不能只给首页或公开页添加分享。登录和权限控制属于访问阶段,不得用来隐藏分享能力。
165
+
166
+ 要求:
167
+ - 以 `pages.json` 为路由清单逐页接入 `onShareAppMessage` 与 `onShareTimeline`;Vue3 组合式 API 页面必须从 `@dcloudio/uni-app` 直接导入并注册两个生命周期,不能只写一个全局工具后假设编译器会自动发现。
168
+ - 页面显示时确保微信分享菜单包含 `shareAppMessage`、`shareTimeline`;分享标题使用业务标题或稳定页面标题,资讯/报告等内容页优先带预览图。
169
+ - 好友转发返回以 `/` 开头的完整 `path`;朋友圈返回当前页面业务 `query`。保留 `id`、分类、公开报告 ShareToken 等定位参数,剔除 Authorization、AccessToken、CustomerToken、手机号授权码、LoginCode、OpenId、验证码等敏感或一次性参数。
170
+ - 需要登录或角色权限的页面仍允许分享原页面。接收者打开后再由页面鉴权提示登录/无权限,不能把所有受保护页面的分享地址强制改成首页。
171
+ - 登录页本身也必须支持分享,避免接收者被鉴权重定向后失去转发入口。
172
+
173
+ 验收:
174
+ - 静态扫描 `pages.json` 与页面源码,页面总数必须等于同时注册两种分享生命周期的页面数。
175
+ - 执行 `build:mp-weixin`,逐页检查编译后的页面 JS 存在 `onShareAppMessage`、`onShareTimeline`,不能只检查源码或只确认构建成功。
176
+ - 在微信开发者工具和体验版各抽测公开页、登录页、一个需登录详情页:朋友转发和朋友圈入口都存在,接收者路径参数正确;未登录接收者看到登录提示而不是白屏或 404。
177
+
178
+ <!-- /microi-progressive:chunk -->
179
+ ## 详细参考路由(渐进披露)
180
+
181
+ 仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
182
+
183
+ - [references/progressive-01-4-重要按钮必须带图标.md](references/progressive-01-4-重要按钮必须带图标.md):4. 重要按钮必须带图标;4.1 模块列表优先使用声明式业务卡片;5. 首屏文字和浮层不得重叠;5.1 未登录/授权提示必须在可用内容区居中;5.2 自定义导航页面必须通过安全区与微信胶囊门禁;5.3 全屏工具页必须遵守返回状态栈;5.4 微信浮动入口必须通过真实事件桥门禁;6. 后台菜单必须规划为至少两级;7. 移动端页面需要动效,但动效必须有用;8. 登录页必须是直接登录界面
184
+ - [references/progressive-02-9-主题切换必须真实且全局生效.md](references/progressive-02-9-主题切换必须真实且全局生效.md):9. 主题切换必须真实且全局生效;10. 报告/列表详情必须保留用户身份;11. 角色与权限必须基于 sys_user.RoleIds 建模;最终交付清单
185
+ <!-- microi-progressive:end -->