# 出题做题生成流程示意图 > **版本**: v2.0 (2026-05-10 更新) > **状态**: 与代码实现已对齐 --- ## 一、模块总览 ``` ┌─────────────────────────────────────────────────────────────────────┐ │ 考察与训练 (ExamModule) │ ├──────────┬──────────┬──────────────┬──────────────┬────────────────┤ │ 🤖 AI出题 │ 📚 题库管理 │ 📋 智能组卷 │ 📝 试卷考核 │ 🎯 互动训练 │ │ (管理员) │ (管理员) │ (管理员) │ (全员) │ (全员) │ │ exam:ai │ exam:bank│ exam:paper │ exam:exam │ exam:train │ └──────────┴──────────┴──────────────┴──────────────┴────────────────┘ ``` ### 各模块功能说明 | 模块 | 权限码 | 功能描述 | 目标用户 | |-----|--------|---------|---------| | AI出题 | `exam:ai` | 选择文档→AI生成题目 | 管理员/有权限用户 | | 题库管理 | `exam:bank` | 题目审核/编辑/删除 | 管理员 | | 智能组卷 | `exam:paper` | 配置参数→生成试卷→**编辑+发布** | 管理员 | | 试卷考核 | `exam:exam` | 待考试/答题/成绩/错题本/**自测组卷** | 全员 | | 互动训练 | `exam:train` | 闯关模式/每日一练/错题本(本地) | 全员 | --- ## 二、题目生成流程(AI出题) ``` ┌──────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │ 上传文档 │ ──→│ 文件向量化处理 │ ──→│ AI题目生成 │ ──→│ 题目预览 │ │ │ │ │ │ │ │ │ └──────────┘ └──────────────┘ └──────────────┘ └────┬─────┘ │ ┌─────────────────────────────────────────┘ ↓ ┌──────────────┐ │ 管理员审核操作 │ └──────┬───────┘ │ ┌──────────┼──────────┐ ↓ ↓ ↓ ┌────────┐ ┌────────┐ ┌────────┐ │ 采纳通过 │ │ 编辑修改 │ │ 删除丢弃 │ └───┬────┘ └───┬────┘ └────────┘ ↓ ↓ ┌────────┐ ┌────────┐ │ 进入题库 │→ │ 进入题库 │ └────────┘ └────────┘ ``` ### 相关API接口 | 序号 | 接口路径 | 方法 | 说明 | |-----|---------|------|------| | 1 | `/api/file/upload` | POST | 上传制度文件 | | 2 | `/api/collections/{name}/vectorize` | POST | 文件向量化处理 | | 3 | `/api/exam/generate` | POST | AI智能出题接口 | | 4 | `/api/question/review/{questionId}` | PUT | 审核题目(采纳/拒绝) | --- ## 三、试卷生成流程(双路径) ### 路径A:管理员 — 智能组卷(可编辑 + 可发布) ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 选择关联文档 │ ──→│ 配置试卷参数 │ ──→│ 调用组卷API │ ──→│ 预览编辑试卷 │ │ (可选) │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────┬───────┘ │ ┌────────────────────────────────┘ ↓ ┌──────────────────────┐ │ 管理员操作面板 │ │ ├─ 编辑题目(题干/选项) │ │ ├─ 调整分值/顺序 │ │ └─ 发布试卷给指定用户 │ └──────────┬───────────┘ │ ┌───────────────┼───────────────┐ ↓ ↓ ↓ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 保存草稿 │ │ 发布试卷 │ │ 删除试卷 │ └──────────┘ └────┬─────┘ └──────────┘ │ ↓ 用户收到通知 ┌──────────────────────┐ │ 试卷考核-待考试列表 │ └──────────────────────┘ ``` ### 路径B:用户 — 自测组卷(仅生成,直接答题) ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 配置参数 │ ──→│ 调用组卷API │ ──→│ 生成成功 │ ──→│ 直接进入答题 │ │ (题型/难度) │ │ │ │ │ │ (不可编辑) │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ ``` ### 两条路径对比 | 维度 | 路径A:管理员智能组卷 | 路径B:用户自测组卷 | |-----|-------------------|------------------| | 入口 | 「智能组卷」标签页 | 「试卷考核→自测组卷」子标签 | | API | `POST /api/exam/paper/generate` | 同一接口 | | 可选文件 | ✅ 关联制度文件筛选 | ✅ 可选关联 | | 生成后行为 | 进入编辑预览 | **直接进入答题页面** | | 编辑题目 | ✅ 题干/选项/答案/分值 | ❌ 不支持 | | 发布功能 | ✅ 发布给指定部门/用户 | ❌ 仅自己使用 | | 数据持久化 | ✅ 存入后端试卷表 | ❌ 前端暂存,关闭即失 | | 权限要求 | `exam:paper` | `exam:exam` | ### 相关API接口 | 序号 | 接口路径 | 方法 | 说明 | |-----|---------|------|------| | 1 | `/api/exam/paper/generate` | POST | 从题库动态生成试卷 | | 2 | `/admin/exam/paper/{paperId}/publish` | POST | 管理员发布试卷(含deadline/target) | | 3 | `/api/exam/my/papers` | GET | 获取我的试卷列表 | | 4 | `/api/exam/paper/{paperId}` | GET | 获取试卷详情 | --- ## 四、答题考试流程(试卷考核) ### 核心流程图 ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 获取待考试 │ ────→ │ 选择试卷 │ ────→ │ 启动考试记录 │ │ 列表 │ │ │ │ /record/start│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ ↓ ↓ ↓ ┌──────────────┐ ┌──────────────────────────────────────────┐ │ GET │ │ 答题界面 │ │ /my/papers │ │ ┌─────────────────────────────────────┐ │ └──────────────┘ │ │ 第 N 题 [题型] ★ 分值 │ │ │ │ 题目内容 │ │ │ │ ○ A. 选项内容 │ │ │ │ ○ B. 选项内容 │ │ │ │ ○ C. 选项内容 │ │ │ │ ○ D. 选项内容 │ │ │ └─────────────────────────────────────┘ │ │ │ │ [上一题] ●●●○●● [下一题] [提交试卷] │ └──────────────┬───────────────────────────┘ │ ┌───────────────────┼───────────────────┐ ↓ ↓ ↓ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 自动保存 │ │ 提交试卷 │ │ 退出确认 │ │ /save │ │ /submit │ │ │ └──────────┘ └────┬─────┘ └──────────┘ │ ↓ ┌──────────────────────┐ │ 后端AI批改处理 │ │ (自动触发) │ └──────────┬───────────┘ │ ↓ ┌──────────────────────┐ │ 显示成绩单 │ │ 总分/得分率/每题详情 │ └──────────┬───────────┘ │ ↓ ┌──────────────────────┐ │ 错题自动收集入库 │ │ → 错题本可查看/重做 │ └──────────────────────┘ ``` ### 答题流程详细步骤与API对应关系 | 步骤 | 操作 | API接口 | 方法 | 说明 | |-----|------|---------|------|------| | 1 | 获取待考试列表 | `/api/exam/my/papers` | GET | 返回当前用户的已发布试卷 | | 2 | 选择并进入试卷 | - | 前端切换视图 | 加载试卷数据到答题组件 | | 3 | **启动考试记录** | `/api/exam/record/{recordId}/start` | POST | 创建考试记录,开始计时 | | 4 | 答题中(自动保存) | `/api/exam/record/{recordId}/save` | PUT | 定期保存当前答案进度 | | 5 | 提交试卷 | `/api/exam/record/{recordId}/submit` | POST | 提交最终答案,触发后端AI批改 | | 6 | 查看成绩结果 | `/api/exam/record/{recordId}/result` | GET | 获取AI批改后的成绩和错题信息 | | 7 | 错题自动收集 | 后端自动处理 | - | 批改后自动将错题录入错题库 | > **注意**:当后端尚未实现 record 系列 API 时,前端会优雅降级: > - start/save 失败时继续前端答题模式 > - submit 失败时降级为直接调用 `/exam/grade` 进行批改 ### 支持的题型及答题方式 | 题型 | question_type | 答题控件 | 答案格式 | |-----|--------------|---------|---------| | 单选题 | `single_choice` | Radio单选框 | 字符串 `"A"` | | 多选题 | `multiple_choice` | Checkbox多选框 | 数组 `["A","C"]` | | 判断题 | `true_false` | 是/否双选 | 字符串 `"true"`/`"false"` | | 填空题 | `fill_blank` | 文本输入框 | 字符串 | | 简答题 | `subjective` | 多行文本域 | 字符串 | --- ## 五、错题系统(两套独立机制) ### 架构对比 ``` ┌─────────────────────┐ ┌─────────────────────┐ │ 互动训练-错题本 │ │ 试卷考核-错题本 │ │ (trainTab='wrong') │ │ (examTab='wrong') │ ├─────────────────────┤ ├─────────────────────┤ │ 数据来源: 前端缓存 │ │ 数据来源: 后端API │ │ 存储位置: trainingData│ │ 存储位置: 数据库表 │ │ .wrongQuestions │ │ wrong_questions │ │ │ │ │ │ 触发场景: │ │ 触发场景: │ │ • 闯关模式答错 │ │ • 试卷考核提交后 │ │ • 每日一练答错 │ │ • 后端自动收集 │ │ │ │ │ │ 操作能力: │ │ 操作能力: │ │ • 查看解析(前端mock) │ │ • 查看解析(API数据) │ │ • 重做(重置关卡) │ │ • 重做(/redo API) │ │ • 无持久化 │ │ • 收藏(/toggle API) │ └─────────────────────┘ └─────────────────────┘ ``` ### 试卷考核错题本API | 操作 | API | 方法 | 说明 | |-----|-----|------|------| | 获取错题列表 | `/api/wrong-questions/list` | POST | 分页查询,支持collection过滤 | | 收藏/取消收藏 | `/api/wrong-questions/collection/toggle` | POST | 传入question_id | | 重做错题 | `/api/wrong-questions/redo` | POST | 传入question_ids数组 | --- ## 六、互动训练流程 ``` ┌─────────────────────────────────────────────────────────────┐ │ 互动训练 (exam:train) │ ├──────────┬──────────┬──────────────────────────────────────┤ │ 🏆 闯关 │ 📅 每日一练│ ❌ 错题本(本地缓存) │ │ checkpoint│ daily │ wrong │ └──────────┴──────────┴──────────────────────────────────────┘ 闯关模式流程: ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 选择关卡 │ → │ 组卷API │ → │ 答题提交 │ → │ 批改评分 │ │ (5个预设) │ │ generate │ │ grade │ │ 更新关卡 │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ ┌──────────┴──────────┐ ↓ ↓ ┌──────────┐ ┌──────────┐ │ 通过升级 │ │ 错题缓存 │ │ 下一关 │ │ 本地存储 │ └──────────┘ └──────────┘ ``` ### 互动训练关卡配置(预设固定关卡) | 关卡ID | 名称 | 难度 | 单选 | 多选 | 判断 | 简答 | 状态 | |-------|------|------|------|------|------|------|------| | 1 | 入门挑战 | ⭐ | 3 | 0 | 2 | 0 | in-progress | | 2 | 基础巩固 | ⭐⭐ | 4 | 2 | 2 | 0 | pending | | 3 | 进阶提升 | ⭐⭐⭐ | 4 | 3 | 3 | 0 | pending | | 4 | 高级挑战 | ⭐⭐⭐⭐ | 3 | 3 | 2 | 2 | pending | | 5 | 大师试炼 | ⭐⭐⭐⭐⭐ | 4 | 4 | 2 | 2 | pending | --- ## 七、完整API接口清单 ### 7.1 题目管理 | 接口 | 路径 | 方法 | 权限 | 说明 | |-----|------|------|------|------| | AI出题 | `/api/exam/generate` | POST | exam:ai | 根据文档生成题目 | | 审核题目 | `/api/question/review/{id}` | PUT | exam:bank | 采纳/拒绝题目 | ### 7.2 试卷管理 | 接口 | 路径 | 方法 | 权限 | 说明 | |-----|------|------|------|------| | 生成试卷 | `/api/exam/paper/generate` | POST | exam:paper 或 exam:exam | 从题库动态组卷 | | 我的试卷 | `/api/exam/my/papers` | GET | exam:exam | 获取用户试卷列表 | | 试卷详情 | `/api/exam/paper/{paperId}` | GET | exam:paper 或 exam:exam | 获取试卷完整内容 | | 发布试卷 | `/admin/exam/paper/{paperId}/publish` | POST | exam:paper | 管理员发布试卷 | ### 7.3 答题考试(record-based) | 接口 | 路径 | 方法 | 权限 | 说明 | |-----|------|------|------|------| | 启动考试 | `/api/exam/record/{recordId}/start` | POST | exam:exam | 开始考试计时 | | 保存答案 | `/api/exam/record/{recordId}/save` | PUT | exam:exam | 答题中途自动保存 | | 提交试卷 | `/api/exam/record/{recordId}/submit` | POST | exam:exam | 提交最终答案 | | 成绩查询 | `/api/exam/record/{recordId}/result` | GET | exam:exam | 获取批改成绩和错题 | ### 7.4 批改与查询 | 接口 | 路径 | 方法 | 权限 | 说明 | |-----|------|------|------|------| | 批改答案 | `/api/exam/grade` | POST | exam:exam | AI批改(降级备用) | | 查询答题记录 | `/api/exam/answers/query` | POST | exam:exam | 按paperId/sessionId查询 | ### 7.5 错题管理 | 接口 | 路径 | 方法 | 权限 | 说明 | |-----|------|------|------|------| | 错题列表 | `/api/wrong-questions/list` | POST | exam:exam | 分页获取错题 | | 收藏切换 | `/api/wrong-questions/collection/toggle` | POST | exam:exam | 收藏/取消收藏错题 | | 重做错题 | `/api/wrong-questions/redo` | POST | exam:exam | 重新练习错题 | --- ## 八、数据库核心表结构 ### exam_paper(试卷表) | 字段名 | 类型 | 说明 | |-------|------|------| | id | BIGINT | 主键 | | uuid | VARCHAR(36) | UUID唯一标识 | | title | VARCHAR(200) | 试卷标题 | | total_score | INT | 总分 | | question_count | INT | 题目数量 | | difficulty | INT | 整体难度(1-5) | | status | TINYINT | 状态(0=草稿,1=已发布,2=已归档) | | creator_id | BIGINT | 创建者(管理员) | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | ### exam_record(考试记录表) | 字段名 | 类型 | 说明 | |-------|------|------| | id | BIGINT | 主键 | | uuid | VARCHAR(36) | UUID唯一标识 | | paper_id | BIGINT | 关联试卷ID | | user_id | BIGINT | 考试用户ID | | status | TINYINT | 状态(0=未开始,1=进行中,2=已交卷,3=已批改) | | score | DECIMAL(5,2) | 得分 | | max_score | INT | 满分 | | started_at | DATETIME | 开始时间 | | submitted_at | DATETIME | 提交时间 | | graded_at | DATETIME | 批改完成时间 | ### wrong_questions(错题表) | 字段名 | 类型 | 说明 | |-------|------|------| | id | BIGINT | 主键 | | question_id | BIGINT | 关联题目ID | | user_id | BIGINT | 用户ID | | student_answer | TEXT | 学生答案 | | correct_answer | TEXT | 正确答案 | | is_correct | TINYINT | 是否正确(0=错误) | | error_count | INT | 错误次数 | | last_wrong_at | DATETIME | 最近错误时间 | --- ## 九、管理员 vs 用户 功能矩阵 | 功能 | 管理员 | 普通用户 | |-----|:-----:|:-------:| | AI出题 | ✅ | ✅(有权限) | | 题库审核 | ✅ | ❌ | | 智能组卷(生成) | ✅ | ❌ | | 智能组卷(编辑) | ✅ | ❌ | | 智能组卷(发布) | ✅ | ❌ | | 试卷考核-待考试 | ❌ | ✅ | | 试卷考核-答题 | ✅(测试) | ✅ | | 试卷考核-成绩单 | ✅ | ✅ | | 试卷考核-错题本(API) | ✅ | ✅ | | 试卷考核-自测组卷 | ✅ | ✅ | | 互动训练-闯关 | ✅ | ✅ | | 互动训练-每日一练 | ✅ | ✅ | | 互动训练-错题本(本地) | ✅ | ✅ | --- *文档更新日期: 2026-05-10* *与 ExamModule.vue v2.0 + exam.js v2.0 对齐*