@microi.net/cli 4.9.5 → 4.9.7
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.
- package/.codebuddy-plugin/marketplace.json +2 -2
- package/.codebuddy-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.workbuddy-plugin/marketplace.json +2 -2
- package/.workbuddy-plugin/plugin.json +1 -1
- package/README.md +7 -12
- package/assets/build-meta.json +6 -5
- package/package.json +1 -1
- package/scripts/mcp-server.js +83 -83
- package/scripts/microi-cli.js +80 -92
- package/scripts/microi-codex-broker.js +418 -0
- package/scripts/microi-codex-router.js +159 -65
- package/scripts/microi-skills.meta.json +349 -190
- package/skills/.microi-skills-version.json +2 -2
- package/skills/.progressive-disclosure-manifest.json +3566 -0
- package/skills/ai-engine/SKILL.md +1 -1
- package/skills/ai-platform-governance/SKILL.md +22 -167
- package/skills/ai-platform-governance/references/progressive-01-/345/212/237/350/203/275/345/274/200/345/205/263.md +190 -0
- package/skills/app-store/SKILL.md +1 -1
- package/skills/business-blueprint/SKILL.md +1 -1
- package/skills/datasource-engine/SKILL.md +1 -1
- package/skills/dos-orm/SKILL.md +1 -1
- package/skills/job-engine/SKILL.md +1 -1
- package/skills/message-notification/SKILL.md +1 -1
- package/skills/microi-ai-application/SKILL.md +1 -1
- package/skills/microi-client-frontend/SKILL.md +18 -435
- 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 -0
- 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 +178 -0
- 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 +144 -0
- package/skills/microi-codex/SKILL.md +4 -4
- package/skills/microi-codex-installer/SKILL.md +25 -36
- package/skills/microi-datasource-mapping/SKILL.md +1 -1
- package/skills/microi-db-schema/SKILL.md +4 -4
- package/skills/microi-db-schema/references/schema-overview.md +1 -1
- package/skills/microi-db-schema/references/schema.md +1 -1
- package/skills/microi-db-schema/references/table-catalog.md +1 -1
- package/skills/microi-deployment/SKILL.md +1 -1
- package/skills/microi-docs-coverage/SKILL.md +1 -1
- package/skills/microi-form-engine/SKILL.md +2 -2
- package/skills/microi-form-layout/SKILL.md +20 -226
- 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 -0
- package/skills/microi-frontend-sdk/SKILL.md +18 -152
- 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 +171 -0
- package/skills/microi-left-right-layout/SKILL.md +1 -1
- package/skills/microi-microservice/SKILL.md +8 -1
- package/skills/microi-microservice/references/runtime-delivery.md +4 -0
- package/skills/microi-mobile-app-quality/SKILL.md +23 -289
- 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 +209 -0
- 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 +117 -0
- package/skills/microi-solution-quotation/SKILL.md +1 -1
- package/skills/microi-system-delivery/SKILL.md +17 -381
- package/skills/microi-system-delivery/references/progressive-01-/346/240/207/345/207/206/345/267/245/344/275/234/346/265/201.md +186 -0
- 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 +210 -0
- package/skills/microi-ui/SKILL.md +20 -170
- 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 -0
- package/skills/microi-uniapp-frontend/SKILL.md +27 -336
- 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 -0
- 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 -0
- package/skills/module-engine/SKILL.md +1 -1
- package/skills/ocr-engine/SKILL.md +1 -1
- package/skills/page-engine/SKILL.md +24 -272
- 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 -0
- 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 -0
- package/skills/performance-testing/SKILL.md +1 -1
- package/skills/playwright-e2e/SKILL.md +25 -591
- 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 -0
- 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 -0
- package/skills/playwright-e2e/references/progressive-03-microi-helper-/346/250/241/346/235/277.md +221 -0
- package/skills/playwright-e2e/references/progressive-04-ci-/345/273/272/350/256/256.md +69 -0
- package/skills/print-engine/SKILL.md +1 -1
- package/skills/production-readonly-audit/SKILL.md +1 -1
- package/skills/report-engine/SKILL.md +1 -1
- package/skills/scripts/optimize-progressive-disclosure.mjs +204 -0
- package/skills/scripts/refresh-progressive-disclosure.mjs +64 -0
- package/skills/scripts/validate-progressive-disclosure.mjs +52 -0
- package/skills/search-engine/SKILL.md +1 -1
- package/skills/spider-engine/SKILL.md +1 -1
- package/skills/translate-engine/SKILL.md +1 -1
- package/skills/ui-design/SKILL.md +27 -1462
- 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 -0
- package/skills/ui-design/references/progressive-02-/345/255/227/344/275/223.md +155 -0
- 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 -0
- 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 -0
- 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 -0
- 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 -0
- 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 -0
- 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 -0
- package/skills/uniapp-mall-assets/SKILL.md +1 -1
- package/skills/unity-integration/SKILL.md +1 -1
- package/skills/v8-api-config/SKILL.md +1 -1
- package/skills/v8-cache-pattern/SKILL.md +1 -1
- package/skills/v8-crud-api/SKILL.md +21 -246
- 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 -0
- 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 -0
- package/skills/v8-debugging/SKILL.md +1 -1
- package/skills/v8-explorer-tree/SKILL.md +1 -1
- package/skills/v8-export-import/SKILL.md +16 -426
- 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 -0
- package/skills/v8-export-import/references/progressive-02-powerpoint-/345/257/274/345/207/272.md +202 -0
- 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 -0
- package/skills/v8-file-upload/SKILL.md +17 -355
- 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 +227 -0
- 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 +149 -0
- package/skills/v8-formengine-http/SKILL.md +1 -1
- package/skills/v8-frontend-events/SKILL.md +20 -206
- package/skills/v8-frontend-events/references/progressive-01-/345/210/227/350/241/250/344/272/213/344/273/266.md +219 -0
- package/skills/v8-http-integration/SKILL.md +15 -237
- package/skills/v8-http-integration/references/progressive-01-get-/350/257/267/346/261/202.md +220 -0
- 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 -0
- package/skills/v8-image-processing/SKILL.md +1 -1
- package/skills/v8-menu-buttons/SKILL.md +16 -512
- package/skills/v8-menu-buttons/references/progressive-01-2-/346/214/211/351/222/256/345/257/271/350/261/241-schema.md +221 -0
- 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 +224 -0
- 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 -0
- package/skills/v8-mongodb/SKILL.md +1 -1
- package/skills/v8-mq-mqtt/SKILL.md +12 -176
- package/skills/v8-mq-mqtt/references/progressive-01-v8-mqtt-iot-/347/211/251/350/201/224/347/275/221.md +181 -0
- package/skills/v8-saas-multi-tenant/SKILL.md +1 -1
- package/skills/v8-security/SKILL.md +17 -330
- package/skills/v8-security/references/progressive-01-2-/346/235/203/351/231/220/346/240/241/351/252/214.md +199 -0
- package/skills/v8-security/references/progressive-02-7-/346/227/245/345/277/227/350/256/260/345/275/225.md +158 -0
- package/skills/v8-sql-query/SKILL.md +1 -1
- package/skills/v8-table-event/SKILL.md +17 -237
- 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 -0
- 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 -0
- package/skills/v8-template-engine/SKILL.md +1 -1
- package/skills/v8-utilities/SKILL.md +1 -1
- package/skills/v8-workflow/SKILL.md +20 -161
- 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 -0
- package/skills/workspace-conventions/SKILL.md +36 -369
- 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 -0
- 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 +196 -0
- 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 -0
|
@@ -3,7 +3,7 @@ name: microi-microservice
|
|
|
3
3
|
description: Microi 前端微服务 MicroService 开发与交付指南。用于创建、读取、修改、构建、发布或修复 Vue3 微应用,维护 microi.routes.json,绑定 sys_menu,使用 V8.OpenAppDialog,或通过 MCP 管理 Web、UniApp、MicroService 应用源码和运行时。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
> **Codex
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
7
|
|
|
8
8
|
# Microi 前端微服务
|
|
9
9
|
|
|
@@ -180,6 +180,13 @@ AI 生成菜单微服务时,应优先封装一个 `callMicroiHost(action, data
|
|
|
180
180
|
吾码宿主独立预览时的回退值。不得直接写死 `min-height: 100vh`、`calc(100vh - 100px)` 等
|
|
181
181
|
只适配浏览器视口或某个主站布局的高度,否则嵌入 TagsView、弹窗或移动端时会被裁剪或产生双滚动。
|
|
182
182
|
|
|
183
|
+
菜单型微服务必须只有一个纵向滚动所有者:宿主外层隐藏溢出,`<micro-app>` 边界提供默认
|
|
184
|
+
`overflow-y:auto` 兜底。普通长页面保持自然高度即可;子应用若需要 sticky 工具栏、虚拟列表等
|
|
185
|
+
内部滚动,则自己的滚动容器必须具有基于 `--micro-app-available-height` 的确定高度和
|
|
186
|
+
`overflow-y:auto`。真实子滚动容器会把内容约束在边界内,框架兜底条自动不出现;只给自动高度
|
|
187
|
+
根节点写 `overflow:auto` 不算自滚动容器。验收需分别覆盖框架兜底和子应用自滚动,断言任一时刻
|
|
188
|
+
只有一个 `scrollHeight > clientHeight` 的纵向滚动所有者。
|
|
189
|
+
|
|
183
190
|
加载/协议/运行时异常只由宿主兜底显示;子应用业务错误标记 `handled=true` 后宿主不得重复提示。
|
|
184
191
|
加载失败页至少显示 AppKey、PageKey、路由、版本、入口、HTTP 状态、发布状态、资产来源、挂载状态和安全原因码,并提供重试、返回与复制诊断。
|
|
185
192
|
|
|
@@ -171,6 +171,10 @@ const host = window.microApp?.getData?.() || {};
|
|
|
171
171
|
移动端共享宿主实测高度;不要在嵌入模式直接固定 `100vh`。宿主高度变化时还会通过
|
|
172
172
|
`host:resize` 数据事件下发 `hostViewport`,画布、图表等需精确像素的组件据此重新布局。
|
|
173
173
|
|
|
174
|
+
菜单页采用单一纵向滚动所有者:自然增高的长页面由 `<micro-app>` 边界兜底滚动;需要内部
|
|
175
|
+
sticky/虚拟列表时,子应用以宿主可用高度约束自己的滚动容器并设置 `overflow-y:auto`,框架边界
|
|
176
|
+
因不再发生内容溢出而不显示滚动条。不要同时让宿主外层、微服务边界和自动高度根节点都承担滚动。
|
|
177
|
+
|
|
174
178
|
子应用通过模板 SDK 调用接口,不自行发明认证协议。关闭/结果使用宿主约定的
|
|
175
179
|
success、cancel、error/close 事件;业务写入成功后再报告 success。
|
|
176
180
|
|
|
@@ -3,7 +3,7 @@ name: microi-mobile-app-quality
|
|
|
3
3
|
description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序。用于创建、重设计、修复、测试或交付任何 Microi 移动端项目,覆盖登录、底部导航、快捷入口、按钮、动效、菜单层级与移动端视觉验收。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
> **Codex
|
|
6
|
+
> **Codex 非阻塞自动更新:** 当前宿主为 Codex 时,吾码 CLI、Codex 插件与工作区 AI/MCP 由后台自动更新;需要诊断时读取 `../microi-codex-installer/SKILL.md`。更新失败、等待空闲或尚未重载均不得阻断当前、正在进行或新建任务。非 Codex 宿主跳过此项。
|
|
7
7
|
|
|
8
8
|
# Microi 移动端质量门禁
|
|
9
9
|
|
|
@@ -11,6 +11,8 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
|
|
|
11
11
|
|
|
12
12
|
自动触发:只要任务涉及 Microi 移动端应用、H5、微信小程序、App 构建、uni-app 项目、登录页、tabbar、首页、我的页、工作台、报告页、视觉重设计或移动端验收,即使用户没有明确点名,也要应用本 skill。
|
|
13
13
|
|
|
14
|
+
<!-- microi-progressive:begin -->
|
|
15
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=9f83607349ba6e305c3d2993de8eeceab70c344557e5dfa2a5be964492ef4685 -->
|
|
14
16
|
## 1. 导航和快捷入口必须使用真实图标
|
|
15
17
|
|
|
16
18
|
底部导航、首页快捷入口、会员中心快捷项、九宫格操作和悬浮操作,必须在文字上方或旁边显示可识别的图标。
|
|
@@ -37,6 +39,8 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
|
|
|
37
39
|
- 主题切换后重新截图底部导航、首页快捷入口和个人中心快捷入口;任何一个图标在圆底上看不清,都算验收失败。
|
|
38
40
|
- UniApp H5 桌面预览可以显示手机壳;真机和浏览器移动设备仿真必须自动去壳并铺满视口。自动化测试要分别断言桌面手机壳存在、移动端手机壳标题隐藏,同时检查所有底部菜单包含真实图标节点。
|
|
39
41
|
|
|
42
|
+
<!-- /microi-progressive:chunk -->
|
|
43
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=4e1b247852aa9f235a26f756d415ebb9fb922f2fea0569bda1bdc8e0b91c4d1c -->
|
|
40
44
|
## 1.1 包体资源必须按用途分层
|
|
41
45
|
|
|
42
46
|
- 构建前扫描图片、音频、视频、字体和第三方资源;公开的大资源优先上传到当前租户 HDFS 公有桶并通过 `sys_config.FileServer`/CDN 引用,敏感资源使用私有桶。
|
|
@@ -46,6 +50,8 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
|
|
|
46
50
|
- 微信小程序上传前增加硬门禁:扫描 `dist/build/mp-weixin` 的真实文件;单个非关键静态资源超过 `256 KB`、主包静态资源达到 `1.5 MB`,或主包距微信当前硬上限不足 `300 KB` 时,发布步骤必须失败并列出最大文件,不能等开发者工具上传后才发现超限。
|
|
47
51
|
- 迁移到 HDFS/CDN 后必须从构建产物确认原大文件已经消失,并从业务记录/配置回读相对 `Path`;页面要先加载当前租户 `SysConfig.FileServer`,不得以源码硬编码 CDN 域名替代运行期配置。远程资源加载失败时只能回退到轻量本地占位,不得把原大图重新塞回主包。
|
|
48
52
|
|
|
53
|
+
<!-- /microi-progressive:chunk -->
|
|
54
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=99bbb22068bb61d61a3fd20b1a21f421804857ce8da85a92390f64641e3f43fc -->
|
|
49
55
|
## 2. 不要猜测 Microi 前端 SDK 登录接口
|
|
50
56
|
|
|
51
57
|
编写登录代码前,先检查本地项目 SDK 封装,例如 `src/utils/microi.v8.js`、`src/utils/api.js`,或标准 `microi.uniapp` 登录实现。
|
|
@@ -71,6 +77,8 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
|
|
|
71
77
|
- 点击账号登录不会抛出 `V8.Login.Login is not a function`。
|
|
72
78
|
- 使用真实系统账号登录后,必须验证“我的”页显示已登录角色,首页/工单/报告不再出现未登录提示,刷新页面或切换底部导航后仍保持一致。
|
|
73
79
|
|
|
80
|
+
<!-- /microi-progressive:chunk -->
|
|
81
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=0a9274750cb6f507b87c417eb66e5f9aa60918c6ead87c7eb2855e209aa30e61 -->
|
|
74
82
|
## 2.1 登录验证码必须跟随 Sys_Config.EnableCaptcha
|
|
75
83
|
|
|
76
84
|
PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)`,都必须先读取 `Sys_Config` 的 `EnableCaptcha` 配置,并按配置决定是否展示和提交图形验证码。
|
|
@@ -95,6 +103,8 @@ PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/Sy
|
|
|
95
103
|
- 检查网络请求:`/api/Captcha/GetCaptcha` 返回后已保存 `captchaid`;登录请求体包含 `_CaptchaId/_CaptchaValue`。
|
|
96
104
|
- 参考标准实现:`microi.uniapp/src/pages/login/index.vue`。
|
|
97
105
|
|
|
106
|
+
<!-- /microi-progressive:chunk -->
|
|
107
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=22bdaf38588f251016e115f1ad15a433e827fb2191041d55ecad42cda94253d1 -->
|
|
98
108
|
## 3. OsClient 请求头不得重复
|
|
99
109
|
|
|
100
110
|
Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览器、代理或服务端运行时可能把 `OsClient` 和 `osclient` 这类大小写重复键合并成 `demo, demo`,导致租户识别失败。
|
|
@@ -115,6 +125,8 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
|
|
|
115
125
|
- 确认目标租户请求头正好是一个运行期值(例如 `osclient: demo`),没有被逗号合并。
|
|
116
126
|
- 微信/支付宝/飞书/抖音等小程序授权登录接口也必须检查,例如 `/apiengine/miniprogram-login`,不得出现 `osclient: demo, demo` 这类合并值。
|
|
117
127
|
|
|
128
|
+
<!-- /microi-progressive:chunk -->
|
|
129
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=1394c7fb8e59b25553e2f9b71ab7f8cf03290b6930c8d8436123bc6048ad2435 -->
|
|
118
130
|
## 3.1 小程序授权登录必须可追踪、可读错误
|
|
119
131
|
|
|
120
132
|
微信开发者工具的模拟授权与体验版真机调用不是同一条真实链路。手机号授权登录接口必须按阶段诊断,不能只返回“手机号登录失败”。
|
|
@@ -132,6 +144,8 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
|
|
|
132
144
|
- 模拟 `uni.request` 域名未配置、超时、HTTP 500、接口 `Code=0`,前端均显示具体原因,loading 在 `finally` 中恢复。
|
|
133
145
|
- 体验版真机复测授权登录;不能只以开发者工具模拟成功作为上线依据。
|
|
134
146
|
|
|
147
|
+
<!-- /microi-progressive:chunk -->
|
|
148
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=feb9ba3267bdf1f6394c425b45dd71e19ac4382ae05549d6e1b6b664c6517a19 -->
|
|
135
149
|
## 3.1.1 手机号快速验证前置页不得混淆腾讯官方
|
|
136
150
|
|
|
137
151
|
- 调用手机号快速验证组件前展示的登录页、弹窗、按钮、说明、分享标题和失败提示中,禁止出现“微信”“微信官方”“微信登录”“一键登录”等可能让用户误认为腾讯官方功能或官方产品的文案。
|
|
@@ -139,6 +153,8 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
|
|
|
139
153
|
- 推荐统一使用“手机号快捷登录”“手机号快速验证”“验证中”等中性文案。底层仍按平台要求保留 `open-type="getPhoneNumber"`、`provider:'weixin'` 等技术实现,不能为改文案破坏真实授权链路。
|
|
140
154
|
- `build:mp-weixin` 后必须扫描登录页源码和 `dist/build/mp-weixin/pages/login/` 产物中的可见文案,并对手机号快速验证前置页截图;发现混淆词、官方 Logo 或近似元素时阻止上传和提审。
|
|
141
155
|
|
|
156
|
+
<!-- /microi-progressive:chunk -->
|
|
157
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=7598db1fdabfe127c2be7593b83dc3a246b1db852d9c0d4001f849d3e97aa273 -->
|
|
142
158
|
## 3.2 微信小程序每个页面默认支持分享
|
|
143
159
|
|
|
144
160
|
小程序项目必须默认支持转发给朋友和分享到朋友圈,不能只给首页或公开页添加分享。登录和权限控制属于访问阶段,不得用来隐藏分享能力。
|
|
@@ -155,293 +171,11 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
|
|
|
155
171
|
- 执行 `build:mp-weixin`,逐页检查编译后的页面 JS 存在 `onShareAppMessage`、`onShareTimeline`,不能只检查源码或只确认构建成功。
|
|
156
172
|
- 在微信开发者工具和体验版各抽测公开页、登录页、一个需登录详情页:朋友转发和朋友圈入口都存在,接收者路径参数正确;未登录接收者看到登录提示而不是白屏或 404。
|
|
157
173
|
|
|
158
|
-
|
|
174
|
+
<!-- /microi-progressive:chunk -->
|
|
175
|
+
## 详细参考路由(渐进披露)
|
|
159
176
|
|
|
160
|
-
|
|
177
|
+
仅在当前任务涉及对应主题时读取;下列文件合计保留了原 SKILL.md 的全部详细知识。
|
|
161
178
|
|
|
162
|
-
|
|
163
|
-
-
|
|
164
|
-
-
|
|
165
|
-
- 主按钮应使用项目品牌渐变或品牌纯色,阴影克制,文字对比度安全。
|
|
166
|
-
- `open-type="getPhoneNumber"` 这类小程序原生按钮必须样式化为 `mci-btn`,并移除默认边框。
|
|
167
|
-
|
|
168
|
-
禁止:
|
|
169
|
-
- 首屏、空状态、登录页或固定底栏里出现纯文字主按钮。
|
|
170
|
-
- 按钮文字没有垂直居中。
|
|
171
|
-
- 异步操作按钮没有加载反馈。
|
|
172
|
-
|
|
173
|
-
验收:
|
|
174
|
-
- 截图检查空状态、登录页和表单提交页。
|
|
175
|
-
- 确认主操作有图标、合适的加载文案和按下反馈。
|
|
176
|
-
|
|
177
|
-
## 4.1 模块列表优先使用声明式业务卡片
|
|
178
|
-
|
|
179
|
-
Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆叠。优先在
|
|
180
|
-
`sys_menu.ViewSchema` 配置 `Scene=Card, Device=Mobile`:
|
|
181
|
-
|
|
182
|
-
- `AvatarTextField`:头像首字或业务简称;没有头像时才显示序号。
|
|
183
|
-
- `TitleField`:唯一主标题,最多两行,不能被右侧金额挤成单字列。
|
|
184
|
-
- `TopFields/StatusFields`:顶部状态、分类、阶段标签,使用少量语义色。
|
|
185
|
-
- `SubtitleFields`:客户、负责人、供应商等一至两项关联信息。
|
|
186
|
-
- `RightFields`:金额、未付、库存等高辨识度数值,支持 `Prefix/Suffix/Tone/Color`。
|
|
187
|
-
- `Fields/MetaFields`:正文和编号、创建人、日期等弱化信息。
|
|
188
|
-
- `BottomFields`:联系人、跟进、合同、附件等可行动的计数或标签。
|
|
189
|
-
|
|
190
|
-
要求:
|
|
191
|
-
|
|
192
|
-
- 卡片内边距通常 12 至 14px,标题、弱信息、金额形成清晰三级层次;不能全卡同字号同颜色。
|
|
193
|
-
- 选择框、更多、底部操作和浮动主按钮的触控区域至少 40 至 44px。
|
|
194
|
-
- 选中态用边框/底色/勾选状态表达,不通过 `transform` 位移导致列表跳动。
|
|
195
|
-
- 只配置字段值和样式时使用 ViewSchema;复杂 HTML 才使用字段 `V8TmpEngineTable`,仍须净化。
|
|
196
|
-
- 未配置 Card 视图时兼容 `MobileListFields/CardTitleTagFields/CardBottomTagFields`,不得白屏。
|
|
197
|
-
- 卡片引用字段必须进入查询列;关联计数由列表接口批量返回,禁止每张卡片再次请求。
|
|
198
|
-
|
|
199
|
-
验收:
|
|
200
|
-
|
|
201
|
-
- 以 375x812、390x844、430x932 至少三种视口检查长标题、空值、大金额、多标签和选中态。
|
|
202
|
-
- 检查顶部/右侧/底部多字段与模板字段均能显示,滚动到底后浮动按钮不遮挡最后一张卡。
|
|
203
|
-
- 批量选择后出现底部操作条;取消选择、执行按钮、更多菜单均可单手点击。
|
|
204
|
-
|
|
205
|
-
## 5. 首屏文字和浮层不得重叠
|
|
206
|
-
|
|
207
|
-
移动端首屏常组合大首屏区域和悬浮快捷面板。这个布局必须视觉检查,因为过大的中文标题和激进的负边距容易造成难看的换行或遮挡主按钮。
|
|
208
|
-
|
|
209
|
-
要求:
|
|
210
|
-
- 首屏标题必须使用能适配真实中文文案的字号,在常见 375px 和 430px 手机宽度下都要可读。
|
|
211
|
-
- 两行中文标题要有足够行高;紧凑业务首屏内不要使用过大的展示字。
|
|
212
|
-
- 使用悬浮快捷面板时,首屏底部要给操作区预留内边距,负边距只能轻微覆盖装饰空间。
|
|
213
|
-
- 首屏主按钮必须完整可见且可点击,包括阴影和圆角底边。
|
|
214
|
-
|
|
215
|
-
禁止:
|
|
216
|
-
- 首屏标题换行成难看的单字或双字第二行。
|
|
217
|
-
- 悬浮面板覆盖登录、报告或提交按钮。
|
|
218
|
-
- 通过隐藏按钮或缩小触控区域来解决重叠。
|
|
219
|
-
|
|
220
|
-
验收:
|
|
221
|
-
- 在 375px 和 430px 宽度截图首屏。
|
|
222
|
-
- 检查首屏标题、主/次按钮和后续悬浮面板是否裁切或重叠。
|
|
223
|
-
|
|
224
|
-
## 5.1 未登录/授权提示必须在可用内容区居中
|
|
225
|
-
|
|
226
|
-
未登录、未授权、无权限等提示模块不能贴在页面顶部。页面上方有 hero/header,下方有 tabBar 或固定底栏时,提示卡片和“立即登录/去授权”按钮必须在剩余可用内容区上下左右居中。
|
|
227
|
-
|
|
228
|
-
要求:
|
|
229
|
-
- 复用统一组件,例如 `MciAuthPrompt` / `mci-auth-prompt`,不要每个页面复制一套未登录提示样式。
|
|
230
|
-
- 页面容器使用 `flex-direction: column` 时,未登录提示外层必须 `flex: 1`、`display:flex`、`align-items:center`、`justify-content:center`,并考虑底部安全区。
|
|
231
|
-
- 如果组件放在自定义组件根节点内,业务页仍要提供外层居中 wrapper,避免小程序自定义组件根节点不参与父级 flex 导致卡片贴顶。
|
|
232
|
-
- 未登录提示的按钮文字和图标必须在按钮内上下左右居中。
|
|
233
|
-
|
|
234
|
-
禁止:
|
|
235
|
-
- 未登录提示卡片紧贴 header 下方,只在横向居中、纵向不居中。
|
|
236
|
-
- 因 tabBar、刘海屏、安全区或固定底栏导致提示卡片视觉中心偏上。
|
|
237
|
-
|
|
238
|
-
验收:
|
|
239
|
-
- 截图检查工作台、消息、我的等未登录态页面,卡片和主按钮必须在 header 与 tabBar/底栏之间的可用区域居中。
|
|
240
|
-
- 375px、430px、iOS 刘海屏/灵动岛和 Android 状态栏场景均不得出现贴顶或按钮文字偏移。
|
|
241
|
-
|
|
242
|
-
## 5.2 自定义导航页面必须通过安全区与微信胶囊门禁
|
|
243
|
-
|
|
244
|
-
`navigationStyle: custom` 代表应用接管了系统导航区域,页面壳必须同时负责状态栏、刘海/灵动岛、微信右上角胶囊和底部手势区,不能把这一责任留给业务页面自行估算。
|
|
245
|
-
|
|
246
|
-
要求:
|
|
247
|
-
- 统一页面壳读取 `uni.getWindowInfo()`,旧运行时回退 `uni.getSystemInfoSync()`;顶部至少使用 `statusBarHeight`,底部使用 `safeAreaInsets.bottom` 或 `screenHeight - safeArea.bottom`。
|
|
248
|
-
- CSS `env(safe-area-inset-*)` 只能作为 H5 兜底,不能作为微信小程序唯一实现。真实值应注入 `--mci-safe-top`、`--mci-safe-bottom` 等共享变量。
|
|
249
|
-
- 微信小程序必须读取 `getMenuButtonBoundingClientRect()` 并为顶部栏预留胶囊右侧宽度;标题、登录、分享、状态按钮与返回按钮都不能和胶囊相交。
|
|
250
|
-
- 全屏弹层或工作台的多按钮头部必须纳入同一门禁。若按钮组不能完整放在胶囊左侧,标题和按钮组整体布局到胶囊底边以下;不得让关闭按钮被原生“更多/关闭”覆盖。
|
|
251
|
-
- 底部导航、fixed 提交栏、底部弹层和正文滚动区必须消费同一个底部安全变量,正文还要预留完整固定栏高度。
|
|
252
|
-
- 审计 `pages.json` 的全部页面:每一个自定义导航路由都必须使用统一安全页面壳。首页通过不代表详情页、表单页、管理页已经通过。
|
|
253
|
-
|
|
254
|
-
自动化验收:
|
|
255
|
-
- 在微信开发者工具至少选择一台 iPhone 刘海/灵动岛机型和一台 Android 机型,逐页访问 `pages.json` 全路由并截图。
|
|
256
|
-
- 断言首个可交互元素位于状态栏下方,逐个读取顶部按钮与胶囊的矩形并确认不相交,底部导航/按钮位于手势条上方,最后一条滚动内容可完整显示。
|
|
257
|
-
- 发现任意页面被遮挡时,必须修复共享页面壳并重跑全路由;禁止只给当前截图页面增加固定 padding。
|
|
258
|
-
|
|
259
|
-
## 5.3 全屏工具页必须遵守返回状态栈
|
|
260
|
-
|
|
261
|
-
- AI 助手、扫码工作台、全屏预览等独占视口功能需要手机侧滑返回时,优先使用独立路由承载;普通 `position:fixed` 蒙层不能冒充页面历史。
|
|
262
|
-
- 返回事件按“键盘/确认框 -> 内部抽屉/筛选 -> 当前全屏页 -> 底层业务页”的顺序消费。关闭按钮与手机返回手势必须得到一致结果。
|
|
263
|
-
- 从 Tab 页进入后,第一次返回只能关闭全屏工具页并回到原 Tab;路由栈异常或分享直达时才兜底回首页,禁止退出小程序或跳过原页面。
|
|
264
|
-
- 自动化至少覆盖关闭按钮、Android 返回键/`onBackPress`、微信侧滑返回三条路径,并验证返回后原页面和滚动状态仍然可用。
|
|
265
|
-
|
|
266
|
-
## 5.4 微信浮动入口必须通过真实事件桥门禁
|
|
267
|
-
|
|
268
|
-
- UniApp 自定义组件中的浮动按钮、拖拽助手和悬浮客服不得只做 H5 点击测试。必须在微信运行时找到真实组件节点,派发 `touchstart/touchend`,并断言页面栈、弹层状态或业务动作确实变化。
|
|
269
|
-
- `touch* / tap` 上的 `.stop/.prevent` 会编译成 `catchtouch* / catchtap`;禁止在可拖拽组件上整组滥用。若出现“看得见但点不动”,先检查生成 WXML 是 `catch*` 还是 `bind*`,再检查事件方法与路由,不要用构建成功替代交互验收。
|
|
270
|
-
- 短触与拖动应通过明确位移阈值区分。短触在 `touchend` 完成主动作,拖动只更新位置并持久化,导航失败必须给用户可见反馈。
|
|
271
|
-
- 自动化需增加对照按钮:同页普通按钮可点击、浮动入口也可点击,才能确认不是自动化连接或页面整体失效。
|
|
272
|
-
|
|
273
|
-
## 6. 后台菜单必须规划为至少两级
|
|
274
|
-
|
|
275
|
-
真实业务系统的后台菜单不能简单堆成一批一级菜单。
|
|
276
|
-
|
|
277
|
-
要求:
|
|
278
|
-
- 先创建父级菜单分组,再把子级 CRUD 模块放到对应分组下。
|
|
279
|
-
- 相关页面超过三个的业务模块必须有父级目录菜单。
|
|
280
|
-
- 建议分组示例:
|
|
281
|
-
- 客户中心:客户、站点、联系人、客户账号绑定。
|
|
282
|
-
- 设备中心:设备台账、设备模板、维保参数。
|
|
283
|
-
- 维保运营:计划、工单、服务记录、维修申请。
|
|
284
|
-
- 报告中心:巡检报告、阅读日志、打印/分享模板。
|
|
285
|
-
- 系统配置:字典、任务、集成设置。
|
|
286
|
-
- 使用 Manifest/MCP 时,必须显式包含父模块和子模块。子模块必须设置 `ParentId`。
|
|
287
|
-
- dry-run 计划必须列出最终菜单树,不能只列平铺菜单名。
|
|
288
|
-
- 如果用户要求通过 MCP 修复已有后台,要真正执行远端工作:读取 `sys_menu`,创建缺失的父级 `SecondMenu` 行,更新现有子菜单 `ParentId` / `Sort`,给管理员角色授权新父菜单,然后回读菜单树。
|
|
289
|
-
- 当用户明确要求修改当前 MCP 租户时,不要只把规则写进 skill 就停下。
|
|
290
|
-
|
|
291
|
-
禁止:
|
|
292
|
-
- 把所有生成模块直接创建到根菜单。
|
|
293
|
-
- 把客户主数据、工单、报告、日志和设置混在同一级。
|
|
294
|
-
|
|
295
|
-
验收:
|
|
296
|
-
- MCP 生成后回读 `sys_menu` 并确认菜单深度。
|
|
297
|
-
- 最终回复必须说明通过 MCP 写入的真实菜单树,以及执行过的权限刷新。
|
|
298
|
-
|
|
299
|
-
## 7. 移动端页面需要动效,但动效必须有用
|
|
300
|
-
|
|
301
|
-
移动端产品不应像静态后台表单。
|
|
302
|
-
|
|
303
|
-
要求:
|
|
304
|
-
- 页面首屏、面板、卡片和重要操作区使用克制的入场动画。
|
|
305
|
-
- 点击目标要有按下反馈。
|
|
306
|
-
- 骨架屏应有轻微流光或脉冲。
|
|
307
|
-
- 装饰动效幅度要小,不能干扰任务完成。
|
|
308
|
-
- 支持时尊重减少动态效果偏好。
|
|
309
|
-
|
|
310
|
-
禁止:
|
|
311
|
-
- 整个应用没有交互反馈。
|
|
312
|
-
- 在密集业务列表上使用重度循环动画。
|
|
313
|
-
- 动效导致布局位移或文字重叠。
|
|
314
|
-
|
|
315
|
-
验收:
|
|
316
|
-
- 浏览器或设备检查确认卡片、面板、按钮或骨架屏有可见但克制的动效。
|
|
317
|
-
- 没有动画导致横向溢出、文字裁切或固定栏抖动。
|
|
318
|
-
|
|
319
|
-
## 8. 登录页必须是直接登录界面
|
|
320
|
-
|
|
321
|
-
登录页不能强迫用户先在两个身份标签之间切换才能登录。
|
|
322
|
-
|
|
323
|
-
要求:
|
|
324
|
-
- H5/App 提供一个账号或手机号 + 密码表单。除非后端明确支持并要求第二条路径,否则不要把独立手机号客户登录表单和账号密码表单并列展示。
|
|
325
|
-
- 微信小程序默认使用 `<button open-type="getPhoneNumber">` 的手机号授权登录。账号密码登录可以作为次级兜底,但必须折叠或弱化,不能和手机号授权并列成第二套完整登录系统。
|
|
326
|
-
- 微信小程序手机号快捷登录必须把返回的手机号 `code` 传给后端;当后端需要 OpenId/UnionId 时,还必须调用 `uni.login()` 获取新的 `LoginCode`。
|
|
327
|
-
- H5/App 兜底只有在后端支持手机号登录时才提供手动手机号输入。
|
|
328
|
-
- 登录文案要清楚:账号/手机号 + 密码是一条路径;微信手机号授权是小程序默认路径。
|
|
329
|
-
- 登录页不要展示当前租户、OsClient、移动端构建版本、API host、调试版本块等内部实现信息。
|
|
330
|
-
|
|
331
|
-
禁止:
|
|
332
|
-
- 除非用户明确要求,否则把员工/客户身份标签作为主登录模型。
|
|
333
|
-
- 同屏展示两套完整登录系统,例如“账号 + 密码”和“手机号输入登录”并列。
|
|
334
|
-
- 假设前端可以从 `getPhoneNumber` 直接读取微信手机号;现代微信返回的是 code。
|
|
335
|
-
- 目标是微信小程序时,只把手机号登录实现成文本输入。
|
|
336
|
-
- 向终端用户展示租户、版本或调试块。
|
|
337
|
-
|
|
338
|
-
验收:
|
|
339
|
-
- 实现前检查标准参考 `microi.uniapp/src/pages/login/index.vue`。
|
|
340
|
-
- 测试账号登录路径和手机号登录按钮渲染。
|
|
341
|
-
- 构建 H5 和微信小程序目标。
|
|
342
|
-
|
|
343
|
-
## 9. 主题切换必须真实且全局生效
|
|
344
|
-
|
|
345
|
-
当客户要求增加另一种视觉风格时,除非用户明确要求删除,否则要把当前已认可设计保留为一个命名主题,而不是直接覆盖。
|
|
346
|
-
|
|
347
|
-
要求:
|
|
348
|
-
- 主题命名要表达视觉意图,不要沿用临时客户措辞。例如:`清新绿红`、`品牌经典`、`专业深色`。
|
|
349
|
-
- 用 `uni.setStorageSync` 或项目主题运行时持久化主题选择。
|
|
350
|
-
- 如果产品有未登录也可打开的我的/个人中心/设置页,主题切换必须在登录前可用。
|
|
351
|
-
- 主题切换应是紧凑的“切换主题”操作,打开弹窗或底部面板;除非页面明确是完整设置页,否则不要把所有主题选项直接堆在我的/个人中心首页。
|
|
352
|
-
- 主题状态要作用到每个页面根节点、固定底部导航、空状态、骨架屏、加载过渡、按钮、卡片、报告详情和 H5 桌面手机壳。只改变当前页的主题是不完整的。
|
|
353
|
-
- 小程序构建不能只依赖 `document.documentElement`;应使用页面根类、CSS 变量或跨端主题服务。
|
|
354
|
-
- H5 uni-app 主题服务只能修改安全外壳:`html`、`body` 的 `data-*` 属性、主题 class 和 CSS 变量。不要通过 `querySelectorAll('.mci-page')`、`MutationObserver` 或定时扫描去改 `.mci-page`、`uni-page-body`、`uni-page`、`RouterView` 下的 Vue/uni 托管节点 class,否则容易触发 Vue 内部只读字段和空 vnode 错误。
|
|
355
|
-
- 固定底部导航、固定提交栏、悬浮操作条等 fixed 组件在 H5 中优先继承 `html/body` 上的 `--mci-*` 主题变量,避免因为组件自己订阅 theme store 或动态绑定 `bottom-nav--theme` class 导致导航时重渲染。小程序端可在组件根节点绑定稳定主题 class,但不要在 H5 路由切换过程中改变 Vue 托管根节点结构。
|
|
356
|
-
- 如果页面局部 scoped CSS 写死颜色,要增加主题覆盖或重构为 `--mci-*` 变量;骨架屏、加载流光、页面过渡遮罩、报告封面、英文小标题、印章/水印、摘要卡和富文本容器也必须使用主题变量。
|
|
357
|
-
- H5 主题变化不能破坏 uni-app 路由补丁。如果切主题后点击导航出现 `Cannot assign to read only property '_'`、`Cannot read properties of null (reading 'type')`、`parentNode`、`scheduler flush`、`updateSlots` 等错误,必须先移除对 Vue/uni 托管节点的 DOM 改写,保持页面 class 稳定,并改用 `html/body` 变量驱动主题。
|
|
358
|
-
- 底部导航必须防止重复点击当前路由、对连续点击做防抖,并在主题切换后略微延迟路由跳转,确保 DOM/主题更新先于 `uni.reLaunch` 完成。
|
|
359
|
-
|
|
360
|
-
禁止:
|
|
361
|
-
- 新增客户偏好主题时删除此前已认可设计。
|
|
362
|
-
- 主题切换效果在导航或重启后消失。
|
|
363
|
-
- 主题卡片/选项使用纯文字假图标。
|
|
364
|
-
- 主题切换破坏底部导航或产生 Vue scheduler 错误。
|
|
365
|
-
- 为了补主题而直接改 `.mci-page`、`uni-page-body`、`uni-page` 等运行时节点 class。
|
|
366
|
-
- 只让首页和列表页换主题,详情页、骨架屏、加载过渡或报告页仍残留旧主题。
|
|
367
|
-
|
|
368
|
-
验收:
|
|
369
|
-
- 在未登录的我的/个人中心页切换主题,并导航到首页、登录页、列表页、详情页和表单页。
|
|
370
|
-
- 确认底部导航、主按钮、卡片、空状态和页面背景都一致变化。
|
|
371
|
-
- 刷新 H5 页面或重启小程序后确认已选主题恢复。
|
|
372
|
-
- 对 `pages.json` 中每个路由、每个命名主题做截图验证。重点检查文字对比度,尤其是快捷卡片、报告卡片、空状态、底部导航、首屏文字和弹窗/底部面板内容。
|
|
373
|
-
- 主题切换后必须额外截图或断言:底部导航容器背景、未选中项文字、选中项文字、选中图标圆底、首页快捷入口图标颜色都已经切到当前主题,而不是残留旧主题。
|
|
374
|
-
- 主题切换后必须继续点击每个底部导航项,并打开至少一个详情路由(例如报告详情),断言控制台没有 `read only property '_'`、`null (reading 'type')`、`parentNode`、`scheduler flush` 等错误。
|
|
375
|
-
- 骨架屏和加载过渡要在切换主题后重新触发一次;颜色、流光、遮罩和空态不能残留上一个主题。
|
|
376
|
-
- 报告详情页必须逐主题截图,检查 `INSPECTION REPORT`、状态胶囊、封面标题、摘要卡、报告正文和富文本在当前主题下都有足够对比度。
|
|
377
|
-
|
|
378
|
-
## 10. 报告/列表详情必须保留用户身份
|
|
379
|
-
|
|
380
|
-
从列表进入详情时必须保留调用者身份模型。即使打开的是同一个视觉报告详情页,员工、客户和公开/分享路线也可能需要不同接口。
|
|
381
|
-
|
|
382
|
-
要求:
|
|
383
|
-
- 如果员工通过已鉴权 FormEngine 或后台账号接口能看到报告列表,报告详情必须使用同样的员工鉴权路径或传有效员工 token。
|
|
384
|
-
- 客户打开报告时,使用客户 token 或感知绑定关系的接口引擎。
|
|
385
|
-
- 外部用户打开分享报告时,使用分享 token 路由,不要求员工/客户登录。
|
|
386
|
-
- 不要给员工用户发送空 `CustomerToken`,然后把后端响应解释为“未登录”。
|
|
387
|
-
- 打开详情页前保留当前会话;除非员工鉴权端点真实返回登录过期码,否则不要清除员工 token。
|
|
388
|
-
|
|
389
|
-
禁止:
|
|
390
|
-
- 员工列表点击时,直接复用客户匿名报告详情引擎且没有员工凭证路径。
|
|
391
|
-
- 登录用户点击已经可见的报告/列表项后被重定向到登录页。
|
|
392
|
-
|
|
393
|
-
验收:
|
|
394
|
-
- 分别测试员工列表 -> 报告详情、客户列表 -> 报告详情、分享 token 详情。
|
|
395
|
-
- 确认点击可见卡片后不会发生意外登录跳转。
|
|
396
|
-
|
|
397
|
-
## 11. 角色与权限必须基于 sys_user.RoleIds 建模
|
|
398
|
-
|
|
399
|
-
移动端和后台不能只区分“已登录/未登录”。企业应用通常至少有内部员工、售后师傅、客服、客户账号等角色,必须在建模阶段明确角色、菜单权限和数据权限。
|
|
400
|
-
|
|
401
|
-
要求:
|
|
402
|
-
- 内部账号统一使用 `sys_user` 登录,身份可从 `RoleIds`、`_Roles`、`Roles`、`RoleName` 和 `Level` 推导展示能力;只有服务端已确认的 `Level>=9999` 才视为平台超级管理员。角色名和前端 `_IsAdmin` 不能代替接口授权。
|
|
403
|
-
- 角色能力要在统一 session/capability store 中计算,例如 `isTechnician`、`isServiceAgent`、`isCustomerAccount`、`canAcceptOrders`、`canManageCustomers`、`canViewReports`。一个人有多个角色时取能力并集。
|
|
404
|
-
- 客户账号角色要精确判断,不能把“客户管理”这类内部后台角色误判为客户账号。建议只把“客户”“客户账号”“客户用户”或明确包含“客户账号”的角色当作客户侧账号。
|
|
405
|
-
- 后台通过 `sys_role` + `sys_rolelimit` 建角色和菜单权限。售后师傅通常能看维保计划、工单、维保记录、报修和检测报告;客服通常能看客户中心、工单、报修、报告和资讯;客户账号默认不直接授予后台菜单,客户侧数据通过绑定关系和接口数据过滤提供。
|
|
406
|
-
- 移动端按钮和数据必须按 capability 控制:接单按钮只给售后师傅/超级管理员,客户资料管理只给客服/超级管理员,客户账号只能看自己绑定客户的数据。
|
|
407
|
-
- 菜单权限只是粗粒度入口控制,接口引擎和 FormEngine 查询仍必须按角色、`V8.CurrentUser`、客户绑定关系做行级过滤。
|
|
408
|
-
- 微信小程序手机号授权登录后,如果当前 OpenId/小程序用户还没有绑定客户或内部 `sys_user` 身份,移动端不能只显示“联系管理员”。必须提供“申请绑定身份”入口,允许用户申请绑定客户、售后师傅或客服等角色,并把申请写入独立审核表;后台审核通过后才写客户绑定表或 `Sys_User.MiniProgramOpenId` 等正式身份字段。
|
|
409
|
-
- 身份绑定申请必须显示审核状态:待审核、已通过、已驳回。待审核期间不要提前开放客户数据、接单、工单处理等能力;已驳回要展示原因或允许重新提交。
|
|
410
|
-
- 后台审核必须由有权限的内部账号执行。审核客户申请时应由后台选择真实客户 Id 后再写绑定关系,不能只相信用户填写的客户名称;审核售后师傅/客服申请时应由后台选择真实 `sys_user.Id` 后再绑定 OpenId。
|
|
411
|
-
- 使用 MCP 建角色前先回读 `sys_role` 和 `sys_menu`。如果 `microi_save_role` 或通用 `add_form_data('sys_role')` 因 `UpdateTime cannot be null` 等系统字段问题失败,要使用平台修复后的专用角色工具;临时迁移可用一次性接口引擎和参数化 `V8.Db` 补建角色,但必须回读验证并删除或禁用临时入口。
|
|
412
|
-
|
|
413
|
-
禁止:
|
|
414
|
-
- 只做前端显示区分,后台角色和菜单权限不落库。
|
|
415
|
-
- 把客户账号当作普通后台用户直接开放客户、报告、工单全量菜单。
|
|
416
|
-
- 客户授权手机号登录后没有绑定关系时,只提示“联系管理员”,却没有申请、审核、状态回显闭环。
|
|
417
|
-
- 审核绑定时只按用户填写的客户名或姓名自动匹配,未由后台确认真实 `CustomerId` / `Sys_User.Id`。
|
|
418
|
-
- 多角色用户只按第一个角色判断,导致能力丢失。
|
|
419
|
-
- 登录状态、角色文本和页面权限由多个页面各自读取缓存,造成互相矛盾。
|
|
420
|
-
|
|
421
|
-
验收:
|
|
422
|
-
- 用超级管理员、售后师傅、客服、客户账号分别登录截图,确认姓名、角色、按钮和数据范围一致。
|
|
423
|
-
- 用多角色账号登录,确认能力取并集。
|
|
424
|
-
- 回读 `sys_role`、`sys_rolelimit`、关键接口返回数据,确认角色存在、菜单授权正确、客户数据没有越权。
|
|
425
|
-
- 使用真实账号登录后刷新 H5 或重启小程序,不能出现缓存用户名但状态未登录的半登录状态。
|
|
426
|
-
- 用未绑定的小程序手机号账号登录,截图确认“我的”页出现申请绑定身份入口;提交申请后后台能看到待审核记录;通过审核前数据权限不提前开放,通过审核后对应客户数据或内部工作台能力才出现。
|
|
427
|
-
|
|
428
|
-
## 最终交付清单
|
|
429
|
-
|
|
430
|
-
移动端项目标记完成前必须确认:
|
|
431
|
-
- 图标:底部导航、首页快捷入口、个人中心快捷项、主按钮。
|
|
432
|
-
- 登录:H5/App 只有一条账号/手机号 + 密码路径;微信手机号授权是小程序默认路径;没有并列重复登录系统,没有租户/版本/调试块;SDK 接口已核验。
|
|
433
|
-
- 登录状态:成功登录必须同时有 token 和用户 `Id`;刷新、切换导航和进入“我的”页后,不得出现缓存用户名但仍提示未登录。
|
|
434
|
-
- 按钮:图标 + 文字、按下态、加载态。
|
|
435
|
-
- 菜单:后台规划为至少两级树。
|
|
436
|
-
- 请求头:`osclient` 是唯一标准请求头值,没有因大小写重复。
|
|
437
|
-
- 未登录态:授权/登录提示卡片和主按钮在可用内容区上下左右居中,不贴顶部。
|
|
438
|
-
- 首屏:首屏文字和悬浮快捷面板已截图检查,无裁切或重叠。
|
|
439
|
-
- 动效:入场、点击、骨架屏动画存在且克制。
|
|
440
|
-
- 主题:命名主题可持久化,未登录可切换,并影响所有页面和底部导航。
|
|
441
|
-
- 主题质检:每个 `pages.json` 路由在每个命名主题下都截图检查;切换主题再导航后,没有低对比文字,也没有 Vue scheduler/router 错误。
|
|
442
|
-
- 图标对比:首页快捷入口、底部导航、我的快捷入口在每个主题下都清晰可见;不得出现绿色圆底配绿色图标、灰色圆底配低对比图标等情况。
|
|
443
|
-
- 鉴权质检:列表到详情路由保留员工/客户/分享身份,不会把已可见项目重定向回登录页。
|
|
444
|
-
- 分享:`pages.json` 中每个页面都已注册好友转发和朋友圈生命周期;登录/受保护页面也可分享,接收者进入后再鉴权。
|
|
445
|
-
- 登录诊断:体验版手机号登录失败时显示阶段、原因和追踪号;后台系统日志可按追踪号查到脱敏错误上下文。
|
|
446
|
-
- 角色权限:`sys_user.RoleIds`、`sys_role`、`sys_rolelimit`、前端 capability 和接口行级过滤已联动验证。
|
|
447
|
-
- 验证:脚本存在时运行 `build:h5`、`build:mp-weixin` 和 `build:app`;执行 H5 路由冒烟测试和控制台检查。
|
|
179
|
+
- [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. 登录页必须是直接登录界面
|
|
180
|
+
- [references/progressive-02-9-主题切换必须真实且全局生效.md](references/progressive-02-9-主题切换必须真实且全局生效.md):9. 主题切换必须真实且全局生效;10. 报告/列表详情必须保留用户身份;11. 角色与权限必须基于 sys_user.RoleIds 建模;最终交付清单
|
|
181
|
+
<!-- microi-progressive:end -->
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# microi-mobile-app-quality 详细参考 1
|
|
2
|
+
|
|
3
|
+
> 按需读取;本文件由 SKILL.md 的原章节无损拆分。
|
|
4
|
+
|
|
5
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-008 sha256=765335189d85b558ad29ba73c04d1cf078101ee94819f969195b50440a82106f -->
|
|
6
|
+
## 4. 重要按钮必须带图标
|
|
7
|
+
|
|
8
|
+
醒目的主操作必须使用打磨过的图标加文字按钮。
|
|
9
|
+
|
|
10
|
+
要求:
|
|
11
|
+
- 登录、去登录、提交、保存、确认、接单、报修、生成报告、上传照片以及首屏主操作必须包含图标。
|
|
12
|
+
- 按钮必须有可见的按下态、加载态、禁用态,并有足够触控高度。
|
|
13
|
+
- 主按钮应使用项目品牌渐变或品牌纯色,阴影克制,文字对比度安全。
|
|
14
|
+
- `open-type="getPhoneNumber"` 这类小程序原生按钮必须样式化为 `mci-btn`,并移除默认边框。
|
|
15
|
+
|
|
16
|
+
禁止:
|
|
17
|
+
- 首屏、空状态、登录页或固定底栏里出现纯文字主按钮。
|
|
18
|
+
- 按钮文字没有垂直居中。
|
|
19
|
+
- 异步操作按钮没有加载反馈。
|
|
20
|
+
|
|
21
|
+
验收:
|
|
22
|
+
- 截图检查空状态、登录页和表单提交页。
|
|
23
|
+
- 确认主操作有图标、合适的加载文案和按下反馈。
|
|
24
|
+
|
|
25
|
+
<!-- /microi-progressive:chunk -->
|
|
26
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-009 sha256=e3c66bd92ca059235a7a3b0ece2fdfa598a41eaa149d0ee3a0d24d0d822a9f58 -->
|
|
27
|
+
## 4.1 模块列表优先使用声明式业务卡片
|
|
28
|
+
|
|
29
|
+
Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆叠。优先在
|
|
30
|
+
`sys_menu.ViewSchema` 配置 `Scene=Card, Device=Mobile`:
|
|
31
|
+
|
|
32
|
+
- `AvatarTextField`:头像首字或业务简称;没有头像时才显示序号。
|
|
33
|
+
- `TitleField`:唯一主标题,最多两行,不能被右侧金额挤成单字列。
|
|
34
|
+
- `TopFields/StatusFields`:顶部状态、分类、阶段标签,使用少量语义色。
|
|
35
|
+
- `SubtitleFields`:客户、负责人、供应商等一至两项关联信息。
|
|
36
|
+
- `RightFields`:金额、未付、库存等高辨识度数值,支持 `Prefix/Suffix/Tone/Color`。
|
|
37
|
+
- `Fields/MetaFields`:正文和编号、创建人、日期等弱化信息。
|
|
38
|
+
- `BottomFields`:联系人、跟进、合同、附件等可行动的计数或标签。
|
|
39
|
+
|
|
40
|
+
要求:
|
|
41
|
+
|
|
42
|
+
- 卡片内边距通常 12 至 14px,标题、弱信息、金额形成清晰三级层次;不能全卡同字号同颜色。
|
|
43
|
+
- 选择框、更多、底部操作和浮动主按钮的触控区域至少 40 至 44px。
|
|
44
|
+
- 选中态用边框/底色/勾选状态表达,不通过 `transform` 位移导致列表跳动。
|
|
45
|
+
- 只配置字段值和样式时使用 ViewSchema;复杂 HTML 才使用字段 `V8TmpEngineTable`,仍须净化。
|
|
46
|
+
- 未配置 Card 视图时兼容 `MobileListFields/CardTitleTagFields/CardBottomTagFields`,不得白屏。
|
|
47
|
+
- 卡片引用字段必须进入查询列;关联计数由列表接口批量返回,禁止每张卡片再次请求。
|
|
48
|
+
|
|
49
|
+
验收:
|
|
50
|
+
|
|
51
|
+
- 以 375x812、390x844、430x932 至少三种视口检查长标题、空值、大金额、多标签和选中态。
|
|
52
|
+
- 检查顶部/右侧/底部多字段与模板字段均能显示,滚动到底后浮动按钮不遮挡最后一张卡。
|
|
53
|
+
- 批量选择后出现底部操作条;取消选择、执行按钮、更多菜单均可单手点击。
|
|
54
|
+
|
|
55
|
+
<!-- /microi-progressive:chunk -->
|
|
56
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-010 sha256=2ddd560cf3620f8fb7f3cf64d62566206430ee14e6ac380a3023c5b9047b4f46 -->
|
|
57
|
+
## 5. 首屏文字和浮层不得重叠
|
|
58
|
+
|
|
59
|
+
移动端首屏常组合大首屏区域和悬浮快捷面板。这个布局必须视觉检查,因为过大的中文标题和激进的负边距容易造成难看的换行或遮挡主按钮。
|
|
60
|
+
|
|
61
|
+
要求:
|
|
62
|
+
- 首屏标题必须使用能适配真实中文文案的字号,在常见 375px 和 430px 手机宽度下都要可读。
|
|
63
|
+
- 两行中文标题要有足够行高;紧凑业务首屏内不要使用过大的展示字。
|
|
64
|
+
- 使用悬浮快捷面板时,首屏底部要给操作区预留内边距,负边距只能轻微覆盖装饰空间。
|
|
65
|
+
- 首屏主按钮必须完整可见且可点击,包括阴影和圆角底边。
|
|
66
|
+
|
|
67
|
+
禁止:
|
|
68
|
+
- 首屏标题换行成难看的单字或双字第二行。
|
|
69
|
+
- 悬浮面板覆盖登录、报告或提交按钮。
|
|
70
|
+
- 通过隐藏按钮或缩小触控区域来解决重叠。
|
|
71
|
+
|
|
72
|
+
验收:
|
|
73
|
+
- 在 375px 和 430px 宽度截图首屏。
|
|
74
|
+
- 检查首屏标题、主/次按钮和后续悬浮面板是否裁切或重叠。
|
|
75
|
+
|
|
76
|
+
<!-- /microi-progressive:chunk -->
|
|
77
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-011 sha256=b599e047e6b7a3688e4264a4d4b334e220e9798cbc13326e85a06f52bf20ce12 -->
|
|
78
|
+
## 5.1 未登录/授权提示必须在可用内容区居中
|
|
79
|
+
|
|
80
|
+
未登录、未授权、无权限等提示模块不能贴在页面顶部。页面上方有 hero/header,下方有 tabBar 或固定底栏时,提示卡片和“立即登录/去授权”按钮必须在剩余可用内容区上下左右居中。
|
|
81
|
+
|
|
82
|
+
要求:
|
|
83
|
+
- 复用统一组件,例如 `MciAuthPrompt` / `mci-auth-prompt`,不要每个页面复制一套未登录提示样式。
|
|
84
|
+
- 页面容器使用 `flex-direction: column` 时,未登录提示外层必须 `flex: 1`、`display:flex`、`align-items:center`、`justify-content:center`,并考虑底部安全区。
|
|
85
|
+
- 如果组件放在自定义组件根节点内,业务页仍要提供外层居中 wrapper,避免小程序自定义组件根节点不参与父级 flex 导致卡片贴顶。
|
|
86
|
+
- 未登录提示的按钮文字和图标必须在按钮内上下左右居中。
|
|
87
|
+
|
|
88
|
+
禁止:
|
|
89
|
+
- 未登录提示卡片紧贴 header 下方,只在横向居中、纵向不居中。
|
|
90
|
+
- 因 tabBar、刘海屏、安全区或固定底栏导致提示卡片视觉中心偏上。
|
|
91
|
+
|
|
92
|
+
验收:
|
|
93
|
+
- 截图检查工作台、消息、我的等未登录态页面,卡片和主按钮必须在 header 与 tabBar/底栏之间的可用区域居中。
|
|
94
|
+
- 375px、430px、iOS 刘海屏/灵动岛和 Android 状态栏场景均不得出现贴顶或按钮文字偏移。
|
|
95
|
+
|
|
96
|
+
<!-- /microi-progressive:chunk -->
|
|
97
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-012 sha256=a363aaead9b632f3533e2f046f39cf7b579a91b92ef4e33d42f848d5a7538515 -->
|
|
98
|
+
## 5.2 自定义导航页面必须通过安全区与微信胶囊门禁
|
|
99
|
+
|
|
100
|
+
`navigationStyle: custom` 代表应用接管了系统导航区域,页面壳必须同时负责状态栏、刘海/灵动岛、微信右上角胶囊和底部手势区,不能把这一责任留给业务页面自行估算。
|
|
101
|
+
|
|
102
|
+
要求:
|
|
103
|
+
- 统一页面壳读取 `uni.getWindowInfo()`,旧运行时回退 `uni.getSystemInfoSync()`;顶部至少使用 `statusBarHeight`,底部使用 `safeAreaInsets.bottom` 或 `screenHeight - safeArea.bottom`。
|
|
104
|
+
- CSS `env(safe-area-inset-*)` 只能作为 H5 兜底,不能作为微信小程序唯一实现。真实值应注入 `--mci-safe-top`、`--mci-safe-bottom` 等共享变量。
|
|
105
|
+
- 微信小程序必须读取 `getMenuButtonBoundingClientRect()` 并为顶部栏预留胶囊右侧宽度;标题、登录、分享、状态按钮与返回按钮都不能和胶囊相交。
|
|
106
|
+
- 全屏弹层或工作台的多按钮头部必须纳入同一门禁。若按钮组不能完整放在胶囊左侧,标题和按钮组整体布局到胶囊底边以下;不得让关闭按钮被原生“更多/关闭”覆盖。
|
|
107
|
+
- 底部导航、fixed 提交栏、底部弹层和正文滚动区必须消费同一个底部安全变量,正文还要预留完整固定栏高度。
|
|
108
|
+
- 审计 `pages.json` 的全部页面:每一个自定义导航路由都必须使用统一安全页面壳。首页通过不代表详情页、表单页、管理页已经通过。
|
|
109
|
+
|
|
110
|
+
自动化验收:
|
|
111
|
+
- 在微信开发者工具至少选择一台 iPhone 刘海/灵动岛机型和一台 Android 机型,逐页访问 `pages.json` 全路由并截图。
|
|
112
|
+
- 断言首个可交互元素位于状态栏下方,逐个读取顶部按钮与胶囊的矩形并确认不相交,底部导航/按钮位于手势条上方,最后一条滚动内容可完整显示。
|
|
113
|
+
- 发现任意页面被遮挡时,必须修复共享页面壳并重跑全路由;禁止只给当前截图页面增加固定 padding。
|
|
114
|
+
|
|
115
|
+
<!-- /microi-progressive:chunk -->
|
|
116
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-013 sha256=207765d0398738f24566763a2481469f4fc63e8a0b5f00abd292fe8a1cdd225a -->
|
|
117
|
+
## 5.3 全屏工具页必须遵守返回状态栈
|
|
118
|
+
|
|
119
|
+
- AI 助手、扫码工作台、全屏预览等独占视口功能需要手机侧滑返回时,优先使用独立路由承载;普通 `position:fixed` 蒙层不能冒充页面历史。
|
|
120
|
+
- 返回事件按“键盘/确认框 -> 内部抽屉/筛选 -> 当前全屏页 -> 底层业务页”的顺序消费。关闭按钮与手机返回手势必须得到一致结果。
|
|
121
|
+
- 从 Tab 页进入后,第一次返回只能关闭全屏工具页并回到原 Tab;路由栈异常或分享直达时才兜底回首页,禁止退出小程序或跳过原页面。
|
|
122
|
+
- 自动化至少覆盖关闭按钮、Android 返回键/`onBackPress`、微信侧滑返回三条路径,并验证返回后原页面和滚动状态仍然可用。
|
|
123
|
+
|
|
124
|
+
<!-- /microi-progressive:chunk -->
|
|
125
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-014 sha256=1451e6ffbb0c0d29d8362e400540e3fa4f9f38a2402a9faf93de4cce7b1c9b4c -->
|
|
126
|
+
## 5.4 微信浮动入口必须通过真实事件桥门禁
|
|
127
|
+
|
|
128
|
+
- UniApp 自定义组件中的浮动按钮、拖拽助手和悬浮客服不得只做 H5 点击测试。必须在微信运行时找到真实组件节点,派发 `touchstart/touchend`,并断言页面栈、弹层状态或业务动作确实变化。
|
|
129
|
+
- `touch* / tap` 上的 `.stop/.prevent` 会编译成 `catchtouch* / catchtap`;禁止在可拖拽组件上整组滥用。若出现“看得见但点不动”,先检查生成 WXML 是 `catch*` 还是 `bind*`,再检查事件方法与路由,不要用构建成功替代交互验收。
|
|
130
|
+
- 短触与拖动应通过明确位移阈值区分。短触在 `touchend` 完成主动作,拖动只更新位置并持久化,导航失败必须给用户可见反馈。
|
|
131
|
+
- 自动化需增加对照按钮:同页普通按钮可点击、浮动入口也可点击,才能确认不是自动化连接或页面整体失效。
|
|
132
|
+
|
|
133
|
+
<!-- /microi-progressive:chunk -->
|
|
134
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-015 sha256=8377f92a7456bd68e83867e893f1c9e8eec9edf0bba2a3f434c5bce75a9e2d00 -->
|
|
135
|
+
## 6. 后台菜单必须规划为至少两级
|
|
136
|
+
|
|
137
|
+
真实业务系统的后台菜单不能简单堆成一批一级菜单。
|
|
138
|
+
|
|
139
|
+
要求:
|
|
140
|
+
- 先创建父级菜单分组,再把子级 CRUD 模块放到对应分组下。
|
|
141
|
+
- 相关页面超过三个的业务模块必须有父级目录菜单。
|
|
142
|
+
- 建议分组示例:
|
|
143
|
+
- 客户中心:客户、站点、联系人、客户账号绑定。
|
|
144
|
+
- 设备中心:设备台账、设备模板、维保参数。
|
|
145
|
+
- 维保运营:计划、工单、服务记录、维修申请。
|
|
146
|
+
- 报告中心:巡检报告、阅读日志、打印/分享模板。
|
|
147
|
+
- 系统配置:字典、任务、集成设置。
|
|
148
|
+
- 使用 Manifest/MCP 时,必须显式包含父模块和子模块。子模块必须设置 `ParentId`。
|
|
149
|
+
- dry-run 计划必须列出最终菜单树,不能只列平铺菜单名。
|
|
150
|
+
- 如果用户要求通过 MCP 修复已有后台,要真正执行远端工作:读取 `sys_menu`,创建缺失的父级 `SecondMenu` 行,更新现有子菜单 `ParentId` / `Sort`,给管理员角色授权新父菜单,然后回读菜单树。
|
|
151
|
+
- 当用户明确要求修改当前 MCP 租户时,不要只把规则写进 skill 就停下。
|
|
152
|
+
|
|
153
|
+
禁止:
|
|
154
|
+
- 把所有生成模块直接创建到根菜单。
|
|
155
|
+
- 把客户主数据、工单、报告、日志和设置混在同一级。
|
|
156
|
+
|
|
157
|
+
验收:
|
|
158
|
+
- MCP 生成后回读 `sys_menu` 并确认菜单深度。
|
|
159
|
+
- 最终回复必须说明通过 MCP 写入的真实菜单树,以及执行过的权限刷新。
|
|
160
|
+
|
|
161
|
+
<!-- /microi-progressive:chunk -->
|
|
162
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-016 sha256=0c1632d28f986156f8d70b2710dc0219de4643b4b9c61771ac544a18f4c355ac -->
|
|
163
|
+
## 7. 移动端页面需要动效,但动效必须有用
|
|
164
|
+
|
|
165
|
+
移动端产品不应像静态后台表单。
|
|
166
|
+
|
|
167
|
+
要求:
|
|
168
|
+
- 页面首屏、面板、卡片和重要操作区使用克制的入场动画。
|
|
169
|
+
- 点击目标要有按下反馈。
|
|
170
|
+
- 骨架屏应有轻微流光或脉冲。
|
|
171
|
+
- 装饰动效幅度要小,不能干扰任务完成。
|
|
172
|
+
- 支持时尊重减少动态效果偏好。
|
|
173
|
+
|
|
174
|
+
禁止:
|
|
175
|
+
- 整个应用没有交互反馈。
|
|
176
|
+
- 在密集业务列表上使用重度循环动画。
|
|
177
|
+
- 动效导致布局位移或文字重叠。
|
|
178
|
+
|
|
179
|
+
验收:
|
|
180
|
+
- 浏览器或设备检查确认卡片、面板、按钮或骨架屏有可见但克制的动效。
|
|
181
|
+
- 没有动画导致横向溢出、文字裁切或固定栏抖动。
|
|
182
|
+
|
|
183
|
+
<!-- /microi-progressive:chunk -->
|
|
184
|
+
<!-- microi-progressive:chunk id=microi-mobile-app-quality-017 sha256=2dcca5305da25f543181ae23550547cb3e3761aebae2843c5fc60e7848153176 -->
|
|
185
|
+
## 8. 登录页必须是直接登录界面
|
|
186
|
+
|
|
187
|
+
登录页不能强迫用户先在两个身份标签之间切换才能登录。
|
|
188
|
+
|
|
189
|
+
要求:
|
|
190
|
+
- H5/App 提供一个账号或手机号 + 密码表单。除非后端明确支持并要求第二条路径,否则不要把独立手机号客户登录表单和账号密码表单并列展示。
|
|
191
|
+
- 微信小程序默认使用 `<button open-type="getPhoneNumber">` 的手机号授权登录。账号密码登录可以作为次级兜底,但必须折叠或弱化,不能和手机号授权并列成第二套完整登录系统。
|
|
192
|
+
- 微信小程序手机号快捷登录必须把返回的手机号 `code` 传给后端;当后端需要 OpenId/UnionId 时,还必须调用 `uni.login()` 获取新的 `LoginCode`。
|
|
193
|
+
- H5/App 兜底只有在后端支持手机号登录时才提供手动手机号输入。
|
|
194
|
+
- 登录文案要清楚:账号/手机号 + 密码是一条路径;微信手机号授权是小程序默认路径。
|
|
195
|
+
- 登录页不要展示当前租户、OsClient、移动端构建版本、API host、调试版本块等内部实现信息。
|
|
196
|
+
|
|
197
|
+
禁止:
|
|
198
|
+
- 除非用户明确要求,否则把员工/客户身份标签作为主登录模型。
|
|
199
|
+
- 同屏展示两套完整登录系统,例如“账号 + 密码”和“手机号输入登录”并列。
|
|
200
|
+
- 假设前端可以从 `getPhoneNumber` 直接读取微信手机号;现代微信返回的是 code。
|
|
201
|
+
- 目标是微信小程序时,只把手机号登录实现成文本输入。
|
|
202
|
+
- 向终端用户展示租户、版本或调试块。
|
|
203
|
+
|
|
204
|
+
验收:
|
|
205
|
+
- 实现前检查标准参考 `microi.uniapp/src/pages/login/index.vue`。
|
|
206
|
+
- 测试账号登录路径和手机号登录按钮渲染。
|
|
207
|
+
- 构建 H5 和微信小程序目标。
|
|
208
|
+
|
|
209
|
+
<!-- /microi-progressive:chunk -->
|