feat: 初始化考培练系统项目
- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
726
docs/规划/完成审核的文件备份/考试工作流联调文档 2.md
Normal file
726
docs/规划/完成审核的文件备份/考试工作流联调文档 2.md
Normal file
@@ -0,0 +1,726 @@
|
||||
# 考试工作流联调文档
|
||||
|
||||
## 一、功能概述
|
||||
|
||||
### 1.1 考试页面入口
|
||||
- **页面地址**:`http://localhost:3001/trainee/exam?courseId=1`
|
||||
- **触发时机**:用户打开考试页面后,自动触发 Dify 考试工作流生成试题
|
||||
|
||||
### 1.2 两个Dify工作流
|
||||
|
||||
#### 工作流1:试题生成器
|
||||
- **功能**:根据课程知识点和错题记录,生成考试试题
|
||||
- **返回格式**:JSON(包含完整试题内容)
|
||||
|
||||
#### 工作流2:答案判断工作流(主观题判断器)
|
||||
- **功能**:判断填空题和问答题的答案正确性
|
||||
- **适用题型**:填空题、问答题
|
||||
- **输入参数**:
|
||||
- 题目内容
|
||||
- 标准答案
|
||||
- 用户答案
|
||||
- **返回结果**:判断正确或错误,如果返回回答错误,则需要前端展示正确答案,并需要用户点击“记住了”方可进入下一题。
|
||||
|
||||
---
|
||||
|
||||
## 二、考试流程设计
|
||||
|
||||
### 2.1 考试启动流程
|
||||
|
||||
```
|
||||
用户打开考试页面
|
||||
↓
|
||||
前端显示:试题动态生成中
|
||||
↓
|
||||
调用 Dify 试题生成器工作流
|
||||
↓
|
||||
工作流返回 JSON 格式的试题
|
||||
↓
|
||||
前端解析 JSON,提取试题
|
||||
↓
|
||||
显示第一题
|
||||
```
|
||||
|
||||
### 2.2 答题交互流程
|
||||
|
||||
#### 单选题
|
||||
1. 用户点击选择答案
|
||||
2. 立刻判断正确与错误(无需点击提交)
|
||||
3. **正确**:自动进入下一题
|
||||
4. **错误**:
|
||||
- 显示"回答错误"提示
|
||||
- 显示该题正确答案
|
||||
- 记录到错题记录数据库
|
||||
- 用户点击"记住了"按钮后进入下一题
|
||||
|
||||
#### 多选题
|
||||
1. 用户勾选多个选项
|
||||
2. 用户点击"提交"按钮
|
||||
3. 判断逻辑同单选题
|
||||
|
||||
#### 判断题
|
||||
1. 用户点击选择答案(正确/错误)
|
||||
2. 立刻判断(无需点击提交)
|
||||
3. 判断逻辑同单选题
|
||||
|
||||
#### 填空题
|
||||
1. 用户输入答案
|
||||
2. 用户点击"提交"按钮
|
||||
3. **调用 Dify "答案判断工作流"** 判断答案正确性
|
||||
4. 工作流返回判断结果
|
||||
5. **正确**:自动进入下一题
|
||||
6. **错误**:显示错误提示、标准答案,记录错题,用户点击"记住了"后进入下一题
|
||||
|
||||
#### 问答题
|
||||
1. 用户输入答案
|
||||
2. 用户点击"提交"按钮
|
||||
3. **调用 Dify "答案判断工作流"** 判断答案正确性
|
||||
4. 判断逻辑同填空题
|
||||
|
||||
### 2.3 考试轮次与重考机制
|
||||
|
||||
**考试轮次规则**:
|
||||
- 考试总共**3轮**:第一次正式考试 + 两次错题重考
|
||||
- 第一轮考试:从课程所有知识点中随机选取生成试题
|
||||
- 第二轮考试(错题重考1):基于第一轮的错题,传递**完整错题详情**给 Dify 工作流重新生成针对性试题
|
||||
- 第三轮考试(错题重考2):基于第二轮的错题,传递**完整错题详情**给 Dify 工作流重新生成针对性试题
|
||||
|
||||
**考试中断规则**:
|
||||
- 考试中断后**不可恢复**
|
||||
- 用户重新加载页面会**重新触发工作流**,生成新的考试
|
||||
- 只有**完成一轮考试**后,才会记录得分和错题记录
|
||||
|
||||
---
|
||||
|
||||
## 三、Dify工作流参数设计
|
||||
|
||||
### 3.1 考试试题生成器 - 输入参数
|
||||
|
||||
| 参数名称 | 类型 | 必填 | 说明 |
|
||||
|---------|------|------|------|
|
||||
| `course_id` | Integer | 必填 | 课程ID,用于获取该课程下所有资料的知识点 |
|
||||
| `position_id` | Integer | 必填 | 岗位ID,让工作流根据岗位特征设计题目 |
|
||||
| `mistake_records` | Array[Object] | 选填 | 错题记录详情数组(第二、三轮考试时传入) |
|
||||
| `single_choice_count` | Integer | 必填 | 单选题数量 |
|
||||
| `multiple_choice_count` | Integer | 必填 | 多选题数量 |
|
||||
| `true_false_count` | Integer | 必填 | 判断题数量 |
|
||||
| `fill_blank_count` | Integer | 必填 | 填空题数量 |
|
||||
| `essay_count` | Integer | 必填 | 问答题数量 |
|
||||
| `difficulty_level` | Integer | 必填 | 难度系数(1-5) |
|
||||
|
||||
#### 参数说明
|
||||
- **course_id**:Dify 工作流通过 SQL 执行器和系统数据库 API 服务,从课程下所有资料中随机选取知识点
|
||||
- **position_id**:从用户信息中自动获取,由管理员在岗位管理页面分配给用户
|
||||
- **mistake_records**:错题记录详情数组,每个对象包含:
|
||||
- `question_id`:题目ID
|
||||
- `knowledge_point_id`:知识点ID
|
||||
- `question_content`:题目内容
|
||||
- `correct_answer`:正确答案
|
||||
- `user_answer`:用户答案
|
||||
|
||||
第二轮、第三轮考试时,传入上一轮的完整错题详情,工作流基于这些错题重新生成针对性试题
|
||||
|
||||
### 3.2 考试试题生成器 - API调用示例
|
||||
|
||||
**Dify工作流API端点**:
|
||||
```bash
|
||||
curl -X POST 'http://dify.ireborn.com.cn/v1/workflows/run' \
|
||||
--header 'Authorization: Bearer app-tDlrmXyS9NtWCShsOx5FH49L' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"inputs": {
|
||||
"course_id": 1,
|
||||
"position_id": 3,
|
||||
"mistake_records": [],
|
||||
"single_choice_count": 10,
|
||||
"multiple_choice_count": 5,
|
||||
"true_false_count": 5,
|
||||
"fill_blank_count": 2,
|
||||
"essay_count": 1,
|
||||
"difficulty_level": 3
|
||||
},
|
||||
"response_mode": "streaming",
|
||||
"user": "kaopeilian"
|
||||
}'
|
||||
```
|
||||
|
||||
**第二/三轮错题重考时的调用示例**:
|
||||
```bash
|
||||
curl -X POST 'http://dify.ireborn.com.cn/v1/workflows/run' \
|
||||
--header 'Authorization: Bearer app-tDlrmXyS9NtWCShsOx5FH49L' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"inputs": {
|
||||
"course_id": 1,
|
||||
"position_id": 3,
|
||||
"mistake_records": [
|
||||
{
|
||||
"question_id": 123,
|
||||
"knowledge_point_id": 456,
|
||||
"question_content": "皮肤的最外层是什么?",
|
||||
"correct_answer": "表皮",
|
||||
"user_answer": "真皮"
|
||||
}
|
||||
],
|
||||
"single_choice_count": 5,
|
||||
"multiple_choice_count": 3,
|
||||
"true_false_count": 2,
|
||||
"fill_blank_count": 1,
|
||||
"essay_count": 1,
|
||||
"difficulty_level": 3
|
||||
},
|
||||
"response_mode": "streaming",
|
||||
"user": "kaopeilian"
|
||||
}'
|
||||
```
|
||||
|
||||
### 3.3 考试试题生成器 - 输出格式
|
||||
|
||||
**JSON格式示例**(待Dify工作流开发完成后补充)
|
||||
|
||||
```json
|
||||
{
|
||||
"exam_name": "皮肤生理学基础考试",
|
||||
"total_questions": 20,
|
||||
"questions": [
|
||||
{
|
||||
"id": 1,
|
||||
"type": "single_choice",
|
||||
"title": "题目内容",
|
||||
"options": [...],
|
||||
"correct_answer": "A",
|
||||
"explanation": "解析内容",
|
||||
"knowledge_point_id": 123
|
||||
},
|
||||
...
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3.4 答案判断工作流 - 输入参数
|
||||
|
||||
| 参数名称 | 类型 | 必填 | 说明 |
|
||||
|---------|------|------|------|
|
||||
| `question` | String | 必填 | 题目内容 |
|
||||
| `correct_answer` | String | 必填 | 标准答案 |
|
||||
| `user_answer` | String | 必填 | 用户提交的答案 |
|
||||
|
||||
### 3.5 答案判断工作流 - API调用示例
|
||||
|
||||
**Dify工作流API端点**:
|
||||
```bash
|
||||
curl -X POST 'http://dify.ireborn.com.cn/v1/workflows/run' \
|
||||
--header 'Authorization: Bearer app-FvMdrvbRBz547DVZEorgO1WT' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"inputs": {
|
||||
"question": "肉毒素注射后____小时内不能平躺",
|
||||
"correct_answer": "4",
|
||||
"user_answer": "4"
|
||||
},
|
||||
"response_mode": "streaming",
|
||||
"user": "kaopeilian"
|
||||
}'
|
||||
```
|
||||
|
||||
**填空题示例**:
|
||||
```bash
|
||||
curl -X POST 'http://dify.ireborn.com.cn/v1/workflows/run' \
|
||||
--header 'Authorization: Bearer app-FvMdrvbRBz547DVZEorgO1WT' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"inputs": {
|
||||
"question": "透明质酸的主要功效是________",
|
||||
"correct_answer": "保湿补水",
|
||||
"user_answer": "补水保湿"
|
||||
},
|
||||
"response_mode": "streaming",
|
||||
"user": "kaopeilian"
|
||||
}'
|
||||
```
|
||||
|
||||
**问答题示例**:
|
||||
```bash
|
||||
curl -X POST 'http://dify.ireborn.com.cn/v1/workflows/run' \
|
||||
--header 'Authorization: Bearer app-FvMdrvbRBz547DVZEorgO1WT' \
|
||||
--header 'Content-Type: application/json' \
|
||||
--data-raw '{
|
||||
"inputs": {
|
||||
"question": "请简述皮肤的三层结构及各自功能",
|
||||
"correct_answer": "皮肤分为表皮、真皮和皮下组织三层。表皮起保护作用,真皮提供营养和支撑,皮下组织储存能量和保温。",
|
||||
"user_answer": "皮肤有表皮负责保护,真皮提供营养支持,皮下组织用于储能保温。"
|
||||
},
|
||||
"response_mode": "streaming",
|
||||
"user": "kaopeilian"
|
||||
}'
|
||||
```
|
||||
|
||||
### 3.6 答案判断工作流 - 输出格式
|
||||
|
||||
```json
|
||||
{
|
||||
"is_correct": true,
|
||||
"correct_answer": "标准答案内容",
|
||||
"feedback": "判断反馈信息(可选)"
|
||||
}
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- `is_correct`:布尔值,`true` 表示正确,`false` 表示错误
|
||||
- `correct_answer`:标准答案(当答错时,前端需要展示此答案)
|
||||
- `feedback`:可选的反馈信息
|
||||
- **重要**:如果返回 `is_correct: false`,前端需要:
|
||||
1. 显示"回答错误"提示
|
||||
2. 显示 `correct_answer` 字段的正确答案
|
||||
3. 显示"记住了"按钮,用户点击后才能进入下一题
|
||||
4. 记录错题到数据库
|
||||
|
||||
---
|
||||
|
||||
## 四、数据库设计
|
||||
|
||||
### 4.1 课程考试设置表 (course_exam_settings)
|
||||
|
||||
**表结构:**
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS course_exam_settings (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
course_id INT NOT NULL UNIQUE COMMENT '课程ID',
|
||||
|
||||
-- 题型数量设置
|
||||
single_choice_count INT NOT NULL DEFAULT 10 COMMENT '单选题数量',
|
||||
multiple_choice_count INT NOT NULL DEFAULT 5 COMMENT '多选题数量',
|
||||
true_false_count INT NOT NULL DEFAULT 5 COMMENT '判断题数量',
|
||||
fill_blank_count INT NOT NULL DEFAULT 0 COMMENT '填空题数量',
|
||||
essay_count INT NOT NULL DEFAULT 0 COMMENT '问答题数量',
|
||||
|
||||
-- 考试参数设置
|
||||
duration_minutes INT NOT NULL DEFAULT 60 COMMENT '考试时长(分钟)',
|
||||
difficulty_level INT NOT NULL DEFAULT 3 COMMENT '难度系数(1-5)',
|
||||
passing_score INT NOT NULL DEFAULT 60 COMMENT '及格分数',
|
||||
|
||||
-- 其他设置
|
||||
is_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用',
|
||||
show_answer_immediately BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否立即显示答案',
|
||||
allow_retake BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否允许重考',
|
||||
max_retake_times INT COMMENT '最大重考次数',
|
||||
|
||||
-- 审计字段
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
created_by INT COMMENT '创建人ID',
|
||||
updated_by INT COMMENT '更新人ID',
|
||||
is_deleted BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
deleted_at DATETIME,
|
||||
deleted_by INT COMMENT '删除人ID',
|
||||
|
||||
FOREIGN KEY (course_id) REFERENCES courses(id),
|
||||
INDEX ix_course_exam_settings_id (id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程考试设置表';
|
||||
```
|
||||
|
||||
**新增字段说明:**
|
||||
- `essay_count`:问答题数量字段(需要添加到现有表结构中)
|
||||
|
||||
### 4.2 错题记录表 (exam_mistakes)
|
||||
|
||||
**注意**:当前数据库中**不存在错题记录表**(已确认 `2-联调 dify 知识拆解已完成.sql` 备份中无此表),需要新建。
|
||||
|
||||
**表结构定义:**
|
||||
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS exam_mistakes (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
|
||||
-- 核心关联字段(必需)
|
||||
user_id INT NOT NULL COMMENT '用户ID',
|
||||
exam_id INT NOT NULL COMMENT '考试ID',
|
||||
question_id INT COMMENT '题目ID(AI生成的题目可能为空)',
|
||||
knowledge_point_id INT COMMENT '关联的知识点ID',
|
||||
|
||||
-- 题目核心信息(必需)
|
||||
question_content TEXT NOT NULL COMMENT '题目内容',
|
||||
correct_answer TEXT NOT NULL COMMENT '正确答案',
|
||||
user_answer TEXT COMMENT '用户答案',
|
||||
|
||||
-- 审计字段
|
||||
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (exam_id) REFERENCES exams(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE SET NULL,
|
||||
FOREIGN KEY (knowledge_point_id) REFERENCES knowledge_points(id) ON DELETE SET NULL,
|
||||
|
||||
INDEX idx_user_id (user_id),
|
||||
INDEX idx_exam_id (exam_id),
|
||||
INDEX idx_knowledge_point_id (knowledge_point_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='错题记录表';
|
||||
```
|
||||
|
||||
**核心字段说明:**
|
||||
- 包含6个核心字段:`user_id`、`exam_id`、`question_id`、`knowledge_point_id`、`question_content`、`correct_answer`、`user_answer`
|
||||
- 简化设计,去除冗余字段(如错误次数、掌握状态等),聚焦核心功能
|
||||
- `question_id` 可为空:AI动态生成的题目可能不在 questions 表中
|
||||
|
||||
### 4.3 岗位表 (positions)
|
||||
|
||||
岗位信息来源于岗位管理页面,表结构参考:
|
||||
|
||||
```sql
|
||||
CREATE TABLE `positions` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`name` VARCHAR(100) NOT NULL COMMENT '岗位名称',
|
||||
`code` VARCHAR(100) NOT NULL UNIQUE COMMENT '岗位编码',
|
||||
`description` TEXT COMMENT '岗位描述',
|
||||
`parent_id` INT NULL COMMENT '上级岗位ID',
|
||||
`status` VARCHAR(20) NOT NULL DEFAULT 'active' COMMENT '状态',
|
||||
`skills` JSON NULL COMMENT '核心技能',
|
||||
`level` VARCHAR(20) NULL COMMENT '岗位等级',
|
||||
`sort_order` INT DEFAULT 0 COMMENT '排序',
|
||||
-- 其他审计字段...
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位表';
|
||||
```
|
||||
|
||||
### 4.4 题目类型说明 (questions表)
|
||||
|
||||
```sql
|
||||
CREATE TABLE `questions` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`course_id` INT NOT NULL COMMENT '课程ID',
|
||||
`question_type` VARCHAR(20) NOT NULL COMMENT '题目类型: single_choice, multiple_choice, true_false, fill_blank, essay',
|
||||
`title` TEXT NOT NULL COMMENT '题目标题',
|
||||
`content` TEXT COMMENT '题目内容',
|
||||
`options` JSON COMMENT '选项(JSON格式)',
|
||||
`correct_answer` TEXT NOT NULL COMMENT '正确答案',
|
||||
`explanation` TEXT COMMENT '答案解释',
|
||||
`score` FLOAT DEFAULT 10.0 COMMENT '分值',
|
||||
`difficulty` VARCHAR(10) DEFAULT 'medium' COMMENT '难度等级: easy, medium, hard',
|
||||
-- 其他字段...
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='题目表';
|
||||
```
|
||||
|
||||
**题型映射关系:**
|
||||
- `single_choice`:单选题
|
||||
- `multiple_choice`:多选题
|
||||
- `true_false`:判断题
|
||||
- `fill_blank`:填空题
|
||||
- `essay`:问答题
|
||||
|
||||
---
|
||||
|
||||
## 五、前后端接口设计
|
||||
|
||||
### 5.1 获取考试设置
|
||||
**接口**:`GET /api/exam/settings?courseId={courseId}`
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"course_id": 1,
|
||||
"single_choice_count": 10,
|
||||
"multiple_choice_count": 5,
|
||||
"true_false_count": 5,
|
||||
"fill_blank_count": 2,
|
||||
"essay_count": 1,
|
||||
"difficulty_level": 3,
|
||||
"duration_minutes": 60,
|
||||
"passing_score": 60
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 触发考试试题生成
|
||||
**接口**:`POST /api/exam/generate`
|
||||
|
||||
**请求体(第一轮考试):**
|
||||
```json
|
||||
{
|
||||
"course_id": 1,
|
||||
"position_id": 3,
|
||||
"mistake_records": [],
|
||||
"single_choice_count": 10,
|
||||
"multiple_choice_count": 5,
|
||||
"true_false_count": 5,
|
||||
"fill_blank_count": 2,
|
||||
"essay_count": 1,
|
||||
"difficulty_level": 3
|
||||
}
|
||||
```
|
||||
|
||||
**请求体(第二/三轮错题重考):**
|
||||
```json
|
||||
{
|
||||
"course_id": 1,
|
||||
"position_id": 3,
|
||||
"mistake_records": [
|
||||
{
|
||||
"question_id": 123,
|
||||
"knowledge_point_id": 456,
|
||||
"question_content": "题目内容",
|
||||
"correct_answer": "正确答案",
|
||||
"user_answer": "用户答案"
|
||||
}
|
||||
],
|
||||
"single_choice_count": 5,
|
||||
"multiple_choice_count": 3,
|
||||
"true_false_count": 2,
|
||||
"fill_blank_count": 1,
|
||||
"essay_count": 1,
|
||||
"difficulty_level": 3
|
||||
}
|
||||
```
|
||||
|
||||
**响应:** Dify工作流返回的JSON(格式待定)
|
||||
|
||||
**说明:**
|
||||
- `position_id` 从当前登录用户信息中自动获取,不允许用户手动选择
|
||||
- 第一轮考试时 `mistake_records` 为空数组
|
||||
- 第二、三轮考试时传入上一轮的完整错题记录
|
||||
|
||||
### 5.3 提交主观题答案判断
|
||||
**接口**:`POST /api/exam/judge-answer`
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"question": "肉毒素注射后____小时内不能平躺",
|
||||
"correct_answer": "4",
|
||||
"user_answer": "4"
|
||||
}
|
||||
```
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"is_correct": true,
|
||||
"correct_answer": "4",
|
||||
"feedback": "回答正确!"
|
||||
}
|
||||
```
|
||||
|
||||
### 5.4 记录错题
|
||||
**接口**:`POST /api/exam/record-mistake`
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"user_id": 1,
|
||||
"exam_id": 123,
|
||||
"question_id": 456,
|
||||
"knowledge_point_id": 789,
|
||||
"question_content": "题目内容",
|
||||
"correct_answer": "A",
|
||||
"user_answer": "B"
|
||||
}
|
||||
```
|
||||
|
||||
**说明:**
|
||||
- `user_id` 从当前登录用户信息中自动获取
|
||||
- 只记录核心字段,简化设计
|
||||
|
||||
### 5.5 获取错题记录
|
||||
**接口**:`GET /api/exam/mistakes?exam_id={exam_id}`
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"mistakes": [
|
||||
{
|
||||
"question_id": 123,
|
||||
"knowledge_point_id": 456,
|
||||
"question_content": "题目内容",
|
||||
"correct_answer": "正确答案",
|
||||
"user_answer": "用户答案"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**说明:**
|
||||
- 用于第二、三轮考试时获取上一轮的错题记录
|
||||
- 返回的数据可直接作为 `mistake_records` 参数传给考试生成接口
|
||||
|
||||
---
|
||||
|
||||
## 六、待办事项与开发任务
|
||||
|
||||
### 6.1 数据库修改任务
|
||||
- [ ] 在 `course_exam_settings` 表中新增 `essay_count` 字段
|
||||
- [ ] 创建 `exam_mistakes` 错题记录表
|
||||
- [ ] 更新数据库架构文档:`/kaopeilian-backend/数据库架构-统一版.md`
|
||||
|
||||
### 6.2 后端开发任务
|
||||
- [ ] 更新 `CourseExamSettings` 模型,添加 `essay_count` 字段
|
||||
- [ ] 创建 `ExamMistake` 模型(包含7个核心字段)
|
||||
- [ ] 开发考试试题生成接口(调用Dify工作流)
|
||||
- [ ] 配置 Dify API 端点:`http://dify.ireborn.com.cn/v1/workflows/run`
|
||||
- [ ] 配置 Authorization Token:`app-tDlrmXyS9NtWCShsOx5FH49L`
|
||||
- [ ] 实现流式响应(streaming)数据处理
|
||||
- [ ] 从用户信息中自动获取 `position_id`
|
||||
- [ ] 支持第一轮考试(mistake_records为空)
|
||||
- [ ] 支持第二、三轮错题重考(传入完整错题详情)
|
||||
- [ ] 开发主观题答案判断接口(调用Dify答案判断工作流)
|
||||
- [ ] 配置 Dify API 端点:`http://dify.ireborn.com.cn/v1/workflows/run`
|
||||
- [ ] 配置 Authorization Token:`app-FvMdrvbRBz547DVZEorgO1WT`
|
||||
- [ ] 实现流式响应数据处理
|
||||
- [ ] 返回判断结果和正确答案
|
||||
- [ ] 开发错题记录接口(只记录核心字段)
|
||||
- [ ] 开发获取错题记录接口(用于错题重考)
|
||||
|
||||
### 6.3 前端开发任务
|
||||
- [ ] 在课程编辑页面(`http://localhost:3001/manager/edit-course/1`)的"考试设置"选项卡中:
|
||||
- [ ] 添加"问答题数量"(essay_count)设置字段
|
||||
- [ ] 确保所有题型数量字段都已存在并正常工作
|
||||
- [ ] 开发考试页面(`http://localhost:3001/trainee/exam?courseId=1`):
|
||||
- [ ] 页面加载时显示"试题动态生成中"状态
|
||||
- [ ] 从用户信息中自动获取 `position_id`(不显示给用户)
|
||||
- [ ] 判断当前是第几轮考试(第一轮/第二轮/第三轮)
|
||||
- [ ] 第一轮考试:传空的 `mistake_records` 数组
|
||||
- [ ] 第二、三轮考试:调用接口获取上一轮错题记录,传入完整错题详情
|
||||
- [ ] 实现答题交互逻辑:
|
||||
- [ ] 单选题/判断题:点击后立即判断,无需提交按钮
|
||||
- [ ] 多选题/填空题/问答题:需要点击"提交"按钮
|
||||
- [ ] 主观题(填空、问答):调用答案判断工作流接口
|
||||
- [ ] 实现错题处理:
|
||||
- [ ] 答错时显示"回答错误"提示
|
||||
- [ ] 显示正确答案
|
||||
- [ ] 显示"记住了"按钮
|
||||
- [ ] 点击"记住了"后进入下一题
|
||||
- [ ] 答错题目立即调用接口记录到错题表
|
||||
- [ ] 实现考试轮次管理:
|
||||
- [ ] 考试中断后不可恢复(刷新页面重新开始)
|
||||
- [ ] 完成一轮考试后记录得分和错题
|
||||
- [ ] 显示当前是第几轮考试
|
||||
- [ ] 完成第三轮后结束考试流程
|
||||
|
||||
### 6.4 Dify工作流开发任务
|
||||
- [ ] 开发"考试试题生成器"工作流
|
||||
- [ ] 配置 SQL 执行器连接系统数据库
|
||||
- [ ] 实现第一轮考试逻辑:
|
||||
- [ ] 根据课程ID从所有资料中随机选取知识点
|
||||
- [ ] 根据岗位ID特征生成符合岗位特点的题目
|
||||
- [ ] 按题型数量生成试题
|
||||
- [ ] 实现第二、三轮错题重考逻辑:
|
||||
- [ ] 接收完整错题详情数组(包含题目内容、正确答案、用户答案)
|
||||
- [ ] 基于错题对应的知识点重新生成针对性试题
|
||||
- [ ] 可以适当调整题目难度和角度
|
||||
- [ ] 定义并测试输出JSON格式
|
||||
- [ ] 开发"答案判断工作流"(主观题判断器)
|
||||
- [ ] 实现填空题答案判断逻辑(支持多种答案表述)
|
||||
- [ ] 实现问答题答案判断逻辑(语义理解判断)
|
||||
- [ ] 定义并测试输出JSON格式
|
||||
- [ ] 返回判断结果和标准答案
|
||||
|
||||
---
|
||||
|
||||
## 七、三轮考试完整流程图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 第一轮考试(正式考试) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 1. 用户进入考试页面 │
|
||||
│ 2. 自动获取用户的 position_id │
|
||||
│ 3. 调用 Dify 工作流生成试题(mistake_records = []) │
|
||||
│ 4. 用户答题,系统实时判断对错 │
|
||||
│ 5. 答错题目立即记录到 exam_mistakes 表 │
|
||||
│ 6. 完成考试,记录得分 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
是否有错题?
|
||||
↓ 是
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 第二轮考试(错题重考1) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 1. 调用接口获取第一轮的错题记录 │
|
||||
│ 2. 传入完整错题详情给 Dify 工作流 │
|
||||
│ 3. Dify 基于错题知识点重新生成针对性试题 │
|
||||
│ 4. 用户答题,判断对错 │
|
||||
│ 5. 答错题目记录到 exam_mistakes 表(关联第二轮考试) │
|
||||
│ 6. 完成考试,记录得分 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
是否有错题?
|
||||
↓ 是
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 第三轮考试(错题重考2) │
|
||||
├─────────────────────────────────────────────────────────────┤
|
||||
│ 1. 调用接口获取第二轮的错题记录 │
|
||||
│ 2. 传入完整错题详情给 Dify 工作流 │
|
||||
│ 3. Dify 基于错题知识点重新生成针对性试题 │
|
||||
│ 4. 用户答题,判断对错 │
|
||||
│ 5. 完成考试,记录最终得分 │
|
||||
│ 6. 结束考试流程 │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**关键要点:**
|
||||
1. 每轮考试都是独立的 exam 记录
|
||||
2. 错题记录会关联到具体的 exam_id
|
||||
3. 第二、三轮考试传入的 `mistake_records` 是上一轮的错题详情,而不是知识点ID
|
||||
4. 岗位ID始终从用户信息中获取,三轮考试都使用相同的岗位ID
|
||||
5. 考试中断后不可恢复,重新进入会重新开始当前轮次
|
||||
|
||||
---
|
||||
|
||||
## 八、注意事项与规范
|
||||
|
||||
### 8.1 开发环境
|
||||
- 本地开发测试环境使用 `localhost`
|
||||
- 全部使用 Docker 容器部署,配合热重载
|
||||
|
||||
### 8.2 数据库操作规范
|
||||
- ⚠️ **不要重置或初始化数据库**,除非经过确认
|
||||
- 严格区分开发测试环境和生产环境
|
||||
|
||||
### 8.3 系统用户特征
|
||||
- 本系统的用户是**轻医美连锁品牌**的员工
|
||||
- 岗位包括:区域经理、店长、美容顾问、医美咨询师、美容技师、护士、前台接待、市场专员等
|
||||
|
||||
### 8.4 联调完成后必做事项
|
||||
1. 将联调、修复的经验更新至:`考培练系统规划/全链路联调/联调经验汇总.md`
|
||||
2. 将规范与约定更新至:`考培练系统规划/全链路联调/规范与约定-团队基线.md`
|
||||
3. 更新前需阅读原文,除了新增内容,还要注意删除错误内容
|
||||
4. 如果修改了数据库结构,更新至:`/kaopeilian-backend/数据库架构-统一版.md`
|
||||
|
||||
---
|
||||
|
||||
## 九、参考信息
|
||||
|
||||
### 9.1 Dify工作流API信息
|
||||
|
||||
#### 试题生成器工作流
|
||||
- **API地址**:`http://dify.ireborn.com.cn/v1/workflows/run`
|
||||
- **Authorization Token**:`app-tDlrmXyS9NtWCShsOx5FH49L`
|
||||
- **用户标识**:`kaopeilian`
|
||||
- **响应模式**:`streaming`
|
||||
|
||||
#### 答案判断工作流
|
||||
- **API地址**:`http://dify.ireborn.com.cn/v1/workflows/run`
|
||||
- **Authorization Token**:`app-FvMdrvbRBz547DVZEorgO1WT`
|
||||
- **用户标识**:`kaopeilian`
|
||||
- **响应模式**:`streaming`
|
||||
|
||||
**⚠️ 注意**:
|
||||
- 两个工作流使用不同的 Authorization Token
|
||||
- 都使用相同的API地址
|
||||
- 响应模式均为 `streaming`(流式响应)
|
||||
- 后端调用时需要处理流式响应数据
|
||||
|
||||
### 9.2 相关页面
|
||||
- **考试页面**:`http://localhost:3001/trainee/exam?courseId=1`
|
||||
- **课程编辑页面(含考试设置)**:`http://localhost:3001/manager/edit-course/1`
|
||||
- **岗位管理页面**:`http://localhost:3001/admin/position-management`
|
||||
|
||||
### 9.3 相关文档
|
||||
- 数据库架构文档:`/kaopeilian-backend/数据库架构-统一版.md`
|
||||
- 联调经验汇总:`考培练系统规划/全链路联调/联调经验汇总.md`
|
||||
- 规范与约定:`考培练系统规划/全链路联调/规范与约定-团队基线.md`
|
||||
- 数据库备份(已确认无错题表):`考培练系统规划/数据库-里程碑备份/2-联调 dify 知识拆解已完成.sql`
|
||||
|
||||
---
|
||||
|
||||
**文档版本**:v1.0
|
||||
**最后更新**:2025-09-30
|
||||
**维护者**:考培练系统开发团队
|
||||
Reference in New Issue
Block a user