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
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,76 +1,85 @@
# **IIT Manager Agent 螟夂ォッ莠、莠呈オ∫ィ倶ク取揀髯占ョセ隶?(V1.0)**
# **IIT Manager Agent 多端交互流程与权限设计 (V1.0)**
## **1\. 譬ク蠢<EFBFBD>ァ定牡螳壻ケ我ク守サ育ォッ遏ゥ髦?*
## **1\. 核心角色定义与终端矩阵**
系统通过“基础角色 \+ 扩展权限”模式,支持单中心与多中心项目的灵活配置。
邉サ扈滄€夊ソ<EFBFBD>€懷渕遑€隗定牡 \+ 謇ゥ螻墓揀髯絶€晄ィ。蠑擾シ梧髪謖∝黒荳ュ蠢<EFBDAD>ク主、壻クュ蠢<EFBDAD>。ケ逶ョ逧<EFBDAE><E980A7>豢サ驟咲スョ縲?
| 角色代码 | 角色名称 | 核心职责 | 主要终端 | 核心权限 |
| :---- | :---- | :---- | :---- | :---- |
| **SYS\_ADMIN** | 邉サ扈溽ョ。逅<EFBFBD><EFBFBD>?| 蟷ウ蜿ー蛻晏ァ句喧縲∝、夂ァ滓姐邂。逅<EFBDA1>€ify 遏・隸<EFBDA5>コ鍋サエ謚?| PC 遶?(Admin Portal) | 蜈ィ螻€驟咲スョ縲∬オ<EFBFBD>コ仙<EFBFBD>驟?|
| **PROJECT\_PI** | 鬘ケ逶ョ雍溯エ」莠?(PI) | 鬘ケ逶ョ霑帛コヲ逶第而縲<E8808C>㍾螟ァ蛛冗ヲサ蜀ウ遲悶€∵匱閭ス謚・陦ィ譟・逵?| 蠕ョ菫。遶?(莨∝セョ騾夂衍+蟆冗ィ句コ? | 蠖ア蟄千憾諤∵怙扈亥ョ。謇ケ縲∝ッシ蜃コ謚・陦?|
| **CRC\_OPERATOR** | 蜊剰ー<EFBFBD><EFBFBD>?(CRC) | 謨ー謐ョ蠖募<EFBFBD>縲、I 蟒コ隶ョ螟肴<E89E9F>ク縲∵ぅ閠<E38185>囂隶ソ謇ァ陦?| REDCap (蠖募<EFBFBD>) \+ PC Workbench | 雍ィ逍大、<EFBFBD>炊縲∵焚謐ョ驥<EFBFBD>寔縲∵ぅ閠<EFBFBD>コ貞<EFBFBD>?|
| **SUBJECT\_PATIENT** | 謔」閠?(蜿苓ッ戊€? | 謗・謾カ謠宣<E8ACA0>縲∝暢隸「遲皮桝縲、E/髫剰ョソ荳頑冠 | 荳ェ莠コ蠕ョ菫。 (H5/蟆冗ィ句コ? | 莉サ蜉。蜿埼ヲ医€<E58CBB>琉遲泌暢隸?|
| **SUB\_I / CO\_PI** | 蟄蝉クュ蠢<EFBFBD>エ溯エ」莠コ | 蛻<>クュ蠢<EFBDAD>焚謐ョ譟・逵九€∵悽荳ュ蠢<EFBDAD>オ∫ィ句ョ。謇ケ | 蠕ョ菫。遶?| 莉<>剞譛ャ荳ュ蠢<EFBDAD>噪謨ー謐ョ譚<EFBDAE> |
| **SYS\_ADMIN** | 系统管理员 | 平台初始化、多租户管理、Dify 知识库维护 | PC (Admin Portal) | 全局配置、资源分配 |
| **PROJECT\_PI** | 项目负责人 (PI) | 项目进度监控、重大偏离决策、智能报表查看 | 微信端 (企微通知+小程序) | 影子状态最终审批、导出报表 |
| **CRC\_OPERATOR** | 协调员 (CRC) | 数据录入、AI 建议复核、患者随访执行 | REDCap (录入) \+ PC Workbench | 质疑处理、数据采集、患者互动 |
| **SUBJECT\_PATIENT** | 患者 (受试者) | 接收提醒、咨询答疑、AE/随访上报 | 个人微信 (H5/小程序) | 任务反馈、问答咨询 |
| **SUB\_I / CO\_PI** | 子中心负责人 | 分中心数据查看、本中心流程审批 | 微信端 | 仅限本中心的数据权限 |
## **2\. 霍ィ扈育ォッ譬ク蠢<EFBFBD>コ、莠呈オ∫ィ?(User Journeys)**
## **2\. 跨终端核心交互流程 (User Journeys)**
### **2.1 智能质控与影子决策流 (核心闭环)**
隸・豬∫ィ倶ス鍋鴫莠<EFBFBD>€EDCap 蠖募<EFBFBD> \-\> AI 蜿醍鴫 \-\> Workbench 螟肴<EFBFBD> \-\> 蝗槫<EFBFBD> REDCap窶晉噪騾サ霎代€?
1. **謨ー謐ョ莠ァ逕<EFBDA7>**<EFBFBD>咾RC 蝨?**REDCap 蜴溽函逡碁擇**謠蝉コ、蜿苓ッ戊€?V1 隶ソ隗<EFBDBF>焚謐ョ縲?
2. **逶大成荳取耳逅?*<2A>哢ode.js 謗・謾カ Webhook<6F>碁ゥア蜉?**QC Agent**<>畑 Dify RAG 譽€邏?Protocol<6F>悟書邇ー騾サ霎醍泝逶セ縲?
3. **蠖ア蟄千函謌<EFBFBD>**<EFBFBD>夂ウサ扈溷惠 **Postgres (iit\_schema)** 荳ュ逕滓<E98095>€譚。迥カ諤∽クコ PROPOSED 逧<>スア蟄占ョー蠖輔€?
4. **蜊ウ譌カ謠宣<EFBFBD>**<EFBFBD>?
* **PC 遶?*<2A>咾RC 逧?Workbench 莉サ蜉。蜊。迚<EFBDA1>ョ樊慮譖エ譁ー縲?
* **蠕ョ菫。遶?*<2A>夊凶荳コ荳・驥崎ソ晁レ<E69981><EFBFBD>蜉ィ扈?PI/CRC 謗ィ騾∽シ∝セョ騾夂衍縲?
5. **螟肴<EFBFBD>ク蜀ウ遲<EFBFBD>**<EFBFBD>咾RC 逋サ蠖<EFBDBB> **PC Workbench**<EFBFBD>梧衍逵玖ッ∵紺體セ蟇ケ豈斐€?
6. **豁」蠑乗鴬陦<EFBFBD>**<EFBFBD>咾RC 轤ケ蜃サ窶懃。ョ隶、蟷カ譖エ譁ー窶晢シ檎ウサ扈溯ー<E6BAAF>畑 REDCap API 蟆<>ソョ豁」蛟シ謌冶エィ逍醍憾諤∝<E8ABA4>蝗?**REDCap**<2A>悟スア蟄占ョー蠖慕憾諤∬スャ荳?EXECUTED縲?
该流程体现了“REDCap 录入 \-\> AI 发现 \-\> Workbench 复核 \-\> 回写 REDCap”的逻辑。
1. **数据产生**CRC 在 **REDCap 原生界面**提交受试者 V1 访视数据。
2. **监听与推理**Node.js 接收 Webhook驱动 **QC Agent** 调用 Dify RAG 检索 Protocol发现逻辑矛盾。
3. **影子生成**:系统在 **Postgres (iit\_schema)** 中生成一条状态为 PROPOSED 的影子记录。
4. **即时提醒**
* **PC 端**CRC 的 Workbench 任务卡片实时更新。
* **微信端**:若为严重违背,自动给 PI/CRC 推送企微通知。
5. **复核决策**CRC 登录 **PC Workbench**,查看证据链对比。
6. **正式执行**CRC 点击“确认并更新”,系统调用 REDCap API 将修正值或质疑状态写回 **REDCap**,影子记录状态转为 EXECUTED。
### **2.2 任务驱动与患者互动流**
隸・豬∫ィ倶ス鍋鴫莠<EFBFBD>€應ササ蜉。蠑墓<EFBFBD>?\-\> 莨∝セョ隗ヲ霎セ \-\> AI 遏・隸<EFBDA5>コ灘屓螟坂€晉噪騾サ霎代€?
1. **莉サ蜉。隗ヲ蜿<EFBDA6>**<EFBFBD>壻ササ蜉。蠑墓梼譽€豬句芦謔」閠?P001 譏取律髴€蝗櫁ョソ<EFBDAE>檎憾諤∝序荳?DUE\_SOON縲?
2. **豸域<EFBFBD>謗ィ騾?*<2A>夂ウサ扈滄€夊ソ<E5A48A>**莨∽ク壼セョ菫。 API**<EFBFBD>御サ・ CRC 霄ォ莉ス蜷第ぅ閠<E38185>セョ菫。蜿鷹€∵署驢偵€?
3. **謔」閠<EFBFBD>ソス髣?*<2A>壽ぅ閠<E38185>惠蠕ョ菫。蝗槫、搾シ壺€<C280>莉雁、ゥ髴€隕∝●闕ッ蜷暦シ溪€€?
4. **AI 螟<>**<EFBFBD>?*Counseling Agent** 蝓コ莠<EFBDBA> Dify 遏・隸<EFBDA5>コ鍋函謌仙屓遲碑拷遞ソ縲?
5. **莠コ蟾・莉句<EFBFBD>**<EFBFBD>?
* 闍・荳コ邂€蜊慕ァ第勸<E7ACAC>窟gent 逶エ謗・蝗槫、阪€?
* 闍・豸牙所逕ィ闕ッ謖<EFBFBD>ッシ<EFBFBD>梧署驢<EFBFBD> CRC 蝨ィ莨∝セョ萓ァ霎ケ譬冗。ョ隶、隸・闕臥ィソ蜷主<E89CB7>蜿鷹€€?
### **2.3 PI 螳剰ァらョ。逅<EFBDA1>オ?*
该流程体现了“任务引擎 \-\> 企微触达 \-\> AI 知识库回复”的逻辑。
1. **任务触发**:任务引擎检测到患者 P001 明日需回访,状态变为 DUE\_SOON。
2. **消息推送**:系统通过**企业微信 API**,以 CRC 身份向患者微信发送提醒。
3. **患者追问**:患者在微信回复:“我今天需要停药吗?”。
4. **AI 处理****Counseling Agent** 基于 Dify 知识库生成回答草稿。
5. **人工介入**
* 若为简单科普Agent 直接回复。
* 若涉及用药指导,提醒 CRC 在企微侧边栏确认该草稿后再发送。
### **2.3 PI 宏观管理流**
1. **周期汇报****Reporting Agent** 每周生成统计报表。
2. **品牌化展示**PI 收到企微通知,点击跳转至**小程序**。
3. **多租户适配**:小程序根据项目 ID 自动加载 \[北医三院\] 等品牌元素和 Logo。
4. **移动决策**PI 在小程序内对 CRC 提交的疑难问题进行远程批示。
1. **蜻ィ譛滓ア<E6BB93>**<EFBFBD>?*Reporting Agent** 豈丞捉逕滓<E98095>扈溯ョ。謚・陦ィ縲?
2. **蜩∫煙蛹門ア慕、?*<2A>啀I 謾カ蛻ー莨∝セョ騾夂衍<E5A482>檎せ蜃サ霍ウ霓ャ閾ウ**蟆冗ィ句コ?*縲?
3. **螟夂ァ滓姐騾る<E9A8BE>**<EFBFBD>壼ー冗ィ句コ乗<EFBFBD>ケ謐ョ鬘ケ逶ョ ID 閾ェ蜉ィ蜉<EFBDA8>霓ス \[蛹怜現荳蛾劼\] 遲牙刀迚悟<E8BF9A><EFBFBD><EFBFBD> Logo縲?
4. **遘サ蜉ィ蜀ウ遲<EFBDB3>**<EFBFBD>啀I 蝨ィ蟆冗ィ句コ丞<EFBDBA>蟇ケ CRC 謠蝉コ、逧<EFBDA4>桝髫セ髣ョ鬚倩ソ幄。瑚ソ懃ィ区音遉コ縲?
## **3\. 终端功能边界划分 (Function Boundary)**
| 蜉溯<EFBFBD>讓。蝮<EFBFBD> | PC 邂。逅<EFBDA1>遭髣ィ謌?| PC Agent Workbench | 蠕ョ菫。蟆冗ィ句コ?H5 | 莨∽ク壼セョ菫。騾夂衍 |
| 功能模块 | PC 管理员门户 | PC Agent Workbench | 微信小程序/H5 | 企业微信通知 |
| :---- | :---- | :---- | :---- | :---- |
| **鬘ケ逶ョ蛻晏ァ句<EFBFBD>?* | 100% (荳贋シ<EFBFBD>譁ケ譯<EFBFBD>) | 0% | 0% | 0% |
| **项目初始化** | 100% (上传方案) | 0% | 0% | 0% |
| **字段映射配置** | 100% | 0% | 0% | 0% |
| **謨ー謐ョ雍ィ謗ァ螳。譬ク** | 0% | 100% (豺ア蠎ヲ豈泌ッケ) | 20% (邏ァ諤・遑ョ隶? | 0% (<EFBFBD><EFBFBD>蜿? |
| **数据质控审核** | 0% | 100% (深度比对) | 20% (紧急确认) | 0% (仅入口) |
| **智能采集(OCR)** | 0% | 100% | 0% | 0% |
| **霑帛コヲ/鬟朱勦謚・陦ィ** | 20% | 50% | 100% (邊セ鄒主庄隗<EFBFBD><EFBFBD>? | 10% (蜊。迚<EFBFBD>遭隕<EFBFBD>) |
| **謔」閠<EFBFBD>イ滄€夊ョー蠖?* | 0% | 100% (蠖呈。」) | 0% | 100% (螳樊慮莠、莠<EFBFBD>) |
| **进度/风险报表** | 20% | 50% | 100% (精美可视化) | 10% (卡片摘要) |
| **患者沟通记录** | 0% | 100% (归档) | 0% | 100% (实时交互) |
## **4\. <EFBFBD>剞荳主ョ牙<EFBFBD>讓。蝙?(Access Control)**
## **4\. 权限与安全模型 (Access Control)**
### **4.1 RBAC 权限设计**
邉サ扈滄㊦逕ィ窶懷粥閭ス譚<EFBFBD><EFBFBD>?\+ 謨ー謐ョ闌<EFBDAE>峩窶晏曙驥肴<E9A9A5>。鬪鯉シ<E9AF89>
系统采用“功能权限 \+ 数据范围”双重校验:
* **功能权限 (Permission)**:决定能否点击“确认回写”、“导出报表”。
* **数据范围 (Scope)**
* GLOBAL可看所有中心数据项目 PI
* SITE\_ONLY仅限本中心子中心 PI/CRC
* PATIENT\_ONLY仅限本人受试者
* **蜉溯<E89C89><EFBFBD>剞 (Permission)**<2A><EFBFBD>螳夊<E89EB3>蜷ヲ轤ケ蜃サ窶懃。ョ隶、蝗槫<E89D97>窶昴€€懷ッシ蜃コ謚・陦ィ窶昴€?
* **謨ー謐ョ闌<EFBDAE>峩 (Scope)**<2A>?
* GLOBAL<41>壼庄逵区園譛我クュ蠢<EFBDAD>焚謐ョ<E8AC90>磯。ケ逶ョ PI<50>€?
* SITE\_ONLY<4C>壻サ<E5A3BB>剞譛ャ荳ュ蠢<EFBDAD>シ亥ュ蝉クュ蠢<EFBDAD> PI/CRC<52>€?
* PATIENT\_ONLY<4C>壻サ<E5A3BB>剞譛ャ莠コ<E88EA0>亥女隸戊€<E6888A>シ峨€?
### **4.2 异构系统身份映射 (Auth Bridge)**
* **REDCap Token 謇倡ョ。**<2A>壽ッ丈ク?CRC/PI 逧<>エヲ謌キ荳句刈蟇<E58888>ュ伜お蜈?REDCap API Token縲?
* **莨∝セョ OpenID 扈大ョ<EFBFBD>**<2A>壼惠 iit\_schema.user\_mapping 荳ュ蟒コ遶?SystemUserID \<-\> WeComID <EFBFBD>丐蟆<EFBFBD>シ檎。ョ菫晄カ域<EFBFBD>邊セ蜃<EFBFBD>耳騾√€?
## **5\. 謇ゥ螻墓€ァ隶セ隶?(Future Roles)**
* **REDCap Token 托管**:每个 CRC/PI 的账户下加密存储其 REDCap API Token
* **企微 OpenID 绑定**:在 iit\_schema.user\_mapping 中建立 SystemUserID \<-\> WeComID 的映射,确保消息精准推送。
蟇ケ莠<EFBFBD> **Co-PI** 謌?**Sub-I** 遲芽ァ定牡<E5AE9A>檎ウサ扈滓髪謖∝<E8AC96>?iit\_projects.roles 陦ィ荳ュ蜉ィ諤∵キサ蜉<EFBDBB><EFBFBD>剞譬<E5899E>ュセ<EFBDAD><EFBDBE>
## **5\. 扩展性设计 (Future Roles)**
* can\_approve\_shadow\_state: 襍倶コ亥ョ。謇ケ譚<EFBDB9>€?
* can\_view\_audit\_trail: 襍倶コ亥ョ。隶。譟・逵区揀縲?
* can\_manage\_patients: 襍倶コ域ぅ閠<E38185>ョ。逅<EFBDA1>揀縲?
**迚域悽隸エ譏<EFBDB4>**<2A>啖1.0 蝓コ遑€迚?| **迥カ諤?*<2A>壼セ<E5A3BC><EFBFBD>ョ。
对于 **Co-PI****Sub-I** 等角色,系统支持在 iit\_projects.roles 表中动态添加权限标签:
* can\_approve\_shadow\_state: 赋予审批权。
* can\_view\_audit\_trail: 赋予审计查看权。
* can\_manage\_patients: 赋予患者管理权。
**版本说明**V1.0 基础版 | **状态**:待评审