1. 项目背景与意义
在高校教学管理过程中,毕业设计、课程设计以及科研项目的选题环节长期依赖线下纸质填报、Excel汇总和人工协调,存在选题信息不透明、学生与导师之间沟通效率低、选题冲突难以实时发现、过程数据难以追溯等问题。随着高校信息化建设的推进,构建一套基于Spring Boot的高校大学生选题管理系统,能够将选题发布、学生申报、导师审核、结果公示等环节线上化,显著提升选题管理效率,降低教务人员重复劳动,同时为后续教学数据分析和质量评估提供可靠的数据支撑。
从实际价值来看,该系统一方面帮助学生快速了解可选课题、实时掌握申报进度,另一方面帮助导师和教务人员统一管理选题资源、自动检测冲突并留痕审批过程,具有较强的工程实践意义和推广价值。
2. 系统技术栈
本系统采用前后端分离架构,后端基于Spring Boot框架构建,前端使用Vue.js配合Element UI组件库,数据库选用MySQL,缓存层使用Redis,权限控制集成Spring Security与JWT。
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.x | 提供快速构建、自动配置与生态集成能力 |
| 持久层 | MyBatis-Plus | 简化单表CRUD操作,内置分页与条件构造器 |
| 数据库 | MySQL 8.0 | 存储用户、课题、选题记录等核心业务数据 |
| 缓存 | Redis | 缓存热点数据与登录令牌,提升并发响应能力 |
| 权限认证 | Spring Security + JWT | 实现基于角色的接口访问控制与无状态认证 |
| 前端框架 | Vue.js + Element UI | 构建管理后台与用户端交互界面 |
| 接口文档 | Swagger / Knife4j | 自动生成在线接口调试文档 |
系统按用户角色划分为学生、导师、教务管理员三类,分别对应选题申报、课题审核、系统管理等核心功能模块。
3. 核心功能模块
系统围绕选题业务全流程设计,主要包含以下功能模块:
- 用户认证与权限管理:支持学生、导师、管理员三种角色登录,基于JWT完成身份校验与接口鉴权。
- 课题管理:导师可发布、修改、撤回课题,管理员可统筹审核课题状态。
- 选题申报:学生浏览可选课题、提交选题申请,系统自动检测选题冲突。
- 审核流程:导师在线审核学生申请,支持通过、驳回并填写审核意见。
- 结果公示:管理员发布最终选题结果,学生可查看个人选题状态。
- 数据统计:按学院、专业、导师维度统计选题分布情况,辅助教务决策。
4. 数据库设计
系统核心数据表包括用户表、角色表、课题表、选题记录表等。以下给出课题表与选题记录表的关键字段设计。
CREATE TABLE topic ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '课题ID', title VARCHAR(100) NOT NULL COMMENT '课题名称', description TEXT COMMENT '课题描述', teacher_id BIGINT NOT NULL COMMENT '发布导师ID', category VARCHAR(50) COMMENT '课题类别', max_students INT DEFAULT 1 COMMENT '可选人数上限', status TINYINT DEFAULT 0 COMMENT '状态:0待审核 1已通过 2已驳回', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); CREATE TABLE selection_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '记录ID', topic_id BIGINT NOT NULL COMMENT '课题ID', student_id BIGINT NOT NULL COMMENT '学生ID', status TINYINT DEFAULT 0 COMMENT '状态:0待审核 1已通过 2已驳回', apply_reason VARCHAR(500) COMMENT '申请理由', review_comment VARCHAR(500) COMMENT '审核意见', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_topic_student (topic_id, student_id) );5. 核心代码实现
本节选取课题发布、选题申报、审核处理三个核心场景,给出后端关键代码实现。
5.1 课题发布接口
导师登录后通过该接口发布新课题,系统自动记录当前登录用户为课题发布人。
@RestController @RequestMapping("/api/topic") public class TopicController { @Resource private TopicService topicService; @PostMapping("/publish") public Result<Long> publish(@RequestBody TopicDTO dto) { Long teacherId = SecurityUtils.getCurrentUserId(); return Result.success(topicService.publishTopic(dto, teacherId)); } }@Service public class TopicServiceImpl implements TopicService { @Resource private TopicMapper topicMapper; @Override @Transactional(rollbackFor = Exception.class) public Long publishTopic(TopicDTO dto, Long teacherId) { Topic topic = new Topic(); BeanUtils.copyProperties(dto, topic); topic.setTeacherId(teacherId); topic.setStatus(TopicStatus.PENDING.getCode()); topicMapper.insert(topic); return topic.getId(); } }5.2 选题申报接口
学生提交选题申请前,系统先校验课题是否存在、是否已满员以及是否重复申报,避免无效申请。
@Service public class SelectionServiceImpl implements SelectionService { @Resource private TopicMapper topicMapper; @Resource private SelectionRecordMapper recordMapper; @Override @Transactional(rollbackFor = Exception.class) public void apply(Long topicId, Long studentId, String reason) { Topic topic = topicMapper.selectById(topicId); if (topic == null || topic.getStatus() != TopicStatus.APPROVED.getCode()) { throw new BusinessException("课题不存在或未通过审核"); } Long appliedCount = recordMapper.countApprovedByTopicId(topicId); if (appliedCount >= topic.getMaxStudents()) { throw new BusinessException("该课题已满员"); } Long exist = recordMapper.countByTopicAndStudent(topicId, studentId); if (exist > 0) { throw new BusinessException("请勿重复申报同一课题"); } SelectionRecord record = new SelectionRecord(); record.setTopicId(topicId); record.setStudentId(studentId); record.setApplyReason(reason); record.setStatus(SelectionStatus.PENDING.getCode()); recordMapper.insert(record); } }5.3 导师审核接口
导师对学生的选题申请进行审核,通过后自动占用课题名额,驳回时需填写审核意见。
@Service public class ReviewServiceImpl implements ReviewService { @Resource private SelectionRecordMapper recordMapper; @Override @Transactional(rollbackFor = Exception.class) public void review(Long recordId, Integer status, String comment) { SelectionRecord record = recordMapper.selectById(recordId); if (record == null) { throw new BusinessException("选题记录不存在"); } if (!SelectionStatus.PENDING.getCode().equals(record.getStatus())) { throw new BusinessException("该记录已处理,请勿重复审核"); } record.setStatus(status); record.setReviewComment(comment); recordMapper.updateById(record); } }6. 总结
基于Spring Boot的高校大学生选题管理系统,通过将课题发布、选题申报、导师审核、结果公示等环节数字化,有效解决了传统选题管理中存在的信息不透明、流程繁琐、冲突难发现等问题。系统采用前后端分离架构,结合Spring Security与JWT保障接口安全,整体具有良好的可维护性与扩展性,能够满足高校日常选题管理需求,并为后续功能扩展(如智能推荐选题、选题热度分析)预留了空间。