内网渗透-内网信息收集
2026/1/22 15:24:57
从前端布局、交互逻辑、后端算法、数据模型四个维度,完善试题管理模块的落地实现,让试题的创建、维护、关联更高效、更贴合教学场景。
| 优化点 | 说明 | 价值 |
|---|---|---|
| 关联信息扩展 | 列表新增「关联试卷数」「使用次数」列,显示该试题被多少试卷引用、被考生作答的次数(如“Java数组声明”关联2套试卷、使用120次) | 直观了解试题的使用价值,辅助筛选高频/低频试题 |
| 批量操作增强 | 新增「批量审核」「批量禁用」「批量导出试题详情」按钮,支持多选试题进行批量处理 | 提升管理员效率,避免重复操作 |
| 状态可视化升级 | 用颜色标签+图标标识状态(待审核-🟡黄色、已审核-🟢绿色、已禁用-🔴红色),醒目清晰 | 快速区分试题状态,定位目标试题 |
| 筛选逻辑优化 | 知识点下拉支持模糊搜索+层级展示(如“spring cloud”→“基础概念/配置管理”),难度筛选支持多选项(如同时选“简单+中等”) | 精准筛选目标试题,减少查找时间 |
┌───────────────────────────────────────────────────────────────────────────────────┐ │ 顶部:添加试题(蓝) + 批量导入(绿) + 批量操作(审核/禁用/导出) + 筛选区 │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 列表:ID | 题干 | 题型 | 知识点 | 难度 | 分值 | 关联试卷数 | 使用次数 | 状态 | 操作 │ │ ├──────┼─────────────────────┼──────┼──────────┼──────┼──────┼──────────┼────────┼──────┼──────┤ │ │ 453 │ Java中数组声明方式? | 单选 | spring cloud | 简单 | 5 │ 2 │ 120 │ 🟡待审核 | 详情/编辑/删除 │ │ └──────┴─────────────────────┴──────┴──────────┴──────┴──────┴──────────┴────────┴──────┴──────┘ └───────────────────────────────────────────────────────────────────────────────────┘| 优化点 | 说明 | 价值 |
|---|---|---|
| 题型动态适配 | 切换题型时自动调整选项数量: • 单选题/判断题:2-4个选项 • 多选题:4-6个选项 • 填空题/简答题:隐藏选项,仅保留题干/答案/解析 | 符合不同题型的出题逻辑,减少无效输入 |
| 多知识点关联 | 知识点选择改为多选下拉(支持模糊搜索+层级选择),允许关联1-3个知识点(如“Java数组”关联“基础语法+数据结构”) | 更精准地标记试题考点,辅助组卷时的知识点覆盖校验 |
| 实时重复检测 | 输入题干后实时检测同科目、同知识点下的题干是否重复,重复时标红并提示(如“该题干在Java科目下已存在,是否继续?”) | 避免试题冗余,保证题库唯一性 |
| 解析富文本支持 | 解析框改为富文本编辑器,支持插入代码块、公式、图片、链接,满足技术类试题的解析需求 | 提升解析的可读性和专业性,适配编程类考试场景 |
| 分值默认值适配 | 根据题型自动填充默认分值(如单选题5分、多选题10分),可手动调整 | 减少手动输入,提升出题效率 |
┌───────────────────────────────────────────────────────────────────────────────────┐ │ 顶部:添加试题 + 关闭按钮 + 题型下拉(动态适配选项) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 基本信息区:题干(富文本) + 选项(动态数量,支持拖拽排序) + 正确答案(下拉/输入) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 关联信息区:知识点(多选下拉) + 难度(下拉) + 分值(默认填充+可调整) + 科目(下拉) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 解析区:富文本编辑器(支持代码/公式/图片) + 状态(待审核/已审核,默认待审核) │ ├───────────────────────────────────────────────────────────────────────────────────┤ │ 底部:确定(蓝) + 取消(灰) + 「保存并继续添加」(蓝,批量出题时显示) │ └───────────────────────────────────────────────────────────────────────────────────┘| 优化点 | 说明 | 价值 |
|---|---|---|
| 预览编辑功能 | 预览页面支持直接编辑错误数据(如重复题干、选项缺失、知识点不匹配),无需重新上传 | 减少导入失败率,提升导入效率 |
| 详细错误提示 | 错误数据标红,并显示具体原因(如“题干重复”“选项数量不足”“知识点不存在”) | 快速定位问题,修正数据更高效 |
| 模板字段增强 | 导出模板中增加字段说明(如“正确答案格式:单选题填A/B/C/D,多选题填AB/AC”)和示例数据 | 降低导入格式错误率,减少用户困惑 |
| 导入日志关联 | 导入完成后生成导入日志(关联通用operation_log和专属question_import_log),显示成功数量、失败数量、错误报告下载链接 | 便于追溯导入历史,处理失败数据 |
1. 选择文件类型 → 2. 上传文件 → 3. 预览并编辑数据 → 4. 确认导入 → 5. 生成导入日志(关联双日志)| 表名 | 核心字段 | 用途 | 关联关系 |
|---|---|---|---|
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 |
// 检测同科目、同知识点下的题干是否重复@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("试题已成功删除");}