docs: 多角色用户视角找茬测试报告 V2(2026-05-08)

5 角色深度测试,发现 ~55 个问题:
- CRITICAL x3: Token 身份切换、统计 API 500、权限泄漏
- HIGH x9: 操作按钮缺失、英文告警、权限越界
- MEDIUM x21: 数据矛盾、国际化、路由不一致

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
iven
2026-05-08 11:43:25 +08:00
parent c82f7bda1d
commit 297a151b0c

View File

@@ -0,0 +1,388 @@
# 多角色用户视角找茬测试报告V2
> 测试日期: 2026-05-08 | 测试人: Claude | 环境: 本地 dev
> 测试方法: 浏览器前端操作 + API 接口验证,从用户视角寻找不合理之处
## 1. 测试总览
| 角色 | 测试方式 | 发现数 |
|------|----------|--------|
| R01 Admin | 浏览器 + API | 12 |
| R02 Doctor | 浏览器 + API完整 E2E | 15 |
| R03 Nurse | 浏览器 + API + 代码分析 | 12 |
| R04 Health Manager | 浏览器 + API + 代码分析 | (含在 R03 中) |
| R05 Operator | API 权限边界 | 3 |
| **跨角色共通** | 全角色 | 8 |
| **合计** | | **~55** |
> **最严重发现**: R02 测试中发现 Token 刷新机制存在竞争条件并发登录会导致身份切换doctor 变成 nurse这是系统级安全问题。
---
## 2. CRITICAL 问题2 个)
### C1: 统计仪表盘核心 API 500 错误
- **严重程度**: CRITICAL
- **页面**: `/health/statistics` (Admin 仪表盘)
- **API**: `GET /api/v1/health/admin/statistics/dashboard` → 500
- **API**: `GET /api/v1/health/admin/statistics/consultations` → 500
- **现象**: 管理员统计仪表盘的两个核心端点返回 500 Internal Server Error
- **用户影响**: 管理员打开统计页面看到空数据或错误提示,无法掌握平台运营状况
- **根因**: 后端 `get_dashboard_stats``get_consultation_stats` 函数在查询异常时未做容错处理wiki 已记录 stats_handler 修复过类似问题,但显然未完全覆盖)
### C2: Token 刷新导致身份切换(系统级安全问题)
- **严重程度**: CRITICAL
- **页面**: 全站
- **发现者**: R02 Doctor 测试
- **现象**: 并发测试中doctor_test 的 session 突然变成 nurse_test 身份。localStorage 中的 user 显示 `nurse_test`token 的 sub 变为 nurse_test 的 UUID。导致医生角色被降级为护士权限大量页面显示"权限不足"
- **根因**: token 自动刷新逻辑在并发请求中使用了错误的 refresh_token或多个代理/标签页共享 localStorage 导致交叉污染
- **用户影响**: 用户在使用过程中突然变成另一个人的身份,严重违反安全和隐私要求
- **相关代码**: `apps/web/src/stores/auth.ts`Zustand 初始化),`apps/web/src/api/client.ts`token 刷新拦截器)
### C3: 权限边界泄漏 — 线下活动
- **严重程度**: CRITICAL
- **影响角色**: Doctor, Health Manager (不应有线下活动管理权限)
- **API**: `GET /api/v1/health/offline-events` → 200 OK应为 403
- **现象**: Doctor 和 Health Manager 通过 API 可访问线下活动列表数据
- **用户影响**: 医生/健康管理师可看到运营数据(活动列表、报名人数),违反最小权限原则
---
## 3. HIGH 问题5 个)
### H1: 操作记录显示 UUID 而非用户名
- **严重程度**: HIGH
- **页面**: 管理员工作台 (`/`)
- **现象**: "最近操作记录"显示 `019d80``019de3` 等 UUID 截断值,而非有意义的用户名
- **用户影响**: 管理员完全无法理解"谁做了什么",操作记录形同虚设
- **修复建议**: 后端返回 `username``display_name` 字段,前端展示用户名
### H2: Doctor 患者管理缺少新建按钮和操作列
- **严重程度**: HIGH
- **页面**: `/health/patients`Doctor 视角)
- **发现者**: R02 Doctor 测试
- **现象**: doctor_test 拥有 `health.patient.manage` 权限,但患者列表页完全没有"新建"按钮,每行的操作列也为空(无查看/编辑按钮)
- **用户影响**: 医生无法新建患者,也无法查看/编辑患者详情,患者管理功能形同虚设
- **根因**: Token 身份切换C2导致 permissions 变为 nurse_test 的权限集,前端据此隐藏了操作按钮
### H3: 咨询管理缺少接诊/回复按钮
- **严重程度**: HIGH
- **页面**: `/health/consultations`Doctor 视角)
- **发现者**: R02 Doctor 测试
- **现象**: 每条咨询只有"关闭"按钮,没有"接诊"、"回复"、"查看详情"等操作。医生无法进入对话界面回复患者
- **用户影响**: 医生无法回复患者咨询,只能关闭咨询,医疗工作流完全断裂
### H4: 告警标题全部使用英文
- **严重程度**: HIGH
- **页面**: 告警仪表盘 (`/health/alert-dashboard`)
- **现象**: 所有告警标题显示为英文 "BP Critical High"、"Heart Rate Abnormal"、"Blood Sugar Elevated"、"Weight Gain Alert"、"Missed Medication"
- **用户影响**: 中国医护人员可能不理解英文告警含义,危急值告警的理解延迟可能影响患者安全
- **修复建议**: 告警模板/规则使用中文标题,或在前端添加中英文映射
### H5: 告警详情无操作按钮(上一轮已报告,仍未修复)
- **严重程度**: HIGH
- **页面**: 告警仪表盘 (`/health/alert-dashboard`)
- **现象**: 点击告警后,右侧详情面板只显示标题、患者、时间,无"确认"/"处理"/"转交"按钮
- **用户影响**: 用户看到告警但无法执行任何操作,只能干看。严重影响告警闭环流程
- **修复建议**: 告警详情面板添加操作按钮,调用 alerts.manage 权限对应的状态变更 API
### H6: 仪表盘品牌/版权信息为测试值
- **严重程度**: HIGH
- **页面**: 全局侧栏 + 页脚
- **现象**:
- 侧栏品牌名: "HMS Test Brand"(应为正式品牌名)
- 页脚版权: "Test Copyright"(应为正式版权信息)
- **用户影响**: 患者或医护人员看到 "Test Brand" 会质疑系统正规性
- **修复建议**: 修改数据库中的租户品牌配置和版权设置
### H7: Operator 可访问告警 API
- **严重程度**: HIGH
- **影响角色**: Operator (运营人员)
- **API**: `GET /api/v1/health/alerts` → 200 OK应为 403
- **现象**: 运营人员无 `health.alerts.list` 权限码,但 API 层未拦截
- **用户影响**: 运营人员可查看医疗告警数据,违反业务隔离原则
### H8: 护士咨询消息发送无权限控制
- **严重程度**: HIGH
- **影响角色**: Nurse (护士)
- **发现者**: R03 Nurse 测试
- **页面**: `/health/consultations/:id` (ConsultationDetail.tsx)
- **现象**: 护士只有 `consultation.list` 权限(无 `.manage`),关闭按钮正确被隐藏。但消息输入框和发送按钮(第 380-402 行)没有权限包裹,护士可自由发送消息
- **用户影响**: 护士在咨询会话中可以发送消息,可能不是预期行为。如果设计意图是护士只读,则是权限越界
### H9: 日常监测页面权限码不匹配
- **严重程度**: HIGH
- **影响角色**: Health Manager
- **发现者**: R04 HM 测试
- **页面**: `/health/daily-monitoring`
- **现象**: 前端 routeConfig 要求 `health.device-readings.list + manage` 权限,但 HM 拥有的是 `health.daily-monitoring.list + manage`。后端 API 也注册了 `daily-monitoring` 权限码。前端路由与后端权限码不一致
- **用户影响**: 健康管理师有日常监测数据管理权限,但前端拦截为 403功能完全不可用
---
## 4. MEDIUM 问题12 个)
### M1: 系统设置 API 404
- **严重程度**: MEDIUM
- **API**: `GET /api/v1/settings` → 404
- **现象**: 系统设置页面可能无法加载后端配置数据
- **用户影响**: 管理员无法修改系统配置
### M2: 日期选择器显示英文
- **严重程度**: MEDIUM
- **页面**: 随访管理、咨询管理等多处筛选器
- **现象**: DatePicker 组件显示 "Start date" / "End date" 英文占位文本
- **用户影响**: 中英文混杂降低专业感
- **根因**: Ant Design 未配置中文 localezhCN
### M2.5: Doctor 仪表盘数据矛盾 — "本月咨询 3 未回复 12"
- **严重程度**: MEDIUM
- **页面**: `/`Doctor 仪表盘)
- **发现者**: R02 Doctor 测试
- **现象**: 卡片显示 "本月咨询 3 未回复 12",未回复数大于咨询总数,逻辑明显错误
- **用户影响**: 医生无法判断实际工作负荷
### M2.6: AI 建议统计与列表不一致
- **严重程度**: MEDIUM
- **页面**: `/`Doctor 仪表盘)
- **发现者**: R02 Doctor 测试
- **现象**: 统计卡片显示 "AI 建议待审 1",但下方列表显示"暂无待审 AI 建议"。API 验证确实有 1 条 pending
- **用户影响**: 医生看到有待审建议但找不到在哪里处理
### M2.7: AI 分析页面类型英文、患者"未知"、无新分析按钮
- **严重程度**: MEDIUM
- **页面**: `/health/ai-analysis`
- **发现者**: R02 Doctor 测试
- **现象**: 分析类型显示 "report_summary"、"trend" 等英文值;多条记录患者显示"未知"UUID 为全零;缺少"触发新分析"按钮
- **用户影响**: AI 分析结果与患者脱钩,无法主动发起分析
### M2.8: Doctor 欢迎语显示"d医生"
- **严重程度**: MEDIUM
- **页面**: `/`Doctor 仪表盘)
- **现象**: display_name 为空时,系统取用户名首字母 "d" + "医生",效果非常奇怪
- **用户影响**: 降低系统专业感
### M2.9: 登录限流过于激进
- **严重程度**: MEDIUM
- **页面**: 全站
- **现象**: 15 分钟内多次登录即触发 429 Too Many Requests
- **用户影响**: 正常使用场景下可能被意外锁定
### M3: 咨询列表缺少"查看详情"入口
- **严重程度**: MEDIUM
- **页面**: 咨询管理 (`/health/consultations`)
- **现象**: 列表中只有"关闭"按钮,无"查看对话"/"进入对话"按钮
- **用户影响**: 管理员无法从列表进入对话详情查看完整消息历史
### M3.5: 侧边栏菜单过度展示
- **严重程度**: MEDIUM
- **影响角色**: Nurse (护士)
- **发现者**: R03 Nurse 测试
- **现象**: 护士侧边栏显示"积分运营"、"内容运营"、"AI 分析"等菜单分组。菜单过滤基于子页面权限,但父级分组没有权限控制,导致大量无权菜单可见
- **用户影响**: 护士看到大量无权菜单入口,点击后进入 403 页面
### M3.6: AI 分析路由前后端不一致
- **严重程度**: MEDIUM
- **影响角色**: Health Manager
- **发现者**: R04 HM 测试
- **现象**: 前端路由 `/health/ai-analysis`,后端 AI 模块注册在 `/ai/` 前缀下。前端 API client 需要确认路径映射是否正确
- **用户影响**: 如果路径硬编码为 `/health/ai/` 则数据为空
### M3.7: 工作流页面有权限但 API 404
- **严重程度**: MEDIUM
- **影响角色**: Health Manager
- **发现者**: R04 HM 测试
- **现象**: HM 有 `workflow.list/read/start` 权限,但 `/workflow/tasks``/workflow/processes` API 返回 404
- **用户影响**: 有权限但无法使用工作流功能
### M4: 咨询类型显示原始枚举值
- **严重程度**: MEDIUM
- **页面**: 咨询管理
- **现象**: 咨询类型列显示 "online"、"phone"、"doctor" 等英文原始值,而非"在线"、"电话"、"医生咨询"
- **用户影响**: 用户不理解这些值的含义
### M5: 用户角色分布显示测试角色
- **严重程度**: MEDIUM
- **页面**: 管理员工作台
- **现象**: "用户活跃度 > 按角色分布" 显示 "E2E测试医生"、"Test Role API"、"接口测试角色" 等测试角色
- **用户影响**: 管理员看到的统计被测试数据污染,影响决策
### M6: 消息内容为空
- **严重程度**: MEDIUM
- **页面**: 消息中心
- **现象**: 消息列表中 content 字段为空,只有标题(且标题可能因编码问题显示乱码)
- **用户影响**: 用户无法从消息预览了解告警详情
### M7: 患者状态全部为"进行中/待确认"
- **严重程度**: MEDIUM
- **页面**: 患者管理 (`/health/patients`)
- **现象**: 56 个患者全部显示 "进行中" 状态和 "待确认" 认证状态
- **用户影响**: 无法区分已建档、已认证、活跃、非活跃患者,患者管理失去意义
- **修复建议**: 审查患者状态流转逻辑,确保创建后有合理的状态变更路径
### M8: 随访任务大量"逾期"且无高亮
- **严重程度**: MEDIUM
- **页面**: 随访管理 (`/health/follow-up-tasks`)
- **现象**: 34 条随访中 11 条逾期32.4%),逾期任务无红色/警示色高亮
- **用户影响**: 逾期任务不醒目,容易被忽略,影响患者随访及时性
### M9: 随访负责人大量"未分配"
- **严重程度**: MEDIUM
- **页面**: 随访管理
- **现象**: 多条随访任务的负责人显示"未分配"
- **用户影响**: 无人负责的随访任务容易被遗忘,应提醒或强制分配
### M10: 行动收件箱中英混杂
- **严重程度**: MEDIUM
- **页面**: 行动收件箱
- **现象**: 部分行动项标题为中文(如"随访提醒"),部分为英文(如"BP trending above 160/100"
- **用户影响**: 不一致的用户体验
### M11: 管理员问候语"系主任"不合理
- **严重程度**: MEDIUM
- **页面**: 管理员工作台
- **现象**: 标题显示 "早上好,系主任",但管理员角色是"系统管理员"不是"系主任"
- **根因**: `display_name` 被设置为"系主任",与角色不匹配
### M12: 患者列表部分信息缺失
- **严重程度**: MEDIUM
- **页面**: 患者管理
- **现象**: 多位患者年龄显示"--"、血型显示"-"、性别为空
- **用户影响**: 信息不完整的患者卡片降低数据可信度
---
## 5. LOW 问题12 个)
### L1: 患者来源信息不一致
- **页面**: 患者管理
- **现象**: 仅 2 位患者显示"来源: xxx",其余患者无来源信息
### L2: 随访列表日期筛选英文标签
- **页面**: 随访管理
- **现象**: 日期输入框 placeholder 为英文 "Start date" / "End date"
### L3: 咨询列表患者名"未知"
- **页面**: 咨询管理
- **现象**: 部分咨询的患者姓名显示不完整或异常(上一轮已报告)
### L4: 文章管理数据极不完整
- **页面**: 文章管理
- **现象**: 所有文章 summary、cover_image、category、author 均为 null
### L5: 个人统计数据全为零
- **页面**: 管理员统计
- **现象**: admin 的 personal-stats 全部为 0合理但不友好应提示"非医疗人员无个人统计"
### L6: WebSocket 连接状态显示"断开"
- **页面**: 告警仪表盘
- **现象**: 顶部显示"连接断开"图标,但未说明如何重连或影响什么功能
### L7: 随访完成率仅 35.3%
- **页面**: 统计
- **现象**: 34 条随访中仅 12 条完成,反映系统缺少催办机制
### L8: 测试用户混入生产数据
- **现象**: 用户列表中有 mp_e2e_1777382921、testuser01 等测试用户
### L9: 患者创建无必填校验提示
- **页面**: 患者管理
- **现象**: 创建患者时,手机号、身份证号等字段虽标记必填,但空提交后才报错
### L10: 随访状态"待确认"含义不明
- **页面**: 随访管理
- **现象**: 有 "待确认" 状态,但与 "待处理" 语义重叠,用户困惑
### L11: 积分规则 API 端点命名不一致
- **现象**: 前端 `/health/points-rules` 与后端路由不直接对应,增加维护成本
### L12: 仪表盘操作记录仅显示登录操作
- **页面**: 管理员工作台
- **现象**: 最近操作记录全部是"登录"操作,缺少患者创建、随访完成等业务操作记录
---
## 6. 跨角色共通问题汇总
| # | 问题 | 严重程度 | 影响范围 |
|---|------|----------|----------|
| 1 | 告警标题英文 | HIGH | 全角色 |
| 2 | 告警无操作按钮 | HIGH | 全角色 |
| 3 | 日期选择器英文 | MEDIUM | 全角色 |
| 4 | 测试品牌/版权 | HIGH | 全角色 |
| 5 | 线下活动权限泄漏 | CRITICAL | Doctor, HM |
| 6 | 告警 API 权限泄漏 | HIGH | Operator |
| 7 | 中英文混杂 | MEDIUM | 全角色 |
| 8 | 操作记录 UUID | HIGH | Admin |
---
## 7. 修复优先级排序
| 优先级 | 问题编号 | 描述 | 预估工作量 |
|--------|----------|------|------------|
| **P0** | C2 | Token 刷新身份切换 | Mauth store + client 修复) |
| **P0** | C1 | 统计仪表盘 API 500 | S容错处理 |
| **P0** | C3 | 线下活动权限泄漏 | S添加权限校验 |
| **P1** | H1 | 操作记录显示 UUID | S后端返回用户名 |
| **P1** | H2 | Doctor 患者管理缺按钮 | M排查 C2 导致的权限问题) |
| **P1** | H3 | 咨询缺接诊/回复按钮 | M前端添加操作入口 |
| **P1** | H4 | 告警标题英文 | S中文映射或数据修改 |
| **P1** | H5 | 告警无操作按钮 | M前端+后端配合) |
| **P1** | H6 | 测试品牌/版权 | S配置修改 |
| **P1** | H7 | Operator 告警权限泄漏 | S中间件添加权限码 |
| **P1** | H8 | 护士咨询发送无权限控制 | SAuthButton 包裹发送按钮) |
| **P1** | H9 | 日常监测权限码不匹配 | S前端 routeConfig 修正) |
| **P2** | M1-M21 | MEDIUM 问题 | 各 S |
| **P3** | L1-L14 | LOW 问题 | 各 XS |
---
## 8. 与上一轮测试对比
| 指标 | 上一轮 (2026-05-06) | 本轮 (2026-05-08) | 变化 |
|------|---------------------|-------------------|------|
| 随访筛选不生效 | FAIL | **已修复** ✓ | 筛选正常工作 |
| 告警无操作按钮 | ISSUE | **未修复** | 仍无按钮 |
| 权限边界绕过(前端) | FAIL | 未重测(代理冲突) | 待验证 |
| 新发现: Token 身份切换 | - | **新发现** | CRITICAL |
| 新发现: 统计 API 500 | - | **新发现** | CRITICAL |
| 新发现: UUID 操作记录 | - | **新发现** | HIGH |
| 新发现: 告警英文标题 | - | **新发现** | HIGH |
| 新发现: 权限 API 层泄漏 | - | **新发现** | CRITICAL+HIGH |
| 新发现: Doctor 仪表盘数据矛盾 | - | **新发现** | MEDIUM |
| 新发现: AI 建议统计不一致 | - | **新发现** | MEDIUM |
| 新发现: 患者管理缺操作按钮 | - | **新发现** | HIGH |
| 新发现: 咨询缺接诊按钮 | - | **新发现** | HIGH |