10 KiB
10 KiB
题库上传和随机抽题功能设计方案
一、功能概述
在现有考试系统基础上,新增题库管理功能,支持:
- 题库管理:创建和管理独立的题目库
- 题目上传:支持Excel批量导入题目
- 随机抽题:创建考试时从题库中按题型和数量随机抽取题目
二、数据库设计
2.1 新增表结构
1. 题库表(question_bank)
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)
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)
-- 添加字段,标识题目来源
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 | 正确答案 | 分值 | 难度 | 知识点 - 导入流程:
- 选择题库
- 下载模板(可选)
- 上传Excel文件
- 预览导入数据
- 确认导入
- 显示导入结果(成功/失败统计)
3.2.2 手动添加题目
- 支持在线表单添加单个题目
- 支持所有题型(单选、多选、判断、填空、简答)
3.3 随机抽题模块
3.3.1 修改考试创建页面
- 现有流程:AI生成题目 → 预览 → 保存
- 新增流程:选择出题方式 → [AI生成 / 从题库抽取] → 预览 → 保存
3.3.2 从题库抽题界面
- 选择题库:下拉选择(按科目筛选)
- 题型配置:
- 题型选择(单选、多选、判断、填空、简答)
- 每种题型的抽取数量
- 可选:难度筛选、知识点筛选
- 抽题规则:
- 随机抽取
- 按难度比例抽取(如:简单30%,中等50%,困难20%)
- 按知识点分布抽取
3.3.3 抽题逻辑
// 伪代码
1. 根据题型、难度、知识点等条件筛选题库题目
2. 如果符合条件的题目数量 >= 需要的数量
- 随机抽取指定数量的题目
3. 如果符合条件的题目数量 < 需要的数量
- 提示:题库中该类型题目不足
- 可选择:减少数量 或 放宽条件
4. 将抽取的题目复制到question表,关联到exam_id
5. 记录题目来源(bank_id, bank_item_id)
四、API接口设计
4.1 题库管理接口
// 题库列表
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 题目管理接口
// 添加题目到题库
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 随机抽题接口
// 从题库随机抽题
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:显示题目来源标识
六、实现步骤
第一阶段:数据库和基础功能
- ✅ 创建数据库表(question_bank, question_bank_item)
- ✅ 修改question表,添加来源字段
- ✅ 创建后端实体类、Mapper、Service、Controller
- ✅ 创建前端API文件
第二阶段:题库管理功能
- ✅ 题库列表页面
- ✅ 题库新增/编辑功能
- ✅ 题库题目列表和CRUD
- ✅ 手动添加题目功能
第三阶段:题目导入功能
- ✅ Excel模板生成和下载
- ✅ Excel文件解析
- ✅ 数据验证和导入
- ✅ 导入结果反馈
第四阶段:随机抽题功能
- ✅ 修改考试创建页面,增加抽题选项
- ✅ 题库选择界面
- ✅ 题型配置界面
- ✅ 后端抽题算法实现
- ✅ 题目预览和确认
第五阶段:优化和测试
- ✅ 抽题算法优化(避免重复、难度分布等)
- ✅ 性能优化(大量题目时的查询优化)
- ✅ 异常处理(题目不足时的提示)
- ✅ 单元测试和集成测试
七、技术要点
7.1 Excel导入
- 前端:使用
xlsx库解析Excel - 后端:使用
EasyExcel或Apache POI解析 - 验证:题目格式验证、必填项检查、选项格式验证
7.2 随机抽题算法
// 核心算法
1. 根据条件查询符合条件的题目列表
2. 使用Collections.shuffle()打乱顺序
3. 取前N个题目
4. 检查是否有重复(如果题库题目可能重复)
7.3 性能优化
- 题库题目表添加索引(bank_id, question_type, difficulty)
- 大量题目时使用分页查询
- 抽题时使用数据库随机函数(ORDER BY RAND())或应用层随机
八、注意事项
-
数据一致性:
- 删除题库时,检查是否有考试正在使用该题库的题目
- 删除题库题目时,检查是否已被考试使用
-
权限控制:
- 教师只能管理自己创建的题库
- 管理员可以管理所有题库
-
题目去重:
- 导入时检查重复题目(可根据题干内容判断)
- 抽题时避免同一题目被多次抽取
-
用户体验:
- 导入失败时,详细提示错误原因和行号
- 抽题时,实时显示可抽取的题目数量
- 题目不足时,提供友好的提示和建议
九、扩展功能(可选)
- 题目标签系统:支持给题目打标签,按标签筛选
- 题目难度自动评估:基于答题数据自动调整难度
- 题目使用统计:统计题目被使用的次数和正确率
- 题库共享:支持题库在教师间共享
- 题目审核:支持题目审核流程
确认事项
请确认以下内容:
- ✅ 数据库表结构设计是否合理?
- ✅ 功能模块划分是否清晰?
- ✅ 随机抽题的规则是否符合需求?
- ✅ Excel导入格式是否满足要求?
- ✅ 是否需要其他扩展功能?
确认后即可开始实现。