Files
AIclinicalresearch/docs/03-业务模块/ADMIN-运营管理端/01-需求分析/02-通用能力层_07-运营与机构管理端PRD_v2.1.md
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

210 lines
8.5 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.
# **壹证循AI平台 \- 运营与机构管理端 PRD**
文档版本: v2.1
状态: 待开发 (Ready for Dev)
优先级: P0
架构模式: 模块化单体 (Modular Monolith)
更新摘要: 新增“品牌定制”需求;定义专属登录页 URL 规范;细化租户配置字段。
## **1\. 业务背景与需求分析 (Context & Requirements)**
### **1.1 为什么要做管理端?(Why)**
目前的系统User App是一个强大的单兵作战工具但要转化为可规模化销售的 **SaaS 商业产品**,我们面临“管理真空”:
1. **无法交付 B 端**:医院买了系统,科主任无法把账号分给医生,药企买了系统,无法监控项目进度。
2. **AI 成本黑洞**:缺乏全局视角的 Token 消耗监控,单次大规模任务可能导致亏损。
3. **研发效能瓶颈**:每次调整 Prompt提示词都需要改代码、发版无法快速响应临床专家对 AI 效果的反馈。
### **1.2 差异化需求画像 (Who needs what)**
#### **A. 运营管理端 (Ops) \- "上帝视角"**
* **痛点**:不知道谁在用,不知道花了多少钱,不敢随便发新版。
* **核心诉求**
* **开户**:给医院/药企开通租户,配置模块(卖什么给谁)。
* **调优**:在不打扰用户的情况下,调试 AI Prompt。
* **风控**:监控 Token 消耗,异常熔断。
#### **B. 医院机构端 (Hospital Admin) \- "管人与管钱"**
* **痛点**:医生流动性大,科研经费分配难。
* **核心诉求**
* **品牌归属感**:登录页必须是医院自己的大楼照片和 Logo体现“本院科研平台”的专属感。
* **层级管理**:按“科室”管理医生(如心内科、肿瘤科)。
* **配额分配**:将购买的总 Token 额度分配给不同科室或个人。
#### **C. 药企机构端 (Pharma Admin) \- "管项目与合规"**
* **痛点**IIT 项目分散在多家医院,数据进度不透明,合规风险大。
* **核心诉求**
* **品牌定制**:药企 Logo 必须时刻可见,符合企业 VI 规范。
* **项目视图**:不是管人,而是管“项目”(如某抗癌药临床研究)。
* **审计合规**所有操作必须有痕迹Audit Log
## **2\. 核心架构决策 (Architecture)**
1. **模块化单体**:继续沿用 /frontend-v2 单一代码库。通过**路由懒加载**区分不同端。
2. **数据隔离**逻辑隔离tenant\_id
3. **生产环境灰度**:支持管理员/调试者在生产环境使用 Draft 版 Prompt。
4. **动态品牌渲染**:前端根据 URL 路径或租户 ID动态加载 CSS 变量和图片资源,实现“千人千面”的 UI。
## **3\. 角色与权限体系 (RBAC v2)**
**设计原则**基于租户类型Tenant Type动态衍生角色。
| 角色 Code | 归属 | 权限范围 | URL 前缀 | 核心职责 |
| :---- | :---- | :---- | :---- | :---- |
| **SUPER\_ADMIN** | 平台 | 全局数据 | /admin | 租户开通、品牌配置、Prompt 调优 |
| **HOSPITAL\_ADMIN** | 医院租户 | 本院数据 | /org/hospital | 科室管理、配额分配 |
| **PHARMA\_ADMIN** | 药企租户 | 本企项目 | /org/pharma | 项目监控、CRO 管理、审计 |
| **USER** | 任意租户 | 个人/被授权数据 | /app | 科研业务操作 |
## **4\. 品牌定制与专属登录设计 (Tenant Branding) \[v2.1 新增\]**
### **4.1 URL 策略 (URL Strategy)**
为了低成本实现专属登录页,采用 **路径前缀** 方案,而非子域名方案。
* **通用登录**https://app.yizhengxun.com/auth/login (显示壹证循默认 UI)
* **专属登录**https://app.yizhengxun.com/t/{tenant\_code}/login
* 示例:北京积水潭医院 \-\> /t/jst-hospital/login
* 示例:恒瑞医药 \-\> /t/hengrui/login
### **4.2 租户配置字段 (Tenant Config)**
在 platform\_schema.tenants 表的 config JSONB 字段中扩展以下属性:
{
"branding": {
"logoUrl": "https://oss.../jst\_logo.png", // 机构 Logo (透明背景)
"loginBackgroundUrl": "https://oss.../jst\_bldg.jpg", // 登录页背景大图
"primaryColor": "\#0056b3", // 品牌主色调 (积水潭蓝)
"welcomeTitle": "北京积水潭医院 AI 临床科研平台", // 登录页大标题
"welcomeSubTitle": "智能化 · 规范化 · 高效率" // 登录页副标题
}
}
### **4.3 交互流程 (User Flow)**
1. **访问**:用户点击医院内网链接 /t/jst-hospital/login。
2. **加载配置**:前端解析 URL 中的 jst-hospital调用公开 API /api/public/tenant-config?code=jst-hospital。
3. **渲染**
* 替换默认背景图为 loginBackgroundUrl。
* 替换 "壹证循 AI" 标题为 "北京积水潭医院..."。
* 替换登录框上方的 Logo。
4. **登录**:用户输入账号密码。
5. **进入系统**
* 跳转至 /app/dashboard。
* **关键点**:顶部导航栏 (Global Header) 左上角显示 **医院 Logo**,而非平台 Logo。
* Ant Design 主题色自动切换为医院品牌色。
## **5\. 运营管理端功能详解 (Super Admin)**
**路由:** /admin/\*
### **5.1 租户与商业化配置 (Provisioning) \[更新\]**
* **租户开通**
* **基础信息**:名称、租户代码 (Code用于 URL)。
* **类型选择**HOSPITAL | PHARMA | JOURNAL。
* **品牌配置** (新增):上传 Logo、背景图设置 Slogan。
* **模块订阅**:勾选 ASL, DC, IIT 等。
* **配置预览**:在后台可以预览该租户的登录页效果。
### **5.2 Prompt 工程化平台 (Prompt Ops)**
* **编辑器**Markdown \+ 变量高亮。
* **生产预览开关**:开启后,管理员在 /app 端操作时自动加载 Draft 版。
### **5.3 成本监控 (Cost)**
* **Token 水位**:今日消耗 vs 预算。
## **6\. 机构管理端:医院版 (Hospital Admin)**
**路由:** /org/hospital/\*
### **6.1 科室与成员管理**
* **科室树**:建立医院组织架构。
* **成员管理**:批量导入医生,关联科室。
### **6.2 经费与配额**
* **配额下发**:将总 Token 额度分配给科室。
## **7\. 机构管理端:药企版 (Pharma Admin)**
**路由:** /org/pharma/\*
### **7.1 项目管理中心**
* **项目列表**:查看本药企发起的所有 IIT/IST 项目。
* **进度监控**:接入 IIT Manager Agent 数据。
### **7.2 合规与审计**
* **操作审计**:查看数据修改痕迹。
## **8\. 统一登录与路由分发 (Unified Entry)**
### **8.1 智能路由策略**
用户登录成功后,前端根据 user.role 和 tenant.type 进行跳转:
function getRedirectPath(user, tenant) {
if (user.role \=== 'SUPER\_ADMIN') return '/admin/dashboard';
if (user.role \=== 'TENANT\_ADMIN') {
if (tenant.type \=== 'HOSPITAL') return '/org/hospital/dashboard';
if (tenant.type \=== 'PHARMA') return '/org/pharma/dashboard';
}
if (tenant.type \=== 'JOURNAL') return '/app/rvw/dashboard';
return '/app/dashboard';
}
## **9\. 技术实现规格 (Technical Specs)**
### **9.1 数据库 Schema 变更**
\-- platform\_schema.tenants
ALTER TABLE tenants
ADD COLUMN code VARCHAR(50) UNIQUE, \-- 租户代码 (如 jst-hospital)
ADD COLUMN type VARCHAR(20) NOT NULL DEFAULT 'HOSPITAL',
ADD COLUMN config JSONB DEFAULT '{}';
\-- config 包含 branding: { logoUrl, loginBackgroundUrl, ... }
\-- platform\_schema.users
ALTER TABLE users
ADD COLUMN department VARCHAR(100);
### **9.2 API 接口新增**
* GET /api/public/tenant-config?code={code}
* **权限**:无需登录 (Public)。
* **功能**:根据租户代码返回品牌配置信息(脱敏,只返回 UI 相关的)。
### **9.3 前端目录结构**
src/modules/
├── auth/
│ ├── LoginPage.tsx \# 通用登录页
│ ├── TenantLoginPage.tsx \# 动态渲染的专属登录页 (路由 /t/:code/login)
├── admin/ \# 运营管理端
├── org/ \# 机构管理端
└── ...
## **10\. 实施路线图 (Roadmap v2.1)**
* **P0 (Week 1\)**:
* DB Schema 变更(增加 Tenant Code, Config
* 实现 /api/public/tenant-config 接口。
* 开发 TenantLoginPage 组件,实现动态换肤。
* **P1 (Week 2\)**:
* 运营端增加“品牌配置”表单(上传图片到 OSS
* 实现全局 Header 根据当前用户 Tenant 自动切换 Logo。
* **P2 (Week 3\)**:
* 实现 /org/hospital 基础版。