336 lines
10 KiB
Markdown
336 lines
10 KiB
Markdown
# 题库上传和随机抽题功能设计方案
|
||
|
||
## 一、功能概述
|
||
|
||
在现有考试系统基础上,新增题库管理功能,支持:
|
||
1. **题库管理**:创建和管理独立的题目库
|
||
2. **题目上传**:支持Excel批量导入题目
|
||
3. **随机抽题**:创建考试时从题库中按题型和数量随机抽取题目
|
||
|
||
## 二、数据库设计
|
||
|
||
### 2.1 新增表结构
|
||
|
||
#### 1. 题库表(question_bank)
|
||
```sql
|
||
CREATE TABLE `question_bank` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '题库ID',
|
||
`bank_name` varchar(200) NOT NULL COMMENT '题库名称',
|
||
`subject_id` bigint NOT NULL COMMENT '科目ID',
|
||
`subject_name` varchar(100) DEFAULT NULL COMMENT '科目名称',
|
||
`description` varchar(500) DEFAULT NULL COMMENT '题库描述',
|
||
`question_count` int DEFAULT 0 COMMENT '题目数量',
|
||
`create_user_id` bigint DEFAULT NULL COMMENT '创建人ID(教师ID)',
|
||
`create_by` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||
`update_by` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_subject_id` (`subject_id`),
|
||
KEY `idx_create_user_id` (`create_user_id`)
|
||
) COMMENT='题库表';
|
||
```
|
||
|
||
#### 2. 题库题目表(question_bank_item)
|
||
```sql
|
||
CREATE TABLE `question_bank_item` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '题目ID',
|
||
`bank_id` bigint NOT NULL COMMENT '题库ID',
|
||
`question_type` varchar(20) NOT NULL COMMENT '题型(single-单选, multiple-多选, judge-判断, fill-填空, essay-简答)',
|
||
`question_content` text NOT NULL COMMENT '题干',
|
||
`options` text DEFAULT NULL COMMENT '选项(JSON格式)',
|
||
`correct_answer` text NOT NULL COMMENT '正确答案',
|
||
`score` decimal(10,2) DEFAULT 0.00 COMMENT '默认分值',
|
||
`difficulty` varchar(10) DEFAULT 'medium' COMMENT '难度(easy-简单, medium-中等, hard-困难)',
|
||
`knowledge_point` varchar(200) DEFAULT NULL COMMENT '知识点',
|
||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_bank_id` (`bank_id`),
|
||
KEY `idx_question_type` (`question_type`),
|
||
KEY `idx_difficulty` (`difficulty`)
|
||
) COMMENT='题库题目表';
|
||
```
|
||
|
||
#### 3. 修改现有题目表(question)
|
||
```sql
|
||
-- 添加字段,标识题目来源
|
||
ALTER TABLE `question`
|
||
ADD COLUMN `source_type` varchar(20) DEFAULT 'manual' COMMENT '题目来源(manual-手动创建, bank-题库抽取, ai-AI生成)',
|
||
ADD COLUMN `bank_id` bigint DEFAULT NULL COMMENT '来源题库ID(如果来自题库)',
|
||
ADD COLUMN `bank_item_id` bigint DEFAULT NULL COMMENT '来源题库题目ID(如果来自题库)';
|
||
```
|
||
|
||
### 2.2 表关系说明
|
||
|
||
```
|
||
question_bank (题库)
|
||
↓ (1:N)
|
||
question_bank_item (题库题目)
|
||
↓ (N:1) [随机抽取]
|
||
question (考试题目) ← exam (考试)
|
||
```
|
||
|
||
## 三、功能模块设计
|
||
|
||
### 3.1 题库管理模块
|
||
|
||
#### 3.1.1 题库列表页面
|
||
- **路径**:`/study/questionBank/index`
|
||
- **功能**:
|
||
- 显示题库列表(名称、科目、题目数量、创建时间等)
|
||
- 支持按科目、名称搜索
|
||
- 支持新增、编辑、删除题库
|
||
- 支持查看题库详情和题目列表
|
||
|
||
#### 3.1.2 题库详情页面
|
||
- **路径**:`/study/questionBank/detail`
|
||
- **功能**:
|
||
- 显示题库基本信息
|
||
- 显示题库中的题目列表
|
||
- 支持按题型筛选
|
||
- 支持添加、编辑、删除题目
|
||
- 支持批量导入题目(Excel)
|
||
|
||
### 3.2 题目上传模块
|
||
|
||
#### 3.2.1 Excel导入功能
|
||
- **支持格式**:
|
||
- Excel文件(.xlsx, .xls)
|
||
- 模板下载功能
|
||
- **Excel模板结构**:
|
||
```
|
||
题型 | 题干 | 选项A | 选项B | 选项C | 选项D | 正确答案 | 分值 | 难度 | 知识点
|
||
```
|
||
- **导入流程**:
|
||
1. 选择题库
|
||
2. 下载模板(可选)
|
||
3. 上传Excel文件
|
||
4. 预览导入数据
|
||
5. 确认导入
|
||
6. 显示导入结果(成功/失败统计)
|
||
|
||
#### 3.2.2 手动添加题目
|
||
- 支持在线表单添加单个题目
|
||
- 支持所有题型(单选、多选、判断、填空、简答)
|
||
|
||
### 3.3 随机抽题模块
|
||
|
||
#### 3.3.1 修改考试创建页面
|
||
- **现有流程**:AI生成题目 → 预览 → 保存
|
||
- **新增流程**:选择出题方式 → [AI生成 / 从题库抽取] → 预览 → 保存
|
||
|
||
#### 3.3.2 从题库抽题界面
|
||
- **选择题库**:下拉选择(按科目筛选)
|
||
- **题型配置**:
|
||
- 题型选择(单选、多选、判断、填空、简答)
|
||
- 每种题型的抽取数量
|
||
- 可选:难度筛选、知识点筛选
|
||
- **抽题规则**:
|
||
- 随机抽取
|
||
- 按难度比例抽取(如:简单30%,中等50%,困难20%)
|
||
- 按知识点分布抽取
|
||
|
||
#### 3.3.3 抽题逻辑
|
||
```java
|
||
// 伪代码
|
||
1. 根据题型、难度、知识点等条件筛选题库题目
|
||
2. 如果符合条件的题目数量 >= 需要的数量
|
||
- 随机抽取指定数量的题目
|
||
3. 如果符合条件的题目数量 < 需要的数量
|
||
- 提示:题库中该类型题目不足
|
||
- 可选择:减少数量 或 放宽条件
|
||
4. 将抽取的题目复制到question表,关联到exam_id
|
||
5. 记录题目来源(bank_id, bank_item_id)
|
||
```
|
||
|
||
## 四、API接口设计
|
||
|
||
### 4.1 题库管理接口
|
||
|
||
```javascript
|
||
// 题库列表
|
||
GET /study/questionBank/list
|
||
// 题库详情
|
||
GET /study/questionBank/{id}
|
||
// 新增题库
|
||
POST /study/questionBank
|
||
// 修改题库
|
||
PUT /study/questionBank
|
||
// 删除题库
|
||
DELETE /study/questionBank/{ids}
|
||
// 题库题目列表
|
||
GET /study/questionBank/{bankId}/items
|
||
```
|
||
|
||
### 4.2 题目管理接口
|
||
|
||
```javascript
|
||
// 添加题目到题库
|
||
POST /study/questionBank/{bankId}/items
|
||
// 修改题库题目
|
||
PUT /study/questionBank/items/{id}
|
||
// 删除题库题目
|
||
DELETE /study/questionBank/items/{ids}
|
||
// 批量导入题目
|
||
POST /study/questionBank/{bankId}/import
|
||
// 下载导入模板
|
||
GET /study/questionBank/template
|
||
```
|
||
|
||
### 4.3 随机抽题接口
|
||
|
||
```javascript
|
||
// 从题库随机抽题
|
||
POST /study/exam/{examId}/random-questions
|
||
// 请求参数:
|
||
{
|
||
"bankId": 1,
|
||
"questionConfig": [
|
||
{
|
||
"type": "single",
|
||
"count": 10,
|
||
"difficulty": "medium", // 可选
|
||
"knowledgePoint": "xxx" // 可选
|
||
},
|
||
{
|
||
"type": "multiple",
|
||
"count": 5
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 五、前端页面设计
|
||
|
||
### 5.1 菜单结构
|
||
```
|
||
学习系统
|
||
├── 学科分类
|
||
├── 班级管理
|
||
├── 课件管理
|
||
├── 课程管理
|
||
├── 课程分配
|
||
├── 学习记录
|
||
├── 学习监控
|
||
├── 用户审核
|
||
├── 班级用户管理
|
||
├── 考试管理
|
||
├── 成绩管理
|
||
├── 语音评测
|
||
└── 题库管理(新增) ← 新增菜单
|
||
├── 题库列表
|
||
└── 题目管理
|
||
```
|
||
|
||
### 5.2 页面文件结构
|
||
```
|
||
ruoyi-ui/src/views/study/questionBank/
|
||
├── index.vue # 题库列表
|
||
├── detail.vue # 题库详情和题目管理
|
||
└── components/
|
||
├── QuestionForm.vue # 题目表单组件
|
||
├── ImportDialog.vue # 导入对话框
|
||
└── QuestionPreview.vue # 题目预览组件
|
||
```
|
||
|
||
### 5.3 修改现有页面
|
||
- `exam/create.vue`:增加"从题库抽取"选项
|
||
- `exam/index.vue`:显示题目来源标识
|
||
|
||
## 六、实现步骤
|
||
|
||
### 第一阶段:数据库和基础功能
|
||
1. ✅ 创建数据库表(question_bank, question_bank_item)
|
||
2. ✅ 修改question表,添加来源字段
|
||
3. ✅ 创建后端实体类、Mapper、Service、Controller
|
||
4. ✅ 创建前端API文件
|
||
|
||
### 第二阶段:题库管理功能
|
||
1. ✅ 题库列表页面
|
||
2. ✅ 题库新增/编辑功能
|
||
3. ✅ 题库题目列表和CRUD
|
||
4. ✅ 手动添加题目功能
|
||
|
||
### 第三阶段:题目导入功能
|
||
1. ✅ Excel模板生成和下载
|
||
2. ✅ Excel文件解析
|
||
3. ✅ 数据验证和导入
|
||
4. ✅ 导入结果反馈
|
||
|
||
### 第四阶段:随机抽题功能
|
||
1. ✅ 修改考试创建页面,增加抽题选项
|
||
2. ✅ 题库选择界面
|
||
3. ✅ 题型配置界面
|
||
4. ✅ 后端抽题算法实现
|
||
5. ✅ 题目预览和确认
|
||
|
||
### 第五阶段:优化和测试
|
||
1. ✅ 抽题算法优化(避免重复、难度分布等)
|
||
2. ✅ 性能优化(大量题目时的查询优化)
|
||
3. ✅ 异常处理(题目不足时的提示)
|
||
4. ✅ 单元测试和集成测试
|
||
|
||
## 七、技术要点
|
||
|
||
### 7.1 Excel导入
|
||
- **前端**:使用 `xlsx` 库解析Excel
|
||
- **后端**:使用 `EasyExcel` 或 `Apache POI` 解析
|
||
- **验证**:题目格式验证、必填项检查、选项格式验证
|
||
|
||
### 7.2 随机抽题算法
|
||
```java
|
||
// 核心算法
|
||
1. 根据条件查询符合条件的题目列表
|
||
2. 使用Collections.shuffle()打乱顺序
|
||
3. 取前N个题目
|
||
4. 检查是否有重复(如果题库题目可能重复)
|
||
```
|
||
|
||
### 7.3 性能优化
|
||
- 题库题目表添加索引(bank_id, question_type, difficulty)
|
||
- 大量题目时使用分页查询
|
||
- 抽题时使用数据库随机函数(ORDER BY RAND())或应用层随机
|
||
|
||
## 八、注意事项
|
||
|
||
1. **数据一致性**:
|
||
- 删除题库时,检查是否有考试正在使用该题库的题目
|
||
- 删除题库题目时,检查是否已被考试使用
|
||
|
||
2. **权限控制**:
|
||
- 教师只能管理自己创建的题库
|
||
- 管理员可以管理所有题库
|
||
|
||
3. **题目去重**:
|
||
- 导入时检查重复题目(可根据题干内容判断)
|
||
- 抽题时避免同一题目被多次抽取
|
||
|
||
4. **用户体验**:
|
||
- 导入失败时,详细提示错误原因和行号
|
||
- 抽题时,实时显示可抽取的题目数量
|
||
- 题目不足时,提供友好的提示和建议
|
||
|
||
## 九、扩展功能(可选)
|
||
|
||
1. **题目标签系统**:支持给题目打标签,按标签筛选
|
||
2. **题目难度自动评估**:基于答题数据自动调整难度
|
||
3. **题目使用统计**:统计题目被使用的次数和正确率
|
||
4. **题库共享**:支持题库在教师间共享
|
||
5. **题目审核**:支持题目审核流程
|
||
|
||
---
|
||
|
||
## 确认事项
|
||
|
||
请确认以下内容:
|
||
1. ✅ 数据库表结构设计是否合理?
|
||
2. ✅ 功能模块划分是否清晰?
|
||
3. ✅ 随机抽题的规则是否符合需求?
|
||
4. ✅ Excel导入格式是否满足要求?
|
||
5. ✅ 是否需要其他扩展功能?
|
||
|
||
确认后即可开始实现。
|
||
|