@microi.net/cli 5.9.0 → 5.9.2

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 (22) hide show
  1. package/.codebuddy-plugin/marketplace.json +2 -2
  2. package/.codebuddy-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.workbuddy-plugin/marketplace.json +2 -2
  5. package/.workbuddy-plugin/plugin.json +1 -1
  6. package/assets/build-meta.json +3 -3
  7. package/cordis.patch.yml +1 -1
  8. package/package.json +1 -1
  9. package/scripts/microi-skills.meta.json +210 -207
  10. package/skills/.microi-skills-version.json +2 -2
  11. package/skills/.progressive-disclosure-manifest.json +95 -77
  12. package/skills/README.md +2 -2
  13. package/skills/microi-docs-coverage/references/capability-map.md +1 -1
  14. package/skills/microi-mobile-app-quality/SKILL.md +27 -9
  15. package/skills/microi-mobile-app-quality/references/mobile-first-delivery.md +75 -0
  16. 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 +31 -17
  17. 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 +8 -7
  18. package/skills/microi-uniapp-frontend/SKILL.md +28 -17
  19. 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 +103 -67
  20. 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 +12 -12
  21. package/skills/workspace-conventions/SKILL.md +4 -2
  22. 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 +9 -1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: microi-mobile-app-quality
3
- description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序。用于创建、重设计、修复、测试或交付任何 Microi 移动端项目,覆盖登录、底部导航、快捷入口、按钮、动效、菜单层级与移动端视觉验收。
3
+ description: Microi 移动端首版交付质量门禁。用于 UniApp/H5/App/小程序创建、修复与发布,覆盖统一快捷登录、长效会话、单列手机布局、真实服务接入、持续动效、后台运营与公开入口验收。
4
4
  ---
5
5
 
6
6
  > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
@@ -11,8 +11,10 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
11
11
 
12
12
  自动触发:只要任务涉及 Microi 移动端应用、H5、微信小程序、App 构建、uni-app 项目、登录页、tabbar、首页、我的页、工作台、报告页、视觉重设计或移动端验收,即使用户没有明确点名,也要应用本 skill。
13
13
 
14
+ 开发前读取[首版交付与外部服务验收](references/mobile-first-delivery.md),按本次实际业务列出适用门禁。首版就验真实手机号流程、会话恢复、手机与桌面布局、持续动效及发布入口;只有首页截图、编译成功或 SDK 对象存在不能宣布产品交付。第三方商户账号尚未开通时完成安全模板与失败路径,并准确区分接入完成和真实业务验收。
15
+
14
16
  <!-- microi-progressive:begin -->
15
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=9f83607349ba6e305c3d2993de8eeceab70c344557e5dfa2a5be964492ef4685 -->
17
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-000 sha256=0bb2395379c14ff6e32e659c1703128665838fc5a2e58a7d53a2d8f8ae63be47 -->
16
18
  ## 1. 导航和快捷入口必须使用真实图标
17
19
 
18
20
  底部导航、首页快捷入口、会员中心快捷项、九宫格操作和悬浮操作,必须在文字上方或旁边显示可识别的图标。
@@ -39,8 +41,21 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
39
41
  - 主题切换后重新截图底部导航、首页快捷入口和个人中心快捷入口;任何一个图标在圆底上看不清,都算验收失败。
40
42
  - UniApp H5 桌面预览可以显示手机壳;真机和浏览器移动设备仿真必须自动去壳并铺满视口。自动化测试要分别断言桌面手机壳存在、移动端手机壳标题隐藏,同时检查所有底部菜单包含真实图标节点。
41
43
 
44
+ ### 1.0 底部导航必须通过几何门禁
45
+
46
+ - H5 安全区只采用浏览器提供的 `env(safe-area-inset-bottom)` 等可信来源;禁止把 `screen.height - window.innerHeight`、`screenHeight - windowHeight` 或浏览器工具栏高度当作安全区。桌面非最大化窗口、缩放和手机地址栏收展时,这些差值可能达到数百像素。App/小程序读取平台权威 inset,`0` 是有效值,禁止 `inset || guessedFallback` 把零替换为猜测值。
47
+
48
+ - 图标存在、页面截图生成和按钮可见都不足以通过验收。必须测量手机壳内屏或移动可见视口、导航外框、每个菜单触摸区与正文滚动区的真实矩形;导航外框底边贴齐所属内屏底边,导航项下方只保留设计间距和真实系统安全区。
49
+ - 桌面手机壳须有明确的可用高度;底部导航贴壳底,不贴浏览器外窗底。手机和移动设备仿真自动去壳;横屏、旋转和宽屏手机不能仅因宽度超过断点就变成桌面预览。
50
+ - 手机产品在桌面内屏保持移动端单列,禁止把首页地图和操作面板按外窗宽度排为两列。桌面可居中预览,但正文、导航及动效均受手机内屏约束;有业务依据的分类双栏单独验证。
51
+ - 页面壳按“头部不收缩、正文 `flex:1; min-height:0`、导航 `flex-shrink:0`”分配空间。普通单列页只允许一个正文滚动 owner,不能让 body、路由包装层和正文同时滚动;短内容也不能把导航挤到中间或在导航下方留下大块空白。
52
+ - 安全区来自运行时或 CSS `env` 的统一变量,只消费一次。流内导航已占据布局空间时,正文不再预留整条导航高度;覆盖式导航才预留其**实测总高度**,不能同时累加导航高度、固定占位和第二份安全区。桌面无真实手势区时不得伪造几十像素底部 padding。
53
+ - 宽度受限的 H5 手机壳仍可能按浏览器宽度换算 `rpx`,必须检查 `pages.json.globalStyle` 的 `rpxCalcMaxDeviceWidth / rpxCalcBaseDeviceWidth` 和实际构建产物;导航高度、图标和尾部占位不得随 4K 桌面视口放大。`750rpx` 不能充当容器 `100%`。
54
+ - 至少覆盖三个主 Tab(不足三个时覆盖全部)、短内容/空态与长内容滚动到底;桌面正常/矮屏、375px/430px 手机、断点两侧、横竖屏和键盘打开/关闭均须留存矩形断言与**视口截图**。`fullPage` 长图不能证明首屏导航贴底;浏览器缩放视口测试不能冒充真实软键盘或真机验收。
55
+ - 详细布局、矩形断言示例与安全区所有权见 [UniApp 布局与安全区参考](../microi-uniapp-frontend/references/progressive-01-移动端分类-双栏列表独立滚动.md#h5-在-pc-浏览器必须自动模拟移动端)。
56
+
42
57
  <!-- /microi-progressive:chunk -->
43
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=4e1b247852aa9f235a26f756d415ebb9fb922f2fea0569bda1bdc8e0b91c4d1c -->
58
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-001 sha256=a5e92f4e6114635b73be59d2a550294bb79dd8c60a3cc2133be16c934e05da8e -->
44
59
  ## 1.1 包体资源必须按用途分层
45
60
 
46
61
  - 构建前扫描图片、音频、视频、字体和第三方资源;公开的大资源优先上传到当前租户 HDFS 公有桶并通过 `sys_config.FileServer`/CDN 引用,敏感资源使用私有桶。
@@ -51,7 +66,7 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
51
66
  - 迁移到 HDFS/CDN 后必须从构建产物确认原大文件已经消失,并从业务记录/配置回读相对 `Path`;页面要先加载当前租户 `SysConfig.FileServer`,不得以源码硬编码 CDN 域名替代运行期配置。远程资源加载失败时只能回退到轻量本地占位,不得把原大图重新塞回主包。
52
67
 
53
68
  <!-- /microi-progressive:chunk -->
54
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=b8e83d75588362899921af62996577277ba77b2fab86767317d62607cec80a84 -->
69
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-002 sha256=bbbd05cdab08058194f97b492c7d09cea748dcfdba6e7fac5063b5d67d078c89 -->
55
70
  ## 2. 不要猜测 Microi 前端 SDK 登录接口
56
71
 
57
72
  编写登录代码前,先检查本地项目 SDK 封装,例如 `src/utils/microi.v8.js`、`src/utils/api.js`,或标准 `microi.uniapp` 登录实现。
@@ -69,6 +84,8 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
69
84
  - 业务守卫、分享接收、手动登录与鉴权失效必须共用登录导航锁;导航失败或登录页真实到达后释放,不能依赖固定延时。UniApp `invoke` 返回 `false` 不会调用 `complete`,被去重的入口不得保留自己的等待锁。
70
85
  - 登录完成优先恢复原业务实例,连续登录页一次移出;历史登录页夹在业务栈中时清栈进入目标。成功返回任务必须去重、在页面销毁时取消,并在执行前复核会话;迟到的失效弹窗不能打断新登录。
71
86
  - 业务页先保存入口参数再鉴权;`onLoad` 未登录早退后,`onShow` 必须恢复一次初始化,并合并并发加载。初始化期间会话失效后仍需允许登录返回重取,不能永久显示骨架屏或丢失分享的记录 Id。
87
+ - 默认快捷流程必须分别验证已注册登录与新手机号自动注册;新用户只授最低角色,已认证角色默认工作模式与普通用户切换均来自服务端身份。企业封闭注册策略不得被前端快捷入口绕过。没有用户授权的收信手机号时,完成发送失败/限频/验证码错误等自动化与真实已有账号登录,收信及首次短信注册由用户在发布后验收;不得向库内用户发短信,也不能把这部分写成已送达。
88
+ - Token 持久化与恢复须按子租户真实 `AccessTokenLifetime` 校验移动端 JWT 时长,不写死 20/30 天。覆盖主动旧换新、响应头轮换、并发续签、冷启动/前台恢复、跨租户、吊销、退出时在途响应;新会话不得被旧响应恢复或清除。实现规范见 [UniApp 默认登录与会话](../microi-uniapp-frontend/SKILL.md)。
72
89
 
73
90
  禁止:
74
91
  - 凭空编造 SDK 子对象。
@@ -82,7 +99,7 @@ description: Microi 移动端质量门禁,适用于 UniApp/H5/微信小程序
82
99
  - 自动回归覆盖并发引导、去重取消无 `complete`、失败重试、历史重复登录栈、登录成功后返回及业务页继续初始化、旧弹窗迟到和页面销毁;真实开发者工具与真机另验冷启动及分享接收,不能用模拟会话代替授权登录。
83
100
 
84
101
  <!-- /microi-progressive:chunk -->
85
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=a35f20404acbf61814f9475610f881f7c60effc0ce3bb8797cee300cd3349ba7 -->
102
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-003 sha256=fec4c841ed7a897643a4c16337dce79a9be22931866af8aa7f888cbae5e72a20 -->
86
103
  ## 2.1 登录验证码必须跟随 Sys_Config.EnableCaptcha
87
104
 
88
105
  PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/SysUser/login`、`/api/SysUser/Login` 或 `V8.Login(param)`,都必须先读取 `Sys_Config` 的 `EnableCaptcha` 配置,并按配置决定是否展示和提交图形验证码。
@@ -108,7 +125,7 @@ PC 端、H5、App、微信小程序或任何自定义前端只要调用 `/api/Sy
108
125
  - 参考标准实现:`microi.uniapp/src/pages/login/index.vue`。
109
126
 
110
127
  <!-- /microi-progressive:chunk -->
111
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=22bdaf38588f251016e115f1ad15a433e827fb2191041d55ecad42cda94253d1 -->
128
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-004 sha256=84a0f768af152f584f87643e1037a0ae57261df8947cc59710e1f021b99c287f -->
112
129
  ## 3. OsClient 请求头不得重复
113
130
 
114
131
  Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览器、代理或服务端运行时可能把 `OsClient` 和 `osclient` 这类大小写重复键合并成 `demo, demo`,导致租户识别失败。
@@ -130,7 +147,7 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
130
147
  - 微信/支付宝/飞书/抖音等小程序授权登录接口也必须检查,例如 `/apiengine/miniprogram-login`,不得出现 `osclient: demo, demo` 这类合并值。
131
148
 
132
149
  <!-- /microi-progressive:chunk -->
133
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=1394c7fb8e59b25553e2f9b71ab7f8cf03290b6930c8d8436123bc6048ad2435 -->
150
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-005 sha256=aefc3f7242a62ac411fa234fe322dd7726a8ed7db4f0d35e01cc364a36e8a335 -->
134
151
  ## 3.1 小程序授权登录必须可追踪、可读错误
135
152
 
136
153
  微信开发者工具的模拟授权与体验版真机调用不是同一条真实链路。手机号授权登录接口必须按阶段诊断,不能只返回“手机号登录失败”。
@@ -149,7 +166,7 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
149
166
  - 体验版真机复测授权登录;不能只以开发者工具模拟成功作为上线依据。
150
167
 
151
168
  <!-- /microi-progressive:chunk -->
152
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=feb9ba3267bdf1f6394c425b45dd71e19ac4382ae05549d6e1b6b664c6517a19 -->
169
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-006 sha256=e2446ca4c0fca61d3c748c2f91c585d9da0df9ee9a0170f70d823b0c0745a88e -->
153
170
  ## 3.1.1 手机号快速验证前置页不得混淆腾讯官方
154
171
 
155
172
  - 调用手机号快速验证组件前展示的登录页、弹窗、按钮、说明、分享标题和失败提示中,禁止出现“微信”“微信官方”“微信登录”“一键登录”等可能让用户误认为腾讯官方功能或官方产品的文案。
@@ -158,7 +175,7 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
158
175
  - `build:mp-weixin` 后必须扫描登录页源码和 `dist/build/mp-weixin/pages/login/` 产物中的可见文案,并对手机号快速验证前置页截图;发现混淆词、官方 Logo 或近似元素时阻止上传和提审。
159
176
 
160
177
  <!-- /microi-progressive:chunk -->
161
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=7598db1fdabfe127c2be7593b83dc3a246b1db852d9c0d4001f849d3e97aa273 -->
178
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-007 sha256=15dc4a001ce3bf6f3620b741cf1bf7dd92e4ff8372eeb256f01c5e2aabba8398 -->
162
179
  ## 3.2 微信小程序每个页面默认支持分享
163
180
 
164
181
  小程序项目必须默认支持转发给朋友和分享到朋友圈,不能只给首页或公开页添加分享。登录和权限控制属于访问阶段,不得用来隐藏分享能力。
@@ -182,4 +199,5 @@ Microi 请求只能发送一个不区分大小写的 OsClient 请求头。浏览
182
199
 
183
200
  - [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
201
  - [references/progressive-02-9-主题切换必须真实且全局生效.md](references/progressive-02-9-主题切换必须真实且全局生效.md):9. 主题切换必须真实且全局生效;10. 报告/列表详情必须保留用户身份;11. 角色与权限必须基于 sys_user.RoleIds 建模;最终交付清单
202
+ - [references/mobile-first-delivery.md](references/mobile-first-delivery.md):新建/交付移动产品必读;首版事实源、短信与地图、安全迁移、布局动效、后台运营、正式发布与证据边界
185
203
  <!-- microi-progressive:end -->
@@ -0,0 +1,75 @@
1
+ # 移动端首版交付与外部服务验收
2
+
3
+ 适用于新建或交付移动产品;局部修复只执行相关项,保持既有正确配置与用户授权。
4
+ 快捷登录和会话协议以 `microi-uniapp-frontend`、`microi-frontend-sdk` 为准;本参考负责
5
+ 把源码、外部服务、后台与正式入口组成一条可回读的交付链,避免只有静态页面。
6
+
7
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-022 sha256=748fc4a802457bab760ae24281c3bb27cb70841fe72b61b86f088439236867aa -->
8
+ ## 开发前固定事实源和首版范围
9
+
10
+ - 使用指定 MCP 的实际 Profile,先回读 `ApiBase + OsClient`,不能因为官网发布归主租户就让试用端请求主租户。不同租户用独立浏览器 context,不能只新开标签。
11
+ - 调用 `microi_list_applications` 盘点在线应用与全部文件;读取目标 `microi_get_application_context` 时显式请求完整内容并检查完整性、文件数和错误数。当前工具 Schema 与实际返回为准,截断结果不能当完整源码。
12
+ - 正式可编辑源码、Manifest、接口引擎、资源策略、构建、测试及设计素材保持在唯一 `AI应用/{appKey}`;受审计独立仓库按发布契约指定。`.tmp/` 只存一次性脚本/报告,不成为发布源;源码交付包必须自包含必要项目文件,不能依赖开发者电脑的临时目录。
13
+ - 把需求拆成可演示的核心流程、角色、后台模块、服务依赖与验收矩阵。首版同时实现移动页面与需求内的业务接口,不把能点击的按钮、模拟成功 Toast、静态地图或随机报表当完成。
14
+ - 默认以实际品牌建立统一壳、图标、字号、间距、卡片、错误/空态、骨架屏和动效组件。用户给参考图是业务/视觉依据;允许个性化时按其意图设计,不复制其它品牌、Logo 或以无限装饰牺牲操作。
15
+ - 多角色使用同一 UniApp 源码与 session/capability store;新用户最低权限、申请、审核、默认角色入口、切回普通角色均有服务端闭环。不存在审核结果时不能因前端模式切换开放高级工作台。
16
+
17
+ ## 短信、地图与安全配置
18
+
19
+ ### 复用已有能力而非猜接口
20
+
21
+ - 先检查同源官网登录/注册、标准 `microi.uniapp` 与现有引擎的真实请求、字段和失败语义。可复用短信发送、验证码消费、DiyToken 签发与续签,保留租户注册策略、最低角色与禁用账号约束。
22
+ - 验证图形码、短信用途、超时、限频、重放与同手机号并发注册;发送成功回执只证明供应商受理,不代表短信到达。真实手机号必须由用户指定或授权,不能从数据库随便选一个;用户选择自行收信时保留明确的发布后验收项。
23
+ - 第三方账号尚未开通时完成字段、说明、后台入口、最小接入模板、错误处理和契约测试。不得把测试桩、验证码绕过、固定数据或匿名管理员权限当正式接通。
24
+
25
+ ### 密钥只在正确租户的安全边界内流转
26
+
27
+ - 地图、短信、支付与电子开票敏感项进入当前租户系统设置的安全配置;公开启动配置只返回明确白名单的能力开关、供应商和当前端必要运行值。不得返回整个 `V8.SysConfig`、`V8.OsClientModel` 或私有设置字典。
28
+ - 获授权从另一租户迁移配置时,先核对供应商产品、运营主体、域名和可复用范围;仅复制所需键的最小允许列表,由可信后端在目标租户重新加密。禁止整行复制 `sys_osclients`、盲拷租户密文、复用基础设施连接串或把秘密写进源码/Manifest。
29
+ - 使用已存在且审阅过的安全配置工具;若没有安全迁移能力,先补可信通用能力或让管理员在后台填写,不能通过 FormEngine、SQL 别名、临时维护引擎或普通 Reveal 绕过权限。具体实现以 `v8-security` 为准。
30
+ - MCP `microi_run_engine` 的原始 `params` 可能被持久化审计;Token、短信码、完整手机号和密钥不得当普通引擎参数用于调试或迁移。认证验收通过标准 SDK/受保护传输在内存使用凭据,日志、报告和错误响应只保留脱敏阶段/追踪号;专用安全写入工具仍按其脱敏契约执行。
31
+
32
+ ### 地图必须按产品与终端验证
33
+
34
+ - 高德浏览器 JS API 的 ClientKey 与 Web 服务 REST Key 是不同产品,不能互换。H5 按明确运行 `Mode` 接入:`js` 加载官方 JS SDK;`server-static` 可由可信服务端调用官方 REST 静态地图,返回真实图片并配合服务端 POI、逆地理编码和路线。后者是静态地图,不具备交互瓦片的拖动/缩放体验;不能借此绕过供应商产品或商业授权。App/小程序走对应平台地图与原生授权适配器,不能在非 H5 分支执行 `window/document`。
35
+ - `js` 模式的 JS 安全码或安全代理地址在 SDK 加载前配置,核对当前 SDK 版本、域名允许列表、HTTPS、CORS;所有模式都核对对应产品与商业权限。复制主租户 Key 不保证目标 CDN 域名可用;`INVALID_USER_KEY`、域名拒绝、安全码错误、配额或商业授权错误必须保留供应商阶段与追踪号。
36
+ - 地图运行配置采用最小投影。浏览器 ClientKey 的公开使用不授权公开 REST Key、短信 Secret 或其它服务密钥;需要保护的 JS 安全配置优先按供应商支持方式通过服务端代理,并限制可信目标,不能接受任意转发 URL。
37
+ - 匿名地图能力按业务允许范围设计,不能因为公共首页要地图就整体放开系统设置或要求游客先用管理员 Token。已登录与未登录分别验实际加载及接口权限。
38
+ - 真实浏览器按模式验收可见尺寸与供应商响应:`js` 断言 SDK 成功及实际瓦片/要素;`server-static` 断言供应商成功响应、图片类型(如 PNG)、真实像素尺寸和已显示的地图图片,不能把错误 JSON、空图或本地示意图当地图。两种模式均点击定位、地点搜索/选择、逆地理编码、路线规划并检查实际结果;定位允许/拒绝、加载超时、空结果和配额不足都有可继续操作的降级。
39
+ - “SDK 全局对象存在”“地图容器存在”“占位文字显示”不是地图已接通。渲染失败要区分配置未启用、Key 产品错误、域名/商业拒绝、容器尺寸与供应商不可用,不能统一吞成模糊提示后宣称通过。
40
+
41
+ ## 布局与持续动效从首版验收
42
+
43
+ | 范围 | 通过条件 | 常见失败 |
44
+ |---|---|---|
45
+ | 桌面 H5 | 居中手机内屏,仍为移动单列,内屏有高度上限 | 主页面变两列、超长手机壳、外窗出现正文第二滚动条 |
46
+ | 手机/设备仿真 | 去壳铺满可见视口,横竖屏与键盘恢复正常 | 仅按宽度把横屏手机当桌面、`100vh` 残留键盘空白 |
47
+ | 底部导航 | 内屏底边贴合,菜单触摸区和实际安全区高度有界 | `screenHeight-windowHeight` 伪造数百像素安全区、重复占位 |
48
+ | 动效 | 入场/按压/骨架反馈及适用持续装饰实测可见 | 只写 keyframes、只在 loading 动、文字输入持续跳动 |
49
+ | 减少动态/后台 | 用户偏好生效,隐藏暂停,恢复不累积监听 | 后台循环耗电、路由越切计时器越多、装饰夺取点击 |
50
+
51
+ 几何断言和共享安全区规则见 UniApp 布局参考;持续动效规则见本 Skill 的“7. 移动端
52
+ 页面需要动效”。每个路由都使用共享壳,不给被投诉的一个页面临时补 padding。
53
+
54
+ ## 后台与运营能力属于业务交付
55
+
56
+ - 完整产品需求包含管理时,后台必须有真实可见的父子菜单、授权模块、搜索/状态筛选、详情、审核/业务操作与运营报表。用客户将使用的账号进入后台验收,不能只在数据库查到菜单行。
57
+ - 报表从真实业务表按权限、日期、城市/组织等范围聚合;金额、订单、状态、优惠/补贴、资金流水各口径能追溯,并与明细对账。没有数据时显示空态,不能填随机 KPI。
58
+ - 用户授权添加测试/运营数据时使用可复现、幂等且有来源标识的种子;主子表、金额、状态和时间口径一致。隔离测试城市/账号/交易,报表说明数据范围,不能伪称真实营业或发出真实短信/扣款/开票;原用户和既有资金数据保持不变。
59
+ - 单一运营主体默认一组支付宝和一组微信收款配置;只有业务明确需要多商户/多通道才设计路由。服务端金额重算、签名/回调验签、幂等、防重放、对账与电子开票状态机仍必须实现,不能因只有一家主体就省略。
60
+ - 客户自有支付/开票账号上线前在后台配置。模板与沙箱通过不代表正式收款/出票;正式受理、异步回调、查询、退款/失败和税务结果分别保留验收边界。
61
+ - 涉及海外/多城市监管时,区分客户材料、已核实法规与推断。预留地区/城市接入、数据区域、审计、车辆终端和合规材料状态,按正式规格实现适配;软件交付不等于牌照、认证或监管审批已获准,遮挡/缺失需求只能标注假设,不能编造成已确认条款。
62
+
63
+ ## 真实发布与自动化证据
64
+
65
+ 1. 从本次冻结源码执行必要的 H5、小程序和 App 编译/单测/契约测试;App 编译资源不是 APK/IPA,小程序构建也不代表已提审或真机通过。
66
+ 2. 使用真实目标 API 与独立登录上下文测试匿名、已有账号、最低角色、高级/多角色和无权访问。每个核心路由与关键按钮有正/负路径:加载、失败、重试、取消、提交及返回状态,不能只点首页。
67
+ 3. H5 至少覆盖 375×812、430×932、桌面矮屏/普通/4K、断点与手机横屏;记录内屏、导航/菜单矩形、滚动 owner、页面溢出、可达末项、网络与控制台。真机软键盘、原生权限与性能证据独立记录。
68
+ 4. 通过 MCP 同步私有源码并发布公开编译产物,等待终态后独立回读版本、文件清单/哈希、运行指针和 CDN 实际内容;返回任务 Id、上传成功或 BuildStatus 文本不能代替完成回执。保留旧版可恢复指针,不手工伪造发布状态。
69
+ 5. 请求需要官网试用/推荐时,回读应用列表记录并从匿名官网点击实际卡片,确认推荐、版本、入口及运行端 `ApiBase + OsClient` 正确;在**公开 URL** 再跑登录、地图、角色、动效及多视口回归,不能以本地构建替代公开体验。
70
+ 6. 客户方案/PDF 若在范围内,截图来自已验收页面:后台高分辨率、移动端真实视口,3D 手机外观只能包装原截图,不生成不存在的界面。图注区分真实页面、测试运营数据、规划能力和供应商待开通项;高清截图不能替代功能证据。
71
+
72
+ 交接按用户编号列出源码与本地测试、MCP 业务资源、私有源码/公有产物、官网入口、
73
+ 设备/渠道和第三方业务各层结果。任何未实测项明确原因,不能笼统宣称“全自动化通过”
74
+ 或“商业就绪”覆盖用户尚未完成的收信、商户开通、正式支付/开票和渠道审核。
75
+ <!-- /microi-progressive:chunk -->
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-008 sha256=765335189d85b558ad29ba73c04d1cf078101ee94819f969195b50440a82106f -->
5
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-008 sha256=8cc961b2ba44763893f3cc09fbfca36668061b6bd75fc8f066904a04622948ff -->
6
6
  ## 4. 重要按钮必须带图标
7
7
 
8
8
  醒目的主操作必须使用打磨过的图标加文字按钮。
@@ -23,7 +23,7 @@
23
23
  - 确认主操作有图标、合适的加载文案和按下反馈。
24
24
 
25
25
  <!-- /microi-progressive:chunk -->
26
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-009 sha256=e3c66bd92ca059235a7a3b0ece2fdfa598a41eaa149d0ee3a0d24d0d822a9f58 -->
26
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-009 sha256=47248f77c0a41a7fd64f6a255d8c9af356b6768e5167c73a48d60b86f1ab9899 -->
27
27
  ## 4.1 模块列表优先使用声明式业务卡片
28
28
 
29
29
  Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆叠。优先在
@@ -53,7 +53,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
53
53
  - 批量选择后出现底部操作条;取消选择、执行按钮、更多菜单均可单手点击。
54
54
 
55
55
  <!-- /microi-progressive:chunk -->
56
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-010 sha256=2ddd560cf3620f8fb7f3cf64d62566206430ee14e6ac380a3023c5b9047b4f46 -->
56
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-010 sha256=979733873bd74cd95b0c84988a8d3709f673a813dc212076e4f02e8b376fb492 -->
57
57
  ## 5. 首屏文字和浮层不得重叠
58
58
 
59
59
  移动端首屏常组合大首屏区域和悬浮快捷面板。这个布局必须视觉检查,因为过大的中文标题和激进的负边距容易造成难看的换行或遮挡主按钮。
@@ -74,7 +74,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
74
74
  - 检查首屏标题、主/次按钮和后续悬浮面板是否裁切或重叠。
75
75
 
76
76
  <!-- /microi-progressive:chunk -->
77
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-011 sha256=b599e047e6b7a3688e4264a4d4b334e220e9798cbc13326e85a06f52bf20ce12 -->
77
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-011 sha256=47a21d62bc04740ed19eea3f7c2c816e4c73b9054de63beb16df12468c6a4363 -->
78
78
  ## 5.1 未登录/授权提示必须在可用内容区居中
79
79
 
80
80
  未登录、未授权、无权限等提示模块不能贴在页面顶部。页面上方有 hero/header,下方有 tabBar 或固定底栏时,提示卡片和“立即登录/去授权”按钮必须在剩余可用内容区上下左右居中。
@@ -94,7 +94,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
94
94
  - 375px、430px、iOS 刘海屏/灵动岛和 Android 状态栏场景均不得出现贴顶或按钮文字偏移。
95
95
 
96
96
  <!-- /microi-progressive:chunk -->
97
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-012 sha256=a363aaead9b632f3533e2f046f39cf7b579a91b92ef4e33d42f848d5a7538515 -->
97
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-012 sha256=fb7a9bfb6e8be41d472df82edf6238b9d09e6aeabd54eb71bce2a255a50c6326 -->
98
98
  ## 5.2 自定义导航页面必须通过安全区与微信胶囊门禁
99
99
 
100
100
  `navigationStyle: custom` 代表应用接管了系统导航区域,页面壳必须同时负责状态栏、刘海/灵动岛、微信右上角胶囊和底部手势区,不能把这一责任留给业务页面自行估算。
@@ -104,7 +104,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
104
104
  - CSS `env(safe-area-inset-*)` 只能作为 H5 兜底,不能作为微信小程序唯一实现。真实值应注入 `--mci-safe-top`、`--mci-safe-bottom` 等共享变量。
105
105
  - 微信小程序必须读取 `getMenuButtonBoundingClientRect()` 并为顶部栏预留胶囊右侧宽度;标题、登录、分享、状态按钮与返回按钮都不能和胶囊相交。
106
106
  - 全屏弹层或工作台的多按钮头部必须纳入同一门禁。若按钮组不能完整放在胶囊左侧,标题和按钮组整体布局到胶囊底边以下;不得让关闭按钮被原生“更多/关闭”覆盖。
107
- - 底部导航、fixed 提交栏、底部弹层和正文滚动区必须消费同一个底部安全变量,正文还要预留完整固定栏高度。
107
+ - 底部导航、fixed 提交栏、底部弹层和正文滚动区使用同一个底部安全变量,并明确空间所有者。流内导航已经占高度时正文不再加整条栏占位;覆盖式栏才由共享布局预留一次实测总高度,安全区包含在该高度内,不能再叠一份。
108
108
  - 审计 `pages.json` 的全部页面:每一个自定义导航路由都必须使用统一安全页面壳。首页通过不代表详情页、表单页、管理页已经通过。
109
109
 
110
110
  自动化验收:
@@ -112,8 +112,19 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
112
112
  - 断言首个可交互元素位于状态栏下方,逐个读取顶部按钮与胶囊的矩形并确认不相交,底部导航/按钮位于手势条上方,最后一条滚动内容可完整显示。
113
113
  - 发现任意页面被遮挡时,必须修复共享页面壳并重跑全路由;禁止只给当前截图页面增加固定 padding。
114
114
 
115
+ ### 5.2.1 底部空白、滚动和键盘必须测量
116
+
117
+ - 安全区来源单独回读:H5 使用 CSS 环境安全区,禁止将 `screenHeight - windowHeight` 当作底部 inset。App/小程序按各端权威接口取值,`0` 必须原样保留;不得以 `inset || guessedFallback` 触发估算。用非最大化桌面窗口、浏览器缩放和地址栏收展重测,不能仅用 `screen === viewport` 的固定截图通过门禁。
118
+
119
+ - 矩形断言以实际页面内屏为边界:桌面使用手机壳内屏,移动端使用当前可见视口;导航底边与该边界的差应在事先约定的舍入容差内(示例 `2 CSS px`)。壳外阴影、边框和桌面留边不算导航下方空白。
120
+ - 同时量导航外框和内部菜单触摸区。外框贴底但高度几百像素、菜单挤在其顶部仍算失败;内部菜单下方剩余高度只能等于真实安全区加设计底间距,不能把多余区域都解释成“安全区”。
121
+ - 至少选三个主 Tab,在初始、滚动中、滚动到底、切回短内容/空态后重复测量;导航位置应稳定,最后一项不能被导航遮挡。普通单列页只允许一个主体滚动 owner,桌面 body 不应跟随正文滚动。
122
+ - 覆盖桌面正常与矮屏、375px/430px 手机、预览断点两侧、手机横屏和旋转后恢复。`rpx` 换算要在 768px、960px 和 4K 外窗下检查实际导航高度,不能只看源码写了 `430px` 壳宽。
123
+ - 输入框获得焦点、软键盘打开、关闭和返回后重新验证可见区域与导航。H5 结合 `visualViewport` 的尺寸/偏移判断真实可见范围,原生端遵守其键盘模式;缩小浏览器视口只证明 resize 响应,不能证明 iOS/Android 真键盘行为。
124
+ - 取 `fullPage:false` 的真实视口截图并核对导航下方区域。长页 `fullPage` 图中导航可能位于图中部,不能据此判定贴底,也不能仅凭长图或图标存在宣称布局通过。
125
+
115
126
  <!-- /microi-progressive:chunk -->
116
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-013 sha256=207765d0398738f24566763a2481469f4fc63e8a0b5f00abd292fe8a1cdd225a -->
127
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-013 sha256=f4e1f01f3dde22120ecba9131b5c738118c0e4aa8131ea83978f3e1d6b4db289 -->
117
128
  ## 5.3 全屏工具页必须遵守返回状态栈
118
129
 
119
130
  - AI 助手、扫码工作台、全屏预览等独占视口功能需要手机侧滑返回时,优先使用独立路由承载;普通 `position:fixed` 蒙层不能冒充页面历史。
@@ -122,7 +133,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
122
133
  - 自动化至少覆盖关闭按钮、Android 返回键/`onBackPress`、微信侧滑返回三条路径,并验证返回后原页面和滚动状态仍然可用。
123
134
 
124
135
  <!-- /microi-progressive:chunk -->
125
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-014 sha256=1451e6ffbb0c0d29d8362e400540e3fa4f9f38a2402a9faf93de4cce7b1c9b4c -->
136
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-014 sha256=eaf8ac0e9edadf382a08951d6c43b9ab561dd2a8ee02fc80048fc843e4656033 -->
126
137
  ## 5.4 微信浮动入口必须通过真实事件桥门禁
127
138
 
128
139
  - UniApp 自定义组件中的浮动按钮、拖拽助手和悬浮客服不得只做 H5 点击测试。必须在微信运行时找到真实组件节点,派发 `touchstart/touchend`,并断言页面栈、弹层状态或业务动作确实变化。
@@ -131,7 +142,7 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
131
142
  - 自动化需增加对照按钮:同页普通按钮可点击、浮动入口也可点击,才能确认不是自动化连接或页面整体失效。
132
143
 
133
144
  <!-- /microi-progressive:chunk -->
134
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-015 sha256=8377f92a7456bd68e83867e893f1c9e8eec9edf0bba2a3f434c5bce75a9e2d00 -->
145
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-015 sha256=3a65e2da022d493b7d950450a10186d33652ec4225c359d9b3800ef431458525 -->
135
146
  ## 6. 后台菜单必须规划为至少两级
136
147
 
137
148
  真实业务系统的后台菜单不能简单堆成一批一级菜单。
@@ -159,17 +170,19 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
159
170
  - 最终回复必须说明通过 MCP 写入的真实菜单树,以及执行过的权限刷新。
160
171
 
161
172
  <!-- /microi-progressive:chunk -->
162
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-016 sha256=0c1632d28f986156f8d70b2710dc0219de4643b4b9c61771ac544a18f4c355ac -->
173
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-016 sha256=e76ae9654126f9efcd103801dfc90cd77955953a94b2a6e01496cf7e8539049b -->
163
174
  ## 7. 移动端页面需要动效,但动效必须有用
164
175
 
165
176
  移动端产品不应像静态后台表单。
166
177
 
167
178
  要求:
168
- - 页面首屏、面板、卡片和重要操作区使用克制的入场动画。
179
+ - 首版设计明确每页的动效来源,首屏、面板、卡片和重要操作区有统一入场与操作反馈;支持“清爽/精致”不等于删除所有动效。
180
+ - 有品牌展示或用户要求持续酷炫效果时,在可见首屏/状态区使用轻量背景流光、光晕、轨道、呼吸或装饰漂浮等持续动效。主要使用 `transform/opacity`,限制层数、范围与幅度;持续动画不能只存在于加载中的骨架屏,不能伪造车辆、交易或其它业务状态。
169
181
  - 点击目标要有按下反馈。
170
182
  - 骨架屏应有轻微流光或脉冲。
171
183
  - 装饰动效幅度要小,不能干扰任务完成。
172
- - 支持时尊重减少动态效果偏好。
184
+ - H5 尊重 `prefers-reduced-motion`,原生端提供等价减弱/关闭能力;页面隐藏或 App `onHide` 暂停装饰循环、计时器/RAF,恢复前台再启动,离开页面清理监听。浏览器 DOM、媒体查询与 RAF 仅在 H5 分支使用,不破坏小程序/App 编译。
185
+ - 装饰层 `pointer-events:none`,被共享内屏裁切;标题、输入框、验证码、正文与关键按钮位置稳定。动效不能触发新的业务请求、重复提交或连续数据刷新。
173
186
 
174
187
  禁止:
175
188
  - 整个应用没有交互反馈。
@@ -177,21 +190,22 @@ Microi.Client 的标准模块移动端不应把 PC 表格字段机械纵向堆
177
190
  - 动效导致布局位移或文字重叠。
178
191
 
179
192
  验收:
180
- - 浏览器或设备检查确认卡片、面板、按钮或骨架屏有可见但克制的动效。
193
+ - 浏览器或设备实际等待至少两个不同时间点,记录动画属性/截图变化,确认可见页面确实持续在动;只扫描 `@keyframes` 或截图一个静止画面不能证明效果。
194
+ - 重测减少动态、前后台暂停/恢复、路由切换、按钮按下、输入/验证码操作与所有主 Tab。确认文字/输入控件矩形稳定、装饰层不夺取触摸、没有重复请求,并留存相应证据;浏览器结果不能冒充原生性能实测。
181
195
  - 没有动画导致横向溢出、文字裁切或固定栏抖动。
182
196
 
183
197
  <!-- /microi-progressive:chunk -->
184
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-017 sha256=2dcca5305da25f543181ae23550547cb3e3761aebae2843c5fc60e7848153176 -->
198
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-017 sha256=9d89588a5dfc384aec720c47cad0506844f0233bd7540cb555650ed7929db946 -->
185
199
  ## 8. 登录页必须是直接登录界面
186
200
 
187
201
  登录页不能强迫用户先在两个身份标签之间切换才能登录。
188
202
 
189
203
  要求:
190
- - H5/App 提供一个账号或手机号 + 密码表单。除非后端明确支持并要求第二条路径,否则不要把独立手机号客户登录表单和账号密码表单并列展示。
204
+ - H5/App 默认提供一个手机号 + 图形验证码 + 短信验证码表单,服务端按租户策略统一已注册登录与未注册自动注册;密码是次级折叠/备用入口。封闭企业账号或用户指定模型保留其策略,不擅自开放注册。
191
205
  - 微信小程序默认使用 `<button open-type="getPhoneNumber">` 的手机号授权登录。账号密码登录可以作为次级兜底,但必须折叠或弱化,不能和手机号授权并列成第二套完整登录系统。
192
206
  - 微信小程序手机号快捷登录必须把返回的手机号 `code` 传给后端;当后端需要 OpenId/UnionId 时,还必须调用 `uni.login()` 获取新的 `LoginCode`。
193
- - H5/App 兜底只有在后端支持手机号登录时才提供手动手机号输入。
194
- - 登录文案要清楚:账号/手机号 + 密码是一条路径;微信手机号授权是小程序默认路径。
207
+ - 短信能力未配置时给明确的暂不可用状态与有效备用入口,不构造看似成功的验证码流程。微信小程序具备正式授权能力时保持手机号授权主路径,与短信/密码入口共用平台 DiyToken。
208
+ - 默认文案说明“未注册手机号将按平台规则自动注册”,展示实际协议/隐私同意;不先要求用户猜测该点登录还是注册。
195
209
  - 登录页不要展示当前租户、OsClient、移动端构建版本、API host、调试版本块等内部实现信息。
196
210
 
197
211
  禁止:
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 按需读取;本文件由 SKILL.md 的原章节无损拆分。
4
4
 
5
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-018 sha256=b6e3138b7f398fad5b03253d07c1eb30e26da5c3df8ff1975117e5a3a282fd58 -->
5
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-018 sha256=28b7c339cbf546a91f4f35fce2bc146f052283fad2b6c54d7a8971acde21740a -->
6
6
  ## 9. 主题切换必须真实且全局生效
7
7
 
8
8
  当客户要求增加另一种视觉风格时,除非用户明确要求删除,否则要把当前已认可设计保留为一个命名主题,而不是直接覆盖。
@@ -39,7 +39,7 @@
39
39
  - 报告详情页必须逐主题截图,检查 `INSPECTION REPORT`、状态胶囊、封面标题、摘要卡、报告正文和富文本在当前主题下都有足够对比度。
40
40
 
41
41
  <!-- /microi-progressive:chunk -->
42
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-019 sha256=f2ca99aebb70273d991f5142e88bd1e02ff42782df5a8e7e180de297fba0faac -->
42
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-019 sha256=406cf4edff553e80567a6462a68b872d98275358b89ff196df0873f78a2c30a9 -->
43
43
  ## 10. 报告/列表详情必须保留用户身份
44
44
 
45
45
  从列表进入详情时必须保留调用者身份模型。即使打开的是同一个视觉报告详情页,员工、客户和公开/分享路线也可能需要不同接口。
@@ -60,7 +60,7 @@
60
60
  - 确认点击可见卡片后不会发生意外登录跳转。
61
61
 
62
62
  <!-- /microi-progressive:chunk -->
63
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-020 sha256=95487284aa5f9b1b3a0fb557845b3400af0355e4b2ebf6abebbef461e8ec8485 -->
63
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-020 sha256=0ba25107b10b0abb9367309a65f5004829293b572fceddd483d85443f46d9af8 -->
64
64
  ## 11. 角色与权限必须基于 sys_user.RoleIds 建模
65
65
 
66
66
  移动端和后台不能只区分“已登录/未登录”。企业应用通常至少有内部员工、售后师傅、客服、客户账号等角色,必须在建模阶段明确角色、菜单权限和数据权限。
@@ -75,7 +75,7 @@
75
75
  - 微信小程序手机号授权登录后,如果当前 OpenId/小程序用户还没有绑定客户或内部 `sys_user` 身份,移动端不能只显示“联系管理员”。必须提供“申请绑定身份”入口,允许用户申请绑定客户、售后师傅或客服等角色,并把申请写入独立审核表;后台审核通过后才写客户绑定表或 `Sys_User.MiniProgramOpenId` 等正式身份字段。
76
76
  - 身份绑定申请必须显示审核状态:待审核、已通过、已驳回。待审核期间不要提前开放客户数据、接单、工单处理等能力;已驳回要展示原因或允许重新提交。
77
77
  - 后台审核必须由有权限的内部账号执行。审核客户申请时应由后台选择真实客户 Id 后再写绑定关系,不能只相信用户填写的客户名称;审核售后师傅/客服申请时应由后台选择真实 `sys_user.Id` 后再绑定 OpenId。
78
- - 使用 MCP 建角色前先回读 `sys_role` 和 `sys_menu`。如果 `microi_save_role` 或通用 `add_form_data('sys_role')` 因 `UpdateTime cannot be null` 等系统字段问题失败,要使用平台修复后的专用角色工具;临时迁移可用一次性接口引擎和参数化 `V8.Db` 补建角色,但必须回读验证并删除或禁用临时入口。
78
+ - 使用 MCP 建角色前先回读 `sys_role` 和 `sys_menu`。如果 `microi_save_role` 或通用 `add_form_data('sys_role')` 因 `UpdateTime cannot be null` 等系统字段问题失败,定位并使用平台修复后的专用角色工具,写入超时先回读;缺能力先补通用 MCP,禁止新建一次性维护接口引擎绕过角色工具和权限边界。
79
79
 
80
80
  禁止:
81
81
  - 只做前端显示区分,后台角色和菜单权限不落库。
@@ -93,7 +93,7 @@
93
93
  - 用未绑定的小程序手机号账号登录,截图确认“我的”页出现申请绑定身份入口;提交申请后后台能看到待审核记录;通过审核前数据权限不提前开放,通过审核后对应客户数据或内部工作台能力才出现。
94
94
 
95
95
  <!-- /microi-progressive:chunk -->
96
- <!-- microi-progressive:chunk id=microi-mobile-app-quality-021 sha256=13405c8ce231e9db8920cd8e1c4e0db26a32c1b5ac967113abee1391985ebfcd -->
96
+ <!-- microi-progressive:chunk id=microi-mobile-app-quality-021 sha256=7569a732bd895f6175f4735ccbddd57ede3d9782fff458449d266e76c7c17d38 -->
97
97
  ## 审核后的会话与角色同步(强制)
98
98
 
99
99
  - 审核通过后的数据库角色、服务端 DiyToken 身份投影、SDK 用户缓存、页面 capability 和申请状态必须一致,禁止以“退出重登后正常”作为验收成功。
@@ -109,14 +109,14 @@
109
109
 
110
110
  移动端项目标记完成前必须确认:
111
111
  - 图标:底部导航、首页快捷入口、个人中心快捷项、主按钮。
112
- - 登录:H5/App 只有一条账号/手机号 + 密码路径;微信手机号授权是小程序默认路径;没有并列重复登录系统,没有租户/版本/调试块;SDK 接口已核验。
112
+ - 登录:H5/App 默认手机号 + 图形验证码 + 短信码统一登录/按租户策略自动注册,密码备用;正式小程序优先手机号授权;没有并列重复身份体系与调试块,SDK 契约已核验。
113
113
  - 登录状态:成功登录必须同时有 token 和用户 `Id`;刷新、切换导航和进入“我的”页后,不得出现缓存用户名但仍提示未登录。
114
114
  - 按钮:图标 + 文字、按下态、加载态。
115
115
  - 菜单:后台规划为至少两级树。
116
116
  - 请求头:`osclient` 是唯一标准请求头值,没有因大小写重复。
117
117
  - 未登录态:授权/登录提示卡片和主按钮在可用内容区上下左右居中,不贴顶部。
118
118
  - 首屏:首屏文字和悬浮快捷面板已截图检查,无裁切或重叠。
119
- - 动效:入场、点击、骨架屏动画存在且克制。
119
+ - 动效:入场、点击、骨架屏与适用的持续品牌动效实测可见;减少动态、后台暂停、路由恢复与稳定文字矩形均通过。
120
120
  - 主题:命名主题可持久化,未登录可切换,并影响所有页面和底部导航。
121
121
  - 主题质检:每个 `pages.json` 路由在每个命名主题下都截图检查;切换主题再导航后,没有低对比文字,也没有 Vue scheduler/router 错误。
122
122
  - 图标对比:首页快捷入口、底部导航、我的快捷入口在每个主题下都清晰可见;不得出现绿色圆底配绿色图标、灰色圆底配低对比图标等情况。
@@ -125,4 +125,5 @@
125
125
  - 登录诊断:体验版手机号登录失败时显示阶段、原因和追踪号;后台系统日志可按追踪号查到脱敏错误上下文。
126
126
  - 角色权限:`sys_user.RoleIds`、`sys_role`、`sys_rolelimit`、前端 capability 和接口行级过滤已联动验证。
127
127
  - 验证:脚本存在时运行 `build:h5`、`build:mp-weixin` 和 `build:app`;执行 H5 路由冒烟测试和控制台检查。
128
+ - 首版闭环:按 [首版交付与外部服务验收](mobile-first-delivery.md) 留存真实服务、后台、运营数据、私有源码同步、CDN 与公开试用入口证据;有客户账号或渠道依赖的未实测项逐项列明。
128
129
  <!-- /microi-progressive:chunk -->
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: microi-uniapp-frontend
3
- description: Microi 吾码 UniApp/H5 前端通用规范。用于构建或修复任何 Microi uni-app/移动端 H5 项目,覆盖上传资源渲染、头像、骨架屏、移动安全区、tabBar、固定底栏和明确业务素材选择。
3
+ description: Microi 吾码 UniApp/H5/App/小程序前端规范。用于创建或维护移动产品,覆盖手机号快捷登录、租户长效会话、统一角色源码、地图接入、资源、安全区、持续动效和真实发布验收。
4
4
  ---
5
5
 
6
6
  > **Microi吾码基础规范(强制):** 任何 AI 模型与宿主每次新建或接续吾码任务,先完整读取 `../workspace-conventions/SKILL.md`,必须执行版本播报、`@microi.net/cli` 后台自动升级、Skills/MCP 同步和进度播报。安装与诊断读取 `../microi-codex-installer/SKILL.md`;更新失败延后重试,不阻断当前工作。
@@ -20,13 +20,13 @@ UniApp/H5/小程序必须通过项目统一 `microi.v8.js` 的 `V8.uploadFile` /
20
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
21
 
22
22
  <!-- microi-progressive:begin -->
23
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-000 sha256=ecb0fc85b5c3b15ac79c9049ca86de8c586d4ce3a6c975255464069d89f87ac4 -->
23
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-000 sha256=1769ef931aebcb62aba41dd3c9f65d45200cdb33ec697268d92af069f3f36789 -->
24
24
  ## 移动端质量门禁必须先读
25
25
 
26
- 创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`。该 Skill 中的底部导航真实图标、重要按钮图标化、登录 API 校验、微信手机号快捷登录、后台二级菜单和页面动效要求,属于交付验收条件,不是可选优化。
26
+ 创建、重构或修复任何 Microi 移动端项目前,必须同时应用 `microi.skills/microi-mobile-app-quality/SKILL.md`,并读取其[首版交付与外部服务验收](../microi-mobile-app-quality/references/mobile-first-delivery.md)。手机号快捷登录、会话续签、导航几何、真实地图、页面动效和公开发布回读从首版纳入需求与测试,不能先交静态占位版,再等待用户逐页指出问题。涉及后台与第三方服务时按实际业务范围执行,既有授权和租户策略优先。
27
27
 
28
28
  <!-- /microi-progressive:chunk -->
29
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=b195b92de6175b7f184257a0ba3b53b94b8a6aaee7ab42fbb05fe1f5338ba097 -->
29
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-001 sha256=51e5f609e93cf164acb9af45f83a8d713f28fba3d68b22d4331a86e5f5248fc5 -->
30
30
  ## 标准产品、视图协议与租户扩展
31
31
 
32
32
  动态表单的组织/树字段优先复用原生 `mci-native-field` 树形下拉与 `native-tree-options.mjs`,无需为小程序把后台 `Department` 改为普通 Select。读取 `Config.<Component>.Multiple/EmitPath`:组织单选叶值保存 Id,多选叶值保存 Id 数组,路径模式保存完整路径/路径数组,数组统一 JSON 序列化。支持祖先展开、搜索、清空、禁用、重试和只读回显;数据源旧模板不能代替当前授权组织树。业务字段联动放租户扩展,不执行任意前端 V8;验收覆盖保存格式、旧数据回显、失败/迟到响应及最近公司祖先联动。
@@ -50,34 +50,45 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
50
50
  仓库必须提供 AI 与人工协作约束文件、租户脚手架、Profile 构建/同步命令和架构检查。平台层改动至少同时构建标准 Profile 与默认交付 Profile;租户视觉改动还要执行多视口截图回归。这样其他同事使用 Codex、Claude、Copilot、Cursor 等工具继续开发时,会先读取相同规则,而不是依赖某次对话记忆。
51
51
 
52
52
  <!-- /microi-progressive:chunk -->
53
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-002 sha256=76ebf3985d21fbbc5d86093b95bdf348e526e3670da9bb6827b5e1a7184e617b -->
53
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-002 sha256=4afd4d5fc252848a1808a4210139a7e96e0e054a936921ab6ab552e58488f0da -->
54
54
  ## H5 预览壳与底部导航强制规则
55
55
 
56
+ - H5 的底部安全区采用 CSS `env(safe-area-inset-bottom)` 等浏览器权威值,不能使用 `screenHeight - windowHeight` 或 `screen.height - innerHeight` 推算。App/小程序只读取平台权威 inset;零值正常,禁止用 `inset || guessedFallback` 换成猜测值。验收必须覆盖物理屏幕与浏览器视口不同、非最大化桌面、缩放和移动浏览器工具栏收展。
57
+
56
58
  - 桌面浏览器允许使用 `Microi UniApp H5 Preview` 手机壳帮助用户理解移动端比例。
57
- - 真机、窄屏浏览器以及 PC DevTools 移动设备仿真(视口宽度小于等于 `767px`)必须自动去掉手机壳标题、外边距、圆角、边框和阴影,内容铺满 `100vw × 100vh`;不得在手机屏幕里再套一层模拟手机。
59
+ - 面向手机的页面在桌面手机壳内仍保持相同的单列布局和移动字号,不能因外窗变宽把地图、主面板或整页拆成桌面两列;业务明确设计的分类双栏另按其独立滚动规范执行。
60
+ - 真机、窄屏浏览器以及 PC DevTools 移动设备仿真必须自动去掉手机壳标题、外边距、圆角、边框和阴影,内容铺满当前可见视口。`767px` 是常用宽度断点,不是手机身份判断;手机横屏/旋转不能因宽度超过它就重新套壳。H5 优先使用动态视口高度并保留旧浏览器兜底,键盘与浏览器栏变化要重新核对可见区域。
61
+ - 桌面手机壳必须约束高度,不能只用 `min-height:100vh` 让内容继续撑长。导航底边贴齐手机壳**内屏**底边,不是浏览器窗口底边;头部和导航不收缩,正文及路由中间包装层使用 `flex:1; min-height:0; min-width:0`。
62
+ - 普通单列壳只有一个正文滚动 owner;流内底栏已占高度,不再给正文叠加整条 tabBar 占位。覆盖式固定底栏由共享布局预留一次实测总高度,包含真实安全区;禁止根容器、正文、占位元素与导航分别重复累加底部间距。双栏列表仅允许明确设计的两块独立滚动区。
63
+ - 桌面宽度限制不能阻止 `rpx` 按外窗宽度放大。把 `rpxCalcMaxDeviceWidth / rpxCalcBaseDeviceWidth` 与壳宽、断点统一,并从实际产物核验导航/图标高度;填满容器使用 `%` 或 flex,不使用 `750rpx`。
58
64
  - AI 应用预览编译器必须为每个底部菜单渲染真实 SVG/本地图标和文字,不能只输出文字、单汉字、emoji 或空白占位。原生 uni-app `tabBar` 仍使用纳入版本管理的本地 PNG `iconPath / selectedIconPath`。
59
- - 自动化验收必须同时使用桌面视口与移动视口截图:桌面端断言手机壳存在,移动端断言 `.phone-status` 隐藏且 `.phone` 无圆角、无边框、宽高铺满;每个底部菜单的图标元素和文字都必须可见、可点击。
65
+ - 自动化验收不能只断言手机壳或图标节点存在。至少覆盖三个主 Tab 的真实内屏/导航/触摸区矩形、导航下方剩余高度、滚动 owner 和末条内容可达;覆盖桌面矮屏、断点、手机横竖屏、键盘打开与关闭后恢复。使用视口截图,桌面 body 不产生第二条竖向滚动条;真实键盘/安全区另做渠道或真机验收。
66
+ - 完整实现与门禁示例见 [H5 手机壳和几何验收](references/progressive-01-移动端分类-双栏列表独立滚动.md#h5-在-pc-浏览器必须自动模拟移动端)。修改共享壳后重跑所有 Tab 与路由,不能只给当前页面补 padding。
60
67
 
61
68
  <!-- /microi-progressive:chunk -->
62
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-003 sha256=5cedd05cb29746019a92db56a21123718fde23d5d9df4b8064dfc260bc89ee05 -->
63
- ## 登录页与手机号快捷登录
69
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-003 sha256=bc471d69e918fdad463836c069b18b93d7194d739fb030096e592d5a80d516dd -->
70
+ ## 默认快捷登录、自动注册与长效会话
64
71
 
65
- - 登录页必须是直接登录面,不要默认做“员工登录 / 客户登录”身份 Tab 切换,除非用户明确要求。默认展示系统账号密码登录,同时提供客户手机号快捷登录入口。
72
+ - H5/App 面向用户的默认登录面为“手机号 + 图形验证码 + 短信验证码”,同一个提交动作由服务端判断:已注册登录,未注册按当前租户开放注册策略自动注册并登录。密码登录是次级折叠/备用入口,不先要求选择“登录/注册”或“员工/客户”。企业封闭账号及用户明确指定的登录模型保留其策略;不得为了展示快捷登录而擅自开放注册、启用短信或授予员工角色。
73
+ - 图形验证码先用于服务端校验短信发送,短信码才证明手机号控制权;供应商未配置、余额不足或短信失败时返回可诊断原因,不能以图形码代替短信、使用万能码或返回短信明文。前端倒计时不代替后端限频、过期、用途绑定、一次性消费与重放保护。沿用官网/标准 UniApp 的实际契约,不能照抄界面后猜接口。
74
+ - 默认新账号只获得租户定义的最低用户角色;高级身份申请经后台审核后才升级。多角色用同一源码、同一 DiyToken 和集中 capability 切换工作模式;已审核的服务角色可默认进入工作台,同时保留已授权的普通用户能力。前端模式和角色缓存不能授予接口权限。
66
75
  - 账号密码登录必须先检查项目本地 SDK 实际导出,常见是 `V8.Login(param)` 或 `/api/SysUser/Login`。禁止凭空写 `V8.Login.Login(...)` 这类未验证子对象。
67
76
  - 登录、接口引擎、FormEngine、上传等所有请求头必须做大小写不敏感去重;`osclient` 只能发送一个运行期值,例如 `demo`,禁止同时传 `OsClient` 与 `osclient` 导致网络面板出现 `demo, demo`。
68
77
  - 账号密码登录只有在同时拿到成功码、有效 token 和有效用户 `Id` 时才算成功。Microi 登录 token 可能在响应头 `authorization`,用户信息可能在响应体 `Data`;两者任一缺失都要清理 SDK token、本地用户缓存和 session。
69
78
  - 恢复本地会话时必须重新校验 token 和用户 `Id`,禁止出现页面显示 `admin` 但状态仍是“未登录”的半登录状态。
79
+ - DiyToken、用户与稳定 `did` 按 `ApiBase + OsClient` 隔离持久化,使用统一 SDK/session store;存储写入失败不能继续成功导航。移动登录传准确 `_ClientType`,有效期读取子租户 `AccessTokenLifetime`(单位天),实际可能是 20、30 天或其它配置,前端不得硬编码。验收以本次 JWT 的签发/到期时间与服务端配置匹配为准,本地 JWT 解析只作调度,不能代替服务端验签。
80
+ - 默认接入 SDK `startTokenMaintenance()`、`resumeAuthSession(false)` 与 `refreshToken()`:按真实到期窗口以旧换新,每个请求接收响应头 `authorization`,同一运行上下文的并发请求 single-flight。有多标签会话需求时,另按 SDK 实际协议验证跨标签 Token/退出同步及竞态,不能把单实例的刷新 Promise 当作已支持跨标签单飞。前台恢复立即检查,退出、切换账号或租户递增会话代次,拒绝旧请求的 Token/用户回写及迟到失效弹窗。已到期、被吊销或管理员撤销的会话不能因本地仍有 Token 无限延长。完整协议见 [SDK Token 与终端协议](../microi-frontend-sdk/references/progressive-01-token-当前登录用户与当前终端登录协议.md)。
70
81
  - 账号密码登录调用 `/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`。
71
82
  - 开启验证码时,页面必须通过 `GET /api/Captcha/GetCaptcha` 获取验证码图片,读取响应头 `captchaid`,提交账号登录时传 `_CaptchaId` 和 `_CaptchaValue`;登录失败后清空输入并刷新验证码。未开启验证码时不显示验证码,不传空验证码字段。
72
83
  - 微信小程序手机号快捷登录必须使用 `<button open-type="getPhoneNumber">`,通过 `@getphonenumber` 获取 `detail.code`,并重新调用 `uni.login({ provider:'weixin' })` 获取新的 `LoginCode`。前端不能假设能直接拿到手机号明文。
73
- - H5/App 可提供手机号输入兜底,但必须确认后端接口支持 `Phone` 登录;微信小程序优先走 `Code + LoginCode`。
84
+ - 微信小程序具备正式授权能力时,手机号授权仍优先走 `Code + LoginCode`;短信输入路径共用同一平台身份与会话,并由实际能力决定备用入口,不能另建平行用户/权限 Token。
74
85
  - 登录按钮、去登录按钮、手机号授权按钮必须是图标 + 文案按钮,具备 loading、disabled/pressed 反馈,且原生 button 默认边框要清掉。
75
86
  - 体验版授权登录必须保留可诊断错误:请求层归一化 `uni.request.fail.errMsg`、HTTP 状态和接口 `Msg`,登录页用模态框完整展示“阶段 + 原因 + 追踪号”。后端接口引擎按阶段写脱敏系统日志;不能只在前端 catch 后显示固定“手机号登录失败”。
76
87
  - 小程序调用手机号快速验证组件的前置页、按钮、弹窗、分享标题和失败提示不得出现“微信”“微信官方”“微信登录”“一键登录”等可能混淆腾讯官方的文案,也不得展示微信官方 Logo、相似绿色气泡图标或仿官方品牌元素。统一使用“手机号快捷登录”“手机号快速验证”等中性业务文案,只展示应用自身品牌 Logo。
77
88
  - 微信小程序构建后必须扫描登录页源码以及 `dist/build/mp-weixin/pages/login/` 产物,并截图核对手机号快速验证前置页;命中上述混淆文案、官方图形或近似元素时必须阻止上传和提审,不能只检查按钮主文案而漏掉说明文字、错误弹窗或分享标题。
78
89
 
79
90
  <!-- /microi-progressive:chunk -->
80
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-004 sha256=cc25e3d896e6f7349a7a7e93b8025ee797bf9810e60214eb95e41d75aa083422 -->
91
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-004 sha256=c0e95b3c0fef84be2526e4b902a7c0d980d98217139b0d0b5b5b6fca7145641d -->
81
92
  ## 微信小程序全页面分享
82
93
 
83
94
  - 创建或维护 UniApp 微信小程序时,默认把好友转发与朋友圈分享视为页面基础能力;按 `pages.json` 全量路由逐页接入,不等待用户额外提出。
@@ -88,7 +99,7 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
88
99
  - 验收不能只看首页右上角。用脚本比较 `pages.json` 路由数量与源码/微信构建产物中的两种分享生命周期数量,并在体验版抽测公开页、登录页和受保护详情页。
89
100
 
90
101
  <!-- /microi-progressive:chunk -->
91
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-005 sha256=d6f78d95dc0b0b042f0d0c525a9cb5295a0324f1c70d6f480c93f2e03d315cec -->
102
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-005 sha256=7e002241f968def653a6ddb7934b3a4f185a0cf5fc845dd31d16f2a47d5cd598 -->
92
103
  ## 首屏 Hero 与浮动面板验收
93
104
 
94
105
  - 移动端首屏 Hero 标题必须按真实中文文案调字号和行高,不能为了“震撼”把业务入口标题做得过大,导致一行半、孤字换行或压住按钮。
@@ -96,7 +107,7 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
96
107
  - 交付前至少检查 375px 与 430px 宽度首屏截图,确认标题、主按钮、次按钮、浮动面板、第二块内容没有重叠、裁切或不美观换行。
97
108
 
98
109
  <!-- /microi-progressive:chunk -->
99
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-006 sha256=a39f7e4fb42c6d290463a9e40eed03235e4afe063d60208b5a3e73a170fbc39f -->
110
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-006 sha256=4ddf2899af481528fd518842ec98aa31ada5e5c0b5dc585c27098b5413b2dd5a -->
100
111
  ## 资源 URL 必须集中解析
101
112
 
102
113
  数据库中的图片、附件、头像、Logo、卡面图、单据图片等字段常见保存形式:
@@ -120,7 +131,7 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
120
131
  - 第三方占位图、已失效临时地址、空字符串统一清理为空,交给 UI 占位态。
121
132
 
122
133
  <!-- /microi-progressive:chunk -->
123
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-007 sha256=3894454672b6bde6f4a7b329103c9418804f4594b7e3505617590ebea5f136ab -->
134
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-007 sha256=bc13da83759030866897991a5192831ee28bb24ad0ff5a5ad9e5c57917520f0d -->
124
135
  ## 移动端大资源优先使用租户 HDFS/CDN
125
136
 
126
137
  定制 UniApp/H5/小程序中的大图、视频、音频、字体和大型第三方静态文件,默认不要塞进主包。应先确认目标 `OsClient`,通过该租户 MCP/HDFS 上传,再以 `sys_config.FileServer + Path` 的 CDN/公有桶地址引用;合同、证件等敏感资源仍必须使用私有桶和临时签名 URL。
@@ -136,7 +147,7 @@ Microi 标准小程序必须采用“平台内核 + 版本化元数据 + Profile
136
147
  - 原始高清图、视频母版、设计源文件不得继续放在会被 UniApp 收集的 `src/static`、分包目录或其它构建入口中;应移到项目资料/设计源目录。主包仅保留小于门禁的轻量失败占位图和离线关键图标。
137
148
 
138
149
  <!-- /microi-progressive:chunk -->
139
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-008 sha256=d7b2b5c8ffe5c1dd8f51eb7d5e8368dba6813c2fa25d39dd3fb8f6659922b5b9 -->
150
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-008 sha256=d52c69b1f93de27639f47c25916cb6c479465ff0db9e5ef3db81073dd50ebebb -->
140
151
  ## 头像必须异步统一解析
141
152
 
142
153
  头像字段比普通图片更容易混合出现上传 JSON、私有路径、相对路径、历史字段名和脏数据。列表页、详情页、业务记录、审批记录、团队/会员卡片、聊天/消息等头像场景都必须走同一个头像解析入口。
@@ -157,7 +168,7 @@ row.OwnerAvatarUrl = await resolveAvatarUrl(rawAvatar);
157
168
  禁止在模板中临时拼接文件服务器,禁止每个页面各写一套头像解析,禁止只在能查到关联用户时才解析接口已经返回的头像字段。
158
169
 
159
170
  <!-- /microi-progressive:chunk -->
160
- <!-- microi-progressive:chunk id=microi-uniapp-frontend-009 sha256=0270fbc5a2ee0d20a4d1d2f2a9c7fc7304e18402d282e1efcf860bd31db9fcb0 -->
171
+ <!-- microi-progressive:chunk id=microi-uniapp-frontend-009 sha256=20cfb0b95ea827e9cbca1272b27a57a080976fc1fd8db3b4586e0dc5ed13d903 -->
161
172
  ## 移动端富文本图文排版
162
173
 
163
174
  商品详情、公告详情、活动说明、文章正文、协议说明等富文本在移动端渲染时,图片和文字不能使用同一套留白规则。