Files
my-springboot-project/文件/出题做题生成流程示意图.md
2026-06-03 12:43:48 +08:00

543 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 知识库管理系统 - 出题做题生成流程
## 文档信息
| 项目 | 内容 |
| -------- | ----------- |
| **文档名称** | 出题做题生成流程示意图 |
| **版本号** | 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 答题规则
| 规则 | 说明 |
| ---- | ------------ |
| 答题时间 | 每道题默认答题时间不限制 |
| 答案保存 | 支持自动保存和手动保存 |
| 提交限制 | 提交后不可修改答案 |
| 错题收集 | 自动收集错题到错题本 |
***
**文档结束**
<br />
让我先查看考试相关的实体类和数据库表结构:
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 | 草稿状态 |
| <br /> | <br /> | published | 已发布 |
| exam\_assignment | status | active | 有效分配 |
| <br /> | <br /> | revoked | 已撤销 |
| exam\_record | status | not\_started | 未开始 |
| <br /> | <br /> | in\_progress | 进行中 |
| <br /> | <br /> | submitted | 已提交 |
| <br /> | <br /> | revoked | 已撤销 |