1. 项目背景与核心价值
高校学科竞赛管理一直是教务工作中的痛点。传统的人工登记、邮件报送方式效率低下,参赛学生、指导老师、院系管理员之间信息不同步,经常出现报名超时、材料遗漏、成绩统计错误等问题。我在某高校信息中心工作期间,曾亲眼见过一个省级竞赛因为Excel表格版本混乱,导致3个获奖团队被错误取消资格。
这个基于SpringBoot+Vue的竞赛平台,正是为了解决这些实际问题而设计的全栈解决方案。它实现了从竞赛发布、团队报名、材料提交、在线评审到成绩公示的全流程数字化管理。与市面上通用的竞赛系统相比,其独特价值在于:
- 教学场景深度适配:特别设计了"团队-指导老师"多对多关系模型,支持一个学生参加多个竞赛、一个老师指导多个团队的教学实际需求
- 评审流程灵活配置:可根据不同竞赛类型设置差异化的评审维度(如创新性30分+实用性50分+答辩表现20分)
- 数据可视化看板:院系管理员可实时查看各竞赛参与度、获奖率等关键指标
提示:系统采用MIT开源协议,商业项目使用时需注意修改前端版权信息。实测在8核16G服务器上可稳定支撑3000+师生同时在线。
2. 技术架构解析
2.1 后端SpringBoot设计
采用经典的MVC分层架构,但针对竞赛业务做了特殊优化:
java复制// 核心实体关系设计示例
@Entity
public class Competition {
@Id @GeneratedValue
private Long id;
@OneToMany(mappedBy = "competition")
private List<Team> teams;
@ElementCollection
@CollectionTable(name="competition_rubrics")
private Map<String, Integer> evaluationRubrics; // 评审维度配置
}
性能优化关键点:
- 使用Hibernate二级缓存减少评委打分时的数据库查询
- 采用@Async异步处理成绩统计等耗时操作
- 自定义Jackson序列化规则避免团队-学生循环引用
2.2 前端Vue实现方案
基于Vue CLI 4.x搭建,主要技术栈:
- 路由管理:Vue Router + 路由守卫实现权限控制
- 状态管理:Vuex模块化设计(分auth、competition等模块)
- UI组件库:Element-UI + 自定义主题
- 可视化:ECharts实现数据看板
典型页面加载优化:
- 使用路由懒加载拆分代码包
- 评委打分页面的富文本编辑器按需加载
- 配置Gzip压缩使vendor包从1.8MB降至450KB
3. 数据库设计与SQL优化
3.1 核心表结构
sql复制CREATE TABLE `team` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8mb4_bin NOT NULL,
`competition_id` bigint NOT NULL,
`final_score` decimal(5,2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_competition` (`competition_id`) COMMENT '竞赛查询优化'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
索引设计经验:
- 为团队表的competition_id添加普通索引
- 成绩统计表建立(competition_id, judge_id)联合索引
- 避免在频繁更新的is_deleted字段上建索引
3.2 典型复杂查询示例
sql复制-- 获取某竞赛各奖项数量统计
SELECT
CASE
WHEN final_score >= 90 THEN '一等奖'
WHEN final_score >= 80 THEN '二等奖'
ELSE '三等奖'
END AS award_level,
COUNT(*) AS award_count
FROM team
WHERE competition_id = #{cid}
GROUP BY award_level;
4. 接口文档关键要点
系统采用RESTful风格设计,主要接口包括:
| 接口类型 | 路径 | 说明 | 权限 |
|---|---|---|---|
| POST | /api/competitions | 创建竞赛 | 管理员 |
| GET | /api/competitions/{id}/teams | 获取参赛团队 | 评委/管理员 |
| PUT | /api/evaluations | 提交评分 | 评委 |
安全设计:
- JWT令牌默认30分钟过期
- 敏感操作(如成绩发布)需二次密码验证
- 使用Spring Security的@PreAuthorize注解进行方法级权限控制
5. 项目部署实战
5.1 开发环境搭建
- 数据库初始化:
bash复制mysql -u root -p < competition_platform.sql
- 后端启动:
properties复制# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/competition?useSSL=false
username: devuser
password: Dev@1234
- 前端配置:
javascript复制// .env.development
VUE_APP_API_BASE_URL=http://localhost:8080/api
5.2 生产环境注意事项
- Nginx配置示例:
nginx复制location /api {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
root /var/www/competition-platform;
try_files $uri $uri/ /index.html;
}
- 遇到过的一个坑:当使用Tomcat部署时,需要显式配置:
java复制@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
6. 毕设开发建议
根据指导过20+本科毕设的经验,给出以下实用建议:
-
功能裁剪策略:
- 基础版:保留用户管理、竞赛发布、团队报名三大核心模块
- 进阶版:增加在线评审、数据分析看板
- 创新点建议:尝试接入短信通知或微信小程序端
-
论文写作技巧:
- 系统设计章节建议采用"需求分析→架构设计→数据库设计→关键实现"的逻辑链
- 性能优化部分可对比添加缓存前后的接口响应时间
- 附上Swagger生成的接口文档作为附录
-
答辩准备:
- 准备1分钟的功能演示视频备用
- 重点解释技术选型原因(如为什么选Vue而非React)
- 提前模拟评委可能问的三大问题:
- 如何保证评分公平性?
- 系统能承受多少并发?
- 与市面已有产品的差异?
实际开发中,我发现团队协作功能最容易被忽视。建议在团队表添加invitation_code字段,实现类似GitHub的邀请机制,这比传统的申请-审核流程体验更好。另外,测试阶段要特别注意评委同时打分时的并发控制,我们曾遇到过乐观锁版本号没正确递增导致分数被覆盖的问题。
