Files
012-kaopeilian/docs/规划/完成审核的文件备份/考试工作流联调文档 2.md
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

727 lines
26 KiB
Markdown
Raw Permalink 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.
# 考试工作流联调文档
## 一、功能概述
### 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 '题目IDAI生成的题目可能为空',
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
**维护者**:考培练系统开发团队