Files
hms/docs/discussions/2026-05-14-miniprogram-deep-analysis-brainstorm.md
iven 447126b6c5 fix(mp): 安全 P0 修复 + 架构 Hook 层补充 + 五专家组分析报告
安全修复:
- 提取 sanitizeHtml 共享工具,修复 article/detail RichText XSS 风险
- request.ts 生产环境强制 HTTPS,消除 HTTP 回退风险
- 错误信息净化:后端错误码映射为用户友好消息,不再透传原始内容
- Token 生命周期管理:利用 expires_in 记录过期时间,请求前主动刷新

工程修复:
- Babel 依赖从 dependencies 移至 devDependencies(包体积优化)

架构改进:
- 新增 usePagination hook(分页加载 + hasMore + refresh,10+ 页面可复用)
- 新增 useAuthRequired hook(登录态 + 患者档案 + 角色判断统一入口)
- 新增 usePageRefresh hook(下拉刷新统一封装,17 页面可复用)

文档:
- 五专家组深度分析+头脑风暴报告(架构7.2/安全5.5/UX6.0/工程5.5/产品7.2)
2026-05-14 20:22:29 +08:00

157 lines
8.6 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.
# HMS 小程序深度分析 + 五专家组头脑风暴
> 日期: 2026-05-14 | 参与者: 5 专家组(架构师 / 安全专家 / UX 专家 / 工程效能专家 / 产品战略专家)
## 一、综合评分矩阵
| 维度 | 评分 | 评审人 | 核心评价 |
|------|------|--------|---------|
| **架构设计** | **7.2/10 (B+)** | 架构师 | 基础设施优秀(网络层/BLE/关怀模式中间层缺失Hook 层/类型共享) |
| **安全性** | **5.5/10 (C+)** | 安全专家 | 认证框架正确,但 PHI 明文存储、XSS 风险、无远程错误追踪 |
| **UX/无障碍** | **6.0/10 (B-)** | UX 专家 | Design Token 体系优秀,但零 ARIA 标注、错误处理不一致、关怀模式仅视觉 |
| **工程效能** | **5.5/10 (C+)** | 工程专家 | 依赖精简、BLE 抽象优秀,但零 CI/CD、零 ESLint、测试覆盖 ~2% |
| **产品完整度** | **7.2/10 (B)** | 产品专家 | 患者端闭环基本完整,但 AI 能力空转、无推送、无看护者模式 |
| **综合** | **6.3/10 (B-)** | — | 技术基座扎实,产品进入「好用」跃升期,工程基础设施是最大短板 |
## 二、关键发现汇总
### 2.1 五大亮点(跨专家组共识)
| # | 亮点 | 涉及文件 | 专家评价 |
|---|------|---------|---------|
| 1 | **request.ts 网络层** | `services/request.ts` | Token 刷新去重 + 响应缓存 + 飞行中请求去重 + LRU 淘汰,"可当教材" |
| 2 | **BLE 子系统** | `services/ble/` 8 文件 | 适配器模式 + 离线缓冲 + 同步调度,"接近产品级方案" |
| 3 | **关怀模式 CSS 变量级联** | `styles/tokens.scss` + `elder-mode.scss` | 非线性缩放 + 58/58 页面 100% 覆盖,"业内罕见优雅实现" |
| 4 | **分包策略** | `app.config.ts` 10 个分包 | 边界清晰,主包 14 页,功能分包合理 |
| 5 | **长者模式触觉反馈** | `utils/elder-toast.ts` | Toast 时长延长 + 震动反馈,细节关怀到位 |
### 2.2 五大风险(按严重程度排序)
| # | 风险 | 级别 | 影响 | 涉及范围 |
|---|------|------|------|---------|
| 1 | **PHI/敏感数据明文存储** | CRITICAL | 患者姓名/手机号/Token 明文可读root 设备可提取 | `utils/secure-storage.ts` + 4 stores |
| 2 | **零 CI/CD + 零代码质量门禁** | CRITICAL | 代码质量完全依赖人工,回归风险极高 | 全项目 |
| 3 | **测试覆盖 ~2%** | HIGH | 66 个页面几乎零测试,重构无安全网 | `__tests__/` 13 文件 |
| 4 | **Hook 层缺失**124 文件仅 2 Hook | HIGH | 跨页面重复代码 ~1200 行,随功能增长恶化 | 全部 56 页面 |
| 5 | **AI 分析 4 个 SSE 端点无 UI 入口** | HIGH | 核心差异化能力空转,投入产出为零 | 后端 4 端点 + 前端无对应页面 |
### 2.3 架构师视角:应该存在的 12 个自定义 Hook
| # | Hook | 受益页面 | 消除重复 |
|---|------|---------|---------|
| 1 | `usePagination` | 10+ | 分页加载 + hasMore + loadMore |
| 2 | `useAuthRequired` | 15+ | 登录守卫 + GuestGuard |
| 3 | `usePageRefresh` | 20+ | usePullDownRefresh + stopPullDownRefresh |
| 4 | `useVitalSigns` | 4 | 体征获取/提交/阈值校验 |
| 5 | `useHealthTrend` | 3 | 趋势数据 + healthStore.getTrend |
| 6 | `useFormValidation` | 6+ | 表单验证 + 脏检查 |
| 7 | `useConsultation` | 2 | 咨询长轮询 + 自动标记已读 |
| 8 | `useBLEConnection` | 1 | BLE 扫描/连接/读取状态机 |
| 9 | `useReminder` | 1 | 首页智能提醒加载 |
| 10 | `useUnreadCount` | 3 | 未读消息计数 + 轮询 |
| 11 | `useAppNavigation` | 15+ | 条件导航 + 参数解析 |
| 12 | `useThresholdCheck` | 2 | 阈值校验 + 异常提示弹窗 |
**P0最高 ROI** `usePagination` + `useAuthRequired` + `usePageRefresh` → 一个工作日完成,减少 50% 重复代码。
### 2.4 安全专家视角6 个关键修复
| # | 修复项 | 当前 | 方案 | 优先级 |
|---|--------|------|------|--------|
| 1 | RichText XSS | `article/detail` 未净化 | 提取 `sanitizeHtml()` 为共享工具 | P0 |
| 2 | HTTPS 强制 | HTTP 回退未保护 | 编译时校验 + 生产强制 HTTPS | P0 |
| 3 | 错误信息净化 | 后端原始消息透传 | error_code 映射 + 用户友好消息 | P0 |
| 4 | Token 生命周期 | `expires_in` 从未使用 | 记录过期时间 + 主动刷新 | P1 |
| 5 | 安全存储 | 明文 `secureSet/Get` | Token 仅内存 / 微信原生加密 | P1 |
| 6 | 远程错误追踪 | 无 Sentry/BugSnag | 接入错误追踪服务 | P1 |
### 2.5 UX 专家视角Top 10 改进
| # | 改进项 | 工作量 | 影响 |
|---|--------|--------|------|
| 1 | 统一 PageState 模式usePageState hook | 3 天 | 56 页面 UX 一致性 |
| 2 | 全量 ARIA 标注 | 5 天 | 视障用户可访问 |
| 3 | 骨架屏组件 | 2 天 | 降低感知等待时间 |
| 4 | 修复 15+ 处静默错误 | 1 天 | 用户不再丢失关键反馈 |
| 5 | 类型安全路由 | 2 天 | 消除路由拼写错误 |
| 6 | 关怀模式简化导航3 大按钮) | 3 天 | 老年用户操作成功率 |
| 7 | 异常值分级告警(黄/橙/红) | 2 天 | 医疗安全关键路径 |
| 8 | 下拉刷新统一包装 | 2 天 | 交互一致性 |
| 9 | 体征录入大数字键盘 | 3 天 | 老年患者录入体验 |
| 10 | InfiniteList 统一列表组件 | 2 天 | 减少 ~300 行重复 |
### 2.6 工程效能专家视角:技术债务优先级
| 优先级 | 任务 | 工时 | 收益 |
|--------|------|------|------|
| P0 | 建立 CI/CD + ESLint + Prettier | 1 天 | 自动化质量门禁 |
| P0 | 补齐 request.ts + auth store 测试 | 3 天 | 核心认证链路回归保护 |
| P1 | Babel 依赖错放修复 | 0.1 天 | 包体积/语义正确 |
| P1 | 消除 35+ 处 `any` + 开启 noImplicitAny | 4 天 | 类型安全 |
| P2 | 创建 `services/types/` 共享类型 | 4h | 消除 4 套重复类型 |
| P2 | OpenAPI 代码生成引入 | 1 周 | 前后端类型自动同步 |
### 2.7 产品专家视角Top 10 缺失功能
| # | 功能 | ICE 分 | 说明 |
|---|------|--------|------|
| 1 | AI 分析 UI 入口 | 27 | 4 个 SSE 端点已存在,只差一个按钮 |
| 2 | 微信订阅消息推送 | 24 | 没有推送 = 没有召回能力 |
| 3 | 体征异常智能提醒 | 22 | 录入后即时判断异常 + 行动建议 |
| 4 | BLE 后台自动同步 | 20 | 手动同步是反用户体验 |
| 5 | 健康数据 PDF 导出 | 18 | 就诊时出示给医生,高频刚需 |
| 6 | 仪表盘异常患者快筛 | 17 | 医生每天第一步 |
| 7 | 告警智能分诊 + 批量操作 | 16 | 当前逐条处理效率极低 |
| 8 | 看护者模式(代操作) | 15 | 老年患者子女代为录入/查看 |
| 9 | 离线体征录入 | 14 | 网络不稳定场景 |
| 10 | 随访自动化工作流 | 13 | 术后/出院自动创建随访 |
## 三、核心结论
### 3.1 跨专家组共识
1. **技术基座扎实** — 网络层/BLE/关怀模式/分包策略是高标准实现,不需要推翻重来
2. **中间层缺失是最大架构问题** — Hook 层和类型共享层的缺失会随页面增长加速恶化
3. **安全合规是医疗产品的生死线** — PHI 明文存储 + XSS 风险 + 无远程错误追踪必须修复
4. **AI 能力空转是最大产品浪费** — 4 个 SSE 端点已建设,只差一个 UI 入口就能释放价值
5. **工程基础设施是扩大团队的瓶颈** — 无 CI/CD + 无 ESLint + 测试 ~2%5 人以上团队必出问题
### 3.2 三个月路线图
**Month 1安全加固 + 工程基础**
- P0: RichText XSS 净化、HTTPS 强制、错误信息净化
- P0: CI/CD 流水线 + ESLint + Prettier + pre-commit hook
- P1: request.ts + auth store 单元测试补齐
- P1: Token 生命周期管理 + secure-storage 加密/内存化
**Month 2架构优化 + UX 提升**
- P0: 提取 usePagination + useAuthRequired + usePageRefresh 三个高 ROI Hook
- P0: AI 分析 UI 入口上线(释放已建设能力)
- P1: 拆分 health/index.tsx (419→5 文件) + daily-monitoring (487→5 文件)
- P1: 统一 PageState 模式 + 骨架屏组件
- P1: 创建 services/types/ 共享类型
**Month 3产品深化 + 质量补齐**
- 微信订阅消息推送接入
- 体征异常即时提醒 + 分级告警
- 医护端工作台化改造
- 覆盖率提升至 50%+
- OpenAPI 代码生成引入
## 四、数据资产清单
| 指标 | 值 |
|------|-----|
| 源文件 | 124 TS/TSX + 82 SCSS |
| 页面 | 56 (13 主包 + 43 分包) |
| 组件 | 10 共享组件 |
| Service | 41 文件 (19 患者 + 8 医生 + 8 BLE + 6 核心) |
| Store | 4 Zustand (auth/ui/health/points) |
| Hook | 2 自定义 (应 12+) |
| 测试 | 13 单元 + 4 E2E (~2% 覆盖率) |
| `any` 类型 | 35+ 处 |
| 重复类型 | 4 套 (patient/doctor 各定义) |
| 大组件 (>200 行) | 7 个 (最大 487 行) |
| 静默 catch | 15+ 处 |
| ARIA 标注 | 0 处 |