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 生产部署配置
This commit is contained in:
iven
2026-05-13 23:29:42 +08:00
parent 212c08b7ae
commit df1d85bfde
78 changed files with 10345 additions and 39 deletions

View File

@@ -0,0 +1,408 @@
# 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`。*