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,8 +1,8 @@
# Schema迁移脚本使用指南
> **<EFBFBD><EFBFBD>𧋦嚗?* V1.0
> **<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗?* 2025-11-09
> **<EFBFBD><EFBFBD><EFBFBD>嚗?* 隞簵ublic schema<EFBFBD><EFBFBD>?0銝芷<E98A9D>蝳艋chema
> **版本:** V1.0
> **创建日期:** 2025-11-09
> **迁移目标:** 从public schema迁移到10个隔离Schema
---
@@ -10,13 +10,13 @@
| # | 脚本名称 | 说明 | 预计时间 | 前置依赖 |
|---|---------|------|---------|---------|
| 1 | `001-create-all-10-schemas.sql` | <EFBFBD>𥕦遣10銝杵chema嚗?霂衣<E99C82>+7蝛綽<E89D9B> | 5蝘?| <20>?|
| 2 | `002-migrate-platform.sql` | <EFBFBD>platform_schema嚗?銝芾”嚗鮁sers嚗?| 15<EFBFBD><EFBFBD><EFBFBD> | 001 |
| 3 | `003-migrate-aia.sql` | <EFBFBD>aia_schema嚗?銝芾”嚗𡁜笆霂萘㮾<E89098><EFBFBD> | 30<EFBFBD><EFBFBD><EFBFBD> | 001, 002 |
| 4 | `004-migrate-pkb.sql` | <EFBFBD>pkb_schema嚗?銝芾”嚗𡁶䰻霂<E4B0BB><E99C82><EFBFBD><EFBFBD>嚗?| 30<EFBFBD><EFBFBD><EFBFBD> | 001, 002 |
| 5 | `005-validate-all.sql` | <EFBFBD><EFBFBD>撉諹<EFBFBD><EFBFBD>峕㺭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 10<EFBFBD><EFBFBD><EFBFBD> | 001-004 |
| 1 | `001-create-all-10-schemas.sql` | 创建10个Schema3详细+7空 | 5秒 | 无 |
| 2 | `002-migrate-platform.sql` | 迁移platform_schema1个表users | 15分钟 | 001 |
| 3 | `003-migrate-aia.sql` | 迁移aia_schema5个表对话相关 | 30分钟 | 001, 002 |
| 4 | `004-migrate-pkb.sql` | 迁移pkb_schema5个表知识库相关 | 30分钟 | 001, 002 |
| 5 | `005-validate-all.sql` | 全局验证和数据完整性检查 | 10分钟 | 001-004 |
**<EFBFBD>餉恣嚗?* 蝥?.5撠𤩺𧒄
**总计:** 约1.5小时
---
@@ -24,19 +24,19 @@
### 前置准备
1. **<EFBFBD><EFBFBD>唳旿摨橒<EFBFBD>撘箇<EFBFBD>撱箄悅嚗?*
1. **备份数据库(强烈建议)**
```bash
pg_dump -U postgres -d your_database > backup_$(date +%Y%m%d_%H%M%S).sql
```
2. **蝖株恕<EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>?*
2. **确认数据库连接**
```bash
# 确保DATABASE_URL环境变量正确
echo $DATABASE_URL
# <EFBFBD>𡝗䰻<EFBFBD>?.env <EFBFBD><EFBFBD>
# 或查看 .env 文件
```
3. **蝖株恕敶枏<EFBFBD>銵函<EFBFBD><EFBFBD>?*
3. **确认当前表结构**
```sql
SELECT tablename FROM pg_tables WHERE schemaname = 'public';
```
@@ -59,7 +59,8 @@ psql $DATABASE_URL -f 004-migrate-pkb.sql
psql $DATABASE_URL -f 005-validate-all.sql
```
#### <EFBFBD><EFBFBD>2嚗帋<EFBFBD>甈⊥<EFBFBD><EFBFBD>銵峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
#### 方法2一次性执行所有脚本
```bash
# 创建执行脚本
cat 001-create-all-10-schemas.sql \
@@ -70,16 +71,18 @@ cat 001-create-all-10-schemas.sql \
| psql $DATABASE_URL
```
#### <EFBFBD><EFBFBD>3嚗帋蝙<EFBFBD>冽㺭<EFBFBD><EFBFBD><EFBFBD>蝡荔<EFBFBD><EFBFBD>Beaver<EFBFBD><EFBFBD>gAdmin嚗?
#### 方法3使用数据库客户端如DBeaver、pgAdmin
1. 打开数据库客户端
2. 连接到目标数据库
3. 依次打开并执行每个SQL文件
---
## <EFBFBD>?撉諹<E69289><EFBFBD><E79A9C>
## ✅ 验证清单
### 执行001后
### <20><EFBFBD>001<30>?
- [ ] 10个Schema全部创建成功
- [ ] 每个Schema都有注释说明
@@ -91,17 +94,21 @@ WHERE nspname LIKE '%_schema'
ORDER BY nspname;
```
### <EFBFBD><EFBFBD>002<EFBFBD>?
- [ ] platform_schema.users銵典<E98AB5>撱箸<E692B1><E7AEB8>?- [ ] <20>唳旿隞簵ublic.users摰峕㟲餈<E39FB2>
- [ ] 4銝芰揣撘訫<EFBFBD>撱箸<EFBFBD><EFBFBD>?
### 执行002
- [ ] platform_schema.users表创建成功
- [ ] 数据从public.users完整迁移
- [ ] 4个索引创建成功
```sql
-- 验证SQL
SELECT COUNT(*) AS public_count FROM public.users;
SELECT COUNT(*) AS platform_count FROM platform_schema.users;
```
### <EFBFBD><EFBFBD>003<EFBFBD>?
- [ ] aia_schema<6D>?銝芾”<E88ABE>𥕦遣<F0A595A6>𣂼<EFBFBD>
### 执行003
- [ ] aia_schema的5个表创建成功
- [ ] 数据完整迁移
- [ ] 外键约束正确建立
@@ -111,8 +118,9 @@ SELECT COUNT(*) FROM aia_schema.projects;
SELECT COUNT(*) FROM aia_schema.conversations;
```
### <EFBFBD><EFBFBD>004<EFBFBD>?
- [ ] pkb_schema<6D>?銝芾”<E88ABE>𥕦遣<F0A595A6>𣂼<EFBFBD>
### 执行004
- [ ] pkb_schema的5个表创建成功
- [ ] 包含Phase 2全文阅读字段
- [ ] 数据完整迁移
@@ -122,16 +130,20 @@ SELECT COUNT(*) FROM pkb_schema.knowledge_bases;
SELECT COUNT(*) FROM pkb_schema.documents;
```
### <EFBFBD><EFBFBD>005<EFBFBD>?
- [ ] <20><><EFBFBD>㗇㺭<E39787><EFBFBD>撖寞<E69296><EFBFBD><E98A9D>?- [ ] 頝沒chema憭㚚睸撘閧鍂<E996A7><EFBFBD>
- [ ] <EFBFBD>䭾㺭<EFBFBD>桐腺憭?
### 执行005
- [ ] 所有数据量对比一致
- [ ] 跨Schema外键引用有效
- [ ] 无数据丢失
---
## <EFBFBD><EFBFBD><><EFBFBD>擧㺭<E693A7><EFBFBD>撣?
## 📊 迁移后数据分布
### Platform Schema
```
platform_schema
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> users (1銵?
└── users (1表)
```
### AIA Schema
@@ -141,7 +153,7 @@ aia_schema
├── conversations
├── messages
├── general_conversations
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> general_messages (5銵?
└── general_messages (5表)
```
### PKB Schema
@@ -151,13 +163,13 @@ pkb_schema
├── documents
├── batch_tasks
├── batch_results
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> task_templates (5銵?
└── task_templates (5表)
```
### 蝛搴chema嚗?銝迎<E98A9D>
### 空Schema7个
```
asl_schema (AI智能文献 - Week 3设计)
common_schema (<EFBFBD>𡁶鍂<EFBFBD><EFBFBD>撅?
common_schema (通用能力层)
dc_schema (数据清洗)
rvw_schema (审稿系统)
admin_schema (运营管理)
@@ -172,19 +184,25 @@ st_schema (统计分析工具)
### 1. 事务保护
所有迁移脚本都使用了事务BEGIN/COMMIT
- <EFBFBD>𣂼<EFBFBD>嚗𡁜<EFBFBD><EFBFBD><EFBFBD>鈭?- 憭梯揖嚗朞䌊<E69C9E><EFBFBD>皛𡄯<E79A9B><F0A184AF>𣳇<EFBFBD><F0A3B387><EFBFBD><EFBFBD>蝘?
### 2. 撟<><E6929F><EFBFBD>?
- 成功:全部提交
- 失败:自动回滚,无部分迁移
### 2. 幂等性
所有脚本支持重复执行:
- 使用 `IF NOT EXISTS` 创建对象
- 使用 `ON CONFLICT DO NOTHING` 插入数据
### 3. public schema保留
<EFBFBD><EFBFBD>?*銝滢<E98A9D><E6BBA2>𣳇膄** public schema銝剔<EFBFBD><EFBFBD>蠘”嚗?- <20><EFBFBD>嚗𡁏䲮靘踹<E99D98>皛𡁜<E79A9B>撖寞<E69296>撉諹<E69289>
- <EFBFBD><EFBFBD>嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𠬍<EFBFBD><EFBFBD><EFBFBD>摰𡁏糓<EFBFBD><EFBFBD><EFBFBD>?
迁移后**不会删除** public schema中的原表:
- 原因:方便回滚和对比验证
- 清理:待所有验证通过后,再决定是否删除
### 4. 外键约束
<EFBFBD><EFBFBD>頝沒chema憭㚚睸嚗?- <20><><EFBFBD><EFBFBD><E58A90>∟”撘閧鍂 `platform_schema.users(id)`
支持跨Schema外键
- 所有业务表引用 `platform_schema.users(id)`
- PostgreSQL原生支持无需特殊配置
---
@@ -193,9 +211,9 @@ st_schema (统计分析工具)
### 问题1连接被拒绝
**<EFBFBD>躰秤嚗?* `connection refused`
**错误:** `connection refused`
**<EFBFBD><EFBFBD>嚗?*
**解决:**
```bash
# 检查PostgreSQL服务
sudo systemctl status postgresql
@@ -204,24 +222,29 @@ sudo systemctl status postgresql
sudo systemctl start postgresql
```
### <EFBFBD><EFBFBD>2嚗𡁏<EFBFBD><EFBFBD>𣂷<EFBFBD>頞?
**<2A>躰秤嚗?* `permission denied to create schema`
### 问题2权限不足
**<EFBFBD><EFBFBD>嚗?*
**错误:** `permission denied to create schema`
**解决:**
```sql
-- 授予权限
GRANT CREATE ON DATABASE your_database TO your_user;
```
### <EFBFBD><EFBFBD>3嚗𡁜<EFBFBD><EFBFBD>桃漲<EFBFBD>笔仃韐?
**<2A>躰秤嚗?* `violates foreign key constraint`
### 问题3外键约束失败
**<EFBFBD><EFBFBD>嚗?*
- 蝖桐<E89D96><E6A190><EFBFBD><EFBFBD>銵?002嚗īlatform嚗匧<E59A97><E58CA7><EFBFBD> 003/004嚗Òia/pkb嚗?- 璉<><E79289>交糓<E4BAA4><EFBFBD>摮斤<E691AE><E696A4><EFBFBD>ser_id
**错误:** `violates foreign key constraint`
### <20><EFBFBD>4嚗𡁏㺭<F0A1818F><EFBFBD>銝滢<E98A9D><E6BBA2>?
**<2A>躰秤嚗?* 撉諹<E69289><E8ABB9>𡁏𧋦<F0A1818F><EFBFBD><E4BA99>唳旿<E594B3><EFBFBD><EFBFBD><E98A9D>?
**閫<><E996AB>嚗?*
**解决:**
- 确保先执行 002platform再执行 003/004aia/pkb
- 检查是否有孤立的user_id
### 问题4数据量不一致
**错误:** 验证脚本报告数据量不一致
**解决:**
1. 检查是否有迁移过程中新增的数据
2. 使用ID对比检查具体差异
```sql
@@ -235,7 +258,8 @@ GRANT CREATE ON DATABASE your_database TO your_user;
## 📝 回滚方案
### 敹恍<EFBFBD><EFBFBD>皛𡄯<EFBFBD><EFBFBD><EFBFBD>嚗?
### 快速回滚(推荐)
```sql
-- 删除所有新建的Schema会级联删除所有表和数据
DROP SCHEMA IF EXISTS platform_schema CASCADE;
@@ -250,7 +274,8 @@ DROP SCHEMA IF EXISTS ssa_schema CASCADE;
DROP SCHEMA IF EXISTS st_schema CASCADE;
```
### 隞𤾸<EFBFBD>隞賣<EFBFBD>憭?
### 从备份恢复
```bash
# 恢复备份
psql $DATABASE_URL < backup_20251109_100000.sql
@@ -262,9 +287,10 @@ psql $DATABASE_URL < backup_20251109_100000.sql
迁移完成后,需要:
1. **<EFBFBD>湔鰵Prisma<EFBFBD>滨蔭** <20>?閫<><EFBFBD>?
1. **更新Prisma配置** → 见任务9
- 更新 `backend/prisma/schema.prisma`
- 瘛餃<EFBFBD> `multiSchema` <EFBFBD><EFBFBD><EFBFBD><EFBFBD>? - 銝?銝杵chema摰帋<E691B0><E79285>
- 添加 `multiSchema` 预览特性
- 为3个Schema定义模型
2. **生成Prisma Client**
```bash
@@ -272,25 +298,28 @@ psql $DATABASE_URL < backup_20251109_100000.sql
npx prisma generate
```
3. **<EFBFBD>湔鰵隞<EFBFBD><EFBFBD>** <20>?閫<><EFBFBD>?2
3. **更新代码** → 见任务12
- 所有数据库查询使用新Schema
- 测试现有功能
4. **餈鞱<EFBFBD>瘚贝<EFBFBD>** <20>?閫<><EFBFBD>?
4. **运行测试** → 见任务8
- 测试AI智能问答
- 瘚贝<EFBFBD><EFBFBD><EFBFBD>摨枏<EFBFBD><EFBFBD>?
- 测试知识库功能
---
## 📞 获取帮助
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
1. **<2A><EFBFBD><E4BAA6><EFBFBD>** - psql隡朞<E99AA1><E69C9E>箄祕蝏<E7A595><E89D8F><EFBFBD><EFBFBD>靽⊥<E99DBD><E28AA5><EFBFBD>霂?2. **璉<><E79289><EFBFBD>獢?* - <20><><EFBFBD>?`09-<2D><EFBFBD>摰墧鴌/01-Schema<6D>𠉛氖<F0A0899B><EFBFBD>霈曇恣嚗?0銝迎<E98A9D>.md`
如果遇到问题:
1. **查看日志** - psql会输出详细的执行信息和错误
2. **检查文档** - 参考 `09-架构实施/01-Schema隔离架构设计10个.md`
3. **验证数据** - 运行 `005-validate-all.sql`
---
**创建人:** AI助手
**最后更新:** 2025-11-09
**<EFBFBD><EFBFBD>𧋦嚗?* V1.0
**版本:** V1.0
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>艙嚗𡁜虾<EFBFBD><EFBFBD><EFBFBD><EFBFBD> + 鈭见𦛚靽脲擪 + 摰峕㟲撉諹<E69289> = 摰匧<E691B0><EFBFBD>宏** 潃鐥<E6BD83>潃?
**核心理念:可重复执行 + 事务保护 + 完整验证 = 安全迁移** ⭐⭐⭐