Files
hms/docs/qa/role-test-results/v2-user-perspective-audit.md
iven 297a151b0c 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>
2026-05-08 11:43:25 +08:00

17 KiB
Raw Permalink Blame History

多角色用户视角找茬测试报告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_statsget_consultation_stats 函数在查询异常时未做容错处理wiki 已记录 stats_handler 修复过类似问题,但显然未完全覆盖)

C2: Token 刷新导致身份切换(系统级安全问题)

  • 严重程度: CRITICAL
  • 页面: 全站
  • 发现者: R02 Doctor 测试
  • 现象: 并发测试中doctor_test 的 session 突然变成 nurse_test 身份。localStorage 中的 user 显示 nurse_testtoken 的 sub 变为 nurse_test 的 UUID。导致医生角色被降级为护士权限大量页面显示"权限不足"
  • 根因: token 自动刷新逻辑在并发请求中使用了错误的 refresh_token或多个代理/标签页共享 localStorage 导致交叉污染
  • 用户影响: 用户在使用过程中突然变成另一个人的身份,严重违反安全和隐私要求
  • 相关代码: apps/web/src/stores/auth.tsZustand 初始化),apps/web/src/api/client.tstoken 刷新拦截器)

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
  • 页面: 管理员工作台 (/)
  • 现象: "最近操作记录"显示 019d80019de3 等 UUID 截断值,而非有意义的用户名
  • 用户影响: 管理员完全无法理解"谁做了什么",操作记录形同虚设
  • 修复建议: 后端返回 usernamedisplay_name 字段,前端展示用户名

H2: Doctor 患者管理缺少新建按钮和操作列

  • 严重程度: HIGH
  • 页面: /health/patientsDoctor 视角)
  • 发现者: R02 Doctor 测试
  • 现象: doctor_test 拥有 health.patient.manage 权限,但患者列表页完全没有"新建"按钮,每行的操作列也为空(无查看/编辑按钮)
  • 用户影响: 医生无法新建患者,也无法查看/编辑患者详情,患者管理功能形同虚设
  • 根因: Token 身份切换C2导致 permissions 变为 nurse_test 的权限集,前端据此隐藏了操作按钮

H3: 咨询管理缺少接诊/回复按钮

  • 严重程度: HIGH
  • 页面: /health/consultationsDoctor 视角)
  • 发现者: 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