# 试卷考核功能设计文档

> 日期: 2026-05-10
> 状态: 已批准
> 模块: 考察与训练 - 试卷考核子功能

## 一、功能概述

在现有「考察与训练」模块中新增 **试卷考核** 主标签页，为用户提供完整的考试流程：接收考试 → 答题 → 批改 → 查看成绩 → 错题练习。同时保留用户自行生成测试卷的能力。

## 二、模块架构

### 2.1 改造后的标签页结构

```
考察与训练 (exam)
├── 🤖 AI出题        (generate)   — exam:ai      — 管理员/有权限
├── 📚 题库管理      (bank)       — exam:bank    — 管理员/有权限
├── 📋 智能组卷      (paper)      — exam:paper   — 管理员专用（可编辑+发布）
├── 📝 试卷考核      (exam)       — exam:exam    — 全员（答题+错题+自测）
└── 🎯 互动训练      (train)      — exam:train   — 全员（闯关+每日一练）
```

### 2.2 试卷考核子标签页

```
试卷考核 [exam]
├── 📋 待考试      (pending)    — 管理员发布的待完成试卷列表
├── ✏️ 答题中      (taking)     — 全屏答题界面（当前正在答的试卷）
├── 📊 成绩单      (results)    — 已完成的试卷批改结果
├── ❌ 错题本      (wrong)      — 调用 wrong-questions/list API
└── 🔧 自测组卷    (selftest)   — 用户自行生成试卷（只生成不编辑，直接做题）
```

## 三、权限模型

### 3.1 新增权限代码

在 `permission.js` 的 `permissionCodeToModule` 中新增：

```javascript
'exam:exam': 'exam',           // 试卷考核 - 查看、答题、成绩、错题
'exam:exam:selftest': 'exam',  // 自测组卷 - 用户自行生成试卷
```

### 3.2 数据库新增权限记录

需在 `permission` 表中插入：

| permissionCode | permissionName | parentId(=exam节点ID) |
|---------------|---------------|---------------------|
| `exam:exam` | 试卷考核 | [exam父节点ID] |

### 3.3 角色分配建议

| 角色 | 可见标签页 |
|-----|----------|
| 超级管理员/管理员 | 全部5个（含智能组卷编辑发布） |
| 普通员工 | AI出题 + 试卷考核 + 互动训练 |

### 3.4 前端权限控制变量

```javascript
const canShowExam = computed(() =>
  hasChildPermission('exam:exam') || hasChildPermission('exam')
)
```

## 四、核心功能详细设计

### 4.1 待考试列表 (pending)

**功能**: 展示管理员通过「智能组卷」发布后、用户尚未完成的试卷。

**数据来源**: `GET /api/exam/my/papers` (§15.1)

**展示字段**:
- 试卷标题 (paper_title)
- 出卷人/来源
- 题目数量 (question_count)
- 总分 (total_score)
- 发布时间 (generated_at)
- 状态标签: `待考试`

**交互**: 点击卡片 → 进入全屏答题页面

**空状态**: "暂无待考试试卷，请等待管理员发布"

### 4.2 答题页面 (taking)

**功能**: 全屏沉浸式答题界面，支持5种题型的答案输入。

**触发**: 从待考试列表点击进入 / 从自测组卷生成后自动进入

**界面布局**:
```
┌─────────────────────────────────────────────┐
│ ⬅ 返回    📝 《试卷名称》         倒计时 ⏱️  │
├─────────────────────────────────────────────┤
│                                             │
│  第 1/13 题  [单选题]  ★ 5分                │
│  ───────────────────────────────────────    │
│  根据公司考勤制度，迟到15分钟以内的处罚是？   │
│                                             │
│  ○ A. 口头警告                               │
│  ○ B. 扣款50元                              │
│  ● C. 扣款100元                             │
│  ○ D. 视为旷工                              │
│                                             │
├─────────────────────────────────────────────┤
│              < 上一题    下一题 >   提交试卷  │
└─────────────────────────────────────────────┘
```

**题型渲染规则**:
| question_type | 控件 | 答案格式 |
|--------------|------|---------|
| single_choice | Radio 单选 | 字符串 "A" |
| multiple_choice | Checkbox 多选 | 数组 ["A","C"] |
| true_false | Radio 是/否 | 字符串 "true"/"false" |
| fill_blank | Input 输入框 | 字符串 |
| subjective | Textarea 文本域 | 字符串 |

**状态管理**:
```javascript
const currentTakingPaper = ref(null)       // 当前正在答的试卷
const currentQuestionIndex = ref(0)       // 当前题目索引
const takingAnswers = ref({})             // { questionId: answer }
const isSubmitting = ref(false)           // 提交中状态
```

**提交逻辑**:
1. 收集所有答案 → 构建 `answers` 数组
2. 调用 `POST /api/exam/grade` (§14.3)
3. 收到批改结果 → 自动跳转到成绩单视图
4. 错题自动标记 → 可在错题本中查看

### 4.3 成绩单 (results)

**功能**: 展示已完成的试卷批改结果。

**数据来源**: 提交批改时的响应 + `POST /api/exam/answers/query` (§14.4)

**展示内容**:
- 总分 / 得分 / 得分率
- 每道题的对错状态、得分、反馈
- 用时统计
- 操作按钮: 「查看解析」「重做错题」

### 4.4 错题本 (wrong)

**功能**: 展示用户的错题记录，支持查看解析和重做。

**数据来源**: `POST /api/wrong-questions/list` (§18.1)

**操作**:
- 查看解析: 显示标准答案 + AI反馈 + 选项高亮
- 重做: 调用 `POST /api/wrong-questions/redo` (§18.3) → 进入答题模式
- 收藏: 调用 `POST /api/wrong-questions/collection/toggle` (§18.2)

**与互动训练错题本的关系**:
- 互动训练的错题本是前端本地缓存（闯关/每日一练的错题）
- 试卷考核的错题本调用后端API，是持久化的真实错题数据
- 两者独立存在，互不影响

### 4.5 自测组卷 (selftest)

**功能**: 用户自行配置参数生成测试卷，生成后直接进入答题。

**API**: `POST /api/exam/paper/generate` (§14.1) — 用户版

**与智能组卷的区别**:

| 维度 | 智能组卷(管理员) | 自测组卷(用户) |
|-----|----------------|--------------|
| API | 同一个接口 | 同一个接口 |
| 生成后行为 | 进入编辑预览 | **直接进入答题** |
| 可编辑题目 | ✅ 编辑题干/选项/答案 | ❌ |
| 可发布给他人 | ✅ 发布按钮 | ❌ 仅自己使用 |
| 保存到试卷列表 | ✅ 存入后端 | ❌ 前端暂存 |
| 权限要求 | `exam:paper` | `exam:exam:selftest` |

**交互流程**:
1. 配置参数（题型数量、难度）→ 可选关联制度文件
2. 点击「开始测试」→ 调用 generatePaper API
3. 生成成功 → 自动切换到答题页面(taking)
4. 答题 → 提交批改 → 显示成绩

## 五、智能组卷改造（管理员增强）

### 5.1 新增能力

在现有的智能组卷功能上增加：

1. **编辑题目**: 在预览弹窗中点击题目旁的「编辑」按钮
   - 可修改: 题干(stem)、选项(options)、答案(answer)、分值(score)
   - 使用已有的 `showEditQuestionModal` 逻辑

2. **发布试卷**: 在预览弹窗底部增加「发布试卷」按钮
   - 调用后端发布接口（如需要新增接口则后续补充）
   - 发布成功后有 `exam:exam` 权限的用户可在「试卷考核-待考试」中看到

3. **试卷列表**: 增加本地已生成试卷的管理面板
   - 显示所有已生成的试卷（草稿/已发布）
   - 支持预览、编辑草稿、发布、删除

### 5.2 权限隔离

```javascript
// 只有拥有 exam:paper 权限的用户才能看到编辑和发布按钮
const canEditAndPublish = computed(() => hasChildPermission('exam:paper'))
```

## 六、API 接口清单

| 功能 | 方法 | 路径 | 文档章节 |
|-----|------|------|---------|
| 生成试卷(共用) | POST | `/api/exam/paper/generate` | §14.1 |
| 批改答案 | POST | `/api/exam/grade` | §14.3 |
| 查询答题记录 | POST | `/api/exam/answers/query` | §14.4 |
| 我的试卷列表 | GET | `/api/exam/my/papers` | §15.1 |
| 试卷详情 | GET | `/api/exam/paper/{paperId}` | §15.2 |
| 错题列表 | POST | `/api/wrong-questions/list` | §18.1 |
| 收藏错题 | POST | `/api/wrong-questions/collection/toggle` | §18.2 |
| 重做错题 | POST | `/api/wrong-questions/redo` | §18.3 |

## 七、文件变更清单

| 文件 | 变更类型 | 说明 |
|-----|---------|------|
| `src/utils/permission.js` | 修改 | 新增 `exam:exam` 权限映射 |
| `src/api/exam.js` | 已完成 | 所有API方法已在之前添加 |
| `src/components/ExamModule.vue` | 大幅修改 | 新增试卷考核标签页及全部子功能 |
| 数据库 permission 表 | 新增记录 | INSERT exam:exam 权限 |
