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

336 lines
10 KiB
Markdown
Raw 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.

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