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,83 +1,119 @@
# 🎉 Node.js 后端 - 部署成功总结
> **閮ㄧ讲瀹屾垚鏃堕棿**锛?025-12-24
> **鏈€缁堢増鏈?*锛歷1.3
> **部署完成时间**2025-12-24
> **最终版本**v1.3
> **内网地址**`http://172.17.173.71:3001`
> **閮ㄧ讲鐘舵€?*锛氣渽 杩愯<E69DA9>涓?
> **鍋ュ悍妫€鏌?*锛氣渽 閫氳繃锛圚TTP 200锛屽搷搴旀椂闂?-15ms锛?
> **部署状态**:✅ 运行中
> **健康检查**:✅ 通过HTTP 200响应时间4-15ms
---
## 📊 部署历程概览
### 版本迭代记录
| 鐗堟湰 | 淇<><E6B787><EFBFBD><E99782> | 鏋勫缓鏃堕棿 | 鐘舵€?| 澶囨敞 |
| 版本 | 修复问题 | 构建时间 | 状态 | 备注 |
|------|---------|---------|------|------|
| v1.0 | 鍒濆<EFBFBD>鐗堟湰 | ~5鍒嗛挓 | 鉂?鍚<>姩澶辫触 | 缂哄皯config<EFBFBD> |
| v1.1 | 娣诲姞config<EFBFBD> | ~1鍒嗛挓 | 鉂?鍚<>姩澶辫触 | pino-pretty閿欒<EFBFBD> |
| v1.2 | <EFBFBD><EFBFBD>pino-pretty | ~8绉?| 鈿狅笍 閮ㄥ垎鎴愬姛 | 鍋ュ悍妫€鏌?00閿欒<E996BF> |
| **v1.3** | **<EFBFBD><EFBFBD>require()** | **~5绉?* | **鉁?瀹屽叏鎴愬姛** | **鐢熶骇鐜<EFBFBD><EFBFBD>杩愯<EFBFBD>涓?* |
| v1.0 | 初始版本 | ~5分钟 | ❌ 启动失败 | 缺少config目录 |
| v1.1 | 添加config目录 | ~1分钟 | ❌ 启动失败 | pino-pretty错误 |
| v1.2 | 修复pino-pretty | ~8秒 | ⚠️ 部分成功 | 健康检查500错误 |
| **v1.3** | **修复require()** | **~5秒** | **✅ 完全成功** | **生产环境运行中** |
### 部署时间轴
### 閮ㄧ讲鏃堕棿杞?
```
2025-12-24 寮€濮嬮儴缃? 鈫?10:00 - 鍒涘缓SAE搴旂敤锛岄厤缃<E58EA4>幆澧冨彉閲? 鈫?10:15 - 閮ㄧ讲v1.0锛屽彂鐜扮己灏慶onfig鐩<EFBFBD>綍 鉂? 鈫?10:25 - 淇<><E6B787>Dockerfile锛屾瀯寤簐1.1 鉁? 鈫?10:28 - 閮ㄧ讲v1.1锛屽彂鐜皃ino-pretty閿欒<E996BF> 鉂? 鈫?10:35 - 淇<>敼logger閰嶇疆锛屾瀯寤簐1.2 鉁? 鈫?10:42 - 閮ㄧ讲v1.2锛屽彂鐜皉equire()閿欒<E996BF> 鉂? 鈫?10:45 - 淇<><E6B787>ES Module闂<65><E99782>锛屾瀯寤簐1.3 鉁? 鈫?10:50 - 閮ㄧ讲v1.3锛屽畬鍏ㄦ垚鍔燂紒馃帀
2025-12-24 开始部署
10:00 - 创建SAE应用配置环境变量
10:15 - 部署v1.0发现缺少config目录 ❌
10:25 - 修复Dockerfile构建v1.1 ✅
10:28 - 部署v1.1发现pino-pretty错误 ❌
10:35 - 修改logger配置构建v1.2 ✅
10:42 - 部署v1.2发现require()错误 ❌
10:45 - 修复ES Module问题构建v1.3 ✅
10:50 - 部署v1.3,完全成功!🎉
```
**鎬昏€楁椂**锛氱害50鍒嗛挓锛堝寘鍚?娆¢棶棰樻帓鏌ュ拰淇<E68BB0><E6B787>锛?
**总耗时**约50分钟包含3次问题排查和修复
---
## 鉁?鏈€缁堥儴缃茬姸鎬?
## ✅ 最终部署状态
### 应用信息
```yaml
应用名称: nodejs-backend-test
命名空间: cn-beijing:test-airesearch
地域: 华北2北京
鐘舵€? 鉁?杩愯<E69DA9>涓?瀹炰緥鏁? 1涓?```
状态: ✅ 运行中
实例数: 1个
```
### 资源配置
```yaml
CPU: 1鏍?鍐呭瓨: 2GB
CPU: 1核
内存: 2GB
镜像: backend-service:v1.3
闀滃儚澶у皬: ~186MB锛堝帇缂╁悗锛?```
镜像大小: ~186MB(压缩后)
```
### 网络配置
```yaml
内网地址: http://172.17.173.71:3001
VPC: vpc-2ze055cptkew9c38w4r06
瀹夊叏缁? sg-2zedk6fi8sgmmcwdu7tu
安全组: sg-2zedk6fi8sgmmcwdu7tu
公网访问: 无(仅内网)
```
### 鍋ュ悍妫€鏌?```yaml
### 健康检查
```yaml
类型: HTTP
路径: /health
端口: 3001
鍒濆<EFBFBD>寤惰繜: 30绉?妫€鏌ラ棿闅? 10绉?鐘舵€? 鈿狅笍 寰呬慨澶嶅埌v1.3鍚庨獙璇?```
初始延迟: 30秒
检查间隔: 10秒
状态: ⚠️ 待修复到v1.3后验证
```
---
## 🔧 三次关键修复
### <EFBFBD><EFBFBD>1锛氭坊鍔燾onfig鐩<EFBFBD>綍锛坴1.0 鈫?v1.1锛?
**闂<><E99782>**锛?```
### 修复1添加config目录v1.0 v1.1
**问题**
```
Error: ENOENT: no such file or directory, open '/app/config/agents.yaml'
```
**瑙e喅**锛?```dockerfile
# Dockerfile 娣诲姞锛?COPY config ./config
**解决**
```dockerfile
# Dockerfile 添加:
COPY config ./config
```
**文档**[13-Node.js后端-镜像修复记录.md](./13-Node.js后端-镜像修复记录.md)
---
### <EFBFBD><EFBFBD>2锛氭潯浠跺寲pino-pretty锛坴1.1 鈫?v1.2锛?
**闂<><E99782>**锛?```
### 修复2条件化pino-prettyv1.1 v1.2
**问题**
```
Error: unable to determine transport target for "pino-pretty"
```
**瑙e喅**锛?```typescript
// index.ts 淇<>敼锛?const fastify = Fastify({
**解决**
```typescript
// index.ts 修改:
const fastify = Fastify({
logger: config.nodeEnv === 'production'
? { level: 'info' } // 生产JSON日志
: { level: 'info', transport: {...} } // 开发pretty格式
@@ -88,19 +124,23 @@ Error: unable to determine transport target for "pino-pretty"
---
### <EFBFBD><EFBFBD>3锛欵S Module閫傞厤锛坴1.2 鈫?v1.3锛?
**闂<><E99782>**锛?```
### 修复3ES Module适配v1.2 v1.3
**问题**
```
ReferenceError: require is not defined
at healthCheck.js:161:43
```
**鏍规簮**锛?```typescript
// 鉂?ES Module涓<65>笉鑳界敤require
**根源**
```typescript
// ❌ ES Module中不能用require
loadAverage: require('os').loadavg()
```
**瑙e喅**锛?```typescript
// 鉁?浣跨敤import
**解决**
```typescript
// ✅ 使用import
import os from 'os'
loadAverage: os.loadavg()
```
@@ -109,14 +149,18 @@ loadAverage: os.loadavg()
## 🎯 部署验证
### 1. 鏈嶅姟鍚<EFBFBD>姩楠岃瘉 鉁?
**鏃ュ織鍏抽敭淇℃伅**锛?```
鉁?Loaded 12 agent configurations
### 1. 服务启动验证 ✅
**日志关键信息**
```
✅ Loaded 12 agent configurations
[PgBossQueue] Initialized with schema: platform_schema
[PostgresCacheAdapter] Cleanup task started
鉁?鏁版嵁搴撹繛鎺ユ垚鍔燂紒
馃搳 鏁版嵁搴撶増鏈? PostgreSQL 15.14
馃殌 Postgres-Only 鏋舵瀯宸插惎鍔?鉁?DC妯″潡鍒濆<E98D92>鍖栨垚鍔?馃殌 AI涓村簥鐮旂┒骞冲彴 - 鍚庣<E98D9A>鏈嶅姟鍣ㄥ惎鍔ㄦ垚鍔燂紒
✅ 数据库连接成功!
📊 数据库版本: PostgreSQL 15.14
🚀 Postgres-Only 架构已启动
✅ DC模块初始化成功
🚀 AI临床研究平台 - 后端服务器启动成功!
📍 服务地址: http://localhost:3001
Server listening at http://172.17.173.71:3001
```
@@ -125,21 +169,23 @@ Server listening at http://172.17.173.71:3001
---
### 2. 妯″潡鍒濆<EFBFBD>鍖栭獙璇?鉁?
| 妯″潡 | 鐘舵€?| 楠岃瘉淇℃伅 |
### 2. 模块初始化验证 ✅
| 模块 | 状态 | 验证信息 |
|------|------|---------|
| **Platform灞?* | 鉁?鎴愬姛 | pg-boss闃熷垪鍚<EFBFBD>姩锛孭ostgreSQL缂撳瓨鍚<EFBFBD> |
| **AIA妯″潡** | 鉁?鎴愬姛 | 12涓狝gent閰嶇疆鍔犺浇瀹屾垚 |
| **PKB妯″潡** | 鉁?鎴愬姛 | RAG寮曟搸鍒濆<EFBFBD>鍖?|
| **ASL妯″潡** | 鉁?鎴愬姛 | 璺<>敱娉ㄥ唽锛學orkers娉ㄥ唽 |
| **DC妯″潡** | 鉁?鎴愬姛 | 6涓<36>〃瀛樺湪锛?555鏉℃暟鎹?|
| **Platform** | ✅ 成功 | pg-boss队列启动PostgreSQL缓存启动 |
| **AIA模块** | ✅ 成功 | 12个Agent配置加载完成 |
| **PKB模块** | ✅ 成功 | RAG引擎初始化 |
| **ASL模块** | ✅ 成功 | 路由注册Workers注册 |
| **DC模块** | ✅ 成功 | 6个表存在7555条数据 |
---
### 3. 鏁版嵁搴撹繛鎺ラ獙璇?鉁?
### 3. 数据库连接验证 ✅
```
鉁?鏁版嵁搴撹繛鎺ユ垚鍔燂紒
馃搳 鏁版嵁搴撶増鏈? PostgreSQL 15.14
✅ 数据库连接成功!
📊 数据库版本: PostgreSQL 15.14
📊 当前数据库连接数: 3
```
@@ -147,40 +193,47 @@ Server listening at http://172.17.173.71:3001
---
### 4. Workers娉ㄥ唽楠岃瘉 鉁?
### 4. Workers注册验证 ✅
```yaml
娉ㄥ唽鐨刉orkers (3涓?:
- asl_screening_batch 鉁? # 鏂囩尞绛涢€夋壒娆″<E5A886>鐞? - dc_extraction_batch 鉁? # 鏁版嵁鎻愬彇鎵规<E98EB5>澶勭悊
- dc_toolc_parse_excel 鉁? # Tool C Excel瑙
注册的Workers (3个):
- asl_screening_batch # 文献筛选批次处理
- dc_extraction_batch ✅ # 数据提取批次处理
- dc_toolc_parse_excel ✅ # Tool C Excel解析
```
**验证结果**:✅ 所有异步Workers注册成功
---
### 5. 鍋ュ悍妫€鏌ラ獙璇?鈿狅笍
### 5. 健康检查验证 ⚠️
**褰撳墠鐘舵€侊紙v1.2锛?*锛?```json
**当前状态v1.2**
```json
{
"level":50,
"err":{"type":"ReferenceError","message":"require is not defined"}
}
```
**闇€瑕佹搷浣?*锛氭洿鏂板埌v1.3鍚庯紝鍋ュ悍妫€鏌ュ簲璇ヨ繑鍥?00
**需要操作**更新到v1.3后健康检查应该返回200
---
## 馃殌 涓嬩竴姝ユ搷浣?
## 🚀 下一步操作
### 立即操作更新到v1.3
1. **鐧诲綍SAE鎺у埗鍙?*锛歨ttps://sae.console.aliyun.com/
1. **登录SAE控制台**https://sae.console.aliyun.com/
2. **找到应用**nodejs-backend-test
3. **鏇存柊闀滃儚鐗堟湰**锛? ```
3. **更新镜像版本**
```
backend-service:v1.2
改为backend-service:v1.3
```
4. **閲嶆柊閮ㄧ讲**锛氫繚瀛樺苟鐐瑰嚮銆愰噸鏂伴儴缃层€?5. **楠岃瘉鍋ュ悍妫€鏌?*锛? ```bash
4. **重新部署**:保存并点击【重新部署】
5. **验证健康检查**
```bash
curl http://172.17.173.71:3001/health
# 应该返回200 OK
```
@@ -191,35 +244,39 @@ Server listening at http://172.17.173.71:3001
### 成本统计
| 璧勬簮 | 瑙勬牸 | 鏈堟垚鏈?| 鐘舵€?|
| 资源 | 规格 | 月成本 | 状态 |
|------|------|-------|------|
| RDS PostgreSQL | 2鏍?GB | 260 | 鉁?杩愯<E69DA9>涓?|
| Python<EFBFBD>湇鍔?| 1鏍?GB | 60 | 鉁?杩愯<E69DA9>涓?|
| **Node.js鍚庣<EFBFBD>** | **1鏍?GB** | **60** | **鉁?杩愯<E69DA9>涓?* |
| 鍓嶇<EFBFBD>Nginx | 1鏍?GB | 60 | 鈴?寰呴儴缃?|
| OSS瀛樺偍 | 10GB | 2 | 鉁?杩愯<E69DA9>涓?|
| NAT缃戝叧 | 灏忓瀷 | 60 | 鉁?杩愯<E69DA9>涓?|
| **褰撳墠鎬昏<EFBFBD>** | - | **442/鏈?* | - |
| RDS PostgreSQL | 2核4GB | ¥260 | ✅ 运行中 |
| Python微服务 | 1核2GB | ¥60 | ✅ 运行中 |
| **Node.js后端** | **1核2GB** | **¥60** | **✅ 运行中** |
| 前端Nginx | 1核2GB | ¥60 | ⏳ 待部署 |
| OSS存储 | 10GB | ¥2 | ✅ 运行中 |
| NAT网关 | 小型 | ¥60 | ✅ 运行中 |
| **当前总计** | - | **¥442/月** | - |
---
## 💡 经验教训
### 1. Docker闀滃儚瀹屾暣鎬ф<EFBFBD>鏌?
### 1. Docker镜像完整性检查
**问题**忘记复制config目录
**鏁欒<EFBFBD>**锛氭瀯寤哄墠妫€鏌ユ竻鍗?```bash
鉁?node_modules
鉁?dist
鉁?prisma
鉁?config 鈫?瀹规槗閬楁紡锛?鉁?package.json
**教训**:构建前检查清单
```bash
✅ node_modules
✅ dist
✅ prisma
✅ config ← 容易遗漏!
✅ package.json
```
---
### 2. 环境适配
**<EFBFBD><EFBFBD>**锛氬紑鍙戝伐鍏凤紙pino-pretty锛夌敤鍦ㄧ敓浜х幆澧?
**鏁欒<EFBFBD>**锛氭牴鎹甆ODE_ENV鏉欢鍖栭厤缃?```typescript
**问题**开发工具pino-pretty用在生产环境
**教训**根据NODE_ENV条件化配置
```typescript
config.nodeEnv === 'production' ? A : B
```
@@ -230,43 +287,60 @@ config.nodeEnv === 'production' ? A : B
**问题**混用require()和import
**教训**项目统一使用ES Module避免require()
```typescript
// 鉂?涓嶈<E6B693>鐢?const os = require('os')
// ❌ 不要用
const os = require('os')
// 鉁?浣跨敤
// ✅ 使用
import os from 'os'
```
---
## 馃摑 鎶€鏈<E282AC>寒鐐?
## 📝 技术亮点
### 1. Postgres-Only架构 🏆
- 鉁?鏃犻渶Redis锛岄檷浣庢垚鏈<E59E9A>害楼700/骞?- 鉁?pg-boss闃熷垪锛氬紓姝ヤ换鍔″<E98D94>鐞?- 鉁?PostgreSQL缂撳瓨锛氭€ц兘浼樺寲
- 鉁?3涓猈orkers锛欰SL銆丏C鎵瑰<E98EB5>鐞?
- ✅ 无需Redis降低成本约¥700/年
- ✅ pg-boss队列异步任务处理
- ✅ PostgreSQL缓存性能优化
- ✅ 3个WorkersASL、DC批处理
### 2. 云原生适配 ☁️
- 鉁?鏃犵姸鎬佸簲鐢?- 鉁?瀹瑰櫒鍖栭儴缃?- 鉁?鍋ュ悍妫€鏌ラ厤缃?- 鉁?鍐呯綉鏈嶅姟鍙戠幇
- ✅ 无状态应用
- ✅ 容器化部署
- ✅ 健康检查配置
- ✅ 内网服务发现
### 3. 生产环境优化 ⚡
- ✅ JSON日志性能10倍于pino-pretty
- ✅ 数据库连接池优化
- ✅ Alpine镜像体积小
- ✅ 多阶段构建(安全)
### 3. 鐢熶骇鐜<E9AA87><E9909C>浼樺寲 鈿?
- 鉁?JSON鏃ュ織锛堟€ц兘10鍊嶄簬pino-pretty锛?- 鉁?鏁版嵁搴撹繛鎺ユ睜浼樺寲
- 鉁?Alpine闀滃儚锛堜綋绉<E7B68B>皬锛?- 鉁?澶氶樁娈垫瀯寤猴紙瀹夊叏锛?
---
## 馃帀 閮ㄧ讲鎴愬姛锛?
### 褰撳墠鐘舵€?
## 🎉 部署成功!
### 当前状态
```
鉁?鏈嶅姟杩愯<E69DA9>涓?鉁?鏁版嵁搴撹繛鎺ユ<E98EBA>甯?鉁?鎵€鏈夋ā鍧楀垵濮嬪寲鎴愬姛
鉁?Workers娉ㄥ唽瀹屾垚
✅ 服务运行中
✅ 数据库连接正常
✅ 所有模块初始化成功
✅ Workers注册完成
⚠️ 健康检查待v1.3验证
```
### 鍐呯綉鍦板潃锛堥噸瑕侊紒锛?
### 内网地址(重要!)
```
Node.js后端http://172.17.173.71:3001
Python微服务http://172.17.173.66:8000
```
**鍓嶇<EFBFBD>Nginx閰嶇疆鏃堕渶瑕佺敤鍒拌繖涓<EFBFBD>湴鍧€锛?*
**前端Nginx配置时需要用到这个地址!**
---
@@ -276,14 +350,17 @@ Python微服务http://172.17.173.66:8000
1. 配置SAE应用监控告警
2. 查看实时日志排查问题
3. 鐩戞帶CPU/鍐呭瓨浣跨敤鐜?
3. 监控CPU/内存使用率
### 扩容建议
濡傛灉1鏍?GB涓嶅<E6B693>锛?- 鎺ㄨ崘锛?鏍?GB锛埪?20/鏈堬級
- 閰嶇疆寮规€т几缂╋紙鎸夐渶鎵╁<EFBFBD>锛?
如果1核2GB不够
- 推荐2核4GB¥120/月)
- 配置弹性伸缩(按需扩容)
---
**馃帀 鎭<>枩锛丯ode.js鍚庣<E98D9A>宸叉垚鍔熼儴缃插埌闃块噷浜慡AE锛?*
**馃摑 鏂囨。缁存姢锛氳繍缁村洟闃?*
**🎉 恭喜Node.js后端已成功部署到阿里云SAE**
**📝 文档维护:运维团队**
**📅 最后更新2025-12-24**