这个基于JavaWeb和MySQL的SSM+Maven赛事打分系统是一个完整的体育竞赛评分管理平台。系统采用经典的SSM(Spring+SpringMVC+MyBatis)框架组合,前端使用轻量级的Layui框架,通过Maven进行项目依赖管理。
作为一个实际可用的评分系统,它主要服务于三类用户角色:
系统设计上充分考虑了体育赛事评分的特点,实现了评分计算(去除最高最低分)、成绩排名等核心功能,同时提供了完整的用户权限控制机制。
系统采用经典的JavaEE三层架构:
提示:项目必须配置Lombok插件,否则编译时会报错。这是新手容易忽略的一个点。
| 环境项 | 版本要求 | 备注 |
|---|---|---|
| JDK | 1.8+ | 推荐OpenJDK 11 |
| MySQL | 5.7+ | 需启用InnoDB引擎 |
| Tomcat | 8.x/9.x | 不推荐使用Tomcat 7 |
| IDE | IDEA/Eclipse | 推荐使用IDEA |
| Maven | 3.6+ | 需配置阿里云镜像 |
系统主要包含以下数据库表:
用户表(user):
选手表(player):
裁判表(judge):
赛事表(match):
报名表(sign_up):
评分表(mark):
项目提供了SQL脚本用于初始化数据库:
sql复制CREATE DATABASE IF NOT EXISTS competition_db DEFAULT CHARSET utf8mb4;
USE competition_db;
-- 用户表
CREATE TABLE user (
user_id VARCHAR(20) PRIMARY KEY,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
role ENUM('admin','judge','player') NOT NULL
);
-- 选手表
CREATE TABLE player (
pid VARCHAR(20) PRIMARY KEY,
pname VARCHAR(50) NOT NULL,
page INT,
psex ENUM('男','女')
);
-- 裁判表
CREATE TABLE judge (
jid VARCHAR(20) PRIMARY KEY,
jname VARCHAR(50) NOT NULL,
jage INT,
jsex ENUM('男','女')
);
-- 赛事表
CREATE TABLE `match` (
mid VARCHAR(20) PRIMARY KEY,
mname VARCHAR(100) NOT NULL,
mtime DATE NOT NULL
);
-- 报名表
CREATE TABLE sign_up (
id INT AUTO_INCREMENT PRIMARY KEY,
pid VARCHAR(20) NOT NULL,
mid VARCHAR(20) NOT NULL,
sign_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pid) REFERENCES player(pid),
FOREIGN KEY (mid) REFERENCES `match`(mid)
);
-- 评分表
CREATE TABLE mark (
id INT AUTO_INCREMENT PRIMARY KEY,
pid VARCHAR(20) NOT NULL,
jid VARCHAR(20) NOT NULL,
mid VARCHAR(20) NOT NULL,
score DECIMAL(5,2) NOT NULL,
mark_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (pid) REFERENCES player(pid),
FOREIGN KEY (jid) REFERENCES judge(jid),
FOREIGN KEY (mid) REFERENCES `match`(mid)
);
系统采用体育赛事常见的评分规则:去除最高分和最低分后计算平均分。核心实现代码如下:
java复制public Double calculateAverageScore(List<Double> scores) {
if(scores == null || scores.size() < 3) {
throw new IllegalArgumentException("评分数量不足");
}
// 排序
Collections.sort(scores);
// 去除最高分和最低分
scores.remove(0); // 最低分
scores.remove(scores.size()-1); // 最高分
// 计算平均分
double sum = 0;
for(Double score : scores) {
sum += score;
}
// 保留1位小数
return Double.parseDouble(String.format("%.1f", sum/scores.size()));
}
系统通过拦截器实现基于角色的访问控制:
java复制public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if(user == null) {
response.sendRedirect("/login");
return false;
}
String requestURI = request.getRequestURI();
// 管理员权限校验
if(requestURI.startsWith("/admin") && !"admin".equals(user.getRole())) {
response.sendError(403, "无权限访问");
return false;
}
// 裁判权限校验
if(requestURI.startsWith("/judge") && !"judge".equals(user.getRole())) {
response.sendError(403, "无权限访问");
return false;
}
// 选手权限校验
if(requestURI.startsWith("/player") && !"player".equals(user.getRole())) {
response.sendError(403, "无权限访问");
return false;
}
return true;
}
}
系统采用RESTful风格API设计,前后端通过JSON格式交互:
java复制@Controller
@RequestMapping("/api/player")
public class PlayerController {
@Autowired
private PlayerService playerService;
@GetMapping("/list")
@ResponseBody
public Map<String, Object> getPlayerList(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
PageInfo<Player> pageInfo = playerService.getPlayerPage(page, size);
Map<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("msg", "success");
result.put("data", pageInfo.getList());
result.put("count", pageInfo.getTotal());
return result;
}
}
数据库配置:
competition_dbdatabase.properties中的连接信息:properties复制jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/competition_db?useSSL=false&characterEncoding=utf8
jdbc.username=root
jdbc.password=yourpassword
Maven配置:
xml复制<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
bash复制mvn clean install
//competition问题现象:启动时报数据库连接错误
排查步骤:
database.properties配置是否正确解决方案:
properties复制# 正确的连接URL格式示例
jdbc.url=jdbc:mysql://localhost:3306/competition_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
问题现象:编译时报getter/setter方法找不到
解决方案:
问题现象:页面显示无样式或JS不生效
排查步骤:
解决方案:
在JSP页面中正确引用静态资源:
jsp复制<link rel="stylesheet" href="${pageContext.request.contextPath}/static/layui/css/layui.css">
<script src="${pageContext.request.contextPath}/static/layui/layui.js"></script>
性能优化:
功能增强:
安全加固:
移动端适配:
这个赛事评分系统作为毕业设计或课程实践项目,涵盖了JavaWeb开发的完整技术栈,从需求分析、系统设计到编码实现的全过程。通过实际开发这个系统,可以深入掌握SSM框架整合、数据库设计、权限控制等企业级开发必备技能。