# 核心业务规则总览

> **版本：** v1.0  
> **创建日期：** 2025-10-10  
> **适用范围：** 整个系统

---

## 📋 目录

1. [用户管理规则](#用户管理规则)
2. [项目管理规则](#项目管理规则)
3. [智能体管理规则](#智能体管理规则)
4. [对话管理规则](#对话管理规则)
5. [知识库管理规则](#知识库管理规则)
6. [权限控制规则](#权限控制规则)
7. [配额限制规则](#配额限制规则)

---

## 用户管理规则

### 注册规则

**BR-U001: 邮箱唯一性**
- 规则：每个邮箱只能注册一个账号
- 验证时机：注册时
- 错误提示："该邮箱已被注册"

**BR-U002: 邮箱格式验证**
- 规则：必须是有效的邮箱格式
- 正则：`^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$`
- 错误提示："邮箱格式不正确"

**BR-U003: 密码强度**
- 规则：密码至少8位，包含字母和数字
- 正则：`^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$`
- 错误提示："密码至少8位，需包含字母和数字"

**BR-U004: 默认试用期**
- 规则：新用户默认获得30天试用期
- 实现：`trial_ends_at = now() + 30天`

### 登录规则

**BR-U005: 账户状态检查**
- 规则：只有status=active的用户可以登录
- 状态：
  - `active` - 可登录
  - `inactive` - 未激活，不可登录
  - `suspended` - 已暂停，不可登录

**BR-U006: 密码错误次数限制**
- 规则：5分钟内最多5次错误尝试
- 超过次数：临时锁定账户15分钟
- 实现：使用Redis记录失败次数

**BR-U007: JWT Token有效期**
- Access Token：7天
- Refresh Token：30天
- 过期后需要重新登录

---

## 项目管理规则

### 创建规则

**BR-P001: 项目数量无限制**
- 规则：用户可以创建任意数量的项目
- 理由：项目是核心功能，不应限制

**BR-P002: 项目名称必填**
- 规则：项目名称不能为空
- 长度：1-200字符
- 错误提示："项目名称不能为空"

**BR-P003: 项目描述必填**
- 规则：项目描述不能为空（用于上下文注入）
- 最小长度：10字符
- 错误提示："请输入项目背景信息，至少10个字符"

### 更新规则

**BR-P004: 项目背景动态更新**
- 规则：用户可以随时编辑项目描述
- 规则：可以"固定"AI回复到项目描述中
- 实现：追加到description字段末尾

**BR-P005: 项目所有权验证**
- 规则：只能修改/删除自己的项目
- 验证：`project.userId === currentUser.id`
- 错误提示："无权限操作该项目"

### 删除规则

**BR-P006: 级联删除**
- 规则：删除项目时，级联删除其所有对话和消息
- 实现：数据库ON DELETE CASCADE
- 确认：前端需要二次确认

**BR-P007: 软删除（可选）**
- 规则：重要项目可以先软删除，保留30天
- 实现：添加deleted_at字段
- 备注：当前版本暂不实现

---

## 智能体管理规则

### 智能体配置

**BR-A001: 智能体配置化管理**
- 规则：智能体配置存储在`config/agents.yaml`
- 规则：不通过数据库管理
- 规则：修改配置后需要重启服务

**BR-A002: 智能体状态**
- `active` - 可用，用户可以选择
- `inactive` - 不可用，隐藏
- `testing` - 测试中，仅管理员可见

**BR-A003: 智能体分类**
- 选题阶段：选题评价、科学问题梳理
- 研究设计：PICOS构建、观察指标设计、CRF制定、样本量计算、临床研究方案撰写
- 论文阶段：论文润色、论文翻译、方法学评审、期刊方法学评审、期刊稿约评审

### Prompt管理

**BR-A004: Prompt文件管理**
- 规则：Prompt存储在`backend/prompts/`目录
- 命名：`{agent_id}_system.txt` 和 `{agent_id}_user.txt`
- 版本：通过Git管理版本

**BR-A005: Prompt变量注入**
- 规则：Prompt中可以使用变量
- 格式：`{variable_name}`
- 示例：`{project_description}`, `{user_question}`

### 模型配置

**BR-A006: 模型参数配置**
- 规则：每个智能体可以配置不同模型的参数
- 参数：
  - `temperature`: 0.0-1.0
  - `max_tokens`: 最大输出token数
  - `top_p`: 0.0-1.0

**BR-A007: 模型切换**
- 规则：用户可以在对话中切换模型
- 可选模型：
  - `deepseek-v3` (默认)
  - `qwen3-72b`
  - `gemini-2.0-flash` (可选)

---

## 对话管理规则

### 创建对话

**BR-C001: 对话归属**
- 规则：对话可以属于项目，也可以是全局快速问答
- 项目对话：`projectId` 不为null
- 全局快速问答：`projectId` 为null

**BR-C002: 对话标题自动生成**
- 规则：首次创建对话时，标题为"与{智能体名称}的对话"
- 规则：可以手动修改标题

### 上下文管理

**BR-C003: 项目背景自动注入**
- 规则：如果对话属于项目，自动将项目description注入上下文
- 注入位置：System prompt之后
- 格式：`# 项目背景\n{project.description}`

**BR-C004: 历史对话管理**
- 规则：保留最近10轮对话作为上下文
- 规则：超过10轮的对话，进行摘要压缩
- Token限制：上下文总token数不超过6000

**BR-C005: 知识库引用**
- 规则：用户可以通过`@知识库名称`引用知识库
- 规则：最多同时引用3个知识库
- 检索数量：每个知识库检索Top 5结果

### 消息固定

**BR-C006: 固定消息到项目背景**
- 规则：只有AI回复可以被固定
- 规则：只有项目内对话可以固定（全局对话不可）
- 实现：追加到project.description末尾
- 格式：
  ```
  --- 来自对话的补充 ---
  {message.content}
  ```

**BR-C007: 固定消息标记**
- 规则：被固定的消息，isPinned字段设为true
- 规则：固定后不可取消（简化实现）

### 流式输出

**BR-C008: Server-Sent Events**
- 规则：使用SSE实现流式输出
- 事件类型：
  - `start`: 开始生成
  - `token`: 每个token
  - `done`: 完成
  - `error`: 错误

**BR-C009: 流式输出超时**
- 规则：单个请求最长60秒
- 超时后：返回已生成的内容
- 错误提示："生成超时，请重试"

---

## 知识库管理规则

### 数量限制

**BR-K001: 知识库数量限制**
- 规则：每个用户最多创建3个知识库
- 验证时机：创建知识库时
- 错误提示："已达到知识库数量上限（3个）"

**BR-K002: 文档数量限制**
- 规则：每个知识库最多上传50个文档
- 验证时机：上传文档时
- 错误提示："该知识库文档数量已达上限（50个）"

### 文档上传

**BR-K003: 文件格式限制**
- 规则：只支持PDF和DOCX格式
- MIME类型：
  - `application/pdf`
  - `application/vnd.openxmlformats-officedocument.wordprocessingml.document`
- 错误提示："仅支持PDF和DOCX格式"

**BR-K004: 文件大小限制**
- 规则：单个文件最大50MB
- 验证时机：上传前（前端）和上传后（后端）
- 错误提示："文件大小超过限制（最大50MB）"

**BR-K005: 文件名唯一性**
- 规则：同一知识库内，文件名不能重复
- 验证：检查是否已存在同名文件
- 处理：自动重命名（添加时间戳）

### 文档处理

**BR-K006: 文档处理状态**
- 状态流转：
  1. `uploading` - 上传中
  2. `processing` - Dify处理中
  3. `completed` - 处理完成
  4. `failed` - 处理失败

**BR-K007: 处理失败重试**
- 规则：处理失败的文档不自动重试
- 规则：用户可以删除后重新上传
- 错误信息：记录在error_message字段

**BR-K008: 异步处理**
- 规则：文档上传后立即返回
- 规则：后台异步提交到Dify处理
- 规则：前端轮询获取处理状态

### 知识库检索

**BR-K009: 混合检索**
- 规则：使用关键词检索 + 语义检索
- 规则：启用Reranking重排序
- Top K：5个结果
- 相似度阈值：0.5

**BR-K010: 检索结果引用**
- 规则：AI回答必须注明引用来源
- 格式：`[文档名] 内容...`
- 规则：前端显示可点击的引用标记

---

## 权限控制规则

### 用户权限

**BR-P001: 角色定义**
- `user` - 普通用户
  - 可以使用所有功能
  - 受配额限制
- `admin` - 管理员
  - 所有user权限
  - 可以访问运营后台
  - 可以查看所有用户数据

### 数据隔离

**BR-P002: 用户数据隔离**
- 规则：用户只能访问自己创建的数据
- 验证：所有查询必须包含userId过滤
- 实现：
  ```sql
  WHERE user_id = currentUser.id
  ```

**BR-P003: 项目权限验证**
- 规则：修改/删除项目前，验证所有权
- 实现：
  ```typescript
  const project = await prisma.project.findFirst({
    where: { id: projectId, userId: currentUser.id }
  })
  if (!project) throw new UnauthorizedError()
  ```

### 管理员权限

**BR-P004: 用户管理权限**
- 规则：只有admin可以查看用户列表
- 规则：只有admin可以修改用户状态
- 规则：admin不能删除用户（只能暂停）

**BR-P005: 对话查看权限**
- 规则：只有admin可以查看用户对话
- 规则：必须记录审计日志
- 规则：敏感信息需要脱敏（如邮箱、手机号）

---

## 配额限制规则

### 知识库配额

**BR-Q001: 知识库数量配额**
- 默认配额：3个知识库
- 记录字段：`users.kb_quota`, `users.kb_used`
- 更新时机：创建/删除知识库时

**BR-Q002: 文档数量配额**
- 默认配额：50个文档/知识库
- 检查时机：上传文档前
- 实现：
  ```sql
  SELECT COUNT(*) FROM documents 
  WHERE kb_id = ? AND status != 'failed'
  ```

### 存储配额（预留）

**BR-Q003: 存储空间配额**
- 默认配额：1GB/用户
- 当前版本：不强制限制
- 未来：可以根据实际需求启用

### API限流

**BR-Q004: API请求频率限制**
- 普通用户：100次/分钟
- 管理员：500次/分钟
- 实现：使用Redis + 滑动窗口算法

**BR-Q005: 登录接口限流**
- 规则：5次/分钟
- 规则：IP和账户双重限制
- 超过后：临时封禁15分钟

---

## 业务流程

### 完整的对话流程

```
1. 用户选择智能体
   ↓
2. 创建对话（可选关联项目）
   ↓
3. 用户发送消息（可选引用知识库）
   ↓
4. 后端组装上下文：
   - 项目背景（如有）
   - 智能体System Prompt
   - 历史对话（最近10轮）
   - 知识库检索结果（如有）
   - 当前用户问题
   ↓
5. 调用LLM（流式输出）
   ↓
6. 保存消息到数据库
   ↓
7. 用户可选：固定消息到项目背景
```

### 知识库文档处理流程

```
1. 用户上传文档
   ↓
2. 验证：
   - 文件格式
   - 文件大小
   - 数量限制
   ↓
3. 上传到对象存储（OSS）
   ↓
4. 创建document记录（status: uploading）
   ↓
5. 异步提交到Dify：
   - 调用Dify上传API
   - 获取dify_document_id
   ↓
6. 轮询处理状态（每2秒）：
   - processing → 更新progress
   - completed → 更新status, segments_count, tokens_count
   - failed → 更新status, error_message
   ↓
7. 更新知识库统计：
   - file_count
   - total_size_bytes
```

---

## 数据一致性规则

### 统计字段更新

**BR-D001: 项目对话数统计**
- 字段：`projects.conversation_count`
- 更新时机：创建/删除对话时
- 实现：使用事务保证一致性

**BR-D002: 知识库文档数统计**
- 字段：`knowledge_bases.file_count`
- 更新时机：文档状态变为completed或删除时
- 计算：只统计status='completed'的文档

**BR-D003: 用户知识库数统计**
- 字段：`users.kb_used`
- 更新时机：创建/删除知识库时
- 验证：创建前检查是否超过quota

### 级联删除

**BR-D004: 用户删除级联**
- 规则：删除用户时，级联删除所有关联数据
- 包括：projects, conversations, messages, knowledge_bases, documents
- 实现：数据库ON DELETE CASCADE

**BR-D005: 项目删除级联**
- 规则：删除项目时，级联删除所有对话和消息
- 实现：数据库ON DELETE CASCADE

**BR-D006: 知识库删除级联**
- 规则：删除知识库时：
  1. 级联删除数据库中的documents
  2. 调用Dify API删除dataset
  3. 删除对象存储中的文件

---

## 异常处理规则

### 错误类型

**BR-E001: 业务错误**
- 验证失败：HTTP 422
- 资源不存在：HTTP 404
- 权限不足：HTTP 403
- 配额超限：HTTP 403

**BR-E002: 系统错误**
- 数据库错误：HTTP 500
- 网络错误：HTTP 503
- Dify服务错误：HTTP 503

### 错误响应

**BR-E003: 统一错误格式**
```json
{
  "success": false,
  "error": {
    "code": "QUOTA_EXCEEDED",
    "message": "知识库数量已达上限",
    "details": {
      "resource": "knowledge_base",
      "quota": 3,
      "used": 3
    }
  },
  "timestamp": "2025-10-10T10:00:00.000Z"
}
```

---

## 安全规则

### 密码安全

**BR-S001: 密码加密**
- 算法：bcrypt
- 成本因子：12
- 规则：永不存储明文密码

**BR-S002: Token安全**
- 规则：Token包含用户ID和角色
- 规则：Token签名使用JWT_SECRET
- 规则：过期Token自动失效

### SQL注入防护

**BR-S003: 使用ORM**
- 规则：所有数据库操作使用Prisma ORM
- 规则：禁止拼接SQL语句
- 规则：使用参数化查询

### XSS防护

**BR-S004: 输入转义**
- 规则：所有用户输入在显示前转义
- 规则：使用React默认转义
- 规则：禁止使用dangerouslySetInnerHTML（除非必要）

---

## 性能优化规则

### 缓存规则

**BR-O001: 智能体列表缓存**
- 规则：智能体列表缓存1小时
- 实现：Redis缓存
- 失效：修改agents.yaml后需清除缓存

**BR-O002: 用户信息缓存**
- 规则：用户信息缓存5分钟
- Key：`user:{userId}`
- 失效：用户信息更新时

### 查询优化

**BR-O003: 分页查询**
- 规则：列表查询必须分页
- 默认：20条/页
- 最大：100条/页

**BR-O004: 索引使用**
- 规则：频繁查询的字段必须建立索引
- 包括：email, userId, projectId, conversationId
- 定期：检查慢查询日志

---

## 数据保留规则

### 数据归档

**BR-R001: 对话归档（未来）**
- 规则：超过6个月的对话自动归档
- 归档表：conversations_archive
- 查询：默认不查询归档数据

**BR-R002: 日志清理**
- 规则：admin_logs保留3个月
- 执行：定时任务每月清理

---

## 业务规则变更流程

1. **提出变更**：填写变更申请
2. **影响评估**：评估对系统的影响
3. **Review**：技术团队Review
4. **更新文档**：同步更新本文档
5. **实施变更**：修改代码
6. **测试验证**：测试新规则
7. **上线发布**：发布到生产

---

**文档维护：** 业务规则变更需同步更新  
**Review频率：** 每个里程碑Review一次  
**最后更新：** 2025-10-10  
**维护者：** 产品经理 + 技术负责人
















