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