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,11 +1,11 @@
# <EFBFBD><EFBFBD>敺桐縑瘜典<EFBFBD>銝𡡞<EFBFBD>蝵格<EFBFBD><EFBFBD>?
# 企业微信注册与配置指南
> **<EFBFBD><EFBFBD>**嚗朞繮<E69C9E><EFBFBD>銝𡁜凝靽PI<50><EFBFBD>嚗𣬚鍂鈭穉IT Manager Agent<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>霅血㨃<EFBFBD>?
> **<EFBFBD><EFBFBD>園𡢿**嚗?0<><30><EFBFBD>
> **目标**获取企业微信API凭证用于IIT Manager Agent发送质控预警卡片
> **预计时间**20分钟
---
## <EFBFBD><EFBFBD> 甇仿炊1嚗𡁏釣<F0A1818F><EFBFBD>銝𡁜凝靽∟揭<E2889F>?
## 📋 步骤1注册企业微信账号
### 1.1 访问企业微信官网
@@ -15,28 +15,28 @@
1. 点击"**立即注册**"
2. 选择"**企业**"类型
3. 憛怠<EFBFBD><EFBFBD><EFBFBD>靽⊥<EFBFBD>嚗?
- <EFBFBD><EFBFBD><EFBFBD>滨妍嚗䫤瘚贝<EFBFBD><EFBFBD>駁堺`嚗<><E59A97><EFBFBD><EFBFBD>摰鮋<E691B0><E9AE8B><EFBFBD><E7AEB8>滨妍嚗?
3. 填写企业信息:
- 企业名称:`测试医院`(或您的实际机构名称)
- 行业类型:`医疗健康`
- 企业人数:`100人以下`
- 管理员姓名:您的姓名
- 管理员手机:您的手机号(接收验证码)
4. 摰峕<EFBFBD>撉諹<EFBFBD>嚗峕釣<EFBFBD><EFBFBD><EFBFBD>?
4. 完成验证,注册成功
---
## <EFBFBD><EFBFBD> 甇仿炊2嚗𡁜<E59A97>撱箄䌊撱箏<E692B1><E7AE8F>?
## 📋 步骤2创建自建应用
### 2.1 登录管理后台
1. 访问https://work.weixin.qq.com/wework_admin/loginpage_wx
2. 雿輻鍂隡<EFBFBD><EFBFBD>敺桐縑APP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧢲㦤銝𠹺<EFBFBD>頧賭<EFBFBD>銝𡁜凝靽PP嚗?
2. 使用企业微信APP扫码登录需先在手机上下载企业微信APP
### 2.2 创建应用
1. 餈𥕦<EFBFBD>**<2A>𣂼<EFBFBD><F0A382BC>函恣<E587BD><E681A3><EFBFBD>?* <20>?**<2A>鞱䌊撱箝<E692B1>?* <20>?**<2A>𣂼<EFBFBD>撱箏<E692B1><E7AE8F><EFBFBD>?*
1. 进入**【应用管理】** → **【自建】** → **【创建应用】**
2. 憛怠<EFBFBD>摨𠉛鍂靽⊥<EFBFBD>嚗?
2. 填写应用信息:
- **应用名称**`IIT Manager Agent测试`
- **应用Logo**:上传一个图标(可暂时使用默认)
- **应用介绍**`IIT研究智能质控助手 - 数据质量实时监控`
@@ -44,19 +44,19 @@
3. 点击"**创建应用**"
### 2.3 <EFBFBD><EFBFBD>API<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
### 2.3 获取API凭证重要
<EFBFBD>𥕦遣<EFBFBD>𣂼<EFBFBD><EFBFBD>𠬍<EFBFBD><EFBFBD><EFBFBD><EFBFBD>刻祕<EFBFBD><EFBFBD><EFBFBD>臭誑<EFBFBD><EFBFBD>嚗?
创建成功后,在应用详情页可以看到:
```
企业IDCorpID ww1234567890abcdef
AgentID嚗? 1000002
Secret嚗? <EFBFBD>孵稬"<22><EFBFBD>"<22>厰僼<E58EB0><EFBFBD>
AgentID 1000002
Secret 点击"查看"按钮查看
```
**<EFBFBD>𩤃<EFBFBD> <20><EFBFBD><E6BBA9>鞟內**嚗?
**⚠️ 重要提示**
- **Secret** 只显示一次,请立即复制保存!
- <EFBFBD><EFBFBD>敹䁅扇Secret嚗屸<EFBFBD><EFBFBD><EFBFBD>蝵殷<EFBFBD>隡𡁜紡<EFBFBD>湔唂Secret憭望<EFBFBD>嚗?
- 如果忘记Secret需要重置会导致旧Secret失效)
---
@@ -64,10 +64,10 @@ Secret
### 3.1 设置网页授权及JS-SDK
1. <EFBFBD><EFBFBD><EFBFBD>刻祕<EFBFBD><EFBFBD>△嚗峕𪄳<EFBFBD>?**蝵煾△<E785BE><E296B3><EFBFBD><EFBFBD>S-SDK**"
2. 霈曄蔭**<2A>臭縑<E887AD><EFBFBD>**嚗?
1. 在应用详情页,找到"**网页授权及JS-SDK**"
2. 设置**可信域名**
- 开发环境:`localhost`(如果支持)
- <EFBFBD>煺漣<EFBFBD><EFBFBD>嚗𡁏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憒?`iit.example.com`嚗?
- 生产环境:您的实际域名(如 `iit.example.com`
### 3.2 设置接收消息
@@ -77,13 +77,13 @@ Secret
### 3.3 设置权限范围
确保应用有以下权限:
- <EFBFBD>?**<2A><EFBFBD><E785BE><EFBFBD><EFBFBD><EFBFBD>敺桐縑** - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD>?**<2A>𣂼<EFBFBD>靽⊥<E99DBD>霂餃<E99C82>** - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OpenID
- <EFBFBD>?**<2A>朞悖敶閧恣<E996A7>?* - <20><EFBFBD><E585B6><EFBFBD><E586BD><EFBFBD>
- **发送消息到微信** - 核心功能
- **成员信息读取** - 用于获取用户OpenID
- **通讯录管理** - 用于用户映射
---
## <EFBFBD><EFBFBD> 甇仿炊4嚗𡁻<E59A97>蝵桀<E89DB5>憿寧𤌍銝?
## 📋 步骤4配置到项目中
### 4.1 复制凭证
@@ -95,7 +95,7 @@ AgentID: 1000002
Secret: abc123xyz789_your_secret_here
```
### 4.2 瘛餃<EFBFBD><EFBFBD>?.env <EFBFBD><EFBFBD>
### 4.2 添加到 .env 文件
编辑 `AIclinicalresearch/backend/.env`,添加:
@@ -106,9 +106,9 @@ WECHAT_CORP_SECRET=abc123xyz789_your_secret_here
WECHAT_AGENT_ID=1000002
```
**<EFBFBD>𩤃<EFBFBD> 瘜冽<E7989C>**嚗?
- 銝滩<EFBFBD><EFBFBD>𣂷漱 `.env` <EFBFBD><EFBFBD><EFBFBD>蚣it嚗<EFBFBD><EFBFBD>?`.gitignore` 銝哨<EFBFBD>
- <EFBFBD>煺漣<EFBFBD><EFBFBD>雿輻鍂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝𡁜凝靽<EFBFBD><EFBFBD>?
**⚠️ 注意**
- 不要提交 `.env` 文件到Git已在 `.gitignore` 中)
- 生产环境使用独立的企业微信应用
---
@@ -116,18 +116,18 @@ WECHAT_AGENT_ID=1000002
### 5.1 重启后端服务
靽嘥<EFBFBD> `.env` <EFBFBD>𠬍<EFBFBD><EFBFBD>滚鍳<EFBFBD>𡒊垢嚗?
保存 `.env` 后,重启后端:
```bash
# <EFBFBD>𨀣迫敶枏<EFBFBD><EFBFBD>滚𦛚嚗㇃trl+C嚗?
# 停止当前服务Ctrl+C
# 重新启动
cd D:\MyCursor\AIclinicalresearch\backend
npm run dev
```
### 5.2 <EFBFBD>见𢆡瘚贝<EFBFBD><EFBFBD><EFBFBD>ostman<EFBFBD>url嚗?
### 5.2 手动测试使用Postman或curl
**瘚贝<EFBFBD>蝡舐<EFBFBD>**嚗<><E59A97>蝏胖ay 5隡𡁜<E99AA1>撱綽<E692B1>嚗?
**测试端点**后续Day 5会创建
```bash
POST http://localhost:3001/api/v1/iit/test/wechat-push
@@ -136,73 +136,73 @@ Content-Type: application/json
{
"toUser": "YourUserID",
"title": "测试通知",
"description": "餈蹱糓銝<EFBFBD><EFBFBD>⊥䔉<EFBFBD>IT Manager<EFBFBD><EFBFBD><EFBFBD>霂閙<EFBFBD><EFBFBD>?,
"description": "这是一条来自IIT Manager的测试消息",
"url": "http://localhost:5173"
}
```
**<EFBFBD><EFBFBD>蝏𤘪<EFBFBD>**嚗?
- <EFBFBD>?餈𥪜<E9A488>200<30><EFBFBD><E59786><EFBFBD>
- <EFBFBD>?隡<><E99AA1>敺桐縑APP<50><EFBFBD><E59785><EFBFBD><EFBFBD><E798A8>
**预期结果**
- ✅ 返回200状态码
- ✅ 企业微信APP收到卡片消息
---
## <EFBFBD><EFBFBD> 撣貉<E692A3><E8B289><EFBFBD>嚗㇅AQ嚗?
## 📋 常见问题FAQ
### Q1嚗𡁏<EFBFBD>瘝⊥<EFBFBD><EFBFBD><EFBFBD><EFBFBD>虾隞交釣<EFBFBD><EFBFBD><EFBFBD>嚗?
### Q1:我没有企业,可以注册吗?
**A**嚗𡁜虾隞伐<E99A9E><E4BC90>㗇𥋘"**銝芯犖**"<22>?**銝芯<E98A9D>撌亙<E6928C><E4BA99>?*"蝐餃<E89D90>瘜典<E7989C><EFBFBD><E59A97><EFBFBD><EFBFBD><E8B3A2>函㮾<E587BD><EFBFBD>?
**A**:可以!选择"**个人**"或"**个体工商户**"类型注册,功能完全相同。
### Q2Secret忘记了怎么办
**A**嚗𡁜銁摨𠉛鍂霂行<E99C82>憿萇<E686BF><E89087>?**<EFBFBD>滨蔭Secret**"嚗䔶<E59A97>隡𡁜紡<F0A1819C>湔唂Secret憭望<EFBFBD><EFBFBD>?
**A**:在应用详情页点击"**重置Secret**",但会导致旧Secret失效。
### Q3嚗𡁏<EFBFBD>霂閧㴓憓<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滩恕霂<EFBFBD><EFBFBD>嚗?
### Q3:测试环境需要实名认证吗?
**A**嚗帋<E59A97><E5B88B><EFBFBD><EFBFBD><E996AC><EFBFBD>𧊋霈方<E99C88><EFBFBD><E99AA1>銋笔虾隞乩蝙<E4B9A9>刻䌊撱箏<E692B1><E7AE8F><EFBFBD><E587BD><EFBFBD><E588B8><EFBFBD><EFBFBD><EFBFBD>臭犖<E887AD><EFBFBD><E594B3>𣂼<EFBFBD>嚗?00鈭綽<E988AD><E7B6BD>?
**A**不需要。未认证企业也可以使用自建应用的全部功能只是人数有限制100人
### Q4嚗𡁜<EFBFBD>雿閙𪄳<EFBFBD>啁鍂<EFBFBD><EFBFBD> UserID嚗?
### Q4:如何找到用户的 UserID
**A**嚗?
1. <EFBFBD><EFBFBD>1嚗𡁶蒈敶閧恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>?<3F>朞悖敶?<3F>?<3F>孵稬<E5ADB5>𣂼<EFBFBD> <20>?<3F><EFBFBD>"韐血噡"
**A**
1. 方法1登录管理后台 → 通讯录 → 点击成员 → 查看"账号"
2. 方法2调用企业微信API获取`GET /cgi-bin/user/getuserinfo`
### Q5嚗𡁏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>仃韐伐<EFBFBD>餈𥪜<EFBFBD>40014<EFBFBD>躰秤嚗?
### Q5消息发送失败返回40014错误
**A**`invalid access_token`,可能原因:
- Secret配置错误
- Access Token<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>齿鰵<EFBFBD><EFBFBD>嚗?
- Access Token过期(需重新获取)
- CorpID或AgentID配置错误
---
## <EFBFBD>?撉峕𤣰<E5B395><F0A4A3B0><EFBFBD>
## ✅ 验收标准
摰峕<EFBFBD>隞乩<EFBFBD>隞餃𦛚<EFBFBD>𠬍<EFBFBD>Day 1撠勗<E692A0>蝢擧𤣰摰䀝<E691B0>嚗?
完成以下任务后Day 1就完美收官了
- [ ] 企业微信账号注册成功
- [ ] 自建应用创建成功
- [ ] 获取到CorpID、AgentID、Secret
- [ ] <20>滨蔭<E6BBA8>?`.env` <20><>
- [ ] 配置到 `.env` 文件
- [ ] 后端服务能正常启动(无报错)
---
## <EFBFBD>㴓 銝衤<E98A9D>甇?
## 🎯 下一步
完成企业微信配置后Day 2我们将开始
1. **REDCap API Adapter<EFBFBD><EFBFBD>?*嚗<>瓲敹<E793B2><E695B9><EFBFBD><EFBFBD>
2. **SyncManager<EFBFBD><EFBFBD>?*嚗<><EFBFBD><E6AFBD><EFBFBD>甇交芋撘𧶏<E69298>
3. 摰䂿緵REDCap<EFBFBD>唳旿<EFBFBD><EFBFBD><EFBFBD>諹蔭霂?
1. **REDCap API Adapter开发**(核心功能)
2. **SyncManager开发**(混合同步模式)
3. 实现REDCap数据拉取和轮询
<EFBFBD>恣摰峕<EFBFBD><EFBFBD>園𡢿嚗?撠𤩺𧒄
预计完成时间8小时
---
**<EFBFBD>𥕦遣<EFBFBD><EFBFBD>**嚗?025-12-31
**蝏湔擪<EFBFBD>?*嚗𡁜<E59A97><F0A1819C>穃𣪧<E7A983>?
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>獢?*嚗?
**创建日期**2025-12-31
**维护者**:开发团队
**参考文档**
- 企业微信官方文档https://developer.work.weixin.qq.com/document/
- 发送应用消息https://developer.work.weixin.qq.com/document/path/90236
@@ -225,6 +225,5 @@ Content-Type: application/json