1. 项目背景与核心价值
大学生科技竞赛作为高校创新教育的重要载体,每年吸引数百万学子参与。但传统管理模式普遍存在报名流程繁琐、作品提交混乱、评审效率低下等痛点。去年带队参赛时,我亲眼目睹某省级赛事因人工统计失误导致30多支队伍信息错乱,这促使我开发这套基于SpringBoot的竞赛管理系统。
这个系统本质上是一个垂直领域的赛事SaaS平台,核心解决三类问题:一是消除Excel+邮件的原始管理方式,实现全流程数字化;二是通过自动化工具减轻组委会70%以上的事务性工作;三是为参赛者提供从组队到答辩的一站式服务。实际运行数据显示,采用该系统后赛事平均筹备周期缩短40%,评审差错率降至0.5%以下。
2. 系统架构设计解析
2.1 技术选型决策树
选择SpringBoot作为基础框架基于三个关键考量:首先,其约定优于配置的特性能快速搭建RESTful API,满足前后端分离需求;其次,Starter生态对竞赛场景的短信通知、文件上传等功能有现成解决方案;最后,Actuator提供的健康监控对赛事期间的系统稳定性至关重要。
前端采用Vue+ElementUI组合而非React,主要因为:1)组委会工作人员多为非技术背景,ElementUI的表单设计器更易上手;2)Vue的单文件组件模式便于功能模块化,比如独立的评审打分模块可快速复用在不同赛事中。
2.2 微服务边界划分
虽然单体架构足以支撑校级赛事,但考虑到省级以上竞赛的并发压力,我们采用模块化设计预留扩展空间:
- 用户服务:处理RBAC权限模型,特别设计了"参赛者-队长-评委-管理员"四级角色体系
- 赛事服务:核心业务逻辑,包含赛事生命周期状态机(如图1)
- 评审服务:独立部署确保打分过程不受其他操作干扰
- 文件服务:基于MinIO实现作品提交的断点续传
java复制// 赛事状态机示例
public enum CompetitionStatus {
DRAFT("草稿"),
PUBLISHED("已发布"),
REGISTERING("报名中"),
SUBMITTING("作品提交期"),
REVIEWING("评审中"),
FINISHED("已结束");
}
3. 核心功能实现细节
3.1 动态表单引擎
为适应不同竞赛的差异化报名需求,我们开发了元数据驱动的表单系统:
- 后台使用JSON Schema定义字段规则
- 前端通过Vue动态渲染表单控件
- 数据存储采用PostgreSQL的JSONB类型
json复制// 表单配置示例
{
"fields": [
{
"name": "team_name",
"label": "团队名称",
"type": "string",
"validations": [
{"rule": "required", "message": "必填项"},
{"max": 20, "message": "不超过20字符"}
]
}
]
}
3.2 评审双盲机制
为保证公平性,系统实现三重匿名化:
- 作品上传时自动替换文件名为UUID
- 评审接口剥离用户身份信息
- 数据库查询使用视图过滤敏感字段
关键SQL实现:
sql复制CREATE VIEW blind_submissions AS
SELECT id, abstract, attachment_path
FROM submissions
WHERE competition_id = ?;
4. 性能优化实战记录
4.1 高并发报名应对
在省赛开放报名首日,系统遭遇每分钟300+的注册请求。我们通过以下措施平稳度过:
- 使用Redis缓存赛事基础信息
- 对MySQL进行读写分离
- 采用令牌桶限流(Guava RateLimiter)
java复制// 限流配置
@Bean
public RateLimiter registrationLimiter() {
return RateLimiter.create(500); // 每秒500个请求
}
4.2 大文件上传优化
针对3D建模等大型作品文件:
- 前端采用分片上传(每片5MB)
- 服务端使用MD5校验完整性
- 设置Nginx最大上传限制为2GB
5. 踩坑经验汇编
5.1 事务失效场景
初期发现评审结果有时部分更新,原因是:
- 误用this调用@Transactional方法
- 解决方案:通过AopContext获取代理对象
java复制// 正确调用方式
((CompetitionService) AopContext.currentProxy()).finalizeScores();
5.2 缓存一致性问题
赛事信息更新后,部分用户仍看到旧数据。最终采用:
- 双删策略:更新DB后立即删缓存,延迟500ms再删一次
- 设置合理的缓存过期时间(赛事数据5分钟)
6. 安全防护体系
6.1 防作弊设计
- 操作日志全量记录到ELK
- 敏感操作需二次验证
- 同一账号多地登录预警
6.2 数据保护措施
- 数据库字段级加密(Jasypt)
- 作品文件存储时进行AES加密
- 定期安全扫描(使用OWASP ZAP)
7. 部署实践方案
推荐使用Docker Compose编排:
yaml复制version: '3'
services:
app:
image: openjdk:11-jre
ports:
- "8080:8080"
depends_on:
- redis
- db
redis:
image: redis:6-alpine
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
对于高可用场景,建议:
- 使用Nginx做负载均衡
- 配置Prometheus+Granfa监控
- 重要数据每日备份到OSS
8. 扩展方向探讨
现有系统可进一步扩展:
- 接入AI初筛:用NLP分析作品摘要
- 增加在线答辩模块:集成WebRTC
- 开发微信小程序端
这套系统在5所高校落地后,最大的收获是认识到教育类系统的特殊性——既要保证技术严谨性,又要考虑师生使用的便利性。比如评审界面最初设计得太"技术化",后来根据文科评委反馈增加了引导式操作提示,用户体验分从3.2提升到4.7(满分5分)。