🎯 试题管理模块完整优化方案(布局+交互+算法+数据模型)
从前端布局、交互逻辑、后端算法、数据模型四个维度,完善试题管理模块的落地实现,让试题的创建、维护、关联更高效、更贴合教学场景。
一、📋 前端布局与交互优化(现有基础上升级)
1. 试题列表页(核心入口)
✅ 现有功能保留
- 筛选区:题型、知识点、难度、题干搜索
- 列表展示:ID、题干、题型、知识点、难度、分值、状态
- 操作列:详情、编辑、删除
- 顶部按钮:批量导入、添加试题
✅ 新增优化项
| 优化点 | 说明 | 价值 |
|---|---|---|
| 关联信息扩展 | 列表新增「关联试卷数」「使用次数」列,显示该试题被多少试卷引用、被考生作答的次数(如“Java数组声明”关联2套试卷、使用120次) | 直观了解试题的使用价值,辅助筛选高频/低频试题 |
| 批量操作增强 | 新增「批量审核」「批量禁用」「批量导出试题详情」按钮,支持多选试题进行批量处理 | 提升管理员效率,避免重复操作 |
| 状态可视化升级 | 用颜色标签+图标标识状态(待审核-🟡黄色、已审核-🟢绿色、已禁用-🔴红色),醒目清晰 | 快速区分试题状态,定位目标试题 |
| 筛选逻辑优化 | 知识点下拉支持模糊搜索+层级展示(如“spring cloud”→“基础概念/配置管理”),难度筛选支持多选项(如同时选“简单+中等”) | 精准筛选目标试题,减少查找时间 |
🎨 优化后列表布局示意
┌───────────────────────────────────────────────────────────────────────────────────┐ │ 顶部:添加试题(蓝) + 批量导入(绿) + 批量操作(审核/禁用/导出) + 筛选区 │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 列表:ID | 题干 | 题型 | 知识点 | 难度 | 分值 | 关联试卷数 | 使用次数 | 状态 | 操作 │ │ ├──────┼─────────────────────┼──────┼──────────┼──────┼──────┼──────────┼────────┼──────┼──────┤ │ │ 453 │ Java中数组声明方式? | 单选 | spring cloud | 简单 | 5 │ 2 │ 120 │ 🟡待审核 | 详情/编辑/删除 │ │ └──────┴─────────────────────┴──────┴──────────┴──────┴──────┴──────────┴────────┴──────┴──────┘ └───────────────────────────────────────────────────────────────────────────────────┘2. 添加/编辑试题弹窗(核心优化)
✅ 现有问题
- 题型切换后选项数量未动态调整(如判断题仍显示4个选项);
- 缺少题干重复检测,易出现相同试题;
- 知识点仅支持单选,无法关联多个知识点;
- 解析框无格式支持,无法插入代码/公式。
✅ 优化点
| 优化点 | 说明 | 价值 |
|---|---|---|
| 题型动态适配 | 切换题型时自动调整选项数量: • 单选题/判断题:2-4个选项 • 多选题:4-6个选项 • 填空题/简答题:隐藏选项,仅保留题干/答案/解析 | 符合不同题型的出题逻辑,减少无效输入 |
| 多知识点关联 | 知识点选择改为多选下拉(支持模糊搜索+层级选择),允许关联1-3个知识点(如“Java数组”关联“基础语法+数据结构”) | 更精准地标记试题考点,辅助组卷时的知识点覆盖校验 |
| 实时重复检测 | 输入题干后实时检测同科目、同知识点下的题干是否重复,重复时标红并提示(如“该题干在Java科目下已存在,是否继续?”) | 避免试题冗余,保证题库唯一性 |
| 解析富文本支持 | 解析框改为富文本编辑器,支持插入代码块、公式、图片、链接,满足技术类试题的解析需求 | 提升解析的可读性和专业性,适配编程类考试场景 |
| 分值默认值适配 | 根据题型自动填充默认分值(如单选题5分、多选题10分),可手动调整 | 减少手动输入,提升出题效率 |
🎨 优化后弹窗布局示意
┌───────────────────────────────────────────────────────────────────────────────────┐ │ 顶部:添加试题 + 关闭按钮 + 题型下拉(动态适配选项) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 基本信息区:题干(富文本) + 选项(动态数量,支持拖拽排序) + 正确答案(下拉/输入) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 关联信息区:知识点(多选下拉) + 难度(下拉) + 分值(默认填充+可调整) + 科目(下拉) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 解析区:富文本编辑器(支持代码/公式/图片) + 状态(待审核/已审核,默认待审核) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 底部:确定(蓝) + 取消(灰) + 「保存并继续添加」(蓝,批量出题时显示) │ └───────────────────────────────────────────────────────────────────────────────────┘3. 批量导入试题弹窗(核心优化)
✅ 现有问题
- 预览时无法编辑错误数据,需重新上传;
- 错误提示模糊,无法定位具体问题;
- 模板缺少字段说明和示例,导入格式错误率高。
✅ 优化点
| 优化点 | 说明 | 价值 |
|---|---|---|
| 预览编辑功能 | 预览页面支持直接编辑错误数据(如重复题干、选项缺失、知识点不匹配),无需重新上传 | 减少导入失败率,提升导入效率 |
| 详细错误提示 | 错误数据标红,并显示具体原因(如“题干重复”“选项数量不足”“知识点不存在”) | 快速定位问题,修正数据更高效 |
| 模板字段增强 | 导出模板中增加字段说明(如“正确答案格式:单选题填A/B/C/D,多选题填AB/AC”)和示例数据 | 降低导入格式错误率,减少用户困惑 |
| 导入日志关联 | 导入完成后生成导入日志(关联通用operation_log和专属question_import_log),显示成功数量、失败数量、错误报告下载链接 | 便于追溯导入历史,处理失败数据 |
🎨 优化后导入流程示意
1. 选择文件类型 → 2. 上传文件 → 3. 预览并编辑数据 → 4. 确认导入 → 5. 生成导入日志(关联双日志)二、⚙️ 后端算法与数据模型优化
1. 核心表结构(基于优化后的设计)
| 表名 | 核心字段 | 用途 | 关联关系 |
|---|---|---|---|
question(试题主表) | id,stem(题干),type(题型),options(选项JSON),correct_answer,analysis(解析),knowledge_ids(关联知识点ID,JSON),difficulty,score,subject_id,status,create_user_id,create_time | 存储试题基本信息,支持多知识点关联 | 多对多关联knowledge表(通过question_knowledge中间表),多对一关联subject表 |
question_knowledge(试题-知识点关联表) | id,question_id,knowledge_id | 存储试题与知识点的关联关系,支持多知识点关联 | 关联question.id和knowledge.id |
question_import_log(试题导入日志表) | id,user_id,subject_id,file_type,total_count,success_count,fail_count,fail_reason(JSON),create_time | 记录导入详细信息 | 关联operation_log.biz_id |
operation_log(通用操作日志表) | id,user_id,operate_type,operate_content,biz_id,create_time | 记录操作轨迹(创建/编辑/删除/导入试题) | biz_id关联对应表的ID |
paper_question(试卷-试题关联表) | id,paper_id,question_id,sort_num,score | 存储试卷与试题的关联关系,支持统计关联试卷数 | 关联question.id和paper.id |
2. 核心算法实现
✅ 试题重复检测算法
// 检测同科目、同知识点下的题干是否重复@GetMapping("/checkStem")publicResultcheckStem(@RequestParamStringstem,@RequestParamLongsubjectId,@RequestParamList<Long>knowledgeIds,@RequestParam(required=false)LongexcludeId){LambdaQueryWrapper<Question>wrapper=Wrappers.lambdaQuery();wrapper.eq(Question::getStem,stem).eq(Question::getSubjectId,subjectId).in(Question::getKnowledgeIds,knowledgeIds);// 多知识点关联检测if(excludeId!=null){wrapper.ne(Question::getId,excludeId);// 编辑时排除自身}booleanexists=questionService.exists(wrapper);returnResult.success(!exists);// true表示题干可用,false表示重复}✅ 批量导入解析算法
// 批量导入试题核心逻辑@PostMapping("/import")publicResultimportQuestions(@RequestParamMultipartFilefile,@RequestParamLongsubjectId){// 1. 解析文件(Excel/Word),转换为试题列表// 2. 实时校验:检测重复题干、选项完整性、知识点是否存在、格式是否正确// 3. 拆分成功/失败列表,失败列表记录错误原因// 4. 批量插入成功的试题到`question`表,同步更新`question_knowledge`关联表// 5. 记录导入日志到`question_import_log`和`operation_log`(关联)// 6. 返回导入结果(成功数量、失败数量、错误报告下载链接)returnResult.success(importResult);}✅ 关联删除校验算法
// 删除试题核心逻辑@DeleteMapping("/delete")publicResultdeleteQuestion(@RequestParamLongquestionId){// 1. 校验试题是否存在// 2. 校验试题是否已关联试卷(关联`paper_question`表)longpaperCount=paperQuestionService.countByQuestionId(questionId);if(paperCount>0){returnResult.error("该试题已被"+paperCount+"套试卷引用,无法删除");}// 3. 删除`question`表和`question_knowledge`关联表记录questionService.removeById(questionId);questionKnowledgeService.removeByQuestionId(questionId);// 4. 记录操作日志到`operation_log`operationLogService.saveLog("删除试题","试题ID:"+questionId,questionId);returnResult.success("试题已成功删除");}三、🔄 交互逻辑闭环(完整流程)
1. 试题创建流程
2. 试题导入流程
四、✨ 优化价值总结
- 体验提升:动态题型适配、多知识点关联、富文本解析等功能,让试题创建更高效、更专业。
- 数据一致:重复检测、关联删除校验、导入日志等机制,避免试题冗余和数据混乱。
- 功能完善:批量操作、筛选优化、预览编辑等功能,满足教学场景的精细化需求。
- 业务适配:多知识点关联、试卷关联统计、富文本解析,适配技术类考试的专业需求。
- 风险防控:禁止删除关联试题、状态校验、错误日志等机制,保障系统稳定性和数据安全性。