1. 项目背景与核心价值
健美操作为一项竞技性体育项目,对评分系统的实时性、准确性和公平性有着极高要求。传统纸质评分方式存在效率低下、容易出错、统计耗时等问题。这个毕业设计项目正是为了解决这些痛点,采用前后端分离架构开发了一套数字化评分系统。
我在实际开发过程中发现,这类系统需要特别关注三个核心指标:
- 实时性 - 评委打分后需立即更新总分和排名
- 容错性 - 支持修改已提交分数且不影响其他评委
- 可追溯 - 所有评分操作需要完整记录日志
2. 技术架构解析
2.1 后端技术选型
SpringBoot 2.7.x作为后端框架,主要基于以下考虑:
- 内嵌Tomcat简化部署
- 自动配置减少XML配置
- 丰富的Starter依赖(特别是Spring Security和MyBatis)
数据库选用MySQL 8.0,关键配置:
sql复制CREATE TABLE score_record (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
event_id VARCHAR(20) NOT NULL,
judge_id VARCHAR(10) NOT NULL,
team_id VARCHAR(10) NOT NULL,
technical_score DECIMAL(5,2),
artistic_score DECIMAL(5,2),
execution_score DECIMAL(5,2),
submit_time DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_event_team (event_id, team_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 前端技术方案
Vue 3 + Element Plus的组合提供了:
- 响应式数据绑定
- 组件化开发模式
- 丰富的UI组件(特别是表格和表单)
- 轻量级状态管理(Pinia)
评分界面关键实现:
vue复制<template>
<el-form :model="scoreForm" label-width="120px">
<el-form-item label="技术分" prop="technical">
<el-input-number v-model="scoreForm.technical"
:min="0" :max="10" :step="0.1"/>
</el-form-item>
<!-- 其他评分项 -->
</el-form>
</template>
3. 核心功能实现
3.1 实时评分系统
采用WebSocket实现实时更新:
java复制@ServerEndpoint("/ws/score/{eventId}")
public class ScoreWebSocket {
@OnOpen
public void onOpen(Session session,
@PathParam("eventId") String eventId) {
// 加入事件房间
}
@OnMessage
public void onMessage(String message) {
// 广播分数更新
}
}
3.2 分数计算逻辑
加权平均算法实现:
java复制public BigDecimal calculateFinalScore(ScoreDTO score) {
// 技术分权重40%,艺术分30%,完成分30%
return score.getTechnical().multiply(new BigDecimal("0.4"))
.add(score.getArtistic().multiply(new BigDecimal("0.3")))
.add(score.getExecution().multiply(new BigDecimal("0.3")));
}
3.3 权限控制系统
基于RBAC模型设计:
java复制@PreAuthorize("hasRole('JUDGE') and #eventId == authentication.principal.eventId")
@PostMapping("/scores")
public ResponseEntity<?> submitScore(
@PathVariable String eventId,
@RequestBody ScoreSubmitDTO dto) {
// 提交评分逻辑
}
4. 部署方案详解
4.1 后端部署
推荐使用Docker部署:
dockerfile复制FROM openjdk:11-jre
COPY target/score-system.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
启动命令:
bash复制docker build -t score-system .
docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod score-system
4.2 前端部署
Nginx配置示例:
nginx复制server {
listen 80;
server_name scores.example.com;
location / {
root /var/www/score-frontend;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
}
}
5. 开发经验与避坑指南
- 并发控制:多个评委同时提交分数时,需要使用乐观锁:
java复制@Update("UPDATE score_record SET technical_score=#{technical} WHERE id=#{id} AND version=#{version}")
int updateWithLock(Score score);
- 性能优化:
- 使用Redis缓存赛事基本信息
- 分页查询历史记录
- 启用Gzip压缩静态资源
- 安全注意事项:
- 启用HTTPS
- 实施CSRF防护
- 对敏感操作记录审计日志
- 测试要点:
- 模拟高并发评分场景
- 测试断网自动恢复能力
- 验证分数计算精度
6. 论文写作建议
- 系统设计章节:
- 包含架构图(建议使用PlantUML绘制)
- 详细说明数据库ER设计
- 分析核心算法时间复杂度
- 实现章节:
- 展示关键代码片段
- 说明技术选型依据
- 记录开发中遇到的问题及解决方案
- 测试章节:
- 设计测试用例表
- 记录压力测试结果
- 对比传统评分方式效率提升
这个项目最让我有成就感的是实现了真正的实时评分展示。在演示环节,当多个评委同时提交分数时,大屏幕上的排名能即时更新,这种即时反馈的效果非常震撼。建议后续可以增加AI动作识别辅助评分功能,但这需要专业的视频分析算法支持