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,329 @@
# V2 审计 — 多角色专家评审
> 日期: 2026-05-04 | 方法: 5 角色专家审视,按 10 维度评分
## 一、评审概述
本报告由 5 个专家角色分别审视 HMS 系统的 20 个功能域,按统一评分框架打分。每个角色关注不同维度,最终汇总为系统级评价。
### 评审角色
| 角色 | 关注维度 | 权重 |
|------|---------|------|
| 产品经理 | D1 目标 + D3 连通 + D10 UX | 25% |
| 技术架构师 | D2 代码 + D4 数据流 + D8 性能 | 25% |
| 安全专家 | D5 安全 + D6 错误处理 | 20% |
| DevOps 工程师 | D7 日志 + D8 性能 + D9 测试 | 15% |
| 医疗领域专家 | D1 目标 + D4 数据流 + D10 UX | 15% |
### 评分方法
- 每个角色对每个功能域给出 0-100 分
- 系统总分 = 各角色加权平均
- 评级: A(90+) / B(80-89) / C(70-79) / D(60-69) / F(<60)
---
## 二、系统级总评
| 角色 | 评分 | 评级 |
|------|------|------|
| 产品经理 | 78 | C |
| 技术架构师 | 70 | C |
| 安全专家 | 65 | D |
| DevOps 工程师 | 68 | D |
| 医疗领域专家 | 75 | C |
| **加权总分** | **72** | **C** |
> V1 审计未做专家评审无法对比。72 分反映"后端完整但前端未接入、安全有漏洞、测试覆盖不足"的现状。
---
## 三、产品经理评审78/C
### 3.1 功能完整性 vs 客户需求
**已交付的核心价值链**(覆盖血透中心主要工作流):
- 透析治疗全流程预约→透析记录→KDIGO 风险评估(后端完整,前端部分接入)
- 健康监测闭环体征录入→阈值告警→SSE 推送→行动收件箱
- 患者触达:小程序体征录入/查看/咨询/随访完成
- AI 辅助决策:趋势分析 SSE + 建议系统(后端完整)
**未交付的关键体验**
- 护理计划/班次/BLE 网关/家庭代理 — 4 个模块 34 条路由完全无 UI无法交付给客户
- AI 前后对比功能 — 关怀闭环的核心价值,目前仅日志
- MP 适老化不足 — 15 处字号低于 22px 阈值,老年患者体验差
### 3.2 MVP 边界评估
| 功能 | MVP 必须 | 当前状态 | 缺口 |
|------|---------|---------|------|
| 透析全流程 | 是 | 85% | 风险评分未自动串联 |
| 健康监测 | 是 | 90% | 危急值阈值管理页缺失 |
| 告警推送 | 是 | 80% | 双路径可能重复 |
| 护理计划 | 否P1 | 50%(仅后端) | 全部前端 |
| 家庭代理 | 否P2 | 50%(仅后端) | 全部前端 |
| AI 报告 | 是 | 70% | 前后对比缺失 |
### 3.3 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F1-F6 核心医疗 | 85 | 目标清晰,三端覆盖较好 |
| F7-F8 内容/积分 | 75 | 非核心但完善 |
| F9 告警 | 80 | 功能完整UX 可优化 |
| F10 AI | 70 | 后端强,前端弱,对比缺失 |
| F11 透析 | 88 | MP 100% 覆盖,流程顺畅 |
| F12 仪表盘 | 75 | 统计维度够但展示偏简 |
| F13 行动收件箱 | 78 | SQL 注入风险影响交付 |
| F14-F17 孤立模块 | 30 | 后端完整但无法交付 |
| F18-F19 FHIR/OAuth | 55 | 基础设施,非 MVP 必需 |
| F20 日聚合 | 72 | 数据层完整,展示层不足 |
---
## 四、技术架构师评审70/C
### 4.1 架构优势
1. **模块边界清晰** — 18 crate 严格通过 EventBus + trait 通信,无跨 crate 直接依赖
2. **SeaORM Entity 统一标准** — 所有实体含 tenant_id/version/软删除/审计字段
3. **事件驱动** — 51 个事件类型outbox 模式保证可靠投递
4. **PII 加密完备** — AES-256-GCM + HMAC 盲索引,覆盖所有敏感字段
5. **服务拆分合理** — health_data_service 拆为 vital_signs/alert/daily_monitoring 等子模块
### 4.2 架构风险
| 风险 | 严重度 | 说明 |
|------|--------|------|
| SQL 注入 | **CRITICAL** | action_inbox_service.rs:272-306 format! 拼接 |
| BLE 双写无事务 | **HIGH** | vital_signs 与 device_readings 可能不一致 |
| 护理计划无事务 | **HIGH** | 三表写入无包裹,中间失败致孤立记录 |
| SSE unbounded | MEDIUM | 告警风暴时内存压力 |
| 串行处理多患者 | MEDIUM | BLE 网关 for 循环,延迟线性增长 |
| 护理计划状态无枚举 | LOW | 自由字符串可写入非法状态 |
### 4.3 微服务拆分准备度
| 维度 | 准备度 | 说明 |
|------|--------|------|
| 模块独立性 | 90% | EventBus 解耦良好 |
| 数据库拆分 | 70% | 共享 PostgreSQL需 schema 分离 |
| 认证独立 | 85% | JWT + middleware 已解耦 |
| API 网关 | 40% | 无统一网关层 |
| 服务发现 | 0% | 单体架构,未规划 |
### 4.4 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F1-F6 核心医疗 | 78 | 代码结构好,数据流有缺口 |
| F9 告警 | 72 | 双路径复杂度高 |
| F10 AI | 68 | 缓存未启用,前后对比缺失 |
| F13 行动收件箱 | 55 | SQL 注入拉低 |
| F14-F17 孤立模块 | 40 | 代码存在但架构断裂 |
| F18 FHIR | 50 | allowed_patient_ids 越权 |
| F19 OAuth | 45 | 权限缺失 + JWT fallback |
---
## 五、安全专家评审65/D
### 5.1 安全合规状态
| 检查项 | 状态 | 说明 |
|--------|------|------|
| SQL 注入防护 | **FAIL** | action_inbox_service.rs format! 拼接 patient_id/user_id |
| PII 加密 | **PASS** | AES-256-GCM8 个实体全覆盖 |
| 多租户隔离 | **PASS** | 应用层 tenant_id + PostgreSQL RLS |
| 权限码完整性 | **WARN** | 53 个 Descriptor 声明OAuth 5 端点缺失 |
| API Key 安全 | **PASS** | SHA-256 哈希 + OsRng 随机生成 |
| XSS 防护 | **PASS** | 未发现 dangerouslySetInnerHTML |
| SSE 认证 | **PASS** | JWT query param + tenant_id 验证 |
| JWT Secret | **WARN** | 硬编码 fallback "dev-secret-key" |
| FHIR 越权 | **FAIL** | allowed_patient_ids 未在查询层执行 |
| 速率限制 | **WARN** | 已建模未执行 |
### 5.2 合规风险评估
**《个人信息保护法》合规**:
- PII 加密: 合规AES-256-GCM
- 数据最小化: 基本合规(脱敏查看支持)
- 第三方数据共享: 风险FHIR allowed_patient_ids 未强制执行)
- 审计日志: 合规140+ 处审计记录)
**《健康医疗数据安全指南》合规**:
- 数据分类分级: 部分合规(加密字段覆盖全,但分类标签缺失)
- 数据出境: 不适用(私有部署)
- 应急响应: 不合规(无安全事件自动告警机制)
### 5.3 按域评分
| 域 | 分数 | 关键问题 |
|----|------|---------|
| F13 行动收件箱 | 40 | SQL 注入SEC-01 |
| F18 FHIR | 50 | allowed_patient_ids 越权SEC-03 |
| F19 OAuth | 45 | 权限缺失SEC-02+ JWT fallbackSEC-04 |
| F1-F6 核心医疗 | 85 | 权限+PII 完善 |
| F9 告警 | 75 | SSE 认证 OK无特殊风险 |
| F16 BLE 网关 | 70 | API Key 安全 OKHTTPS 需反向代理 |
---
## 六、DevOps 工程师评审68/D
### 6.1 可观测性评估
| 维度 | 状态 | 说明 |
|------|------|------|
| tracing 覆盖 | **70%** | 17 个 service 文件 116 处 tracing4/6 新增 service 零覆盖 |
| 审计日志 | **85%** | 140+ 处,覆盖所有关键操作 |
| 错误监控 | **60%** | AppError 统一响应但无外部告警Sentry/Datadog |
| 性能指标 | **30%** | 无 Prometheus/Grafana 集成 |
| 分布式追踪 | **0%** | 无 OpenTelemetry |
### 6.2 部署复杂度
| 组件 | 复杂度 | 说明 |
|------|--------|------|
| 后端服务 | 中 | 单 Axum 进程cargo run 即可 |
| 数据库 | 低 | PostgreSQL + SeaORM 自动迁移 |
| 前端 Web | 低 | Vite SPApnpm build |
| 小程序 | 中 | Taro 编译 + 微信审核 |
| 插件系统 | 高 | WASM 编译 + 热加载 |
| 基础设施 | 中 | Docker Compose 一键启动 |
### 6.3 测试覆盖评估
| 层 | 覆盖率 | 说明 |
|----|--------|------|
| 后端单元+集成 | **80%+** | 772 测试函数97.5% 通过 |
| Web 前端 | **15%** | 62 文件,但断言深度未知 |
| MP 小程序 | **0%** | 40+ 页面零测试 |
| E2E | **5%** | 仅 5 个 Playwright spec |
| 新增模块 | **0%** | care_plan/shift/ble_gateway/family_proxy 零测试 |
### 6.4 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F1-F6 核心医疗 | 72 | 后端测试好,前端弱 |
| F14-F17 新增模块 | 30 | 零测试+零日志 |
| F10 AI | 55 | 集成测试有E2E 无 |
| F18 FHIR | 25 | 零测试 |
| F19 OAuth | 30 | 零测试 |
---
## 七、医疗领域专家评审75/C
### 7.1 临床工作流合理性
**透析全流程**(核心工作流):
- 预约→透析记录→干体重/超滤量/血流量记录 → 合理
- KDIGO 风险评分 → 有价值,但未自动串联 → 效率低
- 透析间期监测(体征录入)→ 合理MP 支持好
**随访工作流**:
- 随访任务创建→分配→执行→记录 → 标准化流程,合理
- AI 建议关联随访 → 设计好,但前后对比未实现,闭环断裂
- 批量随访操作后端有但前端未调用 → 限制效率
**护理工作流**:
- 护理计划→项目→预后 → 概念正确
- 班次→交接班 → 血透中心刚需
- 但两个模块完全无 UI → 无法使用
### 7.2 FHIR 标准合规性
| R4 要求 | 状态 | 说明 |
|---------|------|------|
| 资源类型覆盖 | **60%** | Patient/Observation/Encounter/Device缺少 Condition/MedicationRequest |
| Bundle 结构 | **70%** | 缺 link 字段 |
| 搜索参数 | **50%** | 仅支持 gt/lt缺 eq/ge/le |
| $everything 操作 | **40%** | 无分页限制,血压 ID 重复 |
| OAuth2 保护 | **60%** | Client Credentials OK缺 Authorization Code |
### 7.3 患者安全评估
| 风险 | 严重度 | 说明 |
|------|--------|------|
| 告警延迟/丢失 | 中 | SSE 无背压,告警风暴可能丢失 |
| 体征数据不一致 | 高 | BLE 双写无事务,可能影响临床决策 |
| 危急值阈值管理 | 中 | 后端有阈值配置,但 Web 无管理页 |
| 适老化不足 | 中 | 15 处字号低于 22px老年患者操作困难 |
### 7.4 按域评分
| 域 | 分数 | 说明 |
|----|------|------|
| F11 透析 | 85 | 流程完整MP 覆盖好 |
| F4 预约 | 88 | 三端 100%,血透刚需 |
| F5 随访 | 82 | 流程合理,对比功能缺失 |
| F3 健康数据 | 78 | 数据完整BLE 有风险 |
| F14 护理计划 | 35 | 概念好但无法使用 |
| F18 FHIR | 40 | R4 合规不足 |
---
## 八、综合结论与 Top 5 必修项
### 8.1 各角色共识
5 个专家角色一致认同以下结构性问题:
1. **安全基础不牢** — SQL 注入 + FHIR 越权 + OAuth 权限缺失,不修复不能上线
2. **5 个模块孤立** — 后端投入产出为零34 条路由无 UI需明确交付计划
3. **测试覆盖严重不足** — MP 零测试 + 新增模块零测试,回归风险极高
4. **AI 关怀闭环断裂** — 前后对比未实现,"AI 驱动主动关怀"定位不成立
5. **可观测性缺口** — 4/6 新增 service 零 tracing生产排障困难
### 8.2 Top 5 必修项Phase 2 前必须完成)
| # | 问题 | 角色共识度 | 工作量 |
|---|------|-----------|--------|
| 1 | **C1: SQL 注入修复** — action_inbox_service.rs 参数化查询 | 5/5 | 2h |
| 2 | **C2: FHIR allowed_patient_ids 强制执行** — 查询层过滤 | 4/5 | 4h |
| 3 | **H5: OAuth handler require_permission** — 5 端点权限 | 4/5 | 1h |
| 4 | **M3: JWT Secret 移除硬编码 fallback** — 启动时校验 | 4/5 | 1h |
| 5 | **H2: AI 前后对比功能实现** — 关怀闭环核心 | 4/5 | 8h |
**总工作量: ~16h**
### 8.3 Phase 2 前置条件评估
| 条件 | 状态 | 说明 |
|------|------|------|
| P0 安全修复完成 | **未开始** | C1/C2/H5/M3 四项 |
| AI 关怀闭环通 | **未开始** | H2 前后对比 |
| 核心模块有测试 | **部分** | 后端 80%,前端/MP 不足 |
| 日志覆盖 80%+ | **未达标** | 4/6 新 service 零 tracing |
**结论**: Phase 2患者体验重构可规划但需先完成 P0 安全修复(~8h和 AI 闭环(~8h。安全基础不牢则生产部署风险不可接受。
---
## 九、专家评审按域评分汇总
| 功能域 | 产品 | 架构 | 安全 | DevOps | 医疗 | 加权均 |
|--------|------|------|------|--------|------|--------|
| F1 患者 | 85 | 78 | 85 | 72 | 80 | **81** |
| F2 医生 | 82 | 80 | 85 | 70 | 78 | **80** |
| F3 健康数据 | 80 | 75 | 85 | 68 | 78 | **78** |
| F4 预约 | 88 | 82 | 85 | 75 | 88 | **85** |
| F5 随访 | 82 | 78 | 80 | 72 | 82 | **80** |
| F6 咨询 | 85 | 80 | 85 | 72 | 80 | **81** |
| F7 内容 | 75 | 72 | 80 | 65 | 70 | **73** |
| F8 积分 | 72 | 70 | 80 | 60 | 65 | **70** |
| F9 告警 | 80 | 72 | 75 | 68 | 78 | **76** |
| F10 AI | 70 | 68 | 78 | 55 | 72 | **69** |
| F11 透析 | 88 | 78 | 80 | 75 | 85 | **82** |
| F12 仪表盘 | 75 | 72 | 78 | 65 | 70 | **73** |
| F13 行动收件箱 | 78 | 55 | 40 | 68 | 75 | **61** |
| F14 护理计划 | 30 | 40 | 78 | 30 | 35 | **41** |
| F15 班次 | 30 | 40 | 78 | 30 | 35 | **41** |
| F16 BLE 网关 | 30 | 45 | 70 | 25 | 30 | **41** |
| F17 家庭代理 | 30 | 40 | 78 | 30 | 35 | **41** |
| F18 FHIR | 55 | 50 | 50 | 25 | 40 | **46** |
| F19 OAuth | 55 | 45 | 45 | 30 | 40 | **45** |
| F20 日聚合 | 72 | 65 | 80 | 55 | 70 | **69** |