# 知识库管理系统 - 出题做题生成流程
## 文档信息
| 项目 | 内容 |
| -------- | ----------- |
| **文档名称** | 出题做题生成流程示意图 |
| **版本号** | V1.0.0 |
| **发布日期** | 2026-05-10 |
***
## 一、整体流程概述
本系统的出题做题流程主要包含两大核心环节:
1. **题目生成流程**:从文档中自动/手动生成题目,经过审核后进入题库
2. **答题考试流程**:用户获取试卷、答题、提交、获得成绩
***
## 二、题目生成流程
### 2.1 流程图
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 题目生成流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 上传文档 │───▶│ 文件向量化 │───▶│ 题目生成 │ │
│ │ (FileUpload) │ │ (Vectorize) │ │ (Generate) │ │
│ └──────────────┘ └──────────────┘ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 题目审核 │ │
│ │ (Review) │ │
│ └───────┬──────┘ │
│ ┌─┴─┐ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 审核通过 │ │ 审核拒绝 │ │
│ │ Approved │ │ Rejected │ │
│ └────┬─────┘ └────┬─────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 进入题库 │ │ 返回修改 │ │
│ │ (Question │ │ (Modify) │ │
│ │ Bank) │ └──────────────┘ │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 试卷生成 │ │
│ │ (Paper │ │
│ │ Generate) │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 2.2 详细流程说明
| 步骤 | 阶段 | 接口 | 说明 |
| -- | ----- | ---------------------------------------- | ------------- |
| 1 | 文档上传 | `POST /api/file/upload` | 用户上传文档,保存到服务器 |
| 2 | 文件向量化 | `POST /api/collections/{name}/vectorize` | 将文档内容转换为向量存储 |
| 3 | 题目生成 | `POST /api/exam/generate` | 根据文档内容自动生成题目 |
| 4 | 题目审核 | `PUT /api/question/review/{questionId}` | 人工审核生成的题目 |
| 5 | 进入题库 | 自动 | 审核通过的题目进入题库 |
| 6 | 试卷生成 | `POST /api/exam/paper/generate` | 根据配置从题库生成试卷 |
### 2.3 题目类型
| 类型 | 英文标识 | 说明 |
| --- | ---------------- | ------------ |
| 单选题 | single\_choice | 从选项中选择一个正确答案 |
| 多选题 | multiple\_choice | 从选项中选择多个正确答案 |
| 判断题 | true\_false | 判断陈述是否正确 |
| 填空题 | fill\_blank | 填写正确答案 |
| 简答题 | subjective | 主观题,需要文字回答 |
***
## 三、答题考试流程
### 3.1 流程图
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 答题考试流程 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 获取试卷列表 │───▶│ 选择试卷 │───▶│ 开始答题 │ │
│ │ (My Papers) │ │ (Select) │ │ (Start) │ │
│ └──────────────┘ └──────────────┘ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ 答题界面 │ │
│ │ (Answer) │ │
│ └──────────┬─────────┘ │
│ │ │
│ ┌──────────┴─────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 保存答案 │ │ 提交试卷 │ │
│ │ (Save) │ │ (Submit) │ │
│ └──────────────┘ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ AI批改答案 │ │
│ │ (Grade) │ │
│ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 显示成绩 │ │
│ │ (Result) │ │
│ └───────┬──────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ 错题收集 │ │
│ │ (Wrong Q) │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
```
### 3.2 详细流程说明
| 步骤 | 阶段 | 接口 | 说明 |
| -- | ------ | ----------------------------------------- | ---------- |
| 1 | 获取试卷列表 | `GET /api/exam/my/papers` | 获取用户有权限的试卷 |
| 2 | 获取试卷详情 | `GET /api/exam/paper/{paperId}` | 获取试卷内容 |
| 3 | 开始答题 | `POST /api/exam/record/{recordId}/start` | 标记开始考试 |
| 4 | 保存答案 | `PUT /api/exam/record/{recordId}/save` | 保存单题答案 |
| 5 | 提交试卷 | `POST /api/exam/record/{recordId}/submit` | 提交全部答案 |
| 6 | AI批改 | 后台自动 | AI自动批改答案 |
| 7 | 获取结果 | `GET /api/exam/record/{recordId}/result` | 获取考试成绩 |
| 8 | 错题收集 | 自动 | 自动将错题加入错题本 |
***
## 四、数据流向图
### 4.1 题目生成数据流向
```
用户上传 ──▶ File表 ──▶ 向量库 ──▶ 题目生成 ──▶ Question表(待审核)
│
▼
┌─────────────────┐
│ 审核流程 │
└────────┬────────┘
│
┌──────────────┴──────────────┐
▼ ▼
Question表(已通过) Question表(已拒绝)
│
▼
ExamPaper表(试卷)
```
### 4.2 答题数据流向
```
ExamPaper表 ──▶ 用户答题 ──▶ UserAnswer表 ──▶ AI批改 ──▶ ExamRecord表
│
▼
WrongQuestion表
```
***
## 五、状态流转
### 5.1 题目状态
```
pending(待审核)
│
├─▶ approved(已通过) ──▶ 进入题库
│
└─▶ rejected(已拒绝) ──▶ 可重新编辑
```
### 5.2 考试记录状态
```
created(已创建)
│
▼
started(进行中)
│
├─▶ submitted(已提交)
│ │
│ ▼
│ graded(已批改)
│
└─▶ expired(已过期)
```
***
## 六、核心数据库表关系
```
┌──────────┐ ┌───────────┐ ┌────────────┐
│ File │ │ Question │ │ ExamPaper │
├──────────┤ ├───────────┤ ├────────────┤
│ id │ │ id │ │ id │
│ fileName │◀──────│ fileId │◀───────│ questions │
│ filePath │ │ content │ │ title │
│ status │ │ status │ │ status │
│ examStatus│ │ difficulty│ └────────────┘
└──────────┘ └─────┬─────┘
│
▼
┌──────────────┐ ┌────────────────┐
│ UserAnswer │ │ ExamRecord │
├──────────────┤ ├────────────────┤
│ questionId │◀───────│ id │
│ answer │ │ paperId │
│ isCorrect │ │ userId │
│ score │ │ totalScore │
└──────────────┘ └────────────────┘
```
***
## 七、流程时序图
### 7.1 题目生成时序
```
用户 FileController FileServiceImpl CollectionController
│ │ │ │
│ 上传文件 │ │ │
├─────────────▶│ │ │
│ │ 保存文件 │ │
│ ├─────────────────▶│ │
│ │ │ │
│ 向量化 │ │ │
├─────────────▶│ │ 调用向量化接口 │
│ │ ├───────────────────▶│
│ │ │ │
│ 生成题目 │ │ │
├─────────────▶│ │ 调用AI生成题目 │
│ │ ├───────────────────▶│
│ │ │ │
│ 审核题目 │ │ │
├─────────────▶│ │ │
│ │ 更新题目状态 │ │
│ ├─────────────────▶│ │
│ │ │ │
│ ▼ ▼ ▼
```
### 7.2 答题考试时序
```
用户 UserExamController ExamServiceImpl QuestionMapper
│ │ │ │
│ 获取试卷列表 │ │ │
├─────────────────▶│ │ │
│ │ 查询数据库 │ │
│ │ ├─────────────────▶│
│ │ │ │
│ │ 返回试卷列表 │ │
│◀─────────────────┤ │ │
│ │ │ │
│ 开始答题 │ │ │
├─────────────────▶│ │ 创建考试记录 │
│ │ ├─────────────────▶│
│ │ │ │
│ 保存答案 │ │ │
├─────────────────▶│ │ 保存答题记录 │
│ │ ├─────────────────▶│
│ │ │ │
│ 提交试卷 │ │ │
├─────────────────▶│ │ AI批改答案 │
│ │ ├─────────────────▶│
│ │ │ │
│ │ 返回考试结果 │ │
│◀─────────────────┤ │ │
│ │ │ │
│ ▼ ▼ ▼
```
***
## 八、关键业务规则
### 8.1 题目生成规则
| 规则 | 说明 |
| ------ | ------------------------------ |
| 文件状态检查 | 只有审核通过(auditStatus=1)的文件才能生成题目 |
| 难度等级 | 支持1-5级难度,1最简单,5最难 |
| 题目数量限制 | 每次生成最多100道题目 |
| 去重机制 | 相同内容的题目会被自动去重 |
### 8.2 试卷生成规则
| 规则 | 说明 |
| ---- | ------------------- |
| 权限范围 | 只能选择用户有权限访问的知识库中的题目 |
| 题型配比 | 根据配置的题型数量分配题目 |
| 难度均衡 | 尽量均衡分布不同难度的题目 |
| 随机抽取 | 从题库中随机抽取题目组成试卷 |
### 8.3 答题规则
| 规则 | 说明 |
| ---- | ------------ |
| 答题时间 | 每道题默认答题时间不限制 |
| 答案保存 | 支持自动保存和手动保存 |
| 提交限制 | 提交后不可修改答案 |
| 错题收集 | 自动收集错题到错题本 |
***
**文档结束**
让我先查看考试相关的实体类和数据库表结构:
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\entity\ExamPaper.java
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\entity\ExamRecord.java
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\entity\ExamAssignment.java
让我查看考试相关的Controller来了解完整流程:
toolName: search\_by\_regex
status: success
query: AdminExamController
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\controller\AdminExamController.java
让我查看ExamPaperService的实现来了解完整流程:
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\service\impl\ExamPaperServiceImpl.java
让我查看用户考试相关的Controller和Service:
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\controller\UserExamController.java
toolName: view\_files
status: success
filePath: d:\Users\19211\Desktop\demo\demo\src\main\java\top\tqx\demo\_1\service\impl\ExamRecordServiceImpl.java
## 三张考试表的完整流程说明
### 一、表结构关系
| 表名 | 中文名称 | 核心作用 |
| :---------------- | :---- | :--------------------- |
| `exam_paper` | 试卷表 | 存储试卷的基本信息(标题、描述、题目列表等) |
| `exam_assignment` | 试卷分配表 | 记录试卷发布的范围(部门、用户) |
| `exam_record` | 考试记录表 | 记录每个用户的考试状态和答题情况 |
### 二、完整业务流程
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 管理员端流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ 1. 预览试卷 → 2. 保存试卷 → 3. 发布试卷 │
│ ↓ ↓ ↓ │
│ 生成试卷内容 创建ExamPaper 更新状态为published │
│ (不保存) status=draft 创建ExamAssignment │
│ 创建ExamRecord(每个用户一条) │
└─────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────┐
│ 用户端流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ 4. 查看试卷列表 → 5. 查看试卷内容 → 6. 开始考试 → 7. 保存答案 │
│ ↓ ↓ ↓ ↓ │
│ 查询ExamRecord 查询ExamPaper 更新status= 更新answers字段 │
│ (属于自己的) 获取题目内容 in_progress 记录答题进度 │
│ ↓ │
│ 8. 提交试卷 → 9. 查看成绩 │
│ ↓ ↓ │
│ 调用AI批阅 查询ExamRecord │
│ 保存到UserAnswer 和UserAnswer │
│ 更新status= │
│ submitted │
└─────────────────────────────────────────────────────────────────────────────┘
```
### 三、各步骤详解
#### 阶段一:管理员预览试卷
- **接口**:`POST /admin/exam/paper/preview`
- **操作**:根据条件动态生成试卷内容,**不保存到数据库**
- **目的**:让管理员在保存前预览试卷效果
#### 阶段二:管理员保存试卷
- **接口**:`POST /admin/exam/paper/save`
- **数据流向**:
```
ExamPaper (status=draft)
↓
exam_paper表
```
- **关键字段**:
- `paper_id`:UUID唯一标识
- `question_ids`:题目ID列表(JSON格式)
- `status`:`draft`
#### 阶段三:管理员发布试卷
- **接口**:`POST /admin/exam/paper/{paperId}/publish`
- **数据流向**:
```
1. 更新ExamPaper
status → published
publish_time → 当前时间
deadline → 截止时间
2. 创建ExamAssignment
paper_id → 试卷ID
dept_id / user_ids → 发布范围
status → active
3. 创建ExamRecord(每个目标用户一条)
paper_id → 试卷ID
user_id → 用户ID
status → not_started
```
#### 阶段四:用户查看试卷列表
- **接口**:`GET /exam/my/papers`
- **查询条件**:`user_id = 当前用户 AND status != revoked`
#### 阶段五:用户查看试卷内容
- **接口**:`GET /exam/paper/{paperId}`
- **验证**:确保用户有该试卷的答题权限(检查ExamRecord存在)
#### 阶段六:用户开始考试
- **接口**:`POST /exam/record/{recordId}/start`
- **状态变更**:`not_started` → `in_progress`
- **记录**:`start_time`、`last_active_time`
#### 阶段七:用户保存答案
- **接口**:`PUT /exam/record/{recordId}/save`
- **操作**:将答案JSON序列化后存入`answers`字段
#### 阶段八:用户提交试卷
- **接口**:`POST /exam/record/{recordId}/submit`
- **数据流向**:
```
1. 解析用户答案 → 调用AI批阅接口
2. 保存到UserAnswer表(每题一条记录)
user_id, paper_id, question_id, score, is_correct, feedback
3. 更新ExamRecord
status → submitted
total_score → AI返回的总分
submit_time / graded_time → 当前时间
time_spent → 答题耗时(秒)
```
#### 阶段九:用户查看成绩
- **接口**:`GET /exam/record/{recordId}/result`
- **数据来源**:ExamRecord(总分、状态)+ UserAnswer(每题详情)
### 四、表关系图
```
exam_paper (试卷表)
│
├── 1 : 1 → exam_assignment (分配表)
│ │
│ └── 1 : N → exam_record (记录表)
│ │
│ └── 1 : N → user_answer (答题记录表)
│
└── 1 : N → question (题目表) via question_ids
```
### 五、状态流转
| 表 | 状态字段 | 状态值 | 说明 |
| :--------------- | :----- | :----------- | :--- |
| exam\_paper | status | draft | 草稿状态 |
|
|
| published | 已发布 |
| exam\_assignment | status | active | 有效分配 |
|
|
| revoked | 已撤销 |
| exam\_record | status | not\_started | 未开始 |
|
|
| in\_progress | 进行中 |
|
|
| submitted | 已提交 |
|
|
| revoked | 已撤销 |