guoyu/_已清理文件备份_周六 22512/md/题库功能设计方案.md
2025-12-06 20:11:36 +08:00

10 KiB
Raw Blame History

题库上传和随机抽题功能设计方案

一、功能概述

在现有考试系统基础上,新增题库管理功能,支持:

  1. 题库管理:创建和管理独立的题目库
  2. 题目上传支持Excel批量导入题目
  3. 随机抽题:创建考试时从题库中按题型和数量随机抽取题目

二、数据库设计

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 | 正确答案 | 分值 | 难度 | 知识点
    
  • 导入流程
    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 抽题逻辑

// 伪代码
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:显示题目来源标识

六、实现步骤

第一阶段:数据库和基础功能

  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
  • 后端:使用 EasyExcelApache POI 解析
  • 验证:题目格式验证、必填项检查、选项格式验证

7.2 随机抽题算法

// 核心算法
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. 是否需要其他扩展功能?

确认后即可开始实现。