@microi.net/cli 5.5.9 → 5.6.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 (166) 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/README.md +71 -71
  8. package/assets/build-meta.json +5 -5
  9. package/assets/feature-matrix.json +129 -129
  10. package/cordis.patch.yml +1 -1
  11. package/package.json +1 -1
  12. package/scripts/codex-marketplace.json +20 -20
  13. package/scripts/mcp-codex-stdio-adapter.js +189 -189
  14. package/scripts/mcp-trae-windows-launcher.cmd +21 -21
  15. package/scripts/microi-cli-mcp.js +7 -7
  16. package/scripts/microi-codex-broker.js +447 -447
  17. package/scripts/microi-codex-router.js +582 -582
  18. package/scripts/microi-skills.meta.json +336 -336
  19. package/skills/.microi-skills-version.json +2 -2
  20. package/skills/.progressive-disclosure-manifest.json +3566 -3566
  21. package/skills/README.md +3 -3
  22. package/skills/ai-engine/SKILL.md +45 -45
  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 +177 -177
  26. package/skills/business-blueprint/SKILL.md +85 -85
  27. package/skills/datasource-engine/SKILL.md +91 -91
  28. package/skills/dos-orm/SKILL.md +81 -81
  29. package/skills/dos-orm/references/api-reference.md +229 -229
  30. package/skills/email-engine/SKILL.md +80 -80
  31. package/skills/email-engine/references/v8-email.md +34 -34
  32. package/skills/job-engine/SKILL.md +154 -154
  33. package/skills/message-notification/SKILL.md +126 -126
  34. package/skills/message-notification/agents/openai.yaml +5 -5
  35. package/skills/message-notification/references/contracts.md +102 -102
  36. package/skills/microi-ai-app-auth.js +652 -652
  37. package/skills/microi-ai-application/SKILL.md +102 -102
  38. package/skills/microi-ai-application/agents/openai.yaml +4 -4
  39. package/skills/microi-ai-application/references/frontend-baseline.md +164 -164
  40. package/skills/microi-client-frontend/SKILL.md +43 -43
  41. 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 +2 -2
  42. 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 +28 -28
  43. 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 +56 -56
  44. package/skills/microi-codex/SKILL.md +46 -46
  45. package/skills/microi-codex-installer/SKILL.md +216 -216
  46. package/skills/microi-codex-installer/agents/openai.yaml +7 -7
  47. package/skills/microi-datasource-mapping/SKILL.md +67 -67
  48. package/skills/microi-db-schema/SKILL.md +6 -6
  49. package/skills/microi-db-schema/references/core-tables.md +18 -18
  50. package/skills/microi-db-schema/references/form-component-options.md +256 -256
  51. package/skills/microi-db-schema/references/schema-overview.md +11 -11
  52. package/skills/microi-db-schema/references/schema.md +46 -46
  53. package/skills/microi-db-schema/references/table-catalog.md +57 -57
  54. package/skills/microi-deployment/SKILL.md +18 -1
  55. package/skills/microi-deployment/references/deployment-matrix.md +101 -101
  56. package/skills/microi-docs-coverage/SKILL.md +123 -123
  57. package/skills/microi-docs-coverage/references/capability-map.md +1 -0
  58. package/skills/microi-docs-coverage/scripts/audit-doc-skill-coverage.mjs +894 -894
  59. package/skills/microi-form-engine/SKILL.md +50 -50
  60. package/skills/microi-form-engine/references/component-catalog.md +218 -218
  61. package/skills/microi-form-engine/references/data-source-events.md +124 -124
  62. package/skills/microi-form-layout/SKILL.md +13 -13
  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 +4 -4
  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 +175 -175
  66. package/skills/microi-left-right-layout/SKILL.md +141 -141
  67. package/skills/microi-microservice/SKILL.md +15 -15
  68. package/skills/microi-microservice/references/runtime-delivery.md +278 -278
  69. 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
  70. package/skills/microi-solution-quotation/SKILL.md +78 -78
  71. package/skills/microi-solution-quotation/agents/openai.yaml +4 -4
  72. package/skills/microi-solution-quotation/scripts/build_solution_quote.py +296 -296
  73. package/skills/microi-sso/SKILL.md +85 -85
  74. package/skills/microi-sso/references/acceptance.md +49 -49
  75. package/skills/microi-sso/references/configuration-and-security.md +53 -53
  76. package/skills/microi-sso/references/inbound.md +53 -53
  77. package/skills/microi-sso/references/outbound.md +39 -39
  78. 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 +20 -20
  79. package/skills/microi-ui/SKILL.md +7 -2
  80. package/skills/microi-uniapp-frontend/SKILL.md +134 -134
  81. 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 +136 -136
  82. 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 +124 -124
  83. package/skills/module-engine/SKILL.md +16 -16
  84. package/skills/ocr-engine/SKILL.md +2 -2
  85. package/skills/ocr-engine/agents/openai.yaml +1 -1
  86. package/skills/page-engine/SKILL.md +28 -28
  87. 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 +126 -126
  88. 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 +42 -42
  89. package/skills/performance-testing/SKILL.md +120 -120
  90. package/skills/playwright-e2e/SKILL.md +84 -84
  91. 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 +68 -68
  92. 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 +64 -64
  93. package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +20 -20
  94. package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -69
  95. package/skills/print-engine/SKILL.md +36 -36
  96. package/skills/production-readonly-audit/SKILL.md +41 -41
  97. package/skills/report-engine/SKILL.md +71 -71
  98. package/skills/scripts/optimize-progressive-disclosure.mjs +204 -204
  99. package/skills/scripts/refresh-progressive-disclosure.mjs +64 -64
  100. package/skills/scripts/validate-progressive-disclosure.mjs +52 -52
  101. package/skills/search-engine/SKILL.md +75 -75
  102. package/skills/spider-engine/SKILL.md +190 -190
  103. package/skills/system-observability/SKILL.md +162 -162
  104. package/skills/system-observability/references/memory-incident-triage.md +73 -73
  105. package/skills/translate-engine/SKILL.md +1 -1
  106. package/skills/ui-design/SKILL.md +3 -1
  107. package/skills/uniapp-mall-assets/SKILL.md +170 -170
  108. package/skills/unity-integration/SKILL.md +155 -155
  109. package/skills/unity-integration/agents/openai.yaml +4 -4
  110. package/skills/unity-integration/references/ai-app-delivery.md +103 -103
  111. package/skills/unity-integration/references/sdk-api.md +82 -82
  112. package/skills/unity-integration/references/toolbox-migration.md +66 -66
  113. package/skills/unity-integration/references/webgl-hosting.md +57 -57
  114. package/skills/v8-api-config/SKILL.md +378 -378
  115. package/skills/v8-cache-pattern/SKILL.md +306 -306
  116. package/skills/v8-crud-api/SKILL.md +29 -29
  117. 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 +56 -56
  118. package/skills/v8-debugging/SKILL.md +143 -143
  119. package/skills/v8-explorer-tree/SKILL.md +64 -64
  120. 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 +201 -201
  121. package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +118 -118
  122. 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 +32 -32
  123. package/skills/v8-file-upload/SKILL.md +154 -154
  124. 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 +133 -133
  125. 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 +138 -138
  126. package/skills/v8-formengine-http/SKILL.md +107 -107
  127. package/skills/v8-frontend-events/SKILL.md +22 -22
  128. package/skills/v8-frontend-events/references/bluetooth-print-api.md +135 -135
  129. package/skills/v8-frontend-events/references/bluetooth-print.md +247 -247
  130. package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +50 -50
  131. package/skills/v8-http-integration/SKILL.md +106 -106
  132. package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +31 -31
  133. 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 +5 -5
  134. package/skills/v8-image-processing/SKILL.md +190 -190
  135. package/skills/v8-image-processing/agents/openai.yaml +4 -4
  136. package/skills/v8-image-processing/references/api-reference.md +623 -623
  137. package/skills/v8-menu-buttons/SKILL.md +103 -103
  138. package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +145 -145
  139. 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
  140. 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 +43 -43
  141. package/skills/v8-mongodb/SKILL.md +65 -65
  142. package/skills/v8-mq-mqtt/SKILL.md +175 -175
  143. package/skills/v8-mq-mqtt/references/mqtt-production.md +342 -342
  144. package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +137 -137
  145. package/skills/v8-mq-mqtt/scripts/check-mqtt-skill-coverage.mjs +203 -203
  146. package/skills/v8-saas-multi-tenant/SKILL.md +223 -223
  147. package/skills/v8-security/SKILL.md +25 -25
  148. package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +122 -122
  149. package/skills/v8-sql-query/SKILL.md +127 -127
  150. package/skills/v8-table-event/SKILL.md +20 -20
  151. 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 +18 -18
  152. 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 +15 -15
  153. package/skills/v8-tcp-integration/SKILL.md +1 -1
  154. package/skills/v8-tcp-integration/agents/openai.yaml +4 -4
  155. package/skills/v8-template-engine/SKILL.md +59 -59
  156. package/skills/v8-utilities/SKILL.md +92 -92
  157. package/skills/v8-utilities/references/client-api-index.md +143 -143
  158. package/skills/v8-utilities/references/platform-http-routes.md +83 -83
  159. package/skills/v8-utilities/references/server-api-index.md +74 -74
  160. package/skills/v8-workflow/SKILL.md +44 -44
  161. package/skills/vision-engine/SKILL.md +19 -19
  162. package/skills/vision-engine/references/architecture-and-acceptance.md +34 -34
  163. package/skills/workspace-conventions/SKILL.md +236 -236
  164. 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
  165. 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 +179 -179
  166. 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 +21 -21
@@ -102,7 +102,7 @@
102
102
  ### 资源与隐私文件
103
103
 
104
104
  - 公开图片走 FileServer/CDN。
105
- - 私有图片必须先通过 `/apiengine/platform-private-file-url` 携带权威资源上下文换取短期签名 URL;签发失败时禁止回退裸路径。
105
+ - 私有图片必须先通过 `/apiengine/platform-private-file-url` 携带权威资源上下文换取短期签名 URL;签发失败时禁止回退裸路径。
106
106
  - 上传接口必须通用,不能在平台 HDFS 控制器写某项目“只允许支付凭证或实名认证图片”这类硬编码。
107
107
  - iOS Safari 上传后要验证表单字段不丢失,上传组件不能重置整张表单。
108
108
 
@@ -148,20 +148,20 @@
148
148
  - 通用规则:宿主必须提供唯一的 DI 授权服务,负责缓存刷新、HID、有效期和 RSA 签名验证;所有 Controller、AI、工作流等付费功能只读取这个实例,插件禁止自行缓存或再次创建 `LicenseValidator`。授权验证接口必须返回功能实际读取的 `OnlineFeatureLicensed/ProductType` 与宿主、插件程序集版本。核心插件接口应包含授权状态契约,使旧插件混入新发布包时直接启动/类型加载失败并暴露版本不一致,禁止静默退回开源版。
149
149
  - 自动化检查:先以无授权状态启动,再写入或挂载有效签名文件,验证统一服务限频刷新后授权接口与真实付费功能同时恢复;替换为旧插件 DLL 时启动必须失败或健康检查明确报版本不兼容,不能出现“Verify=Enterprise、功能=OpenSource”。无效签名、错误 HID、过期文件必须继续拒绝。
150
150
 
151
- ### 复盘:全局版本已升级但基础应用并未完整安装
151
+ ### 复盘:全局版本已升级但基础应用并未完整安装
152
152
 
153
153
  - 触发场景:客户旧库的 `ServerVersion` 已被后续步骤推进,但应用商城、导入器、菜单权限或关键元数据仍缺失;客户服务器不通外网时,重启也无法自愈。
154
154
  - 根因:升级器把全局版本号当成所有步骤成功的证明,单步失败后仍继续执行并更新版本;基础应用只依赖在线资源,且完整性检查继续走可能已经失真的 FormEngine 元数据。
155
155
  - 通用规则:后端发布包必须内置可启动的基础应用基线,在线资源只能整组校验成功后作为最新版覆盖,断网或任一资源失败时整组回退;迁移步骤必须失败即停且失败时禁止推进版本。导入器、必要表、菜单和权限等启动前置能力要独立做幂等完整性检查,老库检查以参数化物理表只读查询为准,不能只依赖全局版本或低代码元数据。
156
- - 自动化检查:选择一个版本号偏高但故意缺基础应用的旧库,以禁止外网模式启动,验证后端自动安装基础应用、管理员可见并打开应用商城、插件列表接口可拉取;再次冷启动不得重复导入。再注入任一步骤失败,验证后续步骤不执行且 `ServerVersion` 不前进。
157
-
158
- 流式应用发布等当前运行时入口若会直接查询新增物理字段,其扩展型结构不能只挂在
159
- `ServerVersion` 条件升级链里。必须在后台启动服务的共享分布式升级租约内、入口接流量前
160
- 独立幂等维护,并在版本链之前回读验证;历史版本号漂移或更早无关迁移失败时也要自愈。
161
- 自动化至少构造“版本号已高但发布字段缺失”的旧库并并发启动两个节点,断言只扩展一次、
162
- 没有永久锁,随后流式发布预检和首个文件写入不再出现缺列错误。
163
-
164
- ### 复盘:平台升级覆盖客户菜单的移动端显隐
156
+ - 自动化检查:选择一个版本号偏高但故意缺基础应用的旧库,以禁止外网模式启动,验证后端自动安装基础应用、管理员可见并打开应用商城、插件列表接口可拉取;再次冷启动不得重复导入。再注入任一步骤失败,验证后续步骤不执行且 `ServerVersion` 不前进。
157
+
158
+ 流式应用发布等当前运行时入口若会直接查询新增物理字段,其扩展型结构不能只挂在
159
+ `ServerVersion` 条件升级链里。必须在后台启动服务的共享分布式升级租约内、入口接流量前
160
+ 独立幂等维护,并在版本链之前回读验证;历史版本号漂移或更早无关迁移失败时也要自愈。
161
+ 自动化至少构造“版本号已高但发布字段缺失”的旧库并并发启动两个节点,断言只扩展一次、
162
+ 没有永久锁,随后流式发布预检和首个文件写入不再出现缺列错误。
163
+
164
+ ### 复盘:平台升级覆盖客户菜单的移动端显隐
165
165
 
166
166
  - 触发场景:旧租户切换到新版后端并执行自动升级后,移动端工作台整棵菜单消失;顶级 `sys_menu.AppDisplay` 为 `NULL` 或被升级包写成 `0` 时,所有下级菜单即使为 `1` 也无法展示。
167
167
  - 根因:旧 `UptSysMenu` 部分更新接口读取旧菜单后又丢弃旧实体,重新创建非空 `int` 字段默认为 `0` 的 `SysMenu` 再全字段更新;仅修改排序或父级也会把未传的 `Display/AppDisplay` 清零。历史加列迁移的不可重入多语句 SQL、应用包全量覆盖目标菜单,以及移动端把 `NULL/未配置` 当作隐藏,都会进一步放大影响。
@@ -180,19 +180,19 @@
180
180
  - 通用规则:需要保留旧版本并并行安装新版本时,新版必须使用独立 Compose 文件、独立 project 和独立 service 名;旧编排与旧容器在安装路径中只读。新版若必须保持原内网通信,应从旧容器回读并校验实际 Docker 网络,再通过 `external` 网络引用其真实名称,禁止由第二个 project 重复声明同一 IPAM 子网。动态端口必须写回 API 自身公开地址及前端 `ApiBase`;先启动并确认 API,再启动前端。失败清理只能 `down` 新 project,完成后还要回读旧端口对应的容器 ID 和运行状态,确认未被替换。并行项目后续更新必须使用另一份专用命令,固定读取新版 Compose/project/service,保留现场动态端口,备份新版 API/前端两个运行镜像 ID 并打不可变标签;先更新 API、再更新前端,任一步失败时只恢复新版双镜像,禁止复用会读取旧编排的历史日常更新脚本。进程、端口和 project 隔离不代表数据隔离;若新旧后端共用数据库、Redis 或租户,新版迁移、缓存与基础数据变化仍可能影响旧版,交付时必须明确警告并准备数据库级恢复方案。
181
181
  - 自动化检查:模拟新版起始端口连续占用、新版 API 启动失败和前端健康检查失败;断言旧 yml 字节不变、旧容器未执行 stop/rm/recreate、新版使用独立 project、实际 API 端口同时写入 `AuthServer` 与 `ApiBase`、新版 API 先于前端启动,失败时只清理新 project,并保存端口、网络、镜像 ID 和失败日志。并行日常更新另测动态端口不变、API/前端按序重建、任一服务失败后两个镜像都恢复到本次更新前的 ID,且旧端口容器 ID 始终不变。
182
182
 
183
- ### 复盘:容器已删除但残留 Compose 文件阻止安全重装
183
+ ### 复盘:容器已删除但残留 Compose 文件阻止安全重装
184
184
 
185
185
  - 触发场景:用户删除某个独立 Compose project 的全部容器后重新执行一键安装,脚本只因目标 yml 仍存在就报错退出;用户不得不手工删除文件,且容易误删其它编排。
186
186
  - 根因:安装保护只检查文件存在性,没有区分“仍有运行/停止容器的活跃环境”“容器已清空但本交付 yml 残留”和“身份不明的其它 yml”。
187
187
  - 通用规则:可重装脚本应先用 `docker ps -a` 按 project 标签检查全部运行及停止容器;只要存在任何容器就拒绝覆盖。容器为零但目标 yml 存在时,必须确认它是普通文件,校验预期 service、镜像和 `docker compose config`,保存 SHA-256 并归档原文件后才允许重新生成;身份不符、符号链接或语法错误一律停止。不得直接 `rm -f` 未确认身份的生产 yml。
188
- - 自动化检查:先安装并留下有效 yml,再模拟容器全部被删除,断言重复安装会归档旧 yml、保存哈希、重新选端口并保持旧项目不变;再模拟仍有停止容器,断言安装拒绝继续且原 yml 字节不变。
189
-
190
- ### 复盘:现场 Compose 文件名或 project 漂移导致专用更新脚本误报不存在
191
-
192
- - 触发场景:运维人员手工调整端口、外网 API 地址或重启脚本后,Compose 文件出现历史拼写变体,或容器被目录默认 project 启动;更新脚本仍硬编码标准文件名和初始 project,先报编排不存在,修正文件名后又可能报找不到容器。
193
- - 根因:把首次安装时的文件名和 project 当成长期不变事实,没有从当前磁盘与运行容器标签回读现场状态。
194
- - 通用规则:更新脚本应优先采用显式参数;未显式指定时可兼容已知历史文件名,但两个候选同时存在必须停止,禁止猜测。Compose 文件负责配置事实,运行容器的 `com.docker.compose.project` 与 `com.docker.compose.service` 标签负责运行态事实;应先按 service 标签唯一定位运行容器,再分别回读真实 project,并用各自 project 执行 `compose ps/port/up`。若 API 与前端历史上分属不同 project,更新和回滚可在服务身份唯一、project 合法且未显式限定 project 的前提下分别原地执行,禁止通过删除、迁移或改名强行合并拓扑。更新只拉镜像与重建,不得为了适配现场漂移而重新生成或覆盖端口、AuthServer、ApiBase 和网络配置。
195
- - 自动化检查:覆盖仅标准文件、仅历史拼写文件、两个文件并存、运行 project 使用安装默认值、运行 project 使用目录默认值、API/前端 project 不一致六类场景;断言兼容分支保留现场 yml 字节和动态端口,分别记录 API/前端 project,并在跨 project 成功与失败回滚路径中都使用各自 project;文件歧义及显式 project 不匹配仍应失败关闭。
188
+ - 自动化检查:先安装并留下有效 yml,再模拟容器全部被删除,断言重复安装会归档旧 yml、保存哈希、重新选端口并保持旧项目不变;再模拟仍有停止容器,断言安装拒绝继续且原 yml 字节不变。
189
+
190
+ ### 复盘:现场 Compose 文件名或 project 漂移导致专用更新脚本误报不存在
191
+
192
+ - 触发场景:运维人员手工调整端口、外网 API 地址或重启脚本后,Compose 文件出现历史拼写变体,或容器被目录默认 project 启动;更新脚本仍硬编码标准文件名和初始 project,先报编排不存在,修正文件名后又可能报找不到容器。
193
+ - 根因:把首次安装时的文件名和 project 当成长期不变事实,没有从当前磁盘与运行容器标签回读现场状态。
194
+ - 通用规则:更新脚本应优先采用显式参数;未显式指定时可兼容已知历史文件名,但两个候选同时存在必须停止,禁止猜测。Compose 文件负责配置事实,运行容器的 `com.docker.compose.project` 与 `com.docker.compose.service` 标签负责运行态事实;应先按 service 标签唯一定位运行容器,再分别回读真实 project,并用各自 project 执行 `compose ps/port/up`。若 API 与前端历史上分属不同 project,更新和回滚可在服务身份唯一、project 合法且未显式限定 project 的前提下分别原地执行,禁止通过删除、迁移或改名强行合并拓扑。更新只拉镜像与重建,不得为了适配现场漂移而重新生成或覆盖端口、AuthServer、ApiBase 和网络配置。
195
+ - 自动化检查:覆盖仅标准文件、仅历史拼写文件、两个文件并存、运行 project 使用安装默认值、运行 project 使用目录默认值、API/前端 project 不一致六类场景;断言兼容分支保留现场 yml 字节和动态端口,分别记录 API/前端 project,并在跨 project 成功与失败回滚路径中都使用各自 project;文件歧义及显式 project 不匹配仍应失败关闭。
196
196
 
197
197
  ### 复盘:一键安装脚本仍直接拉取海外镜像或工具二进制
198
198
 
@@ -63,8 +63,13 @@ Microi.UI 不只是组件集合,它是 AI 构建软件的视觉交付标准:
63
63
  - `Microi.UI/src/uniapp`:uni-app Vue 3 组件。
64
64
 
65
65
  <!-- /microi-progressive:chunk -->
66
- <!-- microi-progressive:chunk id=microi-ui-003 sha256=d23efbe5ef40f9352057534fac4aa7cd7808ae2fdb7857d05cb8b57e4a7a9c95 -->
67
- ## 默认要求
66
+ <!-- microi-progressive:chunk id=microi-ui-003 sha256=29586a620e8e76e0d08fa6cf48c1275154d009b734f341da455c802426cc315b -->
67
+ ## 默认要求
68
+
69
+ - **禁止弧形包边**:Tab、卡片、导航、提示条不使用随容器圆角弯曲的强调色侧边框。默认无侧框;需要选中侧标时使用独立的直竖线,与上下边缘留白,不能沿圆角包住上下边缘。中性容器边框与直线端点小圆角不受影响;完整规则见 `../ui-design/SKILL.md`。
70
+ - Web `MciModal` 默认将焦点移入弹窗、约束 Tab、支持 Esc、关闭恢复原焦点并隔离背后页面;多层弹窗只允许最上层交互。桌面标题栏默认可拖动且不能拖出视口,使用 `draggable=false` 可关闭;`closeOnEscape=false` 只用于确需保持的受控状态,必须保留明确关闭路径。
71
+ - 表单提交按钮使用 `MciButton type="submit"`(可配原生 `form` 属性);`MciFormField required` 必须真实触发原生必填验证。自定义 `select`/控件插槽需提供与可见标签一致的 `aria-label` 或 `aria-labelledby`,不能将全部选项文字混入控件名称。
72
+ - 链接、描边按钮和强调文字使用 `--mci-text-link`;品牌填充使用 `--mci-color-primary` 与 `--mci-text-on-primary`。暗色卡片必须使用暗色语义渐变,逐配色核对背景与文字的组合;普通文字和按钮文字对比度至少 4.5:1。
68
73
 
69
74
  - 应用启动时调用 `initMciDesign()`,或提供等效的项目级主题服务。
70
75
  - 支持 `theme: light | dark`、`palette: black | white | red | orange | yellow | green | cyan | blue | purple`、`shape: rounded | flat`、`motion: full | reduced`。
@@ -1,97 +1,97 @@
1
1
  ---
2
- name: microi-uniapp-frontend
3
- description: Microi 吾码 UniApp/H5 前端通用规范。用于构建或修复任何 Microi uni-app/移动端 H5 项目,覆盖上传资源渲染、头像、骨架屏、移动安全区、tabBar、固定底栏和明确业务素材选择。
2
+ name: microi-uniapp-frontend
3
+ description: Microi 吾码 UniApp/H5 前端通用规范。用于构建或修复任何 Microi uni-app/移动端 H5 项目,覆盖上传资源渲染、头像、骨架屏、移动安全区、tabBar、固定底栏和明确业务素材选择。
4
4
  ---
5
5
 
6
6
  > **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
7
7
 
8
- # Microi UniApp 前端通用规范
9
-
10
- 本 Skill 适用于任何 Microi 吾码 UniApp/H5 项目,包括商城、OA、ERP、MES、CRM、互联网项目、预约项目等。不要把规则写成某一个业务应用专属规范。
11
-
12
- ## 图片上传默认参数(强制)
13
-
14
- UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` / `V8.uploadFiles` 上传图片。调用方省略 `options.preview` 时,SDK 必须发送 `Preview=true` 并默认使用 `img` 路径;只有显式 `preview:false` 才允许关闭。服务端仍是最终事实源:即使旧客户端完全不传该字段,也要默认压缩到约 `500 KB`、最长边约 `1920 px`,并在 HDFS 私有桶保留一份 `_origin` 原图。页面不得为了“上传成功”自行改成 `preview:false`,也不得把私有原图或临时签名地址保存进业务字段。
15
-
16
- 动态表单上传还必须把控件已有的文件访问上下文透传为 `formFieldContext`:至少包含 `FormEngineKey + FieldId + SysMenuId`,编辑时再带 `FormDataId`,TableChild 再带 `_TableChildAuth`。后端回读 `diy_field.Config` 后决定“禁止匿名访问”与真实桶;普通用户不能被一刀切为私有桶,客户端自己传 `Limit=false` 也不能放宽私有字段。没有字段上下文的聊天、打卡、临时业务上传仍按普通私有上传处理。
17
-
18
- ## 平台方通用 App 登录连接器(明确例外)
19
-
20
- 登录页默认不得展示 ApiBase、OsClient 或调试配置;但用户明确要求、且安装包由 Microi 平台方作为多租户聚合客户端发布时,允许仅在 `APP-PLUS` 登录页提供通用连接器。协议必须使用固定 `https://` / `http://` 下拉框,地址框禁止重复输入协议,HTTPS 默认,HTTP 显示明文风险并二次确认;H5、小程序和客户专属包不得因此自动开放。候选地址先匿名读取 `GetSysConfig`,验证成功后再持久化。真正切换时必须清除旧 DiyToken、用户、SignalR、菜单/元数据/页面缓存,按 `ApiBase + OsClient` 隔离记住的账号及 RSA 密文,并用端点代次拒绝切换前的迟到响应。支持任意 HTTP 时,最终 IPA 必须显式包含 ATS 例外,Android 安装包必须显式包含 cleartext 例外;不需要任意 HTTP 的正式包应保持平台默认安全策略,iOS ATS 例外还必须在 App Store 审核中说明。
21
-
22
- <!-- microi-progressive:begin -->
8
+ # Microi UniApp 前端通用规范
9
+
10
+ 本 Skill 适用于任何 Microi 吾码 UniApp/H5 项目,包括商城、OA、ERP、MES、CRM、互联网项目、预约项目等。不要把规则写成某一个业务应用专属规范。
11
+
12
+ ## 图片上传默认参数(强制)
13
+
14
+ UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` / `V8.uploadFiles` 上传图片。调用方省略 `options.preview` 时,SDK 必须发送 `Preview=true` 并默认使用 `img` 路径;只有显式 `preview:false` 才允许关闭。服务端仍是最终事实源:即使旧客户端完全不传该字段,也要默认压缩到约 `500 KB`、最长边约 `1920 px`,并在 HDFS 私有桶保留一份 `_origin` 原图。页面不得为了“上传成功”自行改成 `preview:false`,也不得把私有原图或临时签名地址保存进业务字段。
15
+
16
+ 动态表单上传还必须把控件已有的文件访问上下文透传为 `formFieldContext`:至少包含 `FormEngineKey + FieldId + SysMenuId`,编辑时再带 `FormDataId`,TableChild 再带 `_TableChildAuth`。后端回读 `diy_field.Config` 后决定“禁止匿名访问”与真实桶;普通用户不能被一刀切为私有桶,客户端自己传 `Limit=false` 也不能放宽私有字段。没有字段上下文的聊天、打卡、临时业务上传仍按普通私有上传处理。
17
+
18
+ ## 平台方通用 App 登录连接器(明确例外)
19
+
20
+ 登录页默认不得展示 ApiBase、OsClient 或调试配置;但用户明确要求、且安装包由 Microi 平台方作为多租户聚合客户端发布时,允许仅在 `APP-PLUS` 登录页提供通用连接器。协议必须使用固定 `https://` / `http://` 下拉框,地址框禁止重复输入协议,HTTPS 默认,HTTP 显示明文风险并二次确认;H5、小程序和客户专属包不得因此自动开放。候选地址先匿名读取 `GetSysConfig`,验证成功后再持久化。真正切换时必须清除旧 DiyToken、用户、SignalR、菜单/元数据/页面缓存,按 `ApiBase + OsClient` 隔离记住的账号及 RSA 密文,并用端点代次拒绝切换前的迟到响应。支持任意 HTTP 时,最终 IPA 必须显式包含 ATS 例外,Android 安装包必须显式包含 cleartext 例外;不需要任意 HTTP 的正式包应保持平台默认安全策略,iOS ATS 例外还必须在 App Store 审核中说明。
21
+
22
+ <!-- microi-progressive:begin -->
23
23
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-000 sha256=ecb0fc85b5c3b15ac79c9049ca86de8c586d4ce3a6c975255464069d89f87ac4 -->
24
- ## 移动端质量门禁必须先读
25
-
26
- 创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`。该 Skill 中的底部导航真实图标、重要按钮图标化、登录 API 校验、微信手机号快捷登录、后台二级菜单和页面动效要求,属于交付验收条件,不是可选优化。
27
-
24
+ ## 移动端质量门禁必须先读
25
+
26
+ 创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`。该 Skill 中的底部导航真实图标、重要按钮图标化、登录 API 校验、微信手机号快捷登录、后台二级菜单和页面动效要求,属于交付验收条件,不是可选优化。
27
+
28
28
  <!-- /microi-progressive:chunk -->
29
29
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=dbfb19570590b460284ffd88502a8610b6fea0d2c36c08b4d15724782aeda61c -->
30
- ## 标准产品、视图协议与租户扩展
31
-
32
- Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile + 租户插件”架构,不能把某个交付项目直接写死成平台产品:
33
-
34
- - `src/platform/`、通用 `mci-*` 组件、动态模块页和动态表单页只实现平台能力,不得出现租户表名、字段名、品牌文案、素材或客户路由。
35
- - `src/tenants/<tenant>/` 存放客户专属业务组合、首页统计、表单联动、子表规则、扫码/定位/相机和复杂原生流程;`profiles/<id>/` 管理 OsClient、API、品牌、功能开关、路由和真实编译范围。
36
- - `src/generated/`、`pages.json`、`manifest.json` 等 Profile 产物由脚本生成,不能作为人工定制入口。多人合并冲突时以 Profile 与租户源码为准重新生成。
37
- - 普通 CRUD 必须优先使用授权后的 `sys_menu + diy_table + diy_field` 动态渲染;只有原生能力或客户独有的复杂组合才增加租户扩展。
38
-
39
- 统一视图协议归属 `sys_menu`。使用 `EnableViewSchema`、`ViewSchema`、`ViewSchemaVersion`、`ViewConfigVersion` 等明确物理字段保存 `List/Card/Detail/Edit`、`PC/Mobile/All`、角色视图、Hero、MetricStrip、ActionGrid 和 ResponsiveSection。`diy_table/diy_field/sys_menu.DiyConfig` 已废弃,禁止继续读取或写入。
40
-
41
- - 后台新增字段或修改名称、顺序、显隐、组件、校验、数据源和分组后,客户端必须通过版本指纹刷新定义,无需重新发版。
42
- - 表单元数据必须通过 `V8.FormEngine.GetDiyTableModel/GetDiyFieldList` 访问当前 FormEngine 缓存入口,并携带真实菜单授权上下文;页面和控件不得用普通 `GetFormData/GetTableData` 直查受保护的 `diy_table/diy_field`,也不得散落裸元数据接口 URL。
43
- - ViewSchema 未配置、配置不完整或网络暂时失败时,必须回退到菜单移动字段和完整 `diy_field` 定义;定制详情还必须把未显式编排的新字段追加到折叠分组,不能静默丢字段。
44
- - 列表、详情、编辑和保存请求应携带真实授权 `_SysMenuId`;客户端不能自行声明角色、数据范围或表权限,服务端仍是最终权限边界。
45
- - 小程序不得下载或执行任意前端 V8,不得使用 `eval/new Function`。字段显隐和联动使用白名单声明式规则,按钮使用 ActionSchema,复杂事务和校验进入 ApiEngine 或后端表单事件。
46
- - ActionSchema 只能描述文字、图标、颜色、确认提示、参数映射、ApiEngineKey、原生 ActionType 和成功后的刷新/跳转;扫码、定位、拍照、拨号、导航等由受控原生适配器执行。
47
-
48
- 仓库必须提供 AI 与人工协作约束文件、租户脚手架、Profile 构建/同步命令和架构检查。平台层改动至少同时构建标准 Profile 与默认交付 Profile;租户视觉改动还要执行多视口截图回归。这样其他同事使用 Codex、Claude、Copilot、Cursor 等工具继续开发时,会先读取相同规则,而不是依赖某次对话记忆。
49
-
30
+ ## 标准产品、视图协议与租户扩展
31
+
32
+ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile + 租户插件”架构,不能把某个交付项目直接写死成平台产品:
33
+
34
+ - `src/platform/`、通用 `mci-*` 组件、动态模块页和动态表单页只实现平台能力,不得出现租户表名、字段名、品牌文案、素材或客户路由。
35
+ - `src/tenants/<tenant>/` 存放客户专属业务组合、首页统计、表单联动、子表规则、扫码/定位/相机和复杂原生流程;`profiles/<id>/` 管理 OsClient、API、品牌、功能开关、路由和真实编译范围。
36
+ - `src/generated/`、`pages.json`、`manifest.json` 等 Profile 产物由脚本生成,不能作为人工定制入口。多人合并冲突时以 Profile 与租户源码为准重新生成。
37
+ - 普通 CRUD 必须优先使用授权后的 `sys_menu + diy_table + diy_field` 动态渲染;只有原生能力或客户独有的复杂组合才增加租户扩展。
38
+
39
+ 统一视图协议归属 `sys_menu`。使用 `EnableViewSchema`、`ViewSchema`、`ViewSchemaVersion`、`ViewConfigVersion` 等明确物理字段保存 `List/Card/Detail/Edit`、`PC/Mobile/All`、角色视图、Hero、MetricStrip、ActionGrid 和 ResponsiveSection。`diy_table/diy_field/sys_menu.DiyConfig` 已废弃,禁止继续读取或写入。
40
+
41
+ - 后台新增字段或修改名称、顺序、显隐、组件、校验、数据源和分组后,客户端必须通过版本指纹刷新定义,无需重新发版。
42
+ - 表单元数据必须通过 `V8.FormEngine.GetDiyTableModel/GetDiyFieldList` 访问当前 FormEngine 缓存入口,并携带真实菜单授权上下文;页面和控件不得用普通 `GetFormData/GetTableData` 直查受保护的 `diy_table/diy_field`,也不得散落裸元数据接口 URL。
43
+ - ViewSchema 未配置、配置不完整或网络暂时失败时,必须回退到菜单移动字段和完整 `diy_field` 定义;定制详情还必须把未显式编排的新字段追加到折叠分组,不能静默丢字段。
44
+ - 列表、详情、编辑和保存请求应携带真实授权 `_SysMenuId`;客户端不能自行声明角色、数据范围或表权限,服务端仍是最终权限边界。
45
+ - 小程序不得下载或执行任意前端 V8,不得使用 `eval/new Function`。字段显隐和联动使用白名单声明式规则,按钮使用 ActionSchema,复杂事务和校验进入 ApiEngine 或后端表单事件。
46
+ - ActionSchema 只能描述文字、图标、颜色、确认提示、参数映射、ApiEngineKey、原生 ActionType 和成功后的刷新/跳转;扫码、定位、拍照、拨号、导航等由受控原生适配器执行。
47
+
48
+ 仓库必须提供 AI 与人工协作约束文件、租户脚手架、Profile 构建/同步命令和架构检查。平台层改动至少同时构建标准 Profile 与默认交付 Profile;租户视觉改动还要执行多视口截图回归。这样其他同事使用 Codex、Claude、Copilot、Cursor 等工具继续开发时,会先读取相同规则,而不是依赖某次对话记忆。
49
+
50
50
  <!-- /microi-progressive:chunk -->
51
51
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-002 sha256=76ebf3985d21fbbc5d86093b95bdf348e526e3670da9bb6827b5e1a7184e617b -->
52
- ## H5 预览壳与底部导航强制规则
53
-
54
- - 桌面浏览器允许使用 `Microi UniApp H5 Preview` 手机壳帮助用户理解移动端比例。
55
- - 真机、窄屏浏览器以及 PC DevTools 移动设备仿真(视口宽度小于等于 `767px`)必须自动去掉手机壳标题、外边距、圆角、边框和阴影,内容铺满 `100vw × 100vh`;不得在手机屏幕里再套一层模拟手机。
56
- - AI 应用预览编译器必须为每个底部菜单渲染真实 SVG/本地图标和文字,不能只输出文字、单汉字、emoji 或空白占位。原生 uni-app `tabBar` 仍使用纳入版本管理的本地 PNG `iconPath / selectedIconPath`。
57
- - 自动化验收必须同时使用桌面视口与移动视口截图:桌面端断言手机壳存在,移动端断言 `.phone-status` 隐藏且 `.phone` 无圆角、无边框、宽高铺满;每个底部菜单的图标元素和文字都必须可见、可点击。
58
-
52
+ ## H5 预览壳与底部导航强制规则
53
+
54
+ - 桌面浏览器允许使用 `Microi UniApp H5 Preview` 手机壳帮助用户理解移动端比例。
55
+ - 真机、窄屏浏览器以及 PC DevTools 移动设备仿真(视口宽度小于等于 `767px`)必须自动去掉手机壳标题、外边距、圆角、边框和阴影,内容铺满 `100vw × 100vh`;不得在手机屏幕里再套一层模拟手机。
56
+ - AI 应用预览编译器必须为每个底部菜单渲染真实 SVG/本地图标和文字,不能只输出文字、单汉字、emoji 或空白占位。原生 uni-app `tabBar` 仍使用纳入版本管理的本地 PNG `iconPath / selectedIconPath`。
57
+ - 自动化验收必须同时使用桌面视口与移动视口截图:桌面端断言手机壳存在,移动端断言 `.phone-status` 隐藏且 `.phone` 无圆角、无边框、宽高铺满;每个底部菜单的图标元素和文字都必须可见、可点击。
58
+
59
59
  <!-- /microi-progressive:chunk -->
60
60
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-003 sha256=5cedd05cb29746019a92db56a21123718fde23d5d9df4b8064dfc260bc89ee05 -->
61
- ## 登录页与手机号快捷登录
62
-
63
- - 登录页必须是直接登录面,不要默认做“员工登录 / 客户登录”身份 Tab 切换,除非用户明确要求。默认展示系统账号密码登录,同时提供客户手机号快捷登录入口。
64
- - 账号密码登录必须先检查项目本地 SDK 实际导出,常见是 `V8.Login(param)` 或 `/api/SysUser/Login`。禁止凭空写 `V8.Login.Login(...)` 这类未验证子对象。
65
- - 登录、接口引擎、FormEngine、上传等所有请求头必须做大小写不敏感去重;`osclient` 只能发送一个运行期值,例如 `demo`,禁止同时传 `OsClient` 与 `osclient` 导致网络面板出现 `demo, demo`。
66
- - 账号密码登录只有在同时拿到成功码、有效 token 和有效用户 `Id` 时才算成功。Microi 登录 token 可能在响应头 `authorization`,用户信息可能在响应体 `Data`;两者任一缺失都要清理 SDK token、本地用户缓存和 session。
67
- - 恢复本地会话时必须重新校验 token 和用户 `Id`,禁止出现页面显示 `admin` 但状态仍是“未登录”的半登录状态。
68
- - 账号密码登录调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)` 前,必须读取 `/apiengine/platform-sys-config` 或 `V8.GetSysConfig(true)`,并根据 `Sys_Config.EnableCaptcha` 决定是否显示图形验证码。判断函数必须兼容 `1`、`true`、`'1'`、`'true'`,不要直接 `!!cfg.EnableCaptcha`。
69
- - 开启验证码时,页面必须通过 `GET /api/Captcha/GetCaptcha` 获取验证码图片,读取响应头 `captchaid`,提交账号登录时传 `_CaptchaId` 和 `_CaptchaValue`;登录失败后清空输入并刷新验证码。未开启验证码时不显示验证码,不传空验证码字段。
70
- - 微信小程序手机号快捷登录必须使用 `<button open-type="getPhoneNumber">`,通过 `@getphonenumber` 获取 `detail.code`,并重新调用 `uni.login({ provider:'weixin' })` 获取新的 `LoginCode`。前端不能假设能直接拿到手机号明文。
71
- - H5/App 可提供手机号输入兜底,但必须确认后端接口支持 `Phone` 登录;微信小程序优先走 `Code + LoginCode`。
72
- - 登录按钮、去登录按钮、手机号授权按钮必须是图标 + 文案按钮,具备 loading、disabled/pressed 反馈,且原生 button 默认边框要清掉。
73
- - 体验版授权登录必须保留可诊断错误:请求层归一化 `uni.request.fail.errMsg`、HTTP 状态和接口 `Msg`,登录页用模态框完整展示“阶段 + 原因 + 追踪号”。后端接口引擎按阶段写脱敏系统日志;不能只在前端 catch 后显示固定“手机号登录失败”。
74
- - 小程序调用手机号快速验证组件的前置页、按钮、弹窗、分享标题和失败提示不得出现“微信”“微信官方”“微信登录”“一键登录”等可能混淆腾讯官方的文案,也不得展示微信官方 Logo、相似绿色气泡图标或仿官方品牌元素。统一使用“手机号快捷登录”“手机号快速验证”等中性业务文案,只展示应用自身品牌 Logo。
75
- - 微信小程序构建后必须扫描登录页源码以及 `dist/build/mp-weixin/pages/login/` 产物,并截图核对手机号快速验证前置页;命中上述混淆文案、官方图形或近似元素时必须阻止上传和提审,不能只检查按钮主文案而漏掉说明文字、错误弹窗或分享标题。
76
-
61
+ ## 登录页与手机号快捷登录
62
+
63
+ - 登录页必须是直接登录面,不要默认做“员工登录 / 客户登录”身份 Tab 切换,除非用户明确要求。默认展示系统账号密码登录,同时提供客户手机号快捷登录入口。
64
+ - 账号密码登录必须先检查项目本地 SDK 实际导出,常见是 `V8.Login(param)` 或 `/api/SysUser/Login`。禁止凭空写 `V8.Login.Login(...)` 这类未验证子对象。
65
+ - 登录、接口引擎、FormEngine、上传等所有请求头必须做大小写不敏感去重;`osclient` 只能发送一个运行期值,例如 `demo`,禁止同时传 `OsClient` 与 `osclient` 导致网络面板出现 `demo, demo`。
66
+ - 账号密码登录只有在同时拿到成功码、有效 token 和有效用户 `Id` 时才算成功。Microi 登录 token 可能在响应头 `authorization`,用户信息可能在响应体 `Data`;两者任一缺失都要清理 SDK token、本地用户缓存和 session。
67
+ - 恢复本地会话时必须重新校验 token 和用户 `Id`,禁止出现页面显示 `admin` 但状态仍是“未登录”的半登录状态。
68
+ - 账号密码登录调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)` 前,必须读取 `/apiengine/platform-sys-config` 或 `V8.GetSysConfig(true)`,并根据 `Sys_Config.EnableCaptcha` 决定是否显示图形验证码。判断函数必须兼容 `1`、`true`、`'1'`、`'true'`,不要直接 `!!cfg.EnableCaptcha`。
69
+ - 开启验证码时,页面必须通过 `GET /api/Captcha/GetCaptcha` 获取验证码图片,读取响应头 `captchaid`,提交账号登录时传 `_CaptchaId` 和 `_CaptchaValue`;登录失败后清空输入并刷新验证码。未开启验证码时不显示验证码,不传空验证码字段。
70
+ - 微信小程序手机号快捷登录必须使用 `<button open-type="getPhoneNumber">`,通过 `@getphonenumber` 获取 `detail.code`,并重新调用 `uni.login({ provider:'weixin' })` 获取新的 `LoginCode`。前端不能假设能直接拿到手机号明文。
71
+ - H5/App 可提供手机号输入兜底,但必须确认后端接口支持 `Phone` 登录;微信小程序优先走 `Code + LoginCode`。
72
+ - 登录按钮、去登录按钮、手机号授权按钮必须是图标 + 文案按钮,具备 loading、disabled/pressed 反馈,且原生 button 默认边框要清掉。
73
+ - 体验版授权登录必须保留可诊断错误:请求层归一化 `uni.request.fail.errMsg`、HTTP 状态和接口 `Msg`,登录页用模态框完整展示“阶段 + 原因 + 追踪号”。后端接口引擎按阶段写脱敏系统日志;不能只在前端 catch 后显示固定“手机号登录失败”。
74
+ - 小程序调用手机号快速验证组件的前置页、按钮、弹窗、分享标题和失败提示不得出现“微信”“微信官方”“微信登录”“一键登录”等可能混淆腾讯官方的文案,也不得展示微信官方 Logo、相似绿色气泡图标或仿官方品牌元素。统一使用“手机号快捷登录”“手机号快速验证”等中性业务文案,只展示应用自身品牌 Logo。
75
+ - 微信小程序构建后必须扫描登录页源码以及 `dist/build/mp-weixin/pages/login/` 产物,并截图核对手机号快速验证前置页;命中上述混淆文案、官方图形或近似元素时必须阻止上传和提审,不能只检查按钮主文案而漏掉说明文字、错误弹窗或分享标题。
76
+
77
77
  <!-- /microi-progressive:chunk -->
78
78
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-004 sha256=cc25e3d896e6f7349a7a7e93b8025ee797bf9810e60214eb95e41d75aa083422 -->
79
- ## 微信小程序全页面分享
80
-
81
- - 创建或维护 UniApp 微信小程序时,默认把好友转发与朋友圈分享视为页面基础能力;按 `pages.json` 全量路由逐页接入,不等待用户额外提出。
82
- - Vue3 `<script setup>` 页面直接导入 `onShareAppMessage`、`onShareTimeline` 并注册处理函数。可以复用项目级 payload 工具,但生命周期导入必须出现在页面源码中,确保 uni-app 编译器注册页面能力。
83
- - `onShareAppMessage` 返回业务标题和完整页面 `path`;`onShareTimeline` 返回业务标题和当前页 `query`。资讯、报告等内容页可返回符合平台尺寸要求的 `imageUrl`。
84
- - 分享参数保留页面定位所需的 Id、分类和公开 ShareToken,统一过滤 Authorization、AccessToken、CustomerToken、手机号授权码、LoginCode、OpenId、验证码等敏感参数。
85
- - 登录页、员工页、管理页等受保护页面同样可分享。接收者打开后由 session/角色守卫展示登录或无权限提示,不得因页面需要登录就调用 `hideShareMenu`。
86
- - 验收不能只看首页右上角。用脚本比较 `pages.json` 路由数量与源码/微信构建产物中的两种分享生命周期数量,并在体验版抽测公开页、登录页和受保护详情页。
87
-
79
+ ## 微信小程序全页面分享
80
+
81
+ - 创建或维护 UniApp 微信小程序时,默认把好友转发与朋友圈分享视为页面基础能力;按 `pages.json` 全量路由逐页接入,不等待用户额外提出。
82
+ - Vue3 `<script setup>` 页面直接导入 `onShareAppMessage`、`onShareTimeline` 并注册处理函数。可以复用项目级 payload 工具,但生命周期导入必须出现在页面源码中,确保 uni-app 编译器注册页面能力。
83
+ - `onShareAppMessage` 返回业务标题和完整页面 `path`;`onShareTimeline` 返回业务标题和当前页 `query`。资讯、报告等内容页可返回符合平台尺寸要求的 `imageUrl`。
84
+ - 分享参数保留页面定位所需的 Id、分类和公开 ShareToken,统一过滤 Authorization、AccessToken、CustomerToken、手机号授权码、LoginCode、OpenId、验证码等敏感参数。
85
+ - 登录页、员工页、管理页等受保护页面同样可分享。接收者打开后由 session/角色守卫展示登录或无权限提示,不得因页面需要登录就调用 `hideShareMenu`。
86
+ - 验收不能只看首页右上角。用脚本比较 `pages.json` 路由数量与源码/微信构建产物中的两种分享生命周期数量,并在体验版抽测公开页、登录页和受保护详情页。
87
+
88
88
  <!-- /microi-progressive:chunk -->
89
89
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-005 sha256=036ed2e8dd8417615c6641a746852d8c231cd0ab02b357d78a4054404b9dce5d -->
90
- ## 首屏 Hero 与浮动面板验收
91
-
92
- - 移动端首屏 Hero 标题必须按真实中文文案调字号和行高,不能为了“震撼”把业务入口标题做得过大,导致一行半、孤字换行或压住按钮。
93
- - Hero 下方如果有浮动快捷入口面板,必须给 Hero 底部预留按钮安全区,并控制面板负 margin;面板只能覆盖装饰留白,不能盖住“立即登录 / 查看报告 / 提交”等主按钮的圆角、阴影或点击区域。
94
- - 交付前至少检查 375px 与 430px 宽度首屏截图,确认标题、主按钮、次按钮、浮动面板、第二块内容没有重叠、裁切或不美观换行。
90
+ ## 首屏 Hero 与浮动面板验收
91
+
92
+ - 移动端首屏 Hero 标题必须按真实中文文案调字号和行高,不能为了“震撼”把业务入口标题做得过大,导致一行半、孤字换行或压住按钮。
93
+ - Hero 下方如果有浮动快捷入口面板,必须给 Hero 底部预留按钮安全区,并控制面板负 margin;面板只能覆盖装饰留白,不能盖住“立即登录 / 查看报告 / 提交”等主按钮的圆角、阴影或点击区域。
94
+ - 交付前至少检查 375px 与 430px 宽度首屏截图,确认标题、主按钮、次按钮、浮动面板、第二块内容没有重叠、裁切或不美观换行。
95
95
 
96
96
  <!-- /microi-progressive:chunk -->
97
97
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-006 sha256=9baac30856c333837f39530bddedfa93a40a4b5a17c809bdf3854ff824061d96 -->
@@ -100,44 +100,44 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
100
100
  数据库中的图片、附件、头像、Logo、卡面图、单据图片等字段常见保存形式:
101
101
 
102
102
  - 绝对地址:`https://...`
103
- - API 本地文件路由:`/file/...`
104
- - 对象存储相对路径:`/tenant/module/file.jpg` 或 `tenant/module/file.jpg`
105
- - 上传组件 JSON:`[{"Path":"..."}]`、`{"Path":"..."}`、`{"FilePathName":"..."}`,也可能已经是对象/数组而不是字符串
106
- - 历史脏数据或第三方占位图
107
-
108
- 页面模板不能直接写 `<image :src="row.Avatar">`、`<image :src="row.MainImg">`。必须在项目的 API/资源工具模块里提供统一解析函数,例如 `resolveAssetUrl`、`sanitizeAssetUrl`、`resolveFileUrl`、`resolveAvatarUrl`,并让页面只绑定已经归一化后的最终 URL。
109
-
110
- 资源解析函数必须先按 `microi.skills/v8-file-upload/SKILL.md` 的 `normalizeUploadValue` 思路处理 `ImgUpload` / `FileUpload` 字段:空值、`正在上传中...`、旧字符串路径、JSON 字符串对象、JSON 字符串数组、运行时对象、运行时数组都要兼容;取出 `Path` 后再进入 FileServer/API/私有签名 URL 逻辑。
103
+ - API 本地文件路由:`/file/...`
104
+ - 对象存储相对路径:`/tenant/module/file.jpg` 或 `tenant/module/file.jpg`
105
+ - 上传组件 JSON:`[{"Path":"..."}]`、`{"Path":"..."}`、`{"FilePathName":"..."}`,也可能已经是对象/数组而不是字符串
106
+ - 历史脏数据或第三方占位图
107
+
108
+ 页面模板不能直接写 `<image :src="row.Avatar">`、`<image :src="row.MainImg">`。必须在项目的 API/资源工具模块里提供统一解析函数,例如 `resolveAssetUrl`、`sanitizeAssetUrl`、`resolveFileUrl`、`resolveAvatarUrl`,并让页面只绑定已经归一化后的最终 URL。
109
+
110
+ 资源解析函数必须先按 `microi.skills/v8-file-upload/SKILL.md` 的 `normalizeUploadValue` 思路处理 `ImgUpload` / `FileUpload` 字段:空值、`正在上传中...`、旧字符串路径、JSON 字符串对象、JSON 字符串数组、运行时对象、运行时数组都要兼容;取出 `Path` 后再进入 FileServer/API/私有签名 URL 逻辑。
111
111
 
112
112
  推荐规则:
113
113
 
114
114
  - `http(s)://`、`data:`、`blob:` 原样返回。
115
115
  - `/file/...` 走 API 服务。
116
116
  - `/tenant/...`、`tenant/...` 等对象存储路径走 `V8.SysConfig.FileServer` 对应的文件服务器/CDN。
117
- - 私有文件使用后端签名 URL,例如 `V8.Method.GetPrivateFileUrl({ FilePathName })`,失败时再回退到公开文件服务器路径。
118
- - 第三方占位图、已失效临时地址、空字符串统一清理为空,交给 UI 占位态。
119
-
117
+ - 私有文件使用后端签名 URL,例如 `V8.Method.GetPrivateFileUrl({ FilePathName })`,失败时再回退到公开文件服务器路径。
118
+ - 第三方占位图、已失效临时地址、空字符串统一清理为空,交给 UI 占位态。
119
+
120
120
  <!-- /microi-progressive:chunk -->
121
121
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-007 sha256=3894454672b6bde6f4a7b329103c9418804f4594b7e3505617590ebea5f136ab -->
122
- ## 移动端大资源优先使用租户 HDFS/CDN
123
-
124
- 定制 UniApp/H5/小程序中的大图、视频、音频、字体和大型第三方静态文件,默认不要塞进主包。应先确认目标 `OsClient`,通过该租户 MCP/HDFS 上传,再以 `sys_config.FileServer + Path` 的 CDN/公有桶地址引用;合同、证件等敏感资源仍必须使用私有桶和临时签名 URL。
125
-
126
- - 首页 Hero、商品占位图、活动 Banner、引导音频、演示视频等公开资源使用 `Limit:false`,上传后必须以匿名请求验证最终 URL 返回 `200`、正确 `Content-Type` 和非空内容。
127
- - tabBar 图标、返回/关闭等小型交互图标、启动阶段必须离线可用的关键素材可以留在主包;不能为了远程化导致断网时连导航和基本操作都不可识别。
128
- - 上传前按场景做适度压缩和尺寸裁剪,同时保存原始素材或可重复生成源;禁止为了通过包体扫描而盲目把图片、音频压到明显失真、文字模糊或播放体验受损。
129
- - 压缩后必须在至少 375px、430px 和目标小程序设备截图中核对清晰度、裁切、首屏加载与失败占位;音视频还要抽听/抽播。质量不合格时优先调整编码、分辨率和缓存策略,而不是继续极端压缩。
130
- - 项目只能通过统一配置或资源解析器保存 CDN 地址,页面不得散落硬编码 FileServer;切换环境或租户时必须能整体替换。
131
- - CDN 资源必须设置加载失败占位或降级路径。构建验收同时检查小程序主包资源总量、单资源大小、远程域名白名单和真实 CDN 可达性,不能只看源码文件大小。
132
- - 小程序发布前必须扫描实际构建目录,而不只扫描 `src`:单个非离线关键资源超过 `256 KB` 时默认迁移 HDFS/CDN;主包静态资源达到 `1.5 MB` 或距离平台硬上限不足 `300 KB` 时必须停止上传,先瘦身或分包。确需本地保留的例外要记录离线必要性、大小和验证证据。
133
- - HDFS 迁移顺序固定为“保留/归档原始素材 -> 按真实展示尺寸压缩 -> 上传当前租户公有 HDFS -> 保存相对 `Path` -> 运行期通过 `SysConfig.FileServer` 解析 -> 匿名 GET 回读”。回读必须断言 `200`、正确 `Content-Type`、非空大小,重要资源再比对 SHA-256;不能把上传接口返回成功当成完成。
134
- - 原始高清图、视频母版、设计源文件不得继续放在会被 UniApp 收集的 `src/static`、分包目录或其它构建入口中;应移到项目资料/设计源目录。主包仅保留小于门禁的轻量失败占位图和离线关键图标。
135
-
122
+ ## 移动端大资源优先使用租户 HDFS/CDN
123
+
124
+ 定制 UniApp/H5/小程序中的大图、视频、音频、字体和大型第三方静态文件,默认不要塞进主包。应先确认目标 `OsClient`,通过该租户 MCP/HDFS 上传,再以 `sys_config.FileServer + Path` 的 CDN/公有桶地址引用;合同、证件等敏感资源仍必须使用私有桶和临时签名 URL。
125
+
126
+ - 首页 Hero、商品占位图、活动 Banner、引导音频、演示视频等公开资源使用 `Limit:false`,上传后必须以匿名请求验证最终 URL 返回 `200`、正确 `Content-Type` 和非空内容。
127
+ - tabBar 图标、返回/关闭等小型交互图标、启动阶段必须离线可用的关键素材可以留在主包;不能为了远程化导致断网时连导航和基本操作都不可识别。
128
+ - 上传前按场景做适度压缩和尺寸裁剪,同时保存原始素材或可重复生成源;禁止为了通过包体扫描而盲目把图片、音频压到明显失真、文字模糊或播放体验受损。
129
+ - 压缩后必须在至少 375px、430px 和目标小程序设备截图中核对清晰度、裁切、首屏加载与失败占位;音视频还要抽听/抽播。质量不合格时优先调整编码、分辨率和缓存策略,而不是继续极端压缩。
130
+ - 项目只能通过统一配置或资源解析器保存 CDN 地址,页面不得散落硬编码 FileServer;切换环境或租户时必须能整体替换。
131
+ - CDN 资源必须设置加载失败占位或降级路径。构建验收同时检查小程序主包资源总量、单资源大小、远程域名白名单和真实 CDN 可达性,不能只看源码文件大小。
132
+ - 小程序发布前必须扫描实际构建目录,而不只扫描 `src`:单个非离线关键资源超过 `256 KB` 时默认迁移 HDFS/CDN;主包静态资源达到 `1.5 MB` 或距离平台硬上限不足 `300 KB` 时必须停止上传,先瘦身或分包。确需本地保留的例外要记录离线必要性、大小和验证证据。
133
+ - HDFS 迁移顺序固定为“保留/归档原始素材 -> 按真实展示尺寸压缩 -> 上传当前租户公有 HDFS -> 保存相对 `Path` -> 运行期通过 `SysConfig.FileServer` 解析 -> 匿名 GET 回读”。回读必须断言 `200`、正确 `Content-Type`、非空大小,重要资源再比对 SHA-256;不能把上传接口返回成功当成完成。
134
+ - 原始高清图、视频母版、设计源文件不得继续放在会被 UniApp 收集的 `src/static`、分包目录或其它构建入口中;应移到项目资料/设计源目录。主包仅保留小于门禁的轻量失败占位图和离线关键图标。
135
+
136
136
  <!-- /microi-progressive:chunk -->
137
137
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-008 sha256=ed9dfcd0c7504323632b9b31c2b27f062c85eb53f45d617de9837896543974fb -->
138
- ## 头像必须异步统一解析
139
-
140
- 头像字段比普通图片更容易混合出现上传 JSON、私有路径、相对路径、历史字段名和脏数据。列表页、详情页、业务记录、审批记录、团队/会员卡片、聊天/消息等头像场景都必须走同一个头像解析入口。
138
+ ## 头像必须异步统一解析
139
+
140
+ 头像字段比普通图片更容易混合出现上传 JSON、私有路径、相对路径、历史字段名和脏数据。列表页、详情页、业务记录、审批记录、团队/会员卡片、聊天/消息等头像场景都必须走同一个头像解析入口。
141
141
 
142
142
  正确模式:
143
143
 
@@ -151,36 +151,36 @@ row.OwnerAvatarUrl = await resolveAvatarUrl(rawAvatar);
151
151
  ```vue
152
152
  <image v-if="row.OwnerAvatarUrl" :src="row.OwnerAvatarUrl" mode="aspectFill" />
153
153
  ```
154
-
155
- 禁止在模板中临时拼接文件服务器,禁止每个页面各写一套头像解析,禁止只在能查到关联用户时才解析接口已经返回的头像字段。
156
-
154
+
155
+ 禁止在模板中临时拼接文件服务器,禁止每个页面各写一套头像解析,禁止只在能查到关联用户时才解析接口已经返回的头像字段。
156
+
157
157
  <!-- /microi-progressive:chunk -->
158
158
  <!-- microi-progressive:chunk id=microi-uniapp-frontend-009 sha256=0270fbc5a2ee0d20a4d1d2f2a9c7fc7304e18402d282e1efcf860bd31db9fcb0 -->
159
- ## 移动端富文本图文排版
160
-
161
- 商品详情、公告详情、活动说明、文章正文、协议说明等富文本在移动端渲染时,图片和文字不能使用同一套留白规则。
162
-
163
- - 主图、详情长图、海报图可以 `width:100%` / `display:block` 满宽展示,不额外加左右 padding,避免图片显得缩小或边缘参差。
164
- - 文字内容必须有独立容器,设置 `padding: 16px 18px`(或项目设计体系中的等价间距)、`box-sizing:border-box`、稳定 `line-height`,不能让标题、段落贴着卡片或屏幕边缘。
165
- - 富文本生成器输出 HTML 时,推荐结构是“图片块 + 文本块”:图片块只包图片,文本块包标题、段落、规格说明、温馨提示。
166
- - 段落使用 `margin:0 0 6px` 或相近节奏,最后一段可以去掉底部 margin;不要靠 `<br>` 堆间距。
167
- - 移动端截图验收必须看文字是否贴边、是否横向溢出、是否被底部固定按钮遮挡。
168
-
169
- 参考结构:
170
-
171
- ```html
172
- <section class="mci-rich-detail" style="background:#fff;overflow:hidden;">
173
- <p style="margin:0;text-align:center;">
174
- <img src="..." style="display:block;width:100%;max-width:100%;height:auto;" />
175
- </p>
176
- <div style="padding:16px 18px 18px;box-sizing:border-box;line-height:1.7;color:#1f2937;font-size:15px;">
177
- <h2 style="margin:0 0 10px;font-size:22px;line-height:1.28;">商品标题</h2>
178
- <p style="margin:0 0 6px;">所属专区:精选专区</p>
179
- <p style="margin:0;">商品图片与规格信息以实际维护为准。</p>
180
- </div>
181
- </section>
182
- ```
183
-
159
+ ## 移动端富文本图文排版
160
+
161
+ 商品详情、公告详情、活动说明、文章正文、协议说明等富文本在移动端渲染时,图片和文字不能使用同一套留白规则。
162
+
163
+ - 主图、详情长图、海报图可以 `width:100%` / `display:block` 满宽展示,不额外加左右 padding,避免图片显得缩小或边缘参差。
164
+ - 文字内容必须有独立容器,设置 `padding: 16px 18px`(或项目设计体系中的等价间距)、`box-sizing:border-box`、稳定 `line-height`,不能让标题、段落贴着卡片或屏幕边缘。
165
+ - 富文本生成器输出 HTML 时,推荐结构是“图片块 + 文本块”:图片块只包图片,文本块包标题、段落、规格说明、温馨提示。
166
+ - 段落使用 `margin:0 0 6px` 或相近节奏,最后一段可以去掉底部 margin;不要靠 `<br>` 堆间距。
167
+ - 移动端截图验收必须看文字是否贴边、是否横向溢出、是否被底部固定按钮遮挡。
168
+
169
+ 参考结构:
170
+
171
+ ```html
172
+ <section class="mci-rich-detail" style="background:#fff;overflow:hidden;">
173
+ <p style="margin:0;text-align:center;">
174
+ <img src="..." style="display:block;width:100%;max-width:100%;height:auto;" />
175
+ </p>
176
+ <div style="padding:16px 18px 18px;box-sizing:border-box;line-height:1.7;color:#1f2937;font-size:15px;">
177
+ <h2 style="margin:0 0 10px;font-size:22px;line-height:1.28;">商品标题</h2>
178
+ <p style="margin:0 0 6px;">所属专区:精选专区</p>
179
+ <p style="margin:0;">商品图片与规格信息以实际维护为准。</p>
180
+ </div>
181
+ </section>
182
+ ```
183
+
184
184
  <!-- /microi-progressive:chunk -->
185
185
  ## 详细参考路由(渐进披露)
186
186