guoyu/Test/备份/_已清理文件备份_周六 22512/md/题库功能设计方案.md

336 lines
10 KiB
Markdown
Raw Normal View History

# 题库上传和随机抽题功能设计方案
## 一、功能概述
在现有考试系统基础上,新增题库管理功能,支持:
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. ✅ 是否需要其他扩展功能?
确认后即可开始实现。