ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SpringBoot课程选题系统设计与实现

SpringBoot课程选题系统设计与实现 1. 项目背景与核心价值作为一名经历过多次课程设计折磨的老学长我深知选题环节的痛点所在。每到学期末教室里总会上演这样的场景学生们围着老师抢选题热门题目秒光冷门题目无人问津老师手忙脚乱地记录选题情况还要处理这个题目能不能换的灵魂拷问。去年帮导师管理Java课程设计时光是整理Excel表格就出现了3次版本冲突更别说还要手动检查选题重复率。这个基于SpringBoot的选题系统正是为解决这些痛点而生。它实现了三大核心价值数字化选题流程学生可在线浏览所有题目详情教师能实时监控选题动态智能冲突检测自动防止重复选题支持设置题目最大可选人数全流程管理从题目申报、审核发布到最终确认覆盖课程设计全周期技术选型上SpringBoot提供了开箱即用的便利性。实测用IDEA创建项目到跑通第一个接口仅需15分钟。配合MyBatis-Plus和Vue.js我们团队用两周就完成了核心功能开发。系统采用经典的RBAC权限模型区分管理员、教师、学生三种角色数据库选用MySQL 8.0确保事务稳定性。提示实际部署时建议开启MySQL的binlog方便后期做选题数据分析。我们团队后来就用这些数据发现了JavaWeb题目比算法题目抢手3倍的有趣现象。2. 系统架构设计解析2.1 技术栈组成系统采用前后端分离架构技术选型经过多次踩坑后最终定型后端核心SpringBoot 2.7.18避免用3.0部分学校机房JDK还是1.8MyBatis-Plus 3.5.3省去90%的常规SQL编写Hutool 5.8.16国产工具包处理PDF导出真香Redis 6缓存选题热度数据前端核心Vue 2.6 ElementUI考虑到学生群体技术栈ECharts 5.3可视化选题分布Axios处理API拦截数据库设计关键表CREATE TABLE topic ( id int NOT NULL AUTO_INCREMENT, title varchar(100) NOT NULL COMMENT 题目名称, description text COMMENT 题目要求, max_choose int DEFAULT 1 COMMENT 最大可选人数, current_choose int DEFAULT 0 COMMENT 当前已选人数, teacher_id int NOT NULL, status tinyint DEFAULT 0 COMMENT 0待审核 1已发布, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;2.2 核心业务流程系统运转涉及三个关键业务流程每个都包含防踩坑设计题目发布流程教师提交题目含附件要求教研室主任审核可打回修改自动检测题目相似度用SimHash算法发布到选题池学生选题流程查看可选题目列表带搜索筛选查看题目详情含历史选择该题目的学生作品提交选择请求需二次确认系统检查冲突同题目/同导师人数限制数据统计流程实时计算题目热度Redis的ZSET实现定时生成PDF报表用Hutool的PDFBox封装可视化展示ECharts地图式分布注意SimHash相似度阈值建议设为0.85我们测试发现低于这个值会出现基于SSM的电商系统和SSM框架实现的购物平台被误判为相同题目。3. 关键实现细节剖析3.1 并发选课控制当热门题目出现争抢时系统采用乐观锁保证数据一致性。核心代码片段Transactional public boolean chooseTopic(Integer studentId, Integer topicId) { // 检查是否已选过题目 if (selectionMapper.existsByStudentId(studentId)) { throw new BusinessException(每人只能选择一个题目); } Topic topic topicMapper.selectById(topicId); // 使用版本号控制并发 if (topic.getCurrentChoose() topic.getMaxChoose()) { throw new BusinessException(该题目已满员); } int updated topicMapper.updateChooseCount( topicId, topic.getVersion(), topic.getCurrentChoose() 1); if (updated 0) { throw new ConcurrentChooseException(选题冲突请重试); } // 记录选择关系 Selection selection new Selection(); selection.setStudentId(studentId); selection.setTopicId(topicId); selectionMapper.insert(selection); return true; }实测中遇到过一个经典问题当剩余名额为1时多个学生同时点击导致超选。解决方案是在SQL中添加条件WHERE current_choose max_choose配合Transactional注解形成双重保障。3.2 题目相似度检测为防止教师提交重复题目系统在审核阶段自动计算题目相似度使用HanLP提取题目文本关键词通过SimHash生成64位指纹计算海明距离判断相似度核心算法实现public static boolean isSimilar(String text1, String text2) { SimHash hash1 new SimHash(text1, 64); SimHash hash2 new SimHash(text2, 64); int distance hash1.hammingDistance(hash2); return distance 3; // 相当于相似度85% }在实际应用中我们发现需要特别处理代码类题目。比如停车场管理系统和车位预约系统虽然描述不同但实质相似。后来增加了关键词黑名单机制自动标记包含管理系统基于SSM等泛化描述的题目。4. 部署与运维实践4.1 环境搭建要点推荐使用Docker Compose一键部署version: 3 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d ports: - 3306:3306 redis: image: redis:6 ports: - 6379:6379 app: build: . ports: - 8080:8080 depends_on: - mysql - redis踩坑记录学校网络环境可能限制端口建议将前端打包后放在NginxMySQL要配置大小写敏感lower_case_table_names1定时任务要配置时区Asia/Shanghai4.2 性能优化方案经过压力测试100并发选题我们实施了以下优化Redis缓存将热门题目信息缓存QPS从150提升到2100SQL优化为selection表添加复合索引(student_id, topic_id)异步日志用Spring AOP将操作日志异步写入ES前端防抖限制频繁点击选题按钮监控方案推荐Prometheus Grafana监控JVM指标ELK收集业务日志关键接口添加SkyWalking追踪5. 项目扩展方向现有系统已在3个班级试运行根据反馈建议后续可以智能推荐根据学生成绩历史推荐合适难度题目使用协同过滤算法考虑题目标签匹配度代码查重集成SimCSE模型检测课程设计代码相似度提取AST语法树特征对比向量空间距离移动端适配开发微信小程序版本用Uniapp跨端开发增加选题倒计时提醒答辩管理扩展答辩分组与评分模块教师互评机制在线评分实时统计在源码的doc目录下我特别补充了《二次开发指南》包含接口文档SwaggerPostman集合数据库变更日志前端组件说明常见问题排查清单记得第一次演示时有位老师问能不能看到学生点击题目的热力图 这个需求后来我们用ECharts的热力图层实现了。技术永远服务于真实场景这或许就是这个项目最有价值的收获。
返回列表