Files
AIclinicalresearch/docs/03-业务模块/ADMIN-运营管理端/06-开发记录/2026-01-16_用户管理功能与模块权限系统完成.md
HaHafeng 57fdc6ef00 feat(aia): Integrate PromptService for 10 AI agents
Features:
- Migrate 10 agent prompts from hardcoded to database
- Add grayscale preview support (DRAFT/ACTIVE distribution)
- Implement 3-tier fallback (DB -> Cache -> Hardcoded)
- Add version management and rollback capability

Files changed:
- backend/scripts/migrate-aia-prompts.ts (new migration script)
- backend/src/common/prompt/prompt.fallbacks.ts (add AIA fallbacks)
- backend/src/modules/aia/services/agentService.ts (integrate PromptService)
- backend/src/modules/aia/services/conversationService.ts (pass userId)
- backend/src/modules/aia/types/index.ts (fix AgentStage type)

Documentation:
- docs/03-业务模块/AIA-AI智能问答/06-开发记录/2026-01-18-Prompt管理系统集成.md
- docs/02-通用能力层/00-通用能力层清单.md (add FileCard, Prompt management)
- docs/00-系统总体设计/00-系统当前状态与开发指南.md (update to v3.6)

Prompt codes:
- AIA_SCIENTIFIC_QUESTION, AIA_PICO_ANALYSIS, AIA_TOPIC_EVALUATION
- AIA_OUTCOME_DESIGN, AIA_CRF_DESIGN, AIA_SAMPLE_SIZE
- AIA_PROTOCOL_WRITING, AIA_METHODOLOGY_REVIEW
- AIA_PAPER_POLISH, AIA_PAPER_TRANSLATE

Tested: Migration script executed, all 10 prompts inserted successfully
2026-01-18 15:48:53 +08:00

489 lines
14 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.
# 用户管理功能与模块权限系统完成
> **日期:** 2026-01-16
> **开发者:** AI Assistant + User
> **版本:** ADMIN v0.5
> **开发时长:** 1天
> **代码量:** ~3000 行(后端 + 前端)
---
## 📋 开发概述
本次开发完成了运营管理端的**用户管理功能**Phase 4.1),并对整个系统进行了**模块权限系统改造**(从版本系统升级为模块权限系统)。
---
## 🎯 完成功能
### 1. 用户管理功能100%
#### 数据库设计
- **新增表:** `platform_schema.user_modules`(用户模块权限表)
- **字段设计:**
- `user_id`: 用户ID
- `tenant_id`: 租户ID在哪个租户内的权限
- `module_code`: 模块代码RVW, PKB, ASL, DC, IIT, AIA, SSA, ST
- `is_enabled`: 是否启用
- **唯一约束:** `(user_id, tenant_id, module_code)`
- **关联关系:** User ← user_modules → Tenant
#### 权限系统
- **新增权限:** 4 个
- `user:view` - 查看用户
- `user:create` - 创建用户
- `user:edit` - 编辑用户
- `user:delete` - 删除用户
- **角色分配:**
- SUPER_ADMIN: 全部权限
- HOSPITAL_ADMIN / PHARMA_ADMIN: view + create + edit本租户内
- DEPARTMENT_ADMIN: view本科室内
#### 后端实现
**文件列表:**
1. `backend/src/modules/admin/types/user.types.ts` (148 行)
- 定义请求/响应类型
- 用户列表、详情、创建、更新等类型
2. `backend/src/modules/admin/services/userService.ts` (780 行)
- `listUsers()` - 列表查询(支持分页、搜索、筛选)
- `getUserById()` - 获取详情
- `createUser()` - 创建用户
- `updateUser()` - 更新用户
- `updateUserStatus()` - 启用/禁用
- `resetUserPassword()` - 重置密码
- `assignTenantToUser()` - 分配租户
- `removeTenantFromUser()` - 移除租户
- `updateUserModules()` - 更新模块权限
- `importUsers()` - 批量导入
- `getUserQueryScope()` - 数据隔离(基于角色)
3. `backend/src/modules/admin/controllers/userController.ts` (526 行)
- 处理 HTTP 请求和响应
- 参数验证和错误处理
4. `backend/src/modules/admin/routes/userRoutes.ts` (122 行)
- 13 个 API 端点
- 集成认证和权限中间件
**API 端点:**
```
GET /api/admin/users - 用户列表
GET /api/admin/users/:id - 用户详情
POST /api/admin/users - 创建用户
PUT /api/admin/users/:id - 更新用户
PUT /api/admin/users/:id/status - 更新状态
POST /api/admin/users/:id/reset-password - 重置密码
POST /api/admin/users/:id/tenants - 分配租户(仅超管)
DELETE /api/admin/users/:id/tenants/:tid - 移除租户(仅超管)
PUT /api/admin/users/:id/modules - 更新模块权限
POST /api/admin/users/import - 批量导入
GET /api/admin/users/options/tenants - 租户选项
GET /api/admin/users/options/tenants/:id/departments - 科室选项
GET /api/admin/users/options/tenants/:id/modules - 模块选项
```
#### 前端实现
**文件列表:**
1. `frontend-v2/src/modules/admin/types/user.ts` (197 行)
- TypeScript 类型定义
- 角色/租户/状态常量
2. `frontend-v2/src/modules/admin/api/userApi.ts` (130 行)
- API 调用封装
3. `frontend-v2/src/modules/admin/pages/UserListPage.tsx` (412 行)
- 用户列表页(分页、搜索、筛选)
- 操作菜单(查看、编辑、禁用、重置密码)
4. `frontend-v2/src/modules/admin/pages/UserFormPage.tsx` (341 行)
- 创建/编辑用户表单
- 租户配置
- 模块权限配置(多选框)
5. `frontend-v2/src/modules/admin/pages/UserDetailPage.tsx` (393 行)
- 用户详细信息展示
- 租户关系管理
- 模块权限查看
6. `frontend-v2/src/modules/admin/components/ImportUserModal.tsx` (302 行)
- Excel 批量导入
- 文件解析、预览、导入结果
7. `frontend-v2/src/modules/admin/components/AssignTenantModal.tsx` (169 行)
- 分配租户弹窗
- 角色选择、模块配置
8. `frontend-v2/src/modules/admin/components/ModulePermissionModal.tsx` (121 行)
- 模块权限配置弹窗
9. `frontend-v2/src/modules/admin/index.tsx` (32 行)
- 模块路由入口
**路由配置:**
```
/admin/users - 用户列表
/admin/users/create - 创建用户
/admin/users/:id - 用户详情
/admin/users/:id/edit - 编辑用户
```
---
### 2. 模块权限系统改造100%
#### 架构升级:从版本系统 → 模块权限系统
**旧系统(废弃):**
```typescript
// 基于版本等级basic/advanced/premium
requiredVersion: 'basic'
checkModulePermission(requiredVersion)
```
**新系统(启用):**
```typescript
// 基于模块代码AIA/PKB/RVW等
requiredModule: 'PKB'
hasModule(moduleCode)
```
#### 后端改造
**文件:** `backend/src/common/auth/auth.service.ts`
1. **新增方法:** `getUserModules(userId)`
- 查询用户所有租户关系
- 对每个租户,检查租户订阅的模块
- 如果用户有自定义模块权限,使用自定义权限
- 否则继承租户的全部模块权限
- 去重后返回所有可访问模块
2. **修改登录响应:**
```typescript
// 登录成功返回
{
user: {
id, phone, name, role, ...
modules: ['AIA', 'PKB', 'RVW'] // 新增
}
}
```
#### 前端改造
**1. 类型定义更新**
- `framework/auth/types.ts`
- `AuthUser` 添加 `modules: string[]`
- `AuthContextType` 添加 `hasModule(moduleCode)`
**2. AuthContext 更新**
- `framework/auth/AuthContext.tsx`
- 添加 `hasModule()` 方法
- 支持模块权限检查
**3. 导航栏改造**
- `framework/layout/TopNavigation.tsx`
- **移除旧逻辑:** 不再使用 `requiredVersion`
- **新逻辑:** 根据 `user.modules` 过滤显示
- **用户体验:** 只显示有权限的模块(干净、直观)
- **显示优化:** 用户头像下方显示"X 个模块"
**4. 路由守卫改造**
- `framework/router/RouteGuard.tsx`
- **移除旧参数:** `requiredVersion`
- **新参数:** `requiredModule` (moduleCode)
- **权限检查:** `hasModule(moduleCode)`
- **无权限UI** Ant Design Result 组件
**5. 路由配置更新**
- `App.tsx`
```typescript
<RouteGuard
requiredModule={module.moduleCode} // 新
moduleName={module.name}
>
```
---
## 🐛 问题修复
### 1. 文档编码修复(紧急修复)
**问题描述:**
- 2026-01-14 的提交导致 docs 目录下几乎所有 Markdown 文档出现乱码
- UTF-8 中文字符被截断,显示为 `<EFBFBD>?`
- 示例:`"指南" → "指<>?"`、`"团队" → "团<>?"`
**问题原因:**
- PowerShell 重定向操作未指定编码
- 使用 `git show commit:file.md > file.md` 导致编码丢失
**修复方案:**
1. 从 Git 历史恢复正常版本4ed67a8
2. 手动恢复新增的 5 个文档AIA 相关)
3. 更新 Git 提交规范 v1.2,添加 UTF-8 编码安全规则
**修复文件数:** ~100+ 个文档
### 2. 后端类型错误修复
**问题:** `pageSize` 从 HTTP 查询参数传入时是字符串Prisma 需要数字
```
take: "20" // 错误
take: 20 // 正确
```
**修复:** `userService.ts`
```typescript
const page = Number(query.page) || 1;
const pageSize = Number(query.pageSize) || 20;
```
### 3. 前端编译错误修复
**问题:** 导入路径、未使用变量、类型兼容性
**修复:** 10+ 个文件的小错误修复
### 4. 登录跳转逻辑优化
**问题:** 普通用户修改密码后跳转到 `/admin/users`,显示 403
**修复:** 智能跳转逻辑
```typescript
// 检查用户角色是否有权限访问目标页面
// 无权限时自动跳转到首页
```
---
## 📊 技术亮点
### 1. 多租户 + 多模块权限模型
**设计思路:**
```
User (用户)
├─ tenant_id (默认租户)
├─ role (系统角色SUPER_ADMIN, USER 等)
├─ tenant_members[] (多租户关系)
│ └─ role (在该租户内的角色)
└─ user_modules[] (精细化模块权限)
├─ tenant_id (在哪个租户内)
├─ module_code (模块代码)
└─ is_enabled (是否启用)
```
**权限计算逻辑:**
```
FOR 每个租户关系:
IF 用户有自定义模块权限:
使用自定义权限
ELSE:
继承租户所有已订阅模块
END
最终权限 = 所有租户权限的并集(去重)
```
### 2. 数据隔离策略
**基于角色的查询范围:**
- **SUPER_ADMIN**: 无限制,可查看所有用户
- **HOSPITAL_ADMIN / PHARMA_ADMIN**: 限制 `tenant_id = 当前租户`
- **DEPARTMENT_ADMIN**: 限制 `tenant_id = 当前租户 AND department_id = 当前科室`
**实现:** `getUserQueryScope()` 方法
### 3. 前端模块权限系统
**核心理念:**
- **极简用户体验:** 只显示有权限的模块,不显示锁定/禁用的模块
- **零认知负担:** 用户看到的就是可用的
- **性能优化:** 登录时一次性返回模块列表,无需反复查询
**实现要点:**
```typescript
// 1. 登录时获取模块列表
user.modules = ['PKB', 'RVW']
// 2. 导航栏过滤
availableModules = MODULES.filter(m => hasModule(m.moduleCode))
// 3. 路由守卫检查
<RouteGuard requiredModule="PKB">
```
### 4. 批量导入功能
**支持 Excel 导入用户:**
- 模板下载
- 文件上传和解析
- 数据预览
- 批量导入
- 错误详情展示
**字段映射:**
- 手机号、姓名(必填)
- 邮箱、角色、租户代码、科室、模块(可选)
---
## 🔧 技术难点与解决方案
### 难点 1UTF-8 编码损坏
**挑战:** 大量文档编码被破坏,无法批量恢复(会丢失新增文档)
**解决方案:**
1. 通过 Git 日志定位最后正常版本4ed67a8
2. 识别新增文档3 个)和修改文档(~100 个)
3. 用户手动备份新增文档
4. 批量恢复修改文档
5. 用户复制回新增文档
**经验教训:**
- 严禁使用 PowerShell 重定向操作 UTF-8 文件
- 提交前必须检查:`git diff --staged | Select-String "<22>"`
- 更新 Git 提交规范 v1.2
### 难点 2HTTP 查询参数类型转换
**挑战:** Fastify 不会自动转换查询参数类型
**解决方案:**
```typescript
// 显式类型转换
const page = Number(query.page) || 1;
const pageSize = Number(query.pageSize) || 20;
```
### 难点 3模块权限系统架构设计
**挑战:** 如何优雅地从版本系统迁移到模块权限系统
**解决方案:**
- 后端:登录时计算并返回 `modules` 字段
- 前端AuthContext 统一管理,提供 `hasModule()` 方法
- 导航栏:只显示有权限的模块
- 路由守卫:检查 `requiredModule` 而非 `requiredVersion`
---
## 📈 代码统计
| 类别 | 新增 | 修改 | 删除 | 合计 |
|------|------|------|------|------|
| **后端代码** | 1,580 | 150 | 0 | 1,730 |
| **前端代码** | 1,870 | 120 | 30 | 1,960 |
| **类型定义** | 345 | 0 | 0 | 345 |
| **文档** | 300 | 5 | 0 | 305 |
| **总计** | **4,095** | **275** | **30** | **4,340** |
---
## 🧪 测试情况
### 功能测试
| 测试项 | 结果 | 备注 |
|--------|------|------|
| 用户列表加载 | ✅ 通过 | 分页、搜索、筛选正常 |
| 创建用户 | ✅ 通过 | 支持模块配置 |
| 编辑用户 | ✅ 通过 | - |
| 启用/禁用用户 | ✅ 通过 | 状态切换正常 |
| 重置密码 | ✅ 通过 | 重置为默认密码 |
| 分配租户 | ✅ 通过 | 仅超管可操作 |
| 模块权限配置 | ✅ 通过 | 多选框正常 |
| 批量导入 | ✅ 通过 | Excel 解析正常 |
| 模块权限系统 | ✅ 通过 | 导航栏正确过滤 |
| 登录跳转优化 | ✅ 通过 | 无权限时跳首页 |
### 权限测试
| 角色 | 数据范围 | 测试结果 |
|------|----------|----------|
| SUPER_ADMIN | 所有用户 | ✅ 通过 |
| HOSPITAL_ADMIN | 本租户用户 | ✅ 通过 |
| PHARMA_ADMIN | 本租户用户 | ✅ 通过 |
| DEPARTMENT_ADMIN | 本科室用户 | ✅ 通过 |
| USER | 无权限 | ✅ 通过 |
---
## 📝 遗留问题
### 1. pg-boss Worker 注册时序问题
**现象:** 后端启动时偶尔报 `Queue cache is not initialized`
**影响:** 低(重启即可恢复)
**优先级:** P2
**计划:** Phase 5 优化异步初始化流程
### 2. 批量导入性能
**现象:** 导入 100+ 用户时可能超时
**影响:** 低(当前场景不常见)
**优先级:** P3
**计划:** 后续支持异步导入 + 进度显示
---
## 🎓 经验总结
### 开发规范
1. ✅ **提交前必检查:** `git diff --staged | Select-String "<22>"`
2. ✅ **PowerShell 操作文件必须指定编码:** `-Encoding UTF8`
3. ✅ **HTTP 参数类型转换:** `Number(query.page)`
4.**每日必提交:** 避免代码丢失
### 设计模式
1.**数据隔离:** 基于角色的查询范围
2.**权限分层:** 系统角色 + 租户角色 + 模块权限
3.**前端极简:** 只显示有权限的功能
4.**后端统一计算:** 登录时返回完整权限
### 架构演进
1.**平台层支撑业务层:** user_modules 表为所有业务模块提供权限基础
2.**可扩展性:** 新增模块只需添加 modules 表记录
3.**灵活性:** 支持租户级、用户级精细化配置
---
## 🔜 下一步计划
### Phase 4.2:用户管理增强(可选)
- [ ] 用户批量操作(批量禁用、批量分配租户)
- [ ] 用户操作日志audit_logs 集成)
- [ ] 用户统计分析(活跃度、模块使用率)
### Phase 5机构管理端开发
- [ ] 科室/部门管理
- [ ] 使用统计
- [ ] 审计日志
---
## 📦 交付物清单
### 代码
- ✅ 后端4 个核心文件 + 1 个种子脚本
- ✅ 前端9 个文件3 个页面 + 3 个组件 + 3 个工具)
- ✅ 数据库1 个新表 + 4 个权限
### 文档
- ✅ 本开发记录
- ✅ 运营管理端状态更新
- ✅ 系统总体状态更新
- ✅ Git 提交规范 v1.2
### 配置
- ✅ PUBLIC 租户开放 8 个模块
- ✅ 4 个角色的用户权限配置
---
## 🎉 里程碑
**ADMIN 运营管理端进度:**
- Phase 3.5 (Prompt 管理) - 83% ✅
- Phase 4.0 (租户管理) - 100% ✅
- **Phase 4.1 (用户管理) - 100% ✅ 今日完成**
**下一个里程碑:**
- Phase 5.0 (机构管理端) - 0%
---
**开发完成时间:** 2026-01-16 13:30