
温馨提示本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片1. 项目背景与意义随着高校学科竞赛的日益增多传统的线下报名、人工统计、纸质材料审核等管理方式已难以满足高效、规范、透明的竞赛组织需求。开发一套基于 Java Spring Boot 的专业学科竞赛管理系统能够实现竞赛发布、在线报名、作品提交、评委评审、成绩管理、证书生成等全流程数字化管理有效提升竞赛组织效率降低管理成本保障竞赛公平公正。2. 系统需求分析2.1 功能需求本系统面向管理员、教师评委、参赛学生三类角色核心功能模块包括用户管理学生、教师、管理员的注册、登录、角色权限分配与个人信息维护。竞赛管理管理员发布竞赛公告、设置报名时间、参赛要求、竞赛类别与奖项设置。在线报名学生在线报名参赛填写报名信息并上传参赛作品材料。作品评审评委在线查看作品按评分标准打分并填写评审意见。成绩管理系统自动汇总评分生成排名与获奖名单支持成绩导出。证书管理根据获奖结果自动生成电子证书支持下载与打印。数据统计按院系、专业、竞赛类别等维度统计参赛人数与获奖情况。2.2 非功能需求安全性采用 Spring Security JWT 实现身份认证与接口鉴权密码加密存储。性能支持高并发报名场景数据库连接池优化关键接口响应时间控制在 500ms 以内。可维护性采用分层架构与 RESTful API 设计代码结构清晰便于后续扩展。3. 系统架构设计3.1 技术选型层次技术方案前端Vue 3 Element Plus Axios后端Spring Boot 2.7 Spring Security MyBatis-Plus数据库MySQL 8.0缓存Redis文件存储本地磁盘 / 阿里云 OSS构建工具Maven3.2 系统架构图flowchart TD A[浏览器前端 Vue3] --|HTTP/JSON| B[Spring Boot 后端] B -- C[Controller 层] C -- D[Service 业务层] D -- E[Mapper 数据访问层] E -- F[(MySQL 数据库)] D -- G[Redis 缓存] B -- H[文件存储 OSS]3.3 数据库设计系统核心数据表包括用户表、角色表、竞赛表、报名表、作品表、评审表、成绩表、证书表。以下为关键表结构设计CREATE TABLE competition ( id BIGINT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL COMMENT 竞赛名称, category VARCHAR(50) COMMENT 竞赛类别, start_time DATETIME COMMENT 报名开始时间, end_time DATETIME COMMENT 报名截止时间, status TINYINT DEFAULT 0 COMMENT 状态0未开始 1报名中 2评审中 3已结束, description TEXT COMMENT 竞赛说明, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE enrollment ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL COMMENT 学生ID, competition_id BIGINT NOT NULL COMMENT 竞赛ID, team_name VARCHAR(100) COMMENT 团队名称, status TINYINT DEFAULT 0 COMMENT 状态0待审核 1已通过 2已拒绝, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_stu_comp (student_id, competition_id) );4. 核心功能实现4.1 用户认证与权限控制采用 Spring Security 结合 JWT 实现无状态认证通过自定义注解实现接口级权限控制。Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Autowired private JwtAuthenticationFilter jwtFilter; Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers(/api/auth/, /api/competition/list).permitAll() .antMatchers(/api/admin/).hasRole(ADMIN) .antMatchers(/api/judge/**).hasRole(JUDGE) .anyRequest().authenticated() .and() .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); } }4.2 竞赛发布与报名管理管理员发布竞赛后学生可在报名时间内在线报名。报名接口需校验竞赛状态与报名时间防止超时或重复报名。Service public class EnrollmentServiceImpl implements EnrollmentService { Autowired private CompetitionMapper competitionMapper; Autowired private EnrollmentMapper enrollmentMapper; Override Transactional public Result enroll(EnrollmentDTO dto, Long studentId) { Competition competition competitionMapper.selectById(dto.getCompetitionId()); if (competition null) { return Result.error(竞赛不存在); } if (competition.getStatus() ! 1) { return Result.error(当前不在报名时间内); } LocalDateTime now LocalDateTime.now(); if (now.isBefore(competition.getStartTime()) || now.isAfter(competition.getEndTime())) { return Result.error(已超出报名时间范围); } // 校验是否重复报名 Integer count enrollmentMapper.checkExist(studentId, dto.getCompetitionId()); if (count gt; 0) { return Result.error(请勿重复报名); } Enrollment enrollment new Enrollment(); BeanUtils.copyProperties(dto, enrollment); enrollment.setStudentId(studentId); enrollment.setStatus(0); enrollmentMapper.insert(enrollment); return Result.success(报名成功等待审核); } }4.3 作品提交与评审打分报名审核通过后学生可上传作品材料。评委登录后进入评审页面按评分维度打分并填写评语。Service public class ReviewServiceImpl implements ReviewService { Autowired private WorkMapper workMapper; Autowired private ReviewMapper reviewMapper; Override Transactional public Result submitReview(ReviewDTO dto, Long judgeId) { // 校验作品是否存在且处于待评审状态 Work work workMapper.selectById(dto.getWorkId()); if (work null || work.getStatus() ! 1) { return Result.error(作品不存在或不在评审状态); } // 校验评委是否已评审过该作品 Integer count reviewMapper.checkReviewed(judgeId, dto.getWorkId()); if (count gt; 0) { return Result.error(您已评审过该作品); } Review review new Review(); BeanUtils.copyProperties(dto, review); review.setJudgeId(judgeId); review.setCreateTime(LocalDateTime.now()); reviewMapper.insert(review); // 更新作品评审状态 work.setStatus(2); workMapper.updateById(work); return Result.success(评审提交成功); } }4.4 成绩汇总与排名评审结束后系统按作品汇总各评委打分计算平均分并生成排名与获奖名单。Service public class ScoreServiceImpl implements ScoreService { Autowired private ReviewMapper reviewMapper; Autowired private ResultMapper resultMapper; Override Transactional public void calculateScores(Long competitionId) { Listlt;Workgt; works workMapper.selectByCompetition(competitionId); for (Work work : works) { Listlt;Reviewgt; reviews reviewMapper.selectByWorkId(work.getId()); if (reviews.isEmpty()) { continue; } double avg reviews.stream() .mapToDouble(Review::getScore) .average() .orElse(0); // 按平均分排名并确定奖项 CompetitionResult result new CompetitionResult(); result.setWorkId(work.getId()); result.setAvgScore(avg); result.setRank(0); resultMapper.insert(result); } // 按平均分排序生成排名 Listlt;CompetitionResultgt; results resultMapper.selectByCompetition(competitionId); results.sort(Comparator.comparingDouble(CompetitionResult::getAvgScore).reversed()); for (int i 0; i lt; results.size(); i) { results.get(i).setRank(i 1); resultMapper.updateById(results.get(i)); } } }5. 系统测试5.1 测试环境系统测试采用 JUnit 5 Mockito 进行单元测试使用 Postman 进行接口集成测试测试环境如下项目配置操作系统Windows 11 / CentOS 7JDKJDK 1.8数据库MySQL 8.0测试工具Postman、JMeter5.2 核心接口测试用例接口测试场景预期结果POST /api/auth/login正确账号密码登录返回 JWT TokenPOST /api/enrollment重复报名同一竞赛返回请勿重复报名POST /api/review评委重复评审同一作品返回您已评审过该作品GET /api/result/export导出成绩 Excel返回文件下载6. 总结与展望本文设计并实现了一套基于 Java Spring Boot 的专业学科竞赛管理系统覆盖竞赛发布、在线报名、作品提交、评委评审、成绩汇总、证书生成等完整业务流程。系统采用前后端分离架构具备良好的扩展性与安全性能够有效提升高校学科竞赛的组织管理效率。后续可从以下方向继续优化引入消息队列实现报名高峰期的流量削峰增加智能推荐功能根据学生专业与兴趣推荐适合的竞赛对接学校统一身份认证平台实现单点登录完善移动端适配方便学生随时查看竞赛动态。