- Implement 5 core API endpoints (create task, get progress, get results, update decision, export Excel) - Add FulltextScreeningController with Zod validation (652 lines) - Implement ExcelExporter service with 4-sheet report generation (352 lines) - Register routes under /api/v1/asl/fulltext-screening - Create 31 REST Client test cases - Add automated integration test script - Fix PDF extraction fallback mechanism in LLM12FieldsService - Update API design documentation to v3.0 - Update development plan to v1.2 - Create Day 5 development record - Clean up temporary test files
517 lines
14 KiB
Markdown
517 lines
14 KiB
Markdown
# [AI对接] ADMIN快速上下文
|
||
|
||
> **阅读时间:** 5分钟 | **Token消耗:** ~2000 tokens
|
||
> **层级:** L2 | **优先级:** P1
|
||
> **前置阅读:** 03-业务模块/[AI对接] 业务模块快速上下文.md
|
||
|
||
---
|
||
|
||
## 📋 模块定位
|
||
|
||
**运营管理端是SaaS商业模式的运营基础,管理用户、权限、LLM模型、成本等15个功能模块。**
|
||
|
||
**商业价值:** ⭐⭐⭐⭐⭐ SaaS运营必备
|
||
**开发状态:** ⏳ 规划中(P1优先级)
|
||
**依赖能力:** 平台基础层(UAM、监控日志)、LLM网关
|
||
|
||
---
|
||
|
||
## 🎯 核心功能(15个模块)
|
||
|
||
### P0优先级(4个)⭐ 最核心
|
||
|
||
| 模块 | 功能 | 商业价值 |
|
||
|------|------|---------|
|
||
| **用户管理** | 用户CRUD、套餐管理、禁用/启用 | 基础运营 |
|
||
| **Feature Flag管理** | 功能开关配置、版本权限控制 | 商业模式基础 |
|
||
| **LLM模型管理** | 模型配置、价格管理、可用性控制 | 成本控制 |
|
||
| **系统配置** | 全局配置、环境切换、参数管理 | 系统运维 |
|
||
|
||
---
|
||
|
||
### P1优先级(8个)
|
||
|
||
| 模块 | 功能 | 说明 |
|
||
|------|------|------|
|
||
| **Prompt管理** | 智能体Prompt模板管理 | 提高AI效果 |
|
||
| **监控与日志** | 操作日志查询、错误监控 | 运维支持 |
|
||
| **成本分析** | LLM成本统计、用户消费排行 | 成本优化 |
|
||
| **数据报表** | 用户活跃度、功能使用率 | 运营决策 |
|
||
| **业务数据管理** | 文献项目、知识库等业务数据查看 | 运营支持 |
|
||
| **审核管理** | 稿件审查任务管理(RVW模块) | 业务支持 |
|
||
| **系统监控** | 服务健康度、API响应时间 | 技术运维 |
|
||
| **备份管理** | 数据备份、恢复 | 数据安全 |
|
||
|
||
---
|
||
|
||
### P2优先级(3个)
|
||
|
||
| 模块 | 功能 |
|
||
|------|------|
|
||
| **租户管理** | SaaS多租户管理(高级功能) |
|
||
| **公告管理** | 系统公告发布 |
|
||
| **帮助文档** | 在线帮助文档管理 |
|
||
|
||
---
|
||
|
||
## 🏗️ 技术架构
|
||
|
||
### 前端(React)
|
||
```
|
||
src/pages/Admin/
|
||
├── Dashboard/ # 首页仪表盘
|
||
├── Users/ # 用户管理 ⭐ P0
|
||
│ ├── UserList.tsx
|
||
│ ├── UserDetail.tsx
|
||
│ └── UserEdit.tsx
|
||
├── FeatureFlags/ # Feature Flag管理 ⭐ P0
|
||
│ ├── FlagList.tsx
|
||
│ └── FlagConfig.tsx
|
||
├── LLM/ # LLM模型管理 ⭐ P0
|
||
│ ├── ModelList.tsx
|
||
│ ├── ModelConfig.tsx
|
||
│ └── CostAnalysis.tsx
|
||
├── Prompts/ # Prompt管理 P1
|
||
├── Logs/ # 日志查询 P1
|
||
├── Reports/ # 数据报表 P1
|
||
└── Settings/ # 系统配置 ⭐ P0
|
||
```
|
||
|
||
### 后端(Node.js)
|
||
```
|
||
backend/src/modules/admin/
|
||
├── controllers/
|
||
│ ├── userController.ts # 用户管理 ⭐
|
||
│ ├── featureFlagController.ts # Feature Flag ⭐
|
||
│ ├── llmController.ts # LLM模型管理 ⭐
|
||
│ ├── promptController.ts
|
||
│ ├── logController.ts
|
||
│ └── reportController.ts
|
||
├── services/
|
||
│ ├── userService.ts
|
||
│ ├── featureFlagService.ts
|
||
│ ├── llmService.ts
|
||
│ └── reportService.ts
|
||
└── routes/
|
||
└── adminRoutes.ts
|
||
```
|
||
|
||
### 数据库(platform_schema)
|
||
```sql
|
||
-- 已有表
|
||
- users # 用户基础信息
|
||
- roles # 角色
|
||
- permissions # 权限
|
||
- feature_flags # Feature Flag配置
|
||
- user_feature_flags # 用户Feature Flag关联
|
||
- llm_usage # LLM使用记录
|
||
- llm_quotas # LLM配额
|
||
- admin_logs # 管理员操作日志
|
||
|
||
-- 需要新增
|
||
- llm_models # LLM模型配置 ⭐ P0
|
||
- prompt_templates # Prompt模板 P1
|
||
- system_configs # 系统配置 ⭐ P0
|
||
- announcements # 系统公告 P2
|
||
```
|
||
|
||
---
|
||
|
||
## 💡 核心业务流程
|
||
|
||
### 1. Feature Flag配置流程 ⭐⭐⭐⭐⭐
|
||
|
||
```
|
||
1. ADMIN在管理端配置Feature Flag
|
||
- 功能名称:claude_access
|
||
- 描述:是否可以使用Claude模型
|
||
- 默认值:false
|
||
↓
|
||
2. 为不同套餐配置不同的Feature Flag
|
||
- 专业版:只有 deepseek_access
|
||
- 高级版:deepseek_access + qwen3_access
|
||
- 旗舰版:全部模型访问权限
|
||
↓
|
||
3. 用户升级套餐时,自动更新Feature Flag
|
||
↓
|
||
4. 业务模块(ASL、AIA等)调用LLM网关时,自动检查Feature Flag
|
||
```
|
||
|
||
**关键表结构:**
|
||
```sql
|
||
-- Feature Flag定义
|
||
CREATE TABLE platform_schema.feature_flags (
|
||
id SERIAL PRIMARY KEY,
|
||
flag_key VARCHAR(100) UNIQUE NOT NULL, -- 'claude_access'
|
||
flag_name VARCHAR(200) NOT NULL, -- 'Claude模型访问权限'
|
||
description TEXT,
|
||
default_value BOOLEAN DEFAULT FALSE,
|
||
created_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
|
||
-- 用户Feature Flag(覆盖默认值)
|
||
CREATE TABLE platform_schema.user_feature_flags (
|
||
id SERIAL PRIMARY KEY,
|
||
user_id INTEGER REFERENCES platform_schema.users(id),
|
||
flag_id INTEGER REFERENCES platform_schema.feature_flags(id),
|
||
value BOOLEAN NOT NULL,
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
|
||
UNIQUE(user_id, flag_id)
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
### 2. LLM模型管理流程 ⭐⭐⭐⭐
|
||
|
||
```
|
||
1. ADMIN配置LLM模型
|
||
- 模型名称:DeepSeek-V3
|
||
- API Key
|
||
- 价格:¥1/百万tokens
|
||
- 是否启用
|
||
↓
|
||
2. LLM网关根据配置调用模型
|
||
↓
|
||
3. 记录每次调用的成本
|
||
↓
|
||
4. ADMIN查看成本分析报表
|
||
- 总成本
|
||
- 各模型成本占比
|
||
- 用户消费排行
|
||
```
|
||
|
||
**关键表结构:**
|
||
```sql
|
||
CREATE TABLE platform_schema.llm_models (
|
||
id SERIAL PRIMARY KEY,
|
||
model_key VARCHAR(50) UNIQUE NOT NULL, -- 'deepseek-v3'
|
||
model_name VARCHAR(100) NOT NULL, -- 'DeepSeek-V3'
|
||
provider VARCHAR(50), -- 'deepseek', 'openai', 'anthropic'
|
||
api_endpoint TEXT,
|
||
api_key_encrypted TEXT, -- 加密存储
|
||
price_per_million_tokens DECIMAL(10, 6), -- 每百万tokens价格
|
||
is_enabled BOOLEAN DEFAULT TRUE,
|
||
created_at TIMESTAMP DEFAULT NOW(),
|
||
updated_at TIMESTAMP DEFAULT NOW()
|
||
);
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 用户管理流程
|
||
|
||
```
|
||
1. ADMIN创建用户
|
||
- 基础信息(姓名、邮箱等)
|
||
- 选择套餐(professional/premium/enterprise)
|
||
- 自动配置对应的Feature Flag
|
||
↓
|
||
2. ADMIN管理用户
|
||
- 修改套餐(Feature Flag自动更新)
|
||
- 禁用/启用账号
|
||
- 重置密码
|
||
- 调整LLM配额
|
||
↓
|
||
3. ADMIN查看用户详情
|
||
- 基础信息
|
||
- LLM使用统计
|
||
- 功能使用记录
|
||
- 文献项目、知识库等业务数据
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 核心API端点
|
||
|
||
### 用户管理 ⭐ P0
|
||
```
|
||
GET /api/v1/admin/users # 用户列表(分页、筛选)
|
||
GET /api/v1/admin/users/:id # 用户详情
|
||
POST /api/v1/admin/users # 创建用户
|
||
PUT /api/v1/admin/users/:id # 更新用户
|
||
DELETE /api/v1/admin/users/:id # 删除用户
|
||
POST /api/v1/admin/users/:id/disable # 禁用用户
|
||
POST /api/v1/admin/users/:id/enable # 启用用户
|
||
PUT /api/v1/admin/users/:id/plan # 修改套餐
|
||
```
|
||
|
||
### Feature Flag管理 ⭐ P0
|
||
```
|
||
GET /api/v1/admin/feature-flags # Feature Flag列表
|
||
POST /api/v1/admin/feature-flags # 创建Feature Flag
|
||
PUT /api/v1/admin/feature-flags/:id # 更新Feature Flag
|
||
DELETE /api/v1/admin/feature-flags/:id # 删除Feature Flag
|
||
GET /api/v1/admin/users/:id/flags # 查询用户Feature Flag
|
||
PUT /api/v1/admin/users/:id/flags # 更新用户Feature Flag
|
||
```
|
||
|
||
### LLM模型管理 ⭐ P0
|
||
```
|
||
GET /api/v1/admin/llm/models # 模型列表
|
||
POST /api/v1/admin/llm/models # 添加模型
|
||
PUT /api/v1/admin/llm/models/:id # 更新模型
|
||
DELETE /api/v1/admin/llm/models/:id # 删除模型
|
||
GET /api/v1/admin/llm/usage # LLM使用统计
|
||
GET /api/v1/admin/llm/cost-analysis # 成本分析
|
||
```
|
||
|
||
### Prompt管理 P1
|
||
```
|
||
GET /api/v1/admin/prompts # Prompt模板列表
|
||
POST /api/v1/admin/prompts # 创建Prompt
|
||
PUT /api/v1/admin/prompts/:id # 更新Prompt
|
||
DELETE /api/v1/admin/prompts/:id # 删除Prompt
|
||
```
|
||
|
||
### 日志查询 P1
|
||
```
|
||
GET /api/v1/admin/logs # 日志列表(分页、筛选)
|
||
GET /api/v1/admin/logs/errors # 错误日志
|
||
GET /api/v1/admin/logs/operations # 操作日志
|
||
```
|
||
|
||
### 数据报表 P1
|
||
```
|
||
GET /api/v1/admin/reports/overview # 总览数据
|
||
GET /api/v1/admin/reports/users # 用户活跃度
|
||
GET /api/v1/admin/reports/features # 功能使用率
|
||
GET /api/v1/admin/reports/llm # LLM使用统计
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 核心页面设计
|
||
|
||
### 1. 仪表盘(Dashboard)
|
||
**核心指标:**
|
||
- 总用户数 / 活跃用户数
|
||
- 本月LLM调用次数 / 成本
|
||
- 各模块使用率
|
||
- 错误日志数量
|
||
|
||
### 2. 用户管理
|
||
**功能:**
|
||
- 列表:搜索、筛选(套餐、状态)、排序
|
||
- 详情:基础信息 + 使用统计 + 业务数据
|
||
- 编辑:修改套餐、调整配额、禁用/启用
|
||
|
||
### 3. Feature Flag管理 ⭐
|
||
**核心界面:**
|
||
```
|
||
┌─────────────────────────────────────────┐
|
||
│ Feature Flag管理 │
|
||
├─────────────────────────────────────────┤
|
||
│ [+ 新增Flag] │
|
||
│ │
|
||
│ Flag Key | 描述 | 默认值 │
|
||
│─────────────────────────────────────────│
|
||
│ claude_access | Claude访问 | ❌ │
|
||
│ qwen3_access | Qwen3访问 | ❌ │
|
||
│ deepseek_access | DeepSeek访问| ✅ │
|
||
│─────────────────────────────────────────│
|
||
│ │
|
||
│ 套餐配置: │
|
||
│ 专业版:deepseek_access │
|
||
│ 高级版:deepseek_access, qwen3_access │
|
||
│ 旗舰版:全部模型 │
|
||
└─────────────────────────────────────────┘
|
||
```
|
||
|
||
### 4. LLM成本分析 ⭐
|
||
**核心图表:**
|
||
- 成本趋势图(按天)
|
||
- 模型成本占比(饼图)
|
||
- 用户消费排行(柱状图)
|
||
- 模块使用分布(饼图)
|
||
|
||
---
|
||
|
||
## ⚠️ 关键技术难点
|
||
|
||
### 1. API Key安全存储
|
||
**解决方案:** AES-256加密
|
||
```typescript
|
||
import crypto from 'crypto';
|
||
|
||
const ENCRYPTION_KEY = process.env.ENCRYPTION_KEY; // 32字节
|
||
const IV_LENGTH = 16;
|
||
|
||
function encrypt(text: string): string {
|
||
const iv = crypto.randomBytes(IV_LENGTH);
|
||
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
|
||
let encrypted = cipher.update(text);
|
||
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
||
return iv.toString('hex') + ':' + encrypted.toString('hex');
|
||
}
|
||
|
||
function decrypt(text: string): string {
|
||
const parts = text.split(':');
|
||
const iv = Buffer.from(parts[0], 'hex');
|
||
const encrypted = Buffer.from(parts[1], 'hex');
|
||
const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
|
||
let decrypted = decipher.update(encrypted);
|
||
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
||
return decrypted.toString();
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 2. 权限控制
|
||
**ADMIN角色:**
|
||
- 超级管理员:全部权限
|
||
- 运营管理员:用户管理、报表查看
|
||
- 技术管理员:LLM模型管理、日志查询
|
||
|
||
```typescript
|
||
// 权限检查中间件
|
||
async function checkAdminPermission(req, reply, permission: string) {
|
||
const user = req.user;
|
||
|
||
if (!user.isAdmin) {
|
||
throw new UnauthorizedError('需要管理员权限');
|
||
}
|
||
|
||
const hasPermission = await permissionService.check(user.id, permission);
|
||
|
||
if (!hasPermission) {
|
||
throw new ForbiddenError('权限不足');
|
||
}
|
||
}
|
||
|
||
// 使用
|
||
app.get('/api/v1/admin/users', {
|
||
preHandler: checkAdminPermission('user:read')
|
||
}, userController.list);
|
||
```
|
||
|
||
---
|
||
|
||
### 3. 数据报表性能优化
|
||
**问题:** 大数据量查询慢
|
||
|
||
**解决方案:**
|
||
- Redis缓存(5分钟)
|
||
- 数据预聚合(定时任务)
|
||
- 分页查询
|
||
|
||
```typescript
|
||
// 缓存报表数据
|
||
async function getOverviewReport() {
|
||
const cacheKey = 'admin:report:overview';
|
||
|
||
// 先查缓存
|
||
const cached = await redis.get(cacheKey);
|
||
if (cached) return JSON.parse(cached);
|
||
|
||
// 查询数据库
|
||
const data = await db.query(`
|
||
SELECT
|
||
COUNT(DISTINCT user_id) as total_users,
|
||
SUM(total_tokens) as total_tokens,
|
||
SUM(cost) as total_cost
|
||
FROM platform_schema.llm_usage
|
||
WHERE created_at >= date_trunc('month', NOW())
|
||
`);
|
||
|
||
// 缓存5分钟
|
||
await redis.set(cacheKey, JSON.stringify(data), 'EX', 300);
|
||
|
||
return data;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📅 开发计划
|
||
|
||
### Phase 1:P0核心功能(Week 1-2)
|
||
- **用户管理**(3天)
|
||
- Day 1: 后端API(CRUD)
|
||
- Day 2: 前端列表和详情
|
||
- Day 3: 套餐管理、禁用/启用
|
||
|
||
- **Feature Flag管理**(2天)
|
||
- Day 1: 后端API + 数据库
|
||
- Day 2: 前端配置界面
|
||
|
||
- **LLM模型管理**(2天)
|
||
- Day 1: 后端API + 加密存储
|
||
- Day 2: 前端配置界面
|
||
|
||
- **系统配置**(1天)
|
||
|
||
### Phase 2:P1功能(Week 3-4)
|
||
- Prompt管理(2天)
|
||
- 日志查询(2天)
|
||
- 成本分析报表(3天)
|
||
- 数据报表(3天)
|
||
|
||
### Phase 3:P2功能(Week 5)
|
||
- 租户管理
|
||
- 公告管理
|
||
- 帮助文档
|
||
|
||
---
|
||
|
||
## ✅ 开发检查清单
|
||
|
||
**开始前确认:**
|
||
- [ ] ADMIN角色和权限已配置
|
||
- [ ] 数据库表已创建(llm_models, system_configs等)
|
||
- [ ] Redis已部署(用于报表缓存)
|
||
- [ ] ENCRYPTION_KEY环境变量已配置
|
||
|
||
**P0功能完成标准:**
|
||
- [ ] ADMIN可以创建/编辑/删除用户
|
||
- [ ] ADMIN可以配置Feature Flag
|
||
- [ ] ADMIN可以配置LLM模型
|
||
- [ ] ADMIN可以查看LLM成本统计
|
||
- [ ] 所有敏感操作都记录到admin_logs
|
||
|
||
---
|
||
|
||
## 🔗 相关文档
|
||
|
||
**依赖:**
|
||
- [用户与权限中心(UAM)](../../01-平台基础层/01-用户与权限中心(UAM)/README.md)
|
||
- [LLM大模型网关](../../02-通用能力层/01-LLM大模型网关/README.md)
|
||
- [监控与日志](../../01-平台基础层/04-监控与日志/README.md)
|
||
|
||
**详细设计:**
|
||
- [运营管理端完整设计](./README.md)
|
||
|
||
---
|
||
|
||
**最后更新:** 2025-11-06
|
||
**维护人:** 技术架构师
|
||
**优先级:** P1
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|