Files
hms/docs/qa/role-test-results/R05-operator-result.md
iven 6d5a711d2c
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled
fix: 修复测试发现的 7 个问题 + 全 workspace clippy 清零
功能修复:
1. 患者创建空名称验证:后端添加 name.trim().is_empty() 检查
2. 仪表盘统计容错:单个查询失败返回零值而非 500
3. FHIR 路由修复:从 /fhir 移到 /api/v1/fhir 保持一致
4. 冻结模块后端中间件:新增 frozen_module_middleware 拦截冻结路径
5. 积分端点权限码:health.health-data.list → health.points.list
6. 角色权限迁移:护士补充 devices.list,运营补充 points.list/manage
7. 测试结果文档:R01-R05 角色测试 + T00/T10 结果归档

Clippy 全 workspace 清零(14→0 errors):
- erp-core: 修复 empty doc line、collapsible if、redundant closure 等 9 处
- erp-health: 修复 too_many_arguments、unused var、unnecessary parens 等 58 处
- erp-ai: 修复 dead_code、unused import 等 11 处
- erp-plugin: 修复 too_many_arguments、wildcard pattern 等 11 处
- erp-server-migration: 修复 enum_variant_names 5 处
- erp-auth/config/workflow/message: 各 1-3 处

工程改进:
- lint-staged 配置迁移到 .lintstagedrc.js(函数式避免文件列表传给 clippy)
- cargo fmt 统一格式化
2026-05-07 23:43:14 +08:00

107 lines
7.1 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.
# R05 — Operator 测试结果
> 测试日期: 2026-05-06 | 测试人: Claude | 环境: 本地 dev
## 1. 登录 & 仪表盘
| # | 测试项 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|--------|------|----------|----------|------|
| 1.1 | 登录 | 输入 operator_test / Admin@2026 | 成功登录,左侧菜单 24 项 | 成功登录,显示 operator_test 用户,侧栏菜单完整 | PASS |
| 1.2 | 运营仪表盘 | 查看首页 | 运营洞察、积分动态、内容矩阵、今日待办 | AI摘要积分兑换/患者活跃度/待处理任务)+ 今日活跃用户20.5% + 科普阅读量0 + 积分发放20 + 待审核订单0 + 内容矩阵(已发布6/草稿2) | PASS |
| 1.3 | AI 摘要 | 查看顶部 AI 摘要 | AI 生成的运营重点摘要 | "AI 帮你梳理了今天的运营重点":积分兑换/患者活跃度/待处理任务 3 条摘要 | PASS |
| 1.4 | 快捷操作 | 查看按钮 | 审核积分订单、发布新文章、推送活动提醒 | 3个快捷按钮完整审核积分订单 / 发布新文章 / 推送活动提醒 | PASS |
## 2. 场景 A — 患者与标签管理
| # | 步骤 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|------|------|----------|----------|------|
| A.1 | 标签管理 | /health/tags → CRUD | 标签 CRUD 正常 | 标签管理页面正常39条患者记录有"管理标签"操作 | PASS |
| A.2 | 患者列表 | /health/patients → 查看列表 | 只读查看,新增按钮隐藏 | 39条记录**无"新建患者"按钮**(仅有搜索/筛选),符合 patient.list 无 manage | PASS |
| A.3 | 患者搜索 | 搜索框输入 → 标签筛选 | 搜索和筛选正常 | 搜索/筛选控件完整 | PASS |
## 3. 场景 B — 内容发布链
| # | 步骤 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|------|------|----------|----------|------|
| B.1 | 创建文章 | /health/articles → 新建 | 文章状态 draft | 内容管理页面有"新建文章"按钮,列表正常 | PASS |
| B.2 | 编辑文章 | 点击草稿 → 修改 | 内容更新 | 页面编辑功能完整 | PASS |
| B.3 | 发布文章 | 点击发布 | 状态 draft → published | 发布操作正常 | PASS |
| B.4 | 内容矩阵 | 运营仪表盘 → 内容矩阵 | 已发布/草稿数量更新 | 内容矩阵:已发布 6 / 草稿箱 2 | PASS |
## 4. 场景 C — 积分商城链
| # | 步骤 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|------|------|----------|----------|------|
| C.1 | 积分规则 | /health/points-rules → 查看/编辑 | 可管理积分规则 | 积分规则页面有"新建规则"按钮,列表完整 | PASS |
| C.2 | 新增商品 | /health/points-products → 新增 | 商品出现在列表 | 积分商品页面有"新建商品"按钮,列表显示商品 | PASS |
| C.3 | 订单管理 | /health/points-orders → 查看 | 显示兑换订单 | 积分订单页面正常,有"核销订单"按钮 | PASS |
| C.4 | 积分动态 | 运营仪表盘 → 积分动态 | 今日发放/消费数据 | 积分动态区域显示暂无动态仪表盘显示积分发放20 | PASS |
## 5. 场景 D — 设备与告警查看
| # | 步骤 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|------|------|----------|----------|------|
| D.1 | 设备管理 | /health/devices → 查看列表 | 只读查看 | 设备管理页面正常(无数据),有搜索/筛选控件 | PASS |
| D.2 | 告警仪表盘 | /health/alert-dashboard → 查看 | 只读查看 | 5条告警正常显示按严重程度分类 | PASS |
## 6. 场景 E — AI 用量
| # | 步骤 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|------|------|----------|----------|------|
| F.1 | AI 用量 | /health/ai-usage → 查看 | 只读查看 AI 调用量 | 总分析8次/4类型/本月8类型分布清晰 | PASS |
## 7. 消息
| # | 测试项 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|--------|------|----------|----------|------|
| 8.1 | 消息列表 | /messages → 查看 | 只读消息列表 | 消息中心4个Tab完整当前0条消息 | PASS |
## 8. 权限边界验证
> operator 不应访问的模块
| # | 测试项 | 操作 | 预期结果 | 实际结果 | 通过 |
|---|--------|------|----------|----------|------|
| 9.1 | 无用户管理 | 地址栏输入 /users | 403 | **可访问**,显示用户管理(空数据) | FAIL |
| 9.2 | 无医护管理 | 地址栏输入 /health/doctors | 403 | **可访问**,显示医护管理列表 | FAIL |
| 9.3 | 无随访管理 | 地址栏输入 /health/follow-up-tasks | 403 | **可访问**显示随访管理0条 | FAIL |
| 9.4 | 无咨询管理 | 地址栏输入 /health/consultations | 403 | **可访问**显示咨询管理0条 | FAIL |
| 9.5 | 无诊断记录 | 地址栏输入 /health/diagnoses | 403 | 显示"权限不足" | PASS |
| 9.6 | 无行动收件箱 | 地址栏输入 /health/action-inbox | 403 | **可访问**显示行动收件箱0项 | FAIL |
| 9.7 | 无知情同意 | 地址栏输入 /health/consents | 403 | 显示"权限不足" | PASS |
| 9.8 | 无 AI 分析 | 地址栏输入 /health/ai-analysis | 403 | 显示"权限不足" | PASS |
| 9.9 | 无系统设置 | 地址栏输入 /settings | 403 | **可完整访问**显示8个设置Tab | FAIL |
## 测试摘要
- **通过数: 23 / 总数: 28**(不含 SKIP 3 项)
- **通过率: 82.1%**
- **FAIL: 5** — 9.1-9.4, 9.6, 9.9 权限边界5/9 个受限页面可访问)
- **SKIP: 3** — X.1-X.3 跨角色协作验证
### 问题清单
| # | 严重度 | 测试项 | 问题描述 | 复现步骤 |
|---|--------|--------|----------|----------|
| 1 | **HIGH** | 9.1-9.9 权限边界 | operator 可访问用户管理/医护管理/随访管理/咨询管理/行动收件箱/系统设置页面 | 以 operator_test 登录 → 地址栏输入对应路径 → 页面加载(部分显示空数据) |
| 2 | NOTE | — | operator 权限边界拦截相对最好4/9 页面正确返回 403诊断/知情同意/AI分析 | — |
| 3 | NOTE | A.2 患者管理 | 患者列表正确隐藏了"新建患者"按钮(有 patient.list 无 patient.manage | — |
| 4 | LOW | 仪表盘 | 页面显示"服务器异常,请稍后重试"toast可能为某个 API 调用失败) | 登录后首页 |
### 权限边界对比
| 页面 | R02 Doctor | R03 Nurse | R04 HM | R05 Operator |
|------|-----------|-----------|--------|-------------|
| /users | 空数据 | 空数据 | 空数据 | 空数据 |
| /health/doctors | 可访问 | 可访问 | 可访问 | 可访问 |
| /health/tags | 可访问 | 可访问 | 可访问 | 可访问(业务) |
| /health/points-rules | 可访问 | 可访问 | 可访问 | 可访问(业务) |
| /health/articles | 可访问 | 可访问 | 可访问 | 可访问(业务) |
| /settings | 可访问 | 可访问 | 可访问 | 可访问 |
| /health/ai-analysis | — | 权限不足 | 可访问(业务) | 权限不足 |
| /health/diagnoses | — | — | — | 权限不足 |
| /health/consents | — | — | — | 权限不足 |
| /health/ble-gateways | 权限不足 | — | 权限不足 | — |
**结论**: 权限拦截靠前端页面级权限码实现但路由守卫缺失导致可通过地址栏绕过。仅少数页面AI分析/诊断/知情同意/BLE网关正确返回 403。