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,19 +1,28 @@
# <EFBFBD><EFBFBD> 蝏蹱鰵AI<41><EFBFBD><E68B87><EFBFBD><EFBFBD><E7BFB0><EFBFBD><EFBFBD>?
> **<2A>湔鰵<E6B994>園𡢿嚗?* 2026-01-12
> **敶枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>** <20>?Phase 3.5.5 隞<><E99A9E><EFBFBD><EFBFBD>惩歇摰峕<E691B0><EFBFBD><E59A97>蝡臬<E89DA1>蝡舀<E89DA1>霂?
# 🚀 给新AI助手的快速指南
> **更新时间:** 2026-01-12
> **当前状态:** ✅ Phase 3.5.5 代码改造已完成,待端到端测试
---
## <EFBFBD>?30蝘雴<E89D98><EFBFBD><E996AB><EFBFBD>滨𠶖<E6BBA8>?
## ⚡ 30秒了解当前状态
```
<EFBFBD>?Phase 3.5.1-3.5.5 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>惩歇摰峕<EFBFBD>嚗?5%嚗?<3F>?敺<><E695BA><EFBFBD><EFBFBD>蝡臬<E89DA1>蝡舀<E89DA1>霂閖<E99C82>霂?
Phase 3.5.1-3.5.5 代码改造已完成95%
⏳ 待完成:端到端测试验证
已完成:
<EFBFBD>?<3F>唳旿摨橒<E691A8>capability_schema + prompt_templates + prompt_versions
<EFBFBD>?<3F>𡒊垢嚗䥪romptService嚗?96銵䕘<E98AB5>+ 8銝服PI<50>亙藁
<EFBFBD>?<3F>滨垢嚗𡁶恣<F0A181B6><E681A3><EFBFBD><EFBFBD> + Prompt<70>𡑒” + 蝻𤥁<E89DBB><F0A4A581><EFBFBD>CodeMirror 6嚗? <20>?瘚贝<E7989A>嚗𡁜<E59A97>蝡臬<E89DA1><E887AC><EFBFBD><EFBFBD>霂訫<E99C82><E8A8AB><EFBFBD><EFBFBD>
<EFBFBD>?RVW<56><57><EFBFBD>嚗塄ditorialService + methodologyService 撌脫㺿<E884AB>𩤃<EFBFBD>2026-01-12嚗?
✅ 数据库:capability_schema + prompt_templates + prompt_versions
✅ 后端PromptService596行+ 8个API接口
✅ 前端:管理端架构 + Prompt列表 + 编辑器CodeMirror 6
✅ 测试:后端单元测试全部通过
✅ RVW集成editorialService + methodologyService 已改造2026-01-12
下一步:
<EFBFBD>?<3F>臬𢆡<E887AC>𡒊垢<F0A1928A>滚𦛚瘚贝<E7989A>
<EFBFBD>?蝡臬<E89DA1>蝡舀<E89DA1>霂閧<E99C82>摨阡<E691A8><EFBFBD><E996AB><EFBFBD>? <20>?<3F>湔鰵摰峕<E691B0>摨行<E691A8>獢?```
→ 启动后端服务测试
→ 端到端测试灰度预览功能
→ 更新完成度文档
```
---
@@ -24,30 +33,33 @@
| 文件 | 说明 | 行数 |
|------|------|------|
| `backend/src/common/prompt/prompt.service.ts` | PromptService 核心逻辑 | 596 |
| `backend/src/modules/rvw/services/editorialService.ts` | RVW 蝔輻漲霂<EFBFBD><EFBFBD>滚𦛚 <20>?撌脫㺿<E884AB>?| 83 |
| `backend/src/modules/rvw/services/methodologyService.ts` | RVW <EFBFBD><EFBFBD>摮西<EFBFBD>隡唳<EFBFBD><EFBFBD>?<3F>?撌脫㺿<E884AB>?| 83 |
| `backend/src/modules/rvw/workers/reviewWorker.ts` | RVW Worker <EFBFBD>?撌脫凒<E884AB><EFBFBD><E594AC>𠌊serId | 193 |
| `frontend-v2/src/pages/admin/PromptEditorPage.tsx` | Prompt 蝻𤥁<EFBFBD><EFBFBD>券△<EFBFBD>?| 399 |
| `backend/src/modules/rvw/services/editorialService.ts` | RVW 稿约评估服务 ✅ 已改造 | 83 |
| `backend/src/modules/rvw/services/methodologyService.ts` | RVW 方法学评估服务 ✅ 已改造 | 83 |
| `backend/src/modules/rvw/workers/reviewWorker.ts` | RVW Worker ✅ 已更新传递userId | 193 |
| `frontend-v2/src/pages/admin/PromptEditorPage.tsx` | Prompt 编辑器页面 | 399 |
### 文档(必读)
| 文档 | 内容 |
|------|------|
| `04-<EFBFBD><EFBFBD>𤏸恣<EFBFBD>?01-TODO皜<4F><E79A9C><EFBFBD>虾餈質葵嚗?md` | 霂衣<EFBFBD>隞餃𦛚皜<EFBFBD><EFBFBD>嚗?9/110 摰峕<EFBFBD>嚗车
| `04-<EFBFBD><EFBFBD>𤏸恣<EFBFBD>?02-Prompt蝞∠<EFBFBD>蝟餌<EFBFBD><EFBFBD><EFBFBD>𤏸恣<EFBFBD>?md` | 摰峕㟲撘<EFBFBD><EFBFBD>𤏸恣<EFBFBD>?|
| `04-开发计划/01-TODO清单可追踪.md` | 详细任务清单79/110 完成)|
| `04-开发计划/02-Prompt管理系统开发计划.md` | 完整开发计划 |
| `00-Phase3.5完成总结.md` | 已完成工作总结 |
---
## <EFBFBD> Phase 3.5.5 隞餃𦛚霂西圾嚗<EFBFBD><EFBFBD><><E99A9E><EFBFBD><EFBFBD>惩歇摰峕<E691B0> 2026-01-12嚗?
### <20>?隞餃𦛚 1嚗𡁏㺿<F0A1818F>?editorialService.ts - 撌脣<E6928C><E884A3>?
## 🎯 Phase 3.5.5 任务详解(✅ 代码改造已完成 2026-01-12
### ✅ 任务 1改造 editorialService.ts - 已完成
**改造前**(文件读取)
```typescript
const PROMPT_PATH = path.join(__dirname, '../../../../prompts/review_editorial_system.txt');
const prompt = fs.readFileSync(PROMPT_PATH, 'utf-8');
```
**<EFBFBD><EFBFBD><EFBFBD>**嚗㇊romptService嚗?```typescript
**改造后**PromptService
```typescript
import { prisma } from '../../../config/database.js';
import { getPromptService } from '../../../common/prompt/index.js';
@@ -59,28 +71,34 @@ if (isDraft) {
}
```
### <EFBFBD>?隞餃𦛚 2嚗𡁏㺿<F0A1818F>?methodologyService.ts - 撌脣<EFBFBD><EFBFBD>?
### ✅ 任务 2改造 methodologyService.ts - 已完成
**改造后**
```typescript
const { content: systemPrompt, isDraft } = await promptService.get('RVW_METHODOLOGY', {}, { userId });
```
### <EFBFBD>?隞餃𦛚 3嚗𡁏凒<F0A1818F>?reviewWorker.ts - 撌脣<EFBFBD><EFBFBD>?
**<2A><EFBFBD><EFBFBD>** - 隡𣳇<E99AA1>?userId <20><EFBFBD><E88880>啣漲憸<E6BCB2><E686B8>
### ✅ 任务 3更新 reviewWorker.ts - 已完成
**改造后** - 传递 userId 支持灰度预览
```typescript
// <EFBFBD>?Phase 3.5.5: 隡𣳇<EFBFBD>?userId <EFBFBD><EFBFBD><EFBFBD>啣漲憸<EFBFBD><EFBFBD>
// Phase 3.5.5: 传递 userId 支持灰度预览
editorialResult = await reviewEditorialStandards(extractedText, modelType, userId);
methodologyResult = await reviewMethodology(extractedText, modelType, userId);
```
### <EFBFBD>?隞餃𦛚 4嚗𡁶垢<F0A181B6>啁垢瘚贝<E7989A> - 敺<><E695BA>霂?
### ⏳ 任务 4端到端测试 - 待验证
**测试步骤**
1. <20><EFBFBD> Prompt撌亦<EFBFBD><EFBFBD><EFBFBD>`13800000002` / `123456`嚗?2. 餈𥕦<E9A488> `/admin/prompts`
3. 蝻𤥁<E89DBB> `RVW_EDITORIAL`嚗䔶耨<E494B6><EFBFBD><EFBFBD><E686AD>摰對<E691B0><EFBFBD><EFBFBD>?瘚贝<E7989A>"嚗?4. 靽嘥<E99DBD><E598A5>厩阮
1. 登录 Prompt工程师(`13800000002` / `123456`
2. 进入 `/admin/prompts`
3. 编辑 `RVW_EDITORIAL`,修改一处内容(如添加"测试"
4. 保存草稿
5. 开启调试模式,选择 RVW 模块
6. 切换到业务端 `/rvw`
7. 銝𠹺<E98A9D><EFBFBD>銝芣<E98A9D><EFBFBD><E78DA2><EFBFBD><EFBFBD>摰⊥䰻蝏𤘪<E89D8F><F0A498AA>臬炏雿輻鍂鈭<E98D82><EFBFBD><EFBFBD><E5ADB5>?Prompt
8. 撉諹<E69289><E8ABB9><EFBFBD>𡁶鍂<F0A181B6><EFBFBD>雿輻鍂<E8BCBB><EFBFBD><E68A92>?
7. 上传一个文档,查看审查结果是否使用了修改后的 Prompt
8. 验证普通用户仍使用旧版本
---
## 🔑 关键代码示例
@@ -111,7 +129,8 @@ const llmResponse = await llm.chat(messages, {
### 调试模式 API
```typescript
// 撘<><E69298><EFBFBD>霂𤏪<E99C82><F0A48FAA><EFBFBD>霂?RVW嚗?POST /api/admin/prompts/debug
// 开启调试(只调试 RVW
POST /api/admin/prompts/debug
{
"modules": ["RVW"],
"enabled": true
@@ -127,9 +146,10 @@ POST /api/admin/prompts/debug
---
## <EFBFBD><EFBFBD>儭?<3F><EFBFBD>靽⊥<E99DBD>
## 🛠️ 环境信息
### 数据库
### <20>唳旿摨?
```
Host: localhost
Port: 5432
@@ -150,30 +170,32 @@ Password: postgres123
```
端口: 3000
启动: cd frontend-v2 && npm run dev
<EFBFBD><EFBFBD>: /api -> http://localhost:3001 (撌脤<EFBFBD>蝵?
代理: /api -> http://localhost:3001 (已配置)
```
---
## ⚠️ 常见问题
### 1. Prisma Client <EFBFBD><EFBFBD><EFBFBD>?prompt_templates
### 1. Prisma Client 找不到 prompt_templates
**<EFBFBD><EFBFBD>**嚗朞<E59A97>銵?`npx prisma generate`
**解决**:运行 `npx prisma generate`
### 2. 前端调用 API 401
**解决**检查是否已登录JWT Token 是否有效
### 3. CodeMirror 銝齿遬蝷?
**閫<><E996AB>**嚗𡁏<E59A97><F0A1818F>交糓<E4BAA4><EFBFBD><EFBFBD><E98B86> `codemirror` <20>?`@codemirror/*` 靘肽<E99D98>
### 3. CodeMirror 不显示
**解决**:检查是否安装了 `codemirror``@codemirror/*` 依赖
---
## 📞 联系信息
<EFBFBD><EFBFBD><EFBFBD>煾䔮嚗諹窈<EFBFBD>仿<EFBFBD>嚗?- <20><><EFBFBD>航挽霈∴<E99C88>`02-<2D><><EFBFBD>航挽霈?03-Prompt蝞∠<E89D9E>蝟餌<E89D9F>敹恍<E695B9><EFBFBD><E7AC94>?md`
- 撘<><E69298>𤏸<EFBFBD><F0A48FB8><EFBFBD><EFBFBD>`../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?`
如有疑问,请查阅:
- 技术设计:`02-技术设计/03-Prompt管理系统快速参考.md`
- 开发规范:`../../04-开发规范/`
---