# 考试模块（Exam Module）

## 模块概述

考试模块是考培练系统的核心功能之一，提供动态组卷、在线考试、自动判题、成绩分析和错题管理等功能。该模块与Dify AI平台集成，支持智能出题和主观题自动评分。

## 主要功能

### 1. 动态组卷
- 根据课程、知识点、难度等参数动态生成试卷
- 支持多种题型：单选题、多选题、判断题、填空题、简答题、论述题
- 通过Dify工作流实现智能出题

### 2. 考试管理
- 考试计时和状态管理
- 防作弊机制（防重复提交、超时控制）
- 题目与答案分离存储，确保安全性

### 3. 自动判题
- 客观题自动判分
- 主观题通过Dify AI评分
- 实时计算成绩和统计信息

### 4. 成绩分析
- 详细的成绩报告
- 题型正确率统计
- 知识点掌握情况分析
- AI生成的学习建议

### 5. 错题管理
- 自动记录错题
- 支持错题复习和标记掌握状态
- 按知识点分类管理

## 技术架构

### 数据模型
- `ExamSession`: 考试会话表
- `ExamQuestion`: 考试题目表
- `ExamAnswer`: 考试答案表
- `ExamResult`: 考试结果表
- `Mistake`: 错题记录表

### API接口

#### 1. 开始考试
```
POST /api/v1/exams/start
```
- 功能：动态生成试卷并开始考试
- 权限：需要登录
- 参数：课程ID、题目数量、时长、难度等

#### 2. 提交考试
```
POST /api/v1/exams/{examId}/submit
```
- 功能：提交答案并生成成绩
- 权限：需要登录，只能提交自己的考试
- 参数：答案列表

#### 3. 获取考试详情
```
GET /api/v1/exams/{examId}
```
- 功能：获取考试信息和题目（不含答案）
- 权限：需要登录，只能查看自己的考试

#### 4. 获取考试记录
```
GET /api/v1/exams/records
```
- 功能：分页获取考试历史记录
- 权限：需要登录
- 支持按状态筛选

#### 5. 获取考试结果
```
GET /api/v1/exams/{examId}/result
```
- 功能：获取详细的考试成绩和分析
- 权限：需要登录，只能查看自己的成绩

#### 6. 获取错题列表
```
GET /api/v1/exams/mistakes
```
- 功能：分页获取错题记录
- 权限：需要登录
- 支持按掌握状态筛选

## 配置说明

### 环境变量
```env
# Dify配置
DIFY_API_BASE=https://api.dify.ai/v1
DIFY_API_KEY=your_api_key
DIFY_EXAM_WORKFLOW_ID=exam_workflow_id
DIFY_EVAL_WORKFLOW_ID=eval_workflow_id
DIFY_TIMEOUT=30
```

### 考试参数限制
- 题目数量：1-100题
- 考试时长：1-300分钟
- 难度等级：1-5级
- 默认及格分：60分

## 使用示例

### 1. 开始考试
```python
# 请求
POST /api/v1/exams/start
{
    "exam_name": "Python基础测试",
    "question_count": 20,
    "time_limit": 60,
    "difficulty": 3,
    "knowledge_points": ["Python基础", "数据结构"],
    "question_types": ["single_choice", "true_false"]
}

# 响应
{
    "code": 200,
    "message": "考试开始成功",
    "data": {
        "id": 1,
        "exam_name": "Python基础测试",
        "total_questions": 20,
        "total_score": 100.0,
        "time_limit": 60,
        "status": "in_progress",
        "started_at": "2024-01-01T10:00:00",
        "questions": [...]
    }
}
```

### 2. 提交考试
```python
# 请求
POST /api/v1/exams/1/submit
{
    "answers": [
        {
            "question_id": 1,
            "user_answer": "B",
            "time_spent": 30
        },
        {
            "question_id": 2,
            "user_answer": "True",
            "time_spent": 20
        }
    ]
}

# 响应
{
    "code": 200,
    "message": "考试提交成功",
    "data": {
        "exam_id": 1,
        "total_score": 100.0,
        "actual_score": 85.0,
        "percentage_score": 85.0,
        "is_passed": true,
        "correct_questions": 17,
        "ai_analysis": "您在Python基础部分表现优秀...",
        "improvement_suggestions": ["建议加强数据结构的学习"]
    }
}
```

## 安全考虑

1. **认证控制**：所有接口需要JWT认证
2. **权限隔离**：用户只能访问自己的考试数据
3. **防作弊机制**：
   - 题目与答案分离存储
   - 考试状态严格控制
   - 超时自动结束
   - 防止重复提交

## 性能优化

1. **数据库索引**：
   - 用户ID和考试状态联合索引
   - 考试ID和题目顺序联合索引
   
2. **分页查询**：
   - 考试记录和错题列表支持分页
   - 默认每页20条，最大100条

3. **异步处理**：
   - 使用异步数据库操作
   - Dify API调用设置超时控制

## 扩展性

该模块设计考虑了未来的扩展需求：

1. **题库管理**：预留了题库查询接口
2. **批量导入**：支持从Excel导入试题
3. **考试模板**：可保存常用考试配置
4. **团体考试**：支持班级或部门统一考试
5. **证书生成**：考试通过后生成电子证书

## 测试覆盖

- 单元测试：覆盖所有服务层方法
- 集成测试：覆盖所有API接口
- 测试场景包括：
  - 正常流程测试
  - 异常情况处理
  - 权限控制验证
  - 边界条件测试
