1. 项目概述与适用场景
校园竞赛管理系统是一个基于SpringBoot+Vue技术栈开发的B/S架构应用,主要解决高校各类学科竞赛从报名、评审到结果公示的全流程管理问题。这个开源项目特别适合作为计算机相关专业的毕业设计、课程设计或自学练手项目,原因有三:
- 技术栈典型性:采用Java生态中最主流的SpringBoot+Vue前后端分离架构,涵盖RESTful API设计、JWT认证、MyBatis-Plus操作等企业级开发必备技能
- 业务完整性:包含用户权限管理、竞赛CRUD、报名审核、评分排名等完整业务模块,比简单增删改查项目更具实战价值
- 教学友好性:代码结构清晰,MySQL表设计规范,配套文档详细,便于学生理解企业级项目开发流程
提示:本系统默认预设三种角色 - 管理员(admin/123456)、评委(judge/123456)和学生(student/123456),可直接用于演示和测试
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端技术栈
SpringBoot 2.7.x作为核心框架,主要依赖包括:
xml复制<!-- 关键依赖示例 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
架构特点:
- 采用MVC分层设计(controller/service/dao)
- 统一响应封装(ResultVO)
- 全局异常处理(GlobalExceptionHandler)
- 基于JWT的无状态认证
- 使用MyBatis-Plus简化数据库操作
2.2 前端技术栈
Vue 2.x + Element UI构建的管理后台,核心配置:
javascript复制// main.js典型配置
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
前端工程特点:
- 基于vue-cli搭建的标准项目结构
- axios封装实现请求拦截/响应处理
- 动态路由权限控制
- 组件化开发模式
2.3 数据库设计
MySQL 5.7+数据库包含约10张核心表,主要表结构示例:
| 表名 | 字段示例 | 说明 |
|---|---|---|
| user | id, username, password, role | 用户基础表 |
| competition | id, name, start_time, end_time | 竞赛主表 |
| registration | id, user_id, competition_id, status | 报名记录表 |
| score | id, judge_id, registration_id, score | 评分记录表 |
注意:数据库脚本通常存放在项目的
/sql目录下,包含DDL和基础数据插入语句
3. 核心功能实现
3.1 竞赛管理模块
管理员功能实现要点:
java复制// CompetitionController.java片段
@RestController
@RequestMapping("/api/competition")
public class CompetitionController {
@Autowired
private CompetitionService competitionService;
@PostMapping
public ResultVO addCompetition(@RequestBody Competition competition) {
return competitionService.save(competition)
? ResultVO.success()
: ResultVO.error("添加失败");
}
@GetMapping("/{id}")
public ResultVO getDetail(@PathVariable Integer id) {
return ResultVO.success(competitionService.getById(id));
}
}
前端对应实现:
vue复制<!-- CompetitionForm.vue片段 -->
<template>
<el-form :model="form" label-width="80px">
<el-form-item label="竞赛名称">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="开始时间">
<el-date-picker v-model="form.startTime" type="datetime"></el-date-picker>
</el-form-item>
</el-form>
</template>
3.2 报名审核流程
学生报名后端逻辑:
java复制// RegistrationService.java核心方法
public ResultVO apply(Integer userId, Integer competitionId) {
// 检查是否已报名
LambdaQueryWrapper<Registration> query = new LambdaQueryWrapper<>();
query.eq(Registration::getUserId, userId)
.eq(Registration::getCompetitionId, competitionId);
if (registrationService.count(query) > 0) {
return ResultVO.error("已报名该竞赛");
}
// 创建报名记录
Registration reg = new Registration();
reg.setUserId(userId);
reg.setCompetitionId(competitionId);
reg.setStatus(0); // 0-待审核
return registrationService.save(reg)
? ResultVO.success()
: ResultVO.error("报名失败");
}
3.3 评分排名功能
评委打分接口实现:
java复制// ScoreController.java
@PostMapping
public ResultVO submitScore(
@RequestHeader("Authorization") String token,
@RequestBody ScoreDTO dto) {
// 从JWT解析评委ID
Integer judgeId = JwtUtil.getUserId(token);
Score score = new Score();
score.setJudgeId(judgeId);
score.setRegistrationId(dto.getRegistrationId());
score.setScore(dto.getScore());
return scoreService.saveOrUpdate(score)
? ResultVO.success()
: ResultVO.error("评分失败");
}
4. 项目部署与调试
4.1 开发环境搭建
-
后端准备:
- JDK 1.8+
- Maven 3.6+
- IDEA/Eclipse
- 执行
mvn clean install
-
前端准备:
- Node.js 14+
- npm/yarn
- 执行
npm install
-
数据库准备:
- MySQL 5.7+
- 执行项目中的SQL脚本
4.2 常见问题解决
问题1:前端跨域访问报错
javascript复制// vue.config.js解决方案
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
}
问题2:MyBatis-Plus主键冲突
java复制// 实体类配置示例
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO) // 关键注解
private Integer id;
private String username;
// 其他字段...
}
4.3 生产环境部署
推荐部署方案:
- 后端打包:
mvn package生成jar文件 - 前端构建:
npm run build生成dist目录 - 使用Nginx配置:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
root /path/to/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:8080;
}
}
5. 项目扩展建议
-
功能增强方向:
- 添加竞赛作品提交功能(文件上传)
- 实现短信/邮件通知
- 增加数据分析看板
-
技术深化方向:
- 集成Redis缓存热门竞赛数据
- 使用WebSocket实现实时排名更新
- 添加API文档(Swagger/Knife4j)
-
毕设改造建议:
- 修改主题为"创新创业大赛管理系统"
- 增加院系二级管理权限
- 引入Elasticsearch实现竞赛搜索
实战技巧:在原有项目基础上,尝试将JWT认证改为Spring Security+OAuth2的组合,这是企业级认证的常见方案
我在实际开发这类教学项目时发现,最容易出现问题的是前后端数据格式的对接。建议在开发过程中:
- 使用Postman等工具先调试后端接口
- 保持前端axios响应拦截器的统一错误处理
- 对日期时间等特殊字段建立前后端转换规范
