智能组卷系统
创建于 2025 年 4 月 19 日
项目介绍
智能组卷系统是一个面向考试命题场景的自动化组卷平台,基于若依 RuoYi-Vue 3.8.9(Spring Boot 版)二次开发。项目围绕”题库 → 规则 → 算法 → 试卷”这条主线展开:题库侧支持题型与树形知识点的双维维护,题目可携带内容、JSON 选项、答案、解析、分值、难度系数与累计使用次数,并支持 Excel 模板批量导入;试卷侧可配置总分、及格分、难度系数(0-1)、考试时长与组卷算法模型,再以”组卷规则”(题型 × 题目数量 × 每题分值)和”知识点分布”(各知识点占比)为约束条件,一键生成整卷试题并落库。
业务代码集中在 ruoyi-admin 模块的 com.ruoyi.app 包下,包含 algorithm(遗传算法)、controller(试卷/题目/知识点/题型四组 REST 接口)与 domain(七张业务表实体)三个子包。数据库脚本 20250419-zujuan.sql 在若依系统表之外定义了 exam_knowledge_point(树形知识点)、exam_paper、exam_paper_rule(组卷规则)、exam_paper_knowledge_point(知识点占比)、exam_question(题目)、exam_paper_question(试卷题目关联)、exam_paper_version(试卷版本)七张业务表,其中题库预置了 318 道人工智能课程题目,覆盖单选、多选、判断、填空、应用等题型。
项目架构
后端为若依经典的 Maven 多模块工程(ruoyi-admin / ruoyi-framework / ruoyi-system / ruoyi-quartz / ruoyi-generator / ruoyi-common),基于 Java 8 + Spring Boot 2.5.15。持久层是一个值得注意的组合:在 MyBatis-Plus 3.5.4 与 PageHelper 分页插件的基础上,项目引入了 Easy-Query 2.5.17(sql-api-proxy / sql-processor / sql-springboot-starter),通过 @EntityProxy 注解生成强类型代理,Controller 里直接用 easyEntityQuery.queryable(...).where(x -> x.typeId().eq(...)) 的 Lambda 式链式 API 完成查询、分页、连表与写操作,配以 application.yml 中的 easy-query 配置(MySQL、下划线命名转换)。数据库为 MySQL(Druid 1.2.23 连接池),Redis 承担若依的缓存与会话能力,接口文档使用 Swagger 3(springfox),Excel 导入导出基于 Apache POI。
组卷引擎位于 com.ruoyi.app.algorithm 包,采用模板方法模式:抽象基类 GeneticAlgorithm 固化了 generatePaper 的进化主流程(初始化种群 → 计算适应度 → 记录最优解 → 轮盘赌选择 → 单点交叉 → 变异 → 精英保留 → 迭代),把”初始化种群”与”计算适应度”留给子类实现;GeneticAlgorithmFactory 按试卷的 model 字段(knowledge / difficulty)创建 KnowledgeBasedGeneticAlgorithm 或 DifficultyBasedGeneticAlgorithm;GeneticAlgorithmConfig 通过 @ConfigurationProperties(prefix = "exam.genetic") 暴露种群大小(默认 50)、最大迭代次数(100)、交叉率(0.8)、变异率(0.1)与精英保留比例(0.1)。前端基于 Vue 2.6.12 + Element UI 2.15.14 + vue-cli,在若依 web 工程上新增 src/views/app 目录(paper / question / knowledgePoint / questionType 四个页面),并配套 src/api/app/*.js 接口封装。
核心功能
- 题库管理:
ExamQuestionController提供题目 CRUD,支持按题型、知识点、分值区间(minScore/maxScore)、难度系数多条件筛选与 Excel 导出;/app/question/importData通过ExcelUtil<ExamQuestionImportReqVo>解析上传模板,按”知识点名称 → 知识点 ID、题型编码 → 题型 ID”自动匹配,逐条校验并汇总成功/失败明细,选项按 A-F 拼接为 JSON 存储。前端题目页左侧为知识点树(splitpanes分栏 +el-tree),右侧表格展示题目内容(v-html渲染)、选项、答案、分值,难度用el-rate星级展示。 - 试卷与组卷规则配置:
ExamPaperController支持试卷 CRUD 与 Excel 导出,新增/编辑弹窗中可填写总分、及格分、难度系数(滑块)、考试时长与算法模型(knowledge基于知识点 /difficulty基于难度系数);“组卷规则”区以行内表格配置每条规则的题型、题目数量与每题分值,前端实时计算题型小计(questionCount * score);“知识点分布”区通过vue-treeselect树形选择知识点并填写占比,validatePercentage实时校验占比总和必须为 100%,不满足时提交被拦截并弹出警告。 - 智能组卷生成:
POST /app/paper/generate读取试卷及其规则、知识点占比后组卷,流程为:按题型逐条规则取题(优先满足知识点占比配额,配额不足再用同题型题目补齐)、把”规则分”写入题目并保存到exam_paper_question关联表、对选中题目useCount + 1(记录使用频次)、最后按实际选题分值重算并更新试卷总分。前端试卷列表的”生成”按钮触发该接口,“查看结果”调用/app/paper/look联表(ExamPaperQuestionleftJoinExamQuestion)返回整卷试题与分值。 - 遗传算法引擎:
GeneticAlgorithm抽象基类按”初始化种群 → 适应度评估 → 轮盘赌选择 → 单点交叉 → 变异 → 精英保留”完成进化;KnowledgeBasedGeneticAlgorithm按知识点占比分配各知识点题目配额(allocateQuestionsByKnowledgePoint),适应度以知识点覆盖度(0.3)、题型分布(0.3)、总分偏差(0.2)、难度偏差(0.2)加权相乘;DifficultyBasedGeneticAlgorithm按目标难度把题目分配到简单/中等/困难三档(allocateQuestionsByDifficulty),适应度以难度分布(0.4)、题型分布(0.3)、总分(0.2)、知识点覆盖(0.1)加权,变异操作按概率用”同题型同维度”的替代题替换个体中的随机题目。 - 知识点与题型管理:
ExamKnowledgePointController的/app/point/tree基于parent_id递归构建知识点树(复用若依部门树的构建思路),供题库筛选与试卷配置的树形选择器使用;ExamQuestionTypeController提供题型 CRUD 与listForSelect下拉接口,题型表以type_code唯一键约束,承载单选、多选、判断、填空、应用等编码化题型。
设计亮点
- “规则 + 占比”双约束的可解释组卷:与传统黑盒随机抽题不同,本系统把命题经验显式建模为”每类题型几道题、每题几分、每个知识点占多少百分比”的结构化规则,生成结果可解释、可复现,教师调整占比即可精确控制试卷的知识覆盖面。
- 遗传算法作为可切换的组卷模型:算法层把”进化流程”与”约束建模”解耦,两种模型分别以知识点覆盖度和难度系数为核心目标,适应度采用多因子加权相乘(缺项会整体压低得分),配合轮盘赌选择、单点交叉、变异与精英保留,为后续接入真实题库并做多目标寻优预留了完整框架;种群、迭代、交叉/变异率等参数通过
exam.genetic配置项外部化,无需改码即可调参。 - 生成即落库的完整闭环:组卷不是”看一眼”的临时结果,而是直接写入
exam_paper_question关联表、更新题目使用次数并重算试卷总分,形成”题库 → 试卷 → 成绩统计”可追溯的数据链路,use_count字段同时为题目复用率分析提供了数据基础。 - 占比校验前置到表单层:前端在录入阶段即实时计算知识点占比总和并以警告条提示必须为 100%,提交时再次拦截,把非法组卷规则挡在接口之外,配合后端按配额取题(配额不足自动用同题型题目补齐)的兜底策略,保证任何规则组合都能产出一份可用试卷。
- Easy-Query 强类型 ORM 的工程实践:业务接口全部采用 Easy-Query 的代理式 Lambda 查询(如
leftJoin联表查试卷试题、insertable批量落库),编译期即可发现字段拼写错误,代码中几乎看不到手写 SQL 与 XML Mapper,是若依体系下轻量替换/增强 MyBatis 写法的可参考范例。
功能截图
暂无运行截图。
快速上手
项目由后端 20250419-组卷系统api(Maven 多模块,若依 3.8.9)与前端 20250419-组卷系统web(Vue CLI)两个工程组成。后端先用 MySQL 执行 20250419-zujuan.sql(含若依系统表、业务表与 318 道示例题目),再在 application-druid.yml 中配置数据源、application.yml 中确认 Redis 与端口(默认 8087),启动 ruoyi-admin 模块的 RuoYiApplication 即可,接口文档通过 Swagger 3 访问。前端 npm install 后 npm run dev 启动,按若依约定代理 /dev-api 到后端。登录后以管理员账号为 app 模块分配菜单与权限(接口均带 @PreAuthorize("@ss.hasPermi('app:xxx:xxx')") 与前端 v-hasPermi 双重校验),即可进入”知识点管理 → 题型管理 → 题目管理(支持 Excel 导入题库)→ 试卷管理(配置规则与知识点占比后点击”生成”)“完成一次从建库到出卷的完整流程。整体而言,这是一个结构清晰、命题模型贴近教师习惯、且预留了进化算法升级空间的组卷系统。