28 KiB
知识库管理系统 - 出题做题生成流程
文档信息
| 项目 | 内容 |
|---|---|
| 文档名称 | 出题做题生成流程示意图 |
| 版本号 | V1.0.0 |
| 发布日期 | 2026-05-10 |
一、整体流程概述
本系统的出题做题流程主要包含两大核心环节:
- 题目生成流程:从文档中自动/手动生成题目,经过审核后进入题库
- 答题考试流程:用户获取试卷、答题、提交、获得成绩
二、题目生成流程
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 | 已撤销 |