Files
hms/docs/qa/T40-miniprogram-ui-audit-plan.md
iven df1d85bfde docs: T40 UI 审计报告 + wiki 更新 + Docker 配置
- T40 UI 审计计划和结果文档(docs/qa/)
- wiki 更新:miniprogram 设计系统合规审计记录 + index 关键数字更新
- 审计 V2 完整报告(docs/audits/v2/)
- 讨论记录文档(docs/discussions/)
- 设计规格和实施计划(docs/superpowers/)
- 角色测试计划和结果(docs/qa/role-test-*)
- Docker 生产部署配置
2026-05-13 23:29:42 +08:00

409 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# T40 小程序全页面 UI 审查计划
> 日期: 2026-05-13 | 分支: feat/media-library-banner | 状态: 编写中
## 目录
1. **审查目标与范围** — 审查什么、达到什么标准
2. **设计体系速查** — Design Token / 变量 / mixin / 长者模式规范
3. **页面清单与分组** — 56 个页面按角色和功能分组,标注优先级
4. **审查方法与工具** — 逐页审查流程、MCP 自动化 vs 手动、检查清单
5. **审查记录模板** — 每个页面的标准记录格式
6. **已完成项与已知问题** — 前序修复记录、待复查项
---
## 1. 审查目标与范围
### 1.1 目标
对小程序 **全部 56 个页面** 进行逐页 UI 审查,确保:
- **视觉一致性** — 所有页面遵循「温润东方风」设计体系Design Token + SCSS 变量)
- **交互可用性** — 触控区域 ≥ 48px、按钮/Tab 响应正常、空态/加载态/错误态完整
- **长者模式适配** — 字号 ≥ 22px、间距放大、信息层级清晰
- **角色适配正确** — 患者/医护(Doctor/Nurse/HM)/访客 各看到正确的 UI
### 1.2 通过标准
每个页面的审查结果分为三级:
| 等级 | 含义 |
|------|------|
| **PASS** | 无问题,设计体系完全遵循 |
| **PASS_WITH_ISSUES** | 可用但有轻微不一致(低优先级修复) |
| **NEEDS_WORK** | 存在明显问题需修复后才可通过 |
### 1.3 范围
| 维度 | 包含 | 不包含 |
|------|------|--------|
| 页面 | 主包 16 页 + 6 个子包 40 页 = 56 页 | — |
| 角色 | 访客、登录患者、Doctor、Nurse、Health Manager | Operator后台为主小程序体验有限 |
| 状态 | 正常态、空态、加载中、错误态 | 极端边界(如 10k+ 列表项) |
| 设备 | iPhone SE ~ iPhone 15 Pro Max 宽度 | iPad / 横屏模式 |
| 模式 | 标准模式 + 长者模式 | 深色模式(未实现) |
---
## 2. 设计体系速查
> 审查时的参考基准。所有页面必须遵循这些规范,偏离即为问题。
### 2.1 色彩系统(`styles/variables.scss`
| Token | 值 | 用途 |
|-------|-----|------|
| `$pri` | `#C4623A` | 赤土橙,主强调色(按钮/活跃Tab/图标) |
| `$pri-l` | `#F0DDD4` | 赤土浅,背景高亮 |
| `$pri-d` | `#8B3E1F` | 赤土深,渐变终点 |
| `$acc` | `#5B7A5E` | 鼠尾草绿,成功/完成状态 |
| `$acc-l` | `#E8F0E8` | 成功浅背景 |
| `$bg` | `#F5F0EB` | 页面主背景(温润米底) |
| `$card` | `#FFFFFF` | 卡片白色 |
| `$surface-alt` | `#EDE8E2` | 辅助底色Tab 未选中/输入框背景) |
| `$tx` | `#2D2A26` | 主文字warm black |
| `$tx2` | `#5A554F` | 次文字AA 正文 ~5.5:1 |
| `$tx3` | `#78716C` | 淡文字AA 大字 ~4.6:1仅 ≥24px |
| `$bd` | `#E8E2DC` | 边框 |
| `$dan` | `#B54A4A` | 危险红 |
| `$dan-l` | `#FDEAEA` | 危险浅背景 |
| `$wrn` | `#C4873A` | 警告琥珀 |
| `$wrn-l` | `#FFF3E0` | 警告浅背景 |
### 2.2 字号 Token`styles/tokens.scss`
正常模式 10 级字号:
| Token | 正常 | 长者模式 | 用途 |
|-------|------|---------|------|
| `--tk-font-hero` | 48px | 56px | 装饰图标、空状态字符 |
| `--tk-font-h1` | 26px | 30px | 页面/区块标题 |
| `--tk-font-h2` | 24px | 28px | 副标题、日期 |
| `--tk-font-body-lg` | 28px | 34px | 大正文、按钮 |
| `--tk-font-body` | 22px | 30px | 正文、标签 |
| `--tk-font-body-sm` | 16px | 22px | 中等正文、列表项 |
| `--tk-font-num` | 30px | 34px | 数值 |
| `--tk-font-num-lg` | 34px | 40px | 大数值、统计 |
| `--tk-font-cap` | 13px | 18px | 说明文字、时间戳 |
| `--tk-font-micro` | 11px | 17px | 角标、标签 |
**规则:** 页面样式必须用 `var(--tk-font-*)` 而非硬编码 px 值,否则长者模式不生效。
### 2.3 圆角与阴影
| Token | 值 | 用途 |
|-------|-----|------|
| `$r` | 16px | 卡片、输入框 |
| `$r-sm` | 12px | 小型标签、内部元素 |
| `$r-xs` | 8px | 微型圆角 |
| `$r-lg` | 20px | 大卡片、头部区域 |
| `$r-pill` | 999px | 胶囊按钮、角标 |
| `$shadow-sm` | `0 1px 4px rgba(45,42,38,0.04)` | 列表项 |
| `$shadow-md` | `0 2px 12px rgba(45,42,38,0.08)` | 卡片 |
| `$shadow-lg` | `0 8px 32px rgba(45,42,38,0.12)` | 浮层 |
### 2.4 常用 Mixin`styles/mixins.scss`
| Mixin | 用途 | 使用场景 |
|-------|------|---------|
| `@include flex-center` | 水平垂直居中 | 图标容器、按钮文字 |
| `@include serif-number` | Georgia 字体 + 等宽数字 | 数值显示、首字图标 |
| `@include section-title` | 区块标题样式 | 各页 section 标题 |
| `@include tag($bg, $color)` | 标签胶囊 | 状态标签 |
| `@include touch-target` | 最小触控区域 48×48 | 可点击元素 |
| `@include btn-primary` | 主按钮 | 确认/提交 |
| `@include btn-outline` | 描边按钮 | 次要操作 |
| `@include safe-bottom` | 底部安全区 | 列表页底部留白 |
### 2.5 长者模式机制
**原理:** `tokens.scss``.elder-mode` 选择器覆写所有 `--tk-*` 变量,`elder-mode.scss` 做结构性布局调整(触控放大、间距放大、网格降列)。
**审查要点:**
- 字号引用 `var(--tk-font-*)` → 长者模式自动放大
- 字号硬编码 px → 长者模式 **不生效**,需修复
- 触控区域 ≥ 48px正常/ ≥ 56px长者
- 体征网格 2 列 → 1 列(长者模式避免溢出)
---
## 3. 页面清单与分组
> 56 个页面按角色和功能分 7 组。优先级P0 = 核心流程必审P1 = 次要功能P2 = 低频页面。
### 3.1 患者端 — TabBar 页面P0
| # | 路由 | 页面 | 访客守卫 | 说明 |
|---|------|------|---------|------|
| 1 | `pages/index/index` | 首页 | 内置 GuestHome | 登录前轮播图+文章+登录引导;登录后体征进度+快捷操作 |
| 2 | `pages/health/index` | 健康数据 | GuestGuard 组件 | 体征录入 Tab、趋势柱状图、AI 建议卡片 |
| 3 | `pages/messages/index` | 消息 | GuestGuard 组件 | 咨询/通知分段控件、消息卡片列表 |
| 4 | `pages/profile/index` | 我的 | 内置 isGuest | 用户卡片+积分统计+分组菜单+退出登录 |
### 3.2 患者端 — 核心功能页面P0
| # | 路由 | 页面 | 说明 |
|---|------|------|------|
| 5 | `pages/consultation/index` | 咨询列表 | 发起咨询按钮+会话卡片列表 |
| 6 | `pages/consultation/detail/index` | 咨询详情 | 聊天气泡+日期分割+输入栏+长轮询 |
| 7 | `pages/appointment/index` | 预约列表 | 预约卡片+状态标签+悬浮新建按钮 |
| 8 | `pages/appointment/create/index` | 创建预约 | 多步骤表单(科室→医生→日期时间) |
| 9 | `pages/appointment/detail/index` | 预约详情 | 单个预约详情+取消操作 |
| 10 | `pages/mall/index` | 积分商城 | 积分余额卡+签到+商品网格 |
| 11 | `pages/login/index` | 登录 | 微信登录+手机绑定 |
### 3.3 患者端 — 子包功能页面P1
| # | 路由 | 页面 | 说明 |
|---|------|------|------|
| 12 | `pages/pkg-health/trend/index` | 健康趋势 | 趋势图+时间范围切换 |
| 13 | `pages/pkg-health/input/index` | 体征录入 | Zod 校验的录入表单 |
| 14 | `pages/pkg-health/daily-monitoring/index` | 日常监测 | 血压/体重/血糖/出入量录入 |
| 15 | `pages/pkg-health/alerts/index` | 健康告警 | 患者端告警列表 |
| 16 | `pages/pkg-mall/exchange/index` | 积分兑换 | 确认兑换流程 |
| 17 | `pages/pkg-mall/orders/index` | 兑换订单 | 订单列表+状态 Tab |
| 18 | `pages/pkg-mall/detail/index` | 商品详情 | 积分商品详情 |
| 19 | `pages/article/index` | 文章列表 | 文章分类筛选+列表 |
| 20 | `pages/article/detail/index` | 文章详情 | 富文本+分享 |
| 21 | `pages/events/index` | 线下活动 | 活动列表+报名 |
| 22 | `pages/device-sync/index` | 设备同步 | BLE 扫描+连接+数据同步 |
### 3.4 患者端 — 个人中心子页面P1
| # | 路由 | 页面 | 说明 |
|---|------|------|------|
| 23 | `pages/pkg-profile/health-records/index` | 健康记录 | 分页记录列表 |
| 24 | `pages/pkg-profile/reports/index` | 我的报告 | 化验报告列表 |
| 25 | `pages/pkg-profile/followups/index` | 我的随访 | 随访任务+状态 Tab |
| 26 | `pages/pkg-profile/family/index` | 就诊人管理 | 家庭成员列表+切换 |
| 27 | `pages/pkg-profile/family-add/index` | 添加就诊人 | 表单(姓名/关系/性别/生日) |
| 28 | `pages/pkg-profile/medication/index` | 用药记录 | 药物 CRUD |
| 29 | `pages/pkg-profile/diagnoses/index` | 诊断记录 | 诊断列表+类型/状态标签 |
| 30 | `pages/pkg-profile/consents/index` | 知情同意 | 同意记录列表+撤销 |
| 31 | `pages/pkg-profile/dialysis-records/index` | 透析记录 | 患者端透析记录列表 |
| 32 | `pages/pkg-profile/dialysis-records/detail/index` | 透析记录详情 | 单次透析详情 |
| 33 | `pages/pkg-profile/dialysis-prescriptions/index` | 透析处方 | 处方列表 |
| 34 | `pages/pkg-profile/dialysis-prescriptions/detail/index` | 处方详情 | 单个处方详情 |
| 35 | `pages/pkg-profile/elder-mode/index` | 长者模式 | 模式切换开关 |
| 36 | `pages/pkg-profile/settings/index` | 设置 | 清缓存+退出登录 |
| 37 | `pages/ai-report/list/index` | AI 分析列表 | 分析报告列表+状态标签 |
| 38 | `pages/ai-report/detail/index` | AI 分析详情 | 报告渲染 |
| 39 | `pages/report/detail/index` | 化验报告详情 | 指标列表+参考范围 |
| 40 | `pages/followup/detail/index` | 随访详情 | 患者端随访提交 |
### 3.5 医护端 — 工作站P0
| # | 路由 | 页面 | 角色可见 | 说明 |
|---|------|------|---------|------|
| 41 | `pages/doctor/index` | 医护工作台 | D/N/HM | 工作概览卡片+健康审核+快捷操作网格 |
| 42 | `pages/doctor/patients/index` | 患者列表 | D/N | 搜索+患者卡片+分页 |
| 43 | `pages/doctor/patients/detail/index` | 患者详情 | D/N | 患者信息+健康摘要 |
| 44 | `pages/doctor/consultation/index` | 咨询管理 | D/N | 4 个状态 Tab+会话卡片 |
| 45 | `pages/doctor/consultation/detail/index` | 咨询详情(医护) | D/N | 医护端聊天界面 |
| 46 | `pages/doctor/followup/index` | 随访管理 | D/N/HM | 5 个状态 Tab+任务列表 |
| 47 | `pages/doctor/followup/detail/index` | 随访详情(医护) | D/N | 任务详情+提交记录 |
| 48 | `pages/doctor/alerts/index` | 告警中心 | D/N/HM | 严重级别+状态 Tab |
| 49 | `pages/doctor/alerts/detail/index` | 告警详情 | D/N/HM | 单条告警+确认/解除 |
| 50 | `pages/doctor/report/index` | 化验审核 | D | 搜索+报告列表 |
| 51 | `pages/doctor/report/detail/index` | 化验详情(医护) | D | 报告详情+医生备注 |
| 52 | `pages/doctor/action-inbox/index` | 待办事项 | D/N/HM | 行动收件箱 |
### 3.6 医护端 — 透析管理P2
| # | 路由 | 页面 | 说明 |
|---|------|------|------|
| 53 | `pages/doctor/dialysis/index` | 透析记录(医护) | 透析记录列表+状态 Tab |
| 54 | `pages/doctor/dialysis/detail/index` | 透析详情(医护) | 单次透析详情 |
| 55 | `pages/doctor/dialysis/create/index` | 新建透析 | 透析参数表单 |
| 56 | `pages/doctor/prescription/index` | 透析处方(医护) | 处方列表 |
| 57 | `pages/doctor/prescription/detail/index` | 处方详情(医护) | 单个处方详情 |
| 58 | `pages/doctor/prescription/create/index` | 新建处方 | 透析器/透析液/抗凝参数 |
### 3.7 法律页面P2
| # | 路由 | 页面 | 说明 |
|---|------|------|------|
| 59 | `pages/legal/user-agreement` | 用户协议 | 静态富文本 |
| 60 | `pages/legal/privacy-policy` | 隐私政策 | 静态富文本 |
> **注意:** 实际页面数 56主包 16 + 子包 40上表含部分共享路由如 `pages/article/index` 同时服务访客和登录患者),总计 60 条目。
---
## 4. 审查方法与工具
### 4.1 审查流程(每个页面)
```
Step 1 静态代码审查 — 读 .tsx + .scss对照 §2 设计体系检查
Step 2 截图/自动化 — 通过 MCP 注入对应角色身份 → navigate → screenshot
Step 3 对照检查清单 — 逐项判定 PASS / ISSUE
Step 4 记录结果 — 按 §5 模板填入审查记录
```
### 4.2 静态代码审查要点
逐文件检查以下维度:
| 维度 | 检查项 | 怎么查 |
|------|--------|--------|
| **字号** | 是否全部使用 `var(--tk-font-*)` | Grep 硬编码 `font-size: [0-9]+px` |
| **颜色** | 是否使用 SCSS 变量 `$pri`/`$tx`/... | Grep 硬编码 `#xxxxxx`rgba 除外) |
| **圆角** | 是否使用 `$r`/`$r-sm`/... | Grep 硬编码 `border-radius: [0-9]+px` |
| **触控** | 可点击元素 min-height ≥ 48px | 检查 `&:active``onClick` 所在元素 |
| **间距** | 页面内边距是否统一 20-24px | 读 padding 值 |
| **空态** | 空列表是否有提示 UI | 搜索 `length === 0` 分支 |
| **加载态** | 是否有 Loading 组件或状态 | 搜索 `loading` / `Loading` |
| **错误态** | API 失败是否有用户友好提示 | 搜索 `catch` / `error` |
| **长者模式** | 上述字号/触控/间距是否适配 | 切换 elder-mode 验证 |
### 4.3 自动化截图流程MCP
使用 `@hms/weapp-local` MCP 工具:
```
1. connect() — 连接 DevTools
2. inject_auth({ username }) — 注入角色身份
3. evaluate('__hms.restoreAuth()') — 恢复 zustand 状态
4. reLaunch('/pages/index/index') — 跳转到目标页
5. screenshot() — 截图
6. page_data() — 获取页面文本内容
```
**角色注入参数:**
| 角色 | username | 说明 |
|------|----------|------|
| 患者 | admin | 默认注入 patient_id进入患者首页 |
| Doctor | doctor_test | 医护工作站 |
| Nurse | nurse_test | 医护工作站 |
| Health Manager | hm_test | 医护工作站 |
| 访客 | 不注入 | 直接 reLaunch 到目标页 |
### 4.4 手动验证场景
MCP 无法覆盖的场景需手动在 DevTools 中验证:
- 下拉刷新动画
- 列表无限滚动加载
- 输入框聚焦/键盘弹出
- 长者模式切换效果
- 分包页面首次加载 loading
- 图片预览、分享菜单
### 4.5 审查分组建议
按优先级分批执行:
| 批次 | 范围 | 页面数 | 预计耗时 |
|------|------|--------|---------|
| Batch 1 | §3.1 TabBar 页面 | 4 | 30 min |
| Batch 2 | §3.5 医护工作站Doctor 视角)| 12 | 60 min |
| Batch 3 | §3.2 患者端核心功能 | 7 | 45 min |
| Batch 4 | §3.3 患者端子包功能 | 11 | 60 min |
| Batch 5 | §3.4 个人中心子页面 | 18 | 90 min |
| Batch 6 | §3.6 透析管理 + §3.7 法律 | 8 | 30 min |
---
## 5. 审查记录模板
### 5.1 每页标准输出
每个页面审查后按此格式记录:
```markdown
### P{编号} {页面名称}{路由}
**角色:** {访客/患者/Doctor/Nurse/HM}
**截图:** {有/无}
**结果:** {PASS | PASS_WITH_ISSUES | NEEDS_WORK}
| 维度 | 状态 | 备注 |
|------|------|------|
| 字号 Token | ✅/❌ | {如硬编码则列出具体行} |
| 颜色变量 | ✅/❌ | |
| 圆角变量 | ✅/❌ | |
| 触控区域 | ✅/❌ | |
| 空态 | ✅/❌/N/A | |
| 加载态 | ✅/❌/N/A | |
| 错误态 | ✅/❌/N/A | |
| 长者模式 | ✅/❌ | |
| 访客守卫 | ✅/❌/N/A | |
**问题清单:**
- [ ] {问题描述}{严重级: HIGH/MEDIUM/LOW}
```
### 5.2 汇总统计模板
全部审查完成后输出汇总:
```markdown
## 审查汇总
| 分组 | 页面数 | PASS | PASS_WITH_ISSUES | NEEDS_WORK |
|------|--------|------|-----------------|------------|
| TabBar 页面 | 4 | | | |
| 患者端核心 | 7 | | | |
| 患者端子包 | 11 | | | |
| 个人中心 | 18 | | | |
| 医护工作站 | 12 | | | |
| 透析+法律 | 8 | | | |
| **合计** | **60** | | | |
**问题统计:**
- HIGH: {n} 个
- MEDIUM: {n} 个
- LOW: {n} 个
```
---
## 6. 已完成项与已知问题
### 6.1 前序验证中已修复的问题
> 来源: T30 完整业务链路验证2026-05-13
| # | 问题 | 修复文件 | 状态 |
|---|------|---------|------|
| FIX-1 | 登录后首页/个人中心名称显示"访客" | `pages/index/index.tsx``pages/profile/index.tsx` — fallback 链改为 `display_name → patient.name → username → phone后4位 → "用户"` | ✅ 已修复 |
| FIX-2 | 护士工作站快捷操作布局混乱flex → 一行挤 4-7 个按钮)| `pages/doctor/index.scss``display: flex``display: grid; grid-template-columns: repeat(4, 1fr)` | ✅ 已修复 |
| FIX-3 | 咨询页面访客无守卫,触发 401 API 调用 | `pages/consultation/index.tsx` — 添加 user 检查,未登录显示登录引导 | ✅ 已修复 |
| FIX-4 | 首屏 mount 时 zustand 状态不恢复 | `app.tsx` — 添加 `useEffect(() => { restoreAuth(); restoreUI(); }, [])` + `globalThis.__hms` bridge | ✅ 已修复(前序会话) |
### 6.2 T30 遗留问题(本审查需覆盖)
| # | 问题 | 级别 | 备注 |
|---|------|------|------|
| BUG-1 | `/health/dashboard/stats` 返回 404Doctor 角色)| MEDIUM | 可能是路由路径与测试不一致,需验证实际端点 |
| BUG-2 | `/health/offline-events` 返回 404Operator 角色)| LOW | 路由注册问题,需确认 |
| LIMIT-1 | MCP auth injection 无法触发 zustand re-render | INFO | 已通过 `__hms` bridge 修复,需重新编译验证 |
| LIMIT-2 | 分包页面通过 MCP navigateTo 导航失败 | INFO | DevTools 限制,需手动测试或 reLaunch |
### 6.3 审查执行前的准备
新会话开始审查前,需确认:
- [ ] 小程序已重新编译(`pnpm dev:weapp`),包含 FIX-1~4
- [ ] 微信开发者工具已打开并扫码登录
- [ ] MCP 连接可用(`ws://localhost:9420`
- [ ] 后端服务运行中(`localhost:3000`
- [ ] 测试用户密码均为 `Admin@2026`
### 6.4 新会话启动指令
新会话可直接使用以下 prompt 启动审查:
```
执行 T40 小程序 UI 审查。计划文档在 docs/qa/T40-miniprogram-ui-audit-plan.md
先读 §2 设计体系速查和 §3 页面清单,然后从 §3.1 TabBar 页面开始按 Batch 顺序审查。
每批完成后输出该批汇总,最后输出全量汇总。
```
---
*文档结束。开始审查后,结果将记录在 `docs/qa/role-test-results/T40-ui-audit-results.md`。*