Files
aue/docs/superpowers/specs/2026-05-10-exam-assessment-design.md
2026-06-03 13:16:30 +08:00

235 lines
9.0 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.
# 试卷考核功能设计文档
> 日期: 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 权限 |