chore: 清理 .gitignore + 添加 wiki/permissions.md

1. .gitignore: 补充临时调试文件(_*.txt/server_*.txt/tmp_*.txt 等)、
   graphify-out/、apps/mp-native/ 的忽略规则
2. wiki/permissions.md: 角色权限体系文档
This commit is contained in:
iven
2026-05-29 17:20:45 +08:00
parent aa6d93129d
commit 432c5d96f2
2 changed files with 438 additions and 0 deletions

22
.gitignore vendored
View File

@@ -82,6 +82,28 @@ tmp/
screenshots/
server-log.txt
snapshot_*.txt
_*.txt
_server_*.txt
tmp_*.txt
direct_*.txt
server_*.txt
server_combined.txt
out.txt
_wx_login.json
.claude/settings.json
# Trace/debug JSON
trace-*.json
# Graphify knowledge graph (regenerated locally)
graphify-out/
# Native miniprogram (separate project)
apps/mp-native/
# Misc untracked
err.txt
uploads/g:/hms/.superpowers/
.claude/skills/design-handoff/node_modules/
.design/config.yml
.superpowers/

416
wiki/permissions.md Normal file
View File

@@ -0,0 +1,416 @@
---
title: 角色权限体系
updated: 2026-05-22
status: active
tags: [permissions, roles, rbac, frontend, miniprogram]
---
> 2026-05-22 更新:补齐 patient 角色小程序端 manage 权限15 项),注册 `system.analytics.submit` 幽灵权限,新增 §6.4 医生端小程序权限矩阵。
# 角色权限体系
> 从 [[index]] 导航。关联: [[architecture]] [[erp-health]] [[frontend]] [[miniprogram]]
## 1. 概述
HMS 采用 **RBAC基于角色的访问控制** 模型,包含 7 个系统角色,约 141+ 权限码覆盖 auth / config / workflow / message / plugin / health / ai / copilot / dialysis / system 十大模块。
权限执行层分两端:
- **Web 管理后台**:权限码守卫(`routeConfig.ts` 声明 `permissions: [...]`),后端 handler 层 `require_permission` 强制校验
- **微信小程序**:角色码守卫(`isMedicalStaff()` / `isDoctor()` / `isNurse()` / `isHealthManager()`),患者端按角色分流
### 数据范围data_scope
| 角色 | data_scope | 说明 |
|------|-----------|------|
| admin | `all` | 全部数据 |
| viewer | `all` | 全部数据(只读) |
| doctor | `all` | 全部患者数据 |
| nurse | `all` | 全部患者数据 |
| health_manager | `all` | 全部患者数据 |
| operator | `all` | 全部数据 |
| patient | `self` | 仅本人数据 |
---
## 2. 角色定义
| 角色码 | 名称 | 定位 | 典型用户 |
|--------|------|------|----------|
| `admin` | 系统管理员 | 全部权限,系统配置与用户管理 | IT 管理员 |
| `viewer` | 查看者 | 只读权限,查看基础数据 | 上级领导、审计 |
| `doctor` | 医生 | 患者诊疗、诊断、随访、咨询、透析 | 临床医生 |
| `nurse` | 护士 | 患者护理、日常监测、体征录入、设备 | 临床护士 |
| `health_manager` | 健康管理师 | 全流程健康管理、告警规则、AI 分析 | 健康管理师 |
| `operator` | 运营人员 | 内容管理、积分、媒体、轮播图 | 运营/编辑 |
| `patient` | 患者 | 小程序自助服务(仅本人数据) | 患者端用户 |
---
## 3. 权限码总表
### 3.1 基础模块auth / config / workflow / message / plugin
| 模块 | 权限码 | 说明 |
|------|--------|------|
| **用户管理** | `user.list` `user.create` `user.read` `user.update` `user.delete` | 用户 CRUD |
| **角色管理** | `role.list` `role.create` `role.read` `role.update` `role.delete` | 角色 CRUD |
| **权限管理** | `permission.list` | 权限列表(只读) |
| **组织管理** | `organization.list` `organization.create` `organization.update` `organization.delete` | 组织架构 |
| **部门管理** | `department.list` `department.create` `department.update` `department.delete` | 部门 CRUD |
| **岗位管理** | `position.list` `position.create` `position.update` `position.delete` | 岗位 CRUD |
| **字典管理** | `dictionary.list` `dictionary.create` `dictionary.update` `dictionary.delete` | 数据字典 |
| **菜单管理** | `menu.list` `menu.update` | 菜单配置 |
| **系统设置** | `setting.read` `setting.update` `setting.delete` | 系统参数 |
| **编号规则** | `numbering.list` `numbering.create` `numbering.update` `numbering.delete` `numbering.generate` | 编号序列 |
| **主题** | `theme.read` `theme.update` | UI 主题 |
| **语言** | `language.list` `language.update` | 国际化 |
| **工作流** | `workflow.create` `workflow.list` `workflow.read` `workflow.update` `workflow.publish` `workflow.start` `workflow.approve` `workflow.delegate` | BPMN 流程 |
| **消息** | `message.list` `message.send` `message.template.list` `message.template.create` `message.template.manage` | 消息通知 |
| **插件** | `plugin.admin` `plugin.list` | WASM 插件管理 |
| **租户** | `tenant.manage` | 多租户管理 |
### 3.2 健康模块health
| 子域 | 权限码 | 说明 |
|------|--------|------|
| **患者** | `health.patient.list` `health.patient.manage` | 患者档案 |
| **健康数据** | `health.health-data.list` `health.health-data.manage` | 体征/化验 |
| **预约** | `health.appointment.list` `health.appointment.manage` | 预约排班 |
| **随访** | `health.follow-up.list` `health.follow-up.manage` | 随访任务 |
| **咨询** | `health.consultation.list` `health.consultation.manage` | 在线咨询 |
| **医生** | `health.doctor.list` `health.doctor.manage` | 医生管理 |
| **诊断** | `health.diagnosis.list` `health.diagnosis.manage` | 诊断记录 |
| **日常监测** | `health.daily-monitoring.list` `health.daily-monitoring.manage` | 每日监测 |
| **告警** | `health.alerts.list` `health.alerts.manage` | 告警列表 |
| **告警规则** | `health.alert-rules.list` `health.alert-rules.manage` | 告警规则配置 |
| **危急值** | `health.critical-alerts.list` `health.critical-alerts.manage` | 危急值告警 |
| **危急值阈值** | `health.critical-value-thresholds.list` `health.critical-value-thresholds.manage` | 阈值设置 |
| **随访模板** | `health.follow-up-templates.list` `health.follow-up-templates.manage` | 模板管理 |
| **知情同意** | `health.consent.list` `health.consent.manage` | 同意管理 |
| **用药记录** | `health.medication-records.list` `health.medication-records.manage` | 用药记录 |
| **用药提醒** | `health.medication-reminders.list` `health.medication-reminders.manage` | 提醒设置 |
| **行动收件箱** | `health.action-inbox.list` `health.action-inbox.manage` `health.action-inbox.team` | 待办任务 |
| **仪表盘** | `health.dashboard.manage` | 统计仪表盘 |
| **OAuth** | `health.oauth.list` `health.oauth.manage` | 第三方授权 |
| **关怀计划** | `health.care-plan.list` `health.care-plan.manage` | 关怀计划 |
| **排班** | `health.shifts.list` `health.shifts.manage` | 医护排班 |
| **BLE 网关** | `health.ble-gateways.list` `health.ble-gateways.manage` | 蓝牙网关 |
| **家庭代理** | `health.family-proxy.list` `health.family-proxy.manage` | 家属代管 |
| **媒体库** | `health.media.list` `health.media.manage` | 媒体文件 |
| **轮播图** | `health.banners.list` `health.banners.manage` | 首页轮播 |
| **标签** | `health.tags.list` `health.tags.manage` | 患者标签 |
| **设备** | `health.devices.list` `health.devices.manage` | 设备管理 |
| **设备读数** | `health.device-readings.list` `health.device-readings.manage` | 设备数据 |
| **透析** | `health.dialysis.list` `health.dialysis.manage` | 透析记录 |
| **透析处方** | `health.dialysis-prescription.list` `health.dialysis-prescription.manage` | 透析处方 |
| **透析统计** | `health.dialysis.stats` | 透析统计 |
| **线下活动** | `health.offline-events.list` `health.offline-events.manage` | 线下活动 |
| **文章** | `health.articles.list` `health.articles.manage` `health.articles.review` | 内容管理 |
| **积分** | `health.points.list` `health.points.manage` | 积分商城 |
| **统计** | `health.stats.list` | 健康统计 |
### 3.3 AI 模块ai
| 权限码 | 说明 |
|--------|------|
| `ai.analysis.list` `ai.analysis.manage` | AI 分析 |
| `ai.prompt.list` `ai.prompt.manage` | 提示词管理 |
| `ai.provider.manage` | AI Provider 配置 |
| `ai.suggestion.list` `ai.suggestion.manage` | AI 建议 |
| `ai.usage.list` | AI 用量统计 |
| `ai.chat.send` | AI 对话 |
| `ai.config.read` `ai.config.manage` | AI 配置 |
| `ai.knowledge.list` `ai.knowledge.manage` | 知识库 |
| `ai.admin.dashboard` `ai.admin.flags` | AI 管理后台 |
### 3.4 Copilot 模块
| 权限码 | 说明 |
|--------|------|
| `copilot.insights.list` `copilot.insights.manage` | Copilot 洞察 |
| `copilot.risk.view` | 风险查看 |
| `copilot.rules.list` `copilot.rules.manage` | Copilot 规则 |
### 3.5 透析模块dialysis
| 权限码 | 说明 |
|--------|------|
| `health.dialysis.list` `health.dialysis.manage` | 透析管理 |
| `health.dialysis-prescription.list` `health.dialysis-prescription.manage` | 透析处方 |
| `health.dialysis.stats` | 透析统计 |
---
## 4. 各角色权限矩阵
> `+` = 拥有,`-` = 不拥有。admin 拥有全部权限,不再逐一列出。
### 4.1 医生doctor
| 子域 | list | manage | 特殊 |
|------|:----:|:------:|------|
| 患者 | + | + | |
| 健康数据 | + | - | 仅查看 |
| 预约 | + | + | |
| 随访 | + | + | |
| 咨询 | + | + | |
| 医生 | + | + | |
| 诊断 | + | + | |
| 日常监测 | + | + | |
| 告警 | + | + | |
| 告警规则 | + | - | 仅查看 |
| 危急值 | + | - | 仅查看 |
| 知情同意 | + | + | |
| 随访模板 | + | + | |
| 行动收件箱 | + | + | |
| 关怀计划 | + | + | |
| 透析 | + | + | |
| 透析处方 | + | + | |
| 透析统计 | + | | |
| AI 分析 | + | - | 仅查看 |
| AI 建议 | + | - | 仅查看 |
| AI 提示词 | + | - | 仅查看 |
| AI 用量 | + | - | 仅查看 |
| 消息 | + | | |
| 工作流 | + | | `list` + `read` |
**无权访问:** 文章管理、积分、标签、媒体库、轮播图、AI 管理、设备管理、线下活动、copilot
### 4.2 护士nurse
| 子域 | list | manage | 特殊 |
|------|:----:|:------:|------|
| 患者 | + | + | |
| 健康数据 | + | - | 仅查看 |
| 预约 | + | + | |
| 随访 | + | + | |
| 咨询 | + | - | 仅查看 |
| 诊断 | + | - | 仅查看 |
| 日常监测 | + | + | |
| 告警 | + | - | 仅查看 |
| 危急值 | + | - | 仅查看 |
| 知情同意 | + | + | |
| 设备 | + | - | 仅查看 |
| 设备读数 | + | - | 仅查看 |
| 行动收件箱 | + | + | |
| 消息 | + | | |
**无权访问:** 医生管理、告警管理manage、告警规则、AI、文章、积分、标签、媒体库、轮播图、透析、copilot
### 4.3 健康管理师health_manager
| 子域 | list | manage | 特殊 |
|------|:----:|:------:|------|
| 患者 | + | + | |
| 健康数据 | + | + | |
| 医生 | + | - | 仅查看 |
| 随访 | + | + | |
| 咨询 | + | + | |
| 诊断 | + | + | |
| 日常监测 | + | + | |
| 告警 | + | + | |
| 告警规则 | + | + | |
| 危急值 | + | - | 仅查看 |
| 危急值阈值 | + | - | 仅查看 |
| 知情同意 | + | + | |
| 随访模板 | + | + | |
| 标签 | + | + | |
| 设备 | + | - | 仅查看 |
| 行动收件箱 | + | + | `team` 额外权限 |
| 仪表盘 | + | | `dashboard.manage` |
| AI 分析 | + | + | |
| AI 建议 | + | + | |
| AI 提示词 | + | - | 仅查看 |
| AI 用量 | + | - | 仅查看 |
| 消息 | + | | |
| 工作流 | + | | `list` + `read` + `start` |
**无权访问:** 预约、透析、文章、积分、媒体库、轮播图、线下活动、copilot、OAuth、关怀计划、排班
### 4.4 运营人员operator
| 子域 | list | manage | 特殊 |
|------|:----:|:------:|------|
| 患者 | + | - | 仅查看 |
| 标签 | + | + | |
| 文章 | + | + | `review` 额外权限 |
| 积分 | + | + | |
| 设备 | + | - | 仅查看 |
| 告警 | + | - | 仅查看 |
| 媒体库 | + | + | |
| 轮播图 | + | + | |
| 仪表盘 | + | | `dashboard.manage` |
| AI 用量 | + | - | 仅查看 |
| 消息 | + | | |
**无权访问:** 健康数据、预约、随访、咨询、诊断、日常监测、告警规则、危急值、知情同意、AI 分析、透析、copilot
### 4.5 患者patient
> data_scope = `self`,所有操作仅限本人数据。通过小程序访问(`m20260522_000162` 完成全量配置)。
| 子域 | list | manage | 说明 |
|------|:----:|:------:|------|
| 健康数据 | + | + | 录入体征、查看本人体征/化验 |
| 患者 | + | + | 查看/更新本人档案、绑定手机 |
| 预约 | + | + | 创建/取消本人预约 |
| 医生 | + | - | 预约时选择医生 |
| 随访 | + | + | 提交随访记录 |
| 咨询 | + | + | 创建咨询会话、发送消息 |
| 积分 | + | + | 签到、兑换商品 |
| 文章 | + | - | 阅读公开文章 |
| 告警 | + | - | 查看本人告警 |
| 日常监测 | + | + | 创建日常监测记录 |
| 设备读数 | + | + | 上传设备数据 |
| 设备 | + | - | 查看绑定设备 |
| 知情同意 | + | + | 授权/撤回本人同意 |
| 用药记录 | + | - | 查看本人用药 |
| 用药提醒 | + | + | CRUD 本人提醒 |
| 关怀计划 | + | - | 查看本人计划 |
| 行动收件箱 | + | - | 查看本人待办 |
| 透析 | + | - | 查看本人透析 |
| AI 分析 | + | - | 查看本人分析报告 |
| AI 建议 | + | - | 查看分析建议 |
| AI 对话 | + | - | `ai.chat.send` + 会话 list/manage |
| 消息 | + | - | 查看本人消息 |
| 埋点 | - | - | `system.analytics.submit`data_scope=self |
### 4.6 查看者viewer
基础模块只读权限auth / config / workflow / message / plugin 的 `list`/`read`)。无 health / AI / copilot 权限。
---
## 5. Web 前端路由权限
Web 管理后台通过 `routeConfig.ts` 声明每个路由所需权限码。用户登录后,路由守卫检查其角色是否拥有对应权限。
### 5.1 各角色可见菜单
#### admin
全部菜单可见。
#### doctor
首页、统计仪表盘、患者管理、日常监测、诊断记录、知情同意、咨询管理、随访任务、随访模板、行动收件箱、告警仪表盘、告警管理、AI 分析、AI 用量、AI 对话、消息
#### nurse
首页、统计仪表盘、患者管理、日常监测、诊断记录、知情同意、咨询管理、随访任务、行动收件箱、告警仪表盘、告警管理、消息
#### health_manager
首页、统计仪表盘、患者管理、日常监测、诊断记录、知情同意、咨询管理、标签管理、医生管理、随访任务、随访模板、行动收件箱、实时监测、告警仪表盘、告警管理、告警规则、设备管理、危急值阈值、AI 提示词、AI 分析、AI 知识库、AI 用量、AI 配置、AI 对话、消息
#### operator
首页、统计仪表盘、患者管理只读、标签管理、设备管理、告警仪表盘、告警管理只读、文章管理、积分规则、积分商品、积分订单、线下活动、媒体库、轮播图、AI 用量、消息
---
## 6. 小程序角色控制
小程序端采用**角色码**(非权限码)做前端控制,后端仍通过权限码校验 API 请求。
### 6.1 角色判断函数
```typescript
// stores/auth.ts
isMedicalStaff() roles doctor / nurse / admin / health_manager
isDoctor() roles doctor / admin
isNurse() roles nurse / admin
isHealthManager() roles health_manager / admin
hasRole(code) roles code / admin
```
### 6.2 角色与小程序页面映射
| 角色 | 可访问页面 |
|------|-----------|
| **patient** | 首页、健康、咨询、商城、我的5 TabBar+ 分包页面预约、随访、告警、积分、文章、设备、AI 对话) |
| **doctor / admin** | 首页 → 自动跳转医生端分包(`pkg-doctor-core`+ 患者管理、咨询、随访、行动收件箱 |
| **nurse** | 同 doctor但部分管理功能降级为只读 |
| **health_manager** | 同 doctor额外可管理告警规则、AI 分析 |
### 6.3 患者端patientAPI 权限
患者通过小程序访问以下 API均需 `patient` 角色且 `data_scope=self`)。完整权限配置见迁移 `m20260522_000162`
| 小程序页面 | API 路径 | 所需权限码 | 操作类型 |
|-----------|----------|-----------|---------|
| 健康总览 | `GET /health/health-data/summary` | `health.health-data.list` | 只读 |
| 体征录入 | `POST /health/health-data` | `health.health-data.manage` | 写入 |
| 健康趋势 | `GET /health/health-data/trend` | `health.health-data.list` | 只读 |
| 我的报告 | `GET /health/patients/{id}/lab-reports` | `health.health-data.list` | 只读 |
| AI 解读 | `GET /ai/analyses` | `ai.analysis.list` | 只读 |
| 健康档案 | `GET /health/health-records` | `health.health-data.list` | 只读 |
| 诊断记录 | `GET /health/diagnoses` | `health.health-data.list` | 只读 |
| 我的预约 | `GET /health/appointments` | `health.appointment.list` | 只读 |
| 创建预约 | `POST /health/appointments` | `health.appointment.manage` | 写入 |
| 医生列表 | `GET /health/doctors` | `health.doctor.list` | 只读 |
| 我的随访 | `GET /health/follow-up-tasks` | `health.follow-up.list` | 只读 |
| 提交随访 | `POST /health/follow-up-records` | `health.follow-up.manage` | 写入 |
| 在线咨询 | `POST /health/consultation-sessions` | `health.consultation.manage` | 写入 |
| 咨询消息 | `GET/POST /health/consultation-sessions/{id}/messages` | `health.consultation.list` + `manage` | 读写 |
| 告警列表 | `GET /health/alerts` | `health.alerts.list` | 只读 |
| 行动收件箱 | `GET /health/action-inbox` | `health.action-inbox.list` | 只读 |
| 设备同步 | `POST /health/device-readings` | `health.device-readings.manage` | 写入 |
| 药物提醒 | `GET/POST/PUT/DELETE /health/medication-reminders` | `health.medication-reminders.list` + `manage` | 读写 |
| 知情同意 | `POST/PUT /health/consents` | `health.consent.list` + `manage` | 读写 |
| 积分账户 | `GET /health/points/account` | `health.points.list` | 只读 |
| 积分签到 | `POST /health/points/checkin` | `health.points.manage` | 写入 |
| 积分兑换 | `POST /health/points/redeem` | `health.points.manage` | 写入 |
| 文章列表 | `GET /health/articles` | `health.articles.list` | 只读 |
| 消息通知 | `GET /messages` | `message.list` | 只读 |
| AI 对话 | `POST /ai/chat/send` | `ai.chat.send` | 写入 |
| AI 会话 | `GET/POST /ai/chat/sessions` | `ai.chat.session.list` + `manage` | 读写 |
| 埋点上报 | `POST /analytics/batch` | `system.analytics.submit` | 写入 |
| 就诊人管理 | `GET/PUT /health/patients/{id}` | `health.patient.list` + `manage` | 读写 |
| 日常监测 | `GET/POST /health/daily-monitoring` | `health.daily-monitoring.list` + `manage` | 读写 |
### 6.4 医生端小程序权限
医生/护士通过小程序医生端分包(`pkg-doctor-core`)访问以下 API。权限码与 Web 管理后台一致。
| 小程序页面 | API 路径 | 所需权限码 | 角色要求 |
|-----------|----------|-----------|---------|
| 医生首页 | `GET /health/doctor/dashboard` | `health.dashboard.manage` | doctor/nurse/hm |
| 患者管理 | `GET /health/patients` | `health.patient.list` | doctor/nurse/hm |
| 患者详情 | `GET /health/patients/{id}/health-summary` | `health.patient.list` | doctor/nurse/hm |
| 咨询列表 | `GET /health/consultation-sessions` | `health.consultation.list` | doctor/nurse/hm |
| 咨询回复 | `POST /health/consultation-sessions/{id}/messages` | `health.consultation.manage` | doctor/hm |
| 随访管理 | `GET/PUT /health/follow-up-tasks` | `health.follow-up.list` + `manage` | doctor/nurse/hm |
| 告警处理 | `POST /health/alerts/{id}/acknowledge` | `health.alerts.manage` | doctor/hm |
| 行动收件箱 | `GET /health/action-inbox` | `health.action-inbox.list` | doctor/nurse/hm |
| 团队概览 | `GET /health/action-inbox/team` | `health.action-inbox.team` | hm |
| 化验报告 | `GET /health/patients/{id}/lab-reports` | `health.health-data.list` | doctor/nurse/hm |
| 透析管理 | `GET/POST /health/dialysis-records` | `health.dialysis.list` + `manage` | doctor |
| 透析处方 | `GET/POST /health/dialysis-prescriptions` | `health.dialysis-prescription.list` + `manage` | doctor |
---
## 7. 权限配置维护
### 7.1 新增权限码流程
1. 在对应模块 `module.rs``PermissionDescriptor` 中声明权限码
2. 创建迁移文件 seed 权限到 `permissions`
3. 迁移中为需要该权限的角色添加 `role_permissions` 记录
4. 前端路由声明对应 `permissions` 数组
5. 更新本文档
### 7.2 关键迁移文件
| 迁移 | 说明 |
|------|------|
| `seed.rs` | 基础权限auth/config/workflow/message/plugin |
| `m20260506_000125` | 创建 doctor/nurse/health_manager/operator 角色及初始权限 |
| `m20260508_000131` | 权威修复:重新分配 doctor/nurse/operator 权限 |
| `m20260510_000133` | 创建 patient 角色data_scope=self18 个 .list 权限) |
| `m20260510_000137` | 媒体库/轮播图权限 + operator 补充 |
| `m20260516_000147` | AI 对话权限patient + admin |
| `m20260518_000149` | admin 全量权限修复 |
| `m20260521_000164` | 菜单体系重组 |
| `m20260522_000161` | patient 积分 manage 权限 |
| `m20260522_000162` | patient 全量小程序权限15 manage + 1 list + system.analytics.submit 注册) |
### 7.3 权限同步机制
系统启动时自动同步:模块通过 `ErpModule` trait 注册 `PermissionDescriptor``sync_module_permissions()` 将新权限码插入 `permissions`admin 角色自动获得所有新权限。