☰
JSP体育赛事管理系统毕设实战:环境搭建、权限分权与成绩录入避坑指南
2026/10/4 15:48:13 网站建设 项目流程

简介:这份毕业设计论文资源面向计算机相关专业学生与需要完成赛事管理类课题的开发者,围绕体育赛事管理系统的设计与实现展开,提供从需求分析到数据库落地的完整方案。论文以Eclipse为开发工具、MySQL为后台数据库,系统划分操作员管理、运动员管理、项目分类管理、赛程管理、登记参赛、成绩录入与成绩统计等功能模块,并设计管理员、记分员、参赛选手等多角色权限体系,数据库涵盖用户表、赛事表、项目表、成绩表与参赛表,同时给出系统结构图、实体关系图与界面截图,便于读者理解整体架构与实现思路。资源包共1个doc文件,约950KB,内容为完整论文正文,适合直接参考选题框架、功能划分与数据库设计。目前已有82人学习,可作为毕业设计写作与系统开发落地的实用参考。

1. 从一份 JSP 毕设拆起:体育赛事管理系统到底能跑通什么

如果你正在找一份能直接跑起来的 Java Web 毕业设计,又不想碰那些只有截图没有源码的"论文包",这份体育赛事管理系统值得先看一眼。它的技术栈非常典型:Eclipse 做开发、JSP + Struts2 写页面和业务、MySQL 存数据、Tomcat 7.0 当容器,B/S 架构,浏览器访问。功能覆盖操作员管理、运动员管理、项目分类、赛程安排、登记参赛、成绩录入和成绩统计七个模块,还带一套按角色分权的登录体系。说白了,它解决的是运动会从报名到出成绩这一整条链路的数字化记录问题——谁参加哪个项目、什么时候比、成绩多少、谁录的,全落在数据库里。适合两类人:一是要交毕设、需要一份结构完整可演示系统的同学;二是想拿一个真实 JSP 项目练手、熟悉 Struts2 + MySQL 这套老派组合的开发者。下面我按"能跑起来 → 看懂结构 → 避开坑"的顺序拆。

2. 环境搭建与数据库落地:把论文里的表变成能查的库

论文里给了五张表的物理结构设计,但真正动手时你会发现,光有字段定义不够,字符集、主外键、自增策略这些没定死,后面 JSP 页面一插数据就报错。这一章先把运行环境和数据库这两块地基打牢,因为后面所有模块都依赖它。

2.1 开发环境版本对齐

论文写的是 Win8.1 + Eclipse + MySQL7 + Tomcat7.0 + JDK(JSP 隐含要求)。这里有个血泪经验:Struts2 和 Tomcat 版本对 JDK 很敏感。Tomcat 7.0 配 JDK 1.7 或 1.8 都行,但如果你本机装的是 JDK 11 以上,Tomcat 7 启动会直接抛UnsupportedClassVersionError。我一般会单独装一个 JDK 1.8,在 Eclipse 里给这个项目单独指定 JRE,不动系统默认。

环境清单如下,照着对一遍再往下走:

组件论文指定版本实操建议说明
操作系统Win8.1Win10/11 均可路径别带中文和空格
开发工具EclipseEclipse IDE for Enterprise Java需带 Web 项目支持
JDK未明确JDK 1.8与 Tomcat7 兼容性最好
Web 服务器Tomcat 7.0Tomcat 7.0.x别升到 9,Servlet 规范有差异
数据库MySQL 7MySQL 5.7 或 8.08.0 需注意驱动包版本
开发语言JSP、Java同Struts2 框架

提示:MySQL 8.0 的默认认证插件是caching_sha2_password,老版本 JDBC 驱动连不上,要么换mysql-connector-java-8.0.x驱动,要么把用户认证方式改回mysql_native_password。这是新手最容易卡住的第一道坎。

2.2 建库建表:把五张物理表写进 MySQL

论文 4.2.3 节给了操作员、运动员、项目分类、赛程、参赛记录五张表的字段、类型和约束。我把它整理成可直接执行的建表脚本,字段名沿用论文里的命名(admin_id、player_id 等),方便你对照论文截图。

-- 创建数据库,字符集用 utf8mb4 防止中文乱码 CREATE DATABASE sports_meet DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE sports_meet; -- 操作员信息表:管理员和普通操作员都存这里,靠 admin_type 区分身份 CREATE TABLE admin ( admin_id INT(4) NOT NULL AUTO_INCREMENT COMMENT '编号', admin_username VARCHAR(50) NOT NULL COMMENT '用户名', admin_password VARCHAR(50) NOT NULL COMMENT '密码', admin_type INT(4) NOT NULL COMMENT '身份类型 1管理员 2操作员', admin_name VARCHAR(50) DEFAULT NULL COMMENT '姓名', admin_sex VARCHAR(50) DEFAULT NULL COMMENT '性别', PRIMARY KEY (admin_id), UNIQUE KEY uk_username (admin_username) -- 用户名唯一,对应论文"验证用户名是否存在" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 运动员信息表:player_number 运动员号唯一 CREATE TABLE player ( player_id INT(4) NOT NULL AUTO_INCREMENT COMMENT '编号', player_name VARCHAR(50) NOT NULL COMMENT '姓名', player_sex VARCHAR(50) NOT NULL COMMENT '性别', player_birthday VARCHAR(8) DEFAULT NULL COMMENT '生日', player_class VARCHAR(50) NOT NULL COMMENT '班级', player_studentid VARCHAR(50) NOT NULL COMMENT '学号', player_number VARCHAR(50) NOT NULL COMMENT '运动员号', PRIMARY KEY (player_id), UNIQUE KEY uk_number (player_number) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 项目分类信息表 CREATE TABLE type ( type_id INT(4) NOT NULL AUTO_INCREMENT COMMENT '编号', type_name VARCHAR(50) NOT NULL COMMENT '名称', type_introduction VARCHAR(300) DEFAULT NULL COMMENT '说明', PRIMARY KEY (type_id), UNIQUE KEY uk_typename (type_name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 赛程信息表:schedule_itemid 外键指向项目分类 CREATE TABLE schedule ( schedule_id INT(4) NOT NULL AUTO_INCREMENT COMMENT '编号', schedule_itemid INT(4) NOT NULL COMMENT '项目分类', schedule_name VARCHAR(50) NOT NULL COMMENT '名称', schedule_date DATETIME NOT NULL COMMENT '日期', schedule_starttime VARCHAR(50) NOT NULL COMMENT '开始时间', schedule_endtime VARCHAR(50) NOT NULL COMMENT '结束时间', schedule_introduction VARCHAR(300) DEFAULT NULL COMMENT '说明', PRIMARY KEY (schedule_id), UNIQUE KEY uk_schname (schedule_name), KEY fk_sch_type (schedule_itemid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 参赛记录信息表:运动员和赛程多对多的联系表,成绩和登记人都在这 CREATE TABLE plog ( plog_id INT(4) NOT NULL AUTO_INCREMENT COMMENT '编号', plog_playerid INT(4) NOT NULL COMMENT '运动员', plog_scheduleid INT(4) NOT NULL COMMENT '赛程', plog_score FLOAT(8) DEFAULT NULL COMMENT '成绩', plog_adminid INT(4) DEFAULT NULL COMMENT '登记人', PRIMARY KEY (plog_id), KEY fk_plog_player (plog_playerid), KEY fk_plog_sch (plog_scheduleid) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这段脚本做了三件论文里没写死但必须做的事:一是统一用utf8mb4,否则运动员姓名里的生僻字或中文标点会变问号;二是把论文里"验证唯一性"的需求落成UNIQUE KEY,用户名、运动员号、项目分类名、赛程名都加了唯一约束,这样即使前端校验被绕过,数据库层也能兜底;三是给外键字段建了普通索引(KEY),参赛记录表按运动员或赛程查询时不会全表扫描。

参数说明:admin_type用整数区分角色,1 是管理员、2 是操作员,登录后据此决定是否显示操作员管理模块,对应论文 5.1 节"系统会自动判断用户的权限"。plog_score用FLOAT(8)存成绩,如果你要精确到毫秒或需要小数运算,建议换成DECIMAL,浮点数在统计排名时可能出现9.999999这种玄学值。

2.3 导入项目与配置数据库连接

建完库,把源码导入 Eclipse:File → Import → Existing Projects into Workspace,选中项目根目录。然后找到数据库配置文件,Struts2 项目一般放在src下的db.properties或c3p0配置里,把库名、用户名、密码改成你本地的。

# db.properties 示例,按你本地实际改 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/sports_meet?useUnicode=true&characterEncoding=utf8mb4 jdbc.username=root jdbc.password=你的密码

改完在 Eclipse 里右键项目Run As → Run on Server,选 Tomcat 7.0。启动后浏览器访问http://localhost:8080/项目名/,能看到登录页就说明环境通了。如果报 404,先检查web.xml里的welcome-file和 Struts2 过滤器配置;如果报 500 且堆栈里有ClassNotFoundException,八成是mysql-connector驱动包没放进WEB-INF/lib。

3. 权限与核心模块实现:登录分权、赛程排序、成绩录入怎么落地

环境通了只是第一步,真正决定这份系统能不能演示的是几个核心模块的逻辑。论文第五章把登录、操作员、运动员、项目分类、赛程、参赛六个模块的实现都过了一遍,但偏描述性。这一章挑三个最容易出问题、也最能体现设计思路的模块,把实现逻辑和关键代码讲透。

3.1 登录模块:一次查询定角色

登录的本质是一次带条件的查询:拿用户名和密码去admin表里找,找到就说明身份合法,同时把admin_type取出来存进 Session,后续每个页面据此判断权限。论文 5.1 节说"成功登录系统的用户,系统会自动判断用户的权限",落到代码就是下面这样。

// LoginAction.java 核心逻辑(Struts2 Action) public String execute() { // 1. 按用户名+密码查询,密码明文比对(论文未提加密,演示够用) String hql = "from Admin where adminUsername=? and adminPassword=?"; Admin admin = (Admin) session.createQuery(hql) .setString(0, username) .setString(1, password) .uniqueResult(); if (admin == null) { // 2. 查不到,返回错误提示,对应论文"弹出错误提示要求重新输入" addActionError("用户名或密码错误"); return "loginFail"; } // 3. 查到,把身份类型写进 Session,供后续页面鉴权 ServletActionContext.getRequest().getSession() .setAttribute("adminType", admin.getAdminType()); ServletActionContext.getRequest().getSession() .setAttribute("adminId", admin.getAdminId()); return "loginSuccess"; }

逻辑说明:uniqueResult()保证只返回一条记录,因为用户名有唯一约束,不会出现多条。参数说明:adminType为 1 时前端菜单渲染操作员管理入口,为 2 时隐藏该入口,这就是论文说的"不同用户对应不同操作界面"。注意密码这里是明文比对,论文没提加密,作为毕设演示没问题,但如果要写进简历或答辩被问到安全性,建议至少加一层 MD5 或 BCrypt,否则数据库被拖库就是裸奔。

3.2 赛程管理:按开始时间自动排序

论文 4.1 节提到"已经添加的赛程信息将会自动的按照赛程开始的先后顺序进行排列"。这个需求看着简单,实现方式有两种:一是在 SQL 里ORDER BY schedule_date, schedule_starttime,二是查出来后在 Java 里用Comparator排。我一般选前者,数据库排序更省内存,也避免时间字段格式不统一导致排序错乱。

-- 赛程列表查询:先按日期,再按开始时间升序 SELECT s.schedule_id, s.schedule_name, s.schedule_date, s.schedule_starttime, s.schedule_endtime, t.type_name FROM schedule s LEFT JOIN type t ON s.schedule_itemid = t.type_id ORDER BY s.schedule_date ASC, s.schedule_starttime ASC;

这里用LEFT JOIN关联项目分类表,是为了在赛程列表里直接显示分类名称而不是一个数字 ID,对应论文 4.1 节"每个赛程需指定其所属的项目分类"。参数说明:schedule_starttime论文里定义成VARCHAR(50),存的是"09:00"这种字符串,字符串排序在补零的情况下没问题,但如果有人录成"9:00",排序就会乱。稳妥做法是录入时前端强制两位小时格式,或者干脆把字段改成TIME类型。

3.3 参赛与成绩录入:多对多关系怎么落表

这是整个系统数据关系最绕的地方。论文 4.2.1 节明确说"赛程与运动员属于多对多的关系,参赛记录将是这两个实体的联系表"。也就是说,一个运动员可以参加多个赛程,一个赛程可以有多个运动员,两者的关系全部落在plog表里。登记参赛就是往plog插一条记录,成绩录入就是更新这条记录的plog_score。

// 登记参赛:插入一条参赛记录 public String signUp() { Plog plog = new Plog(); plog.setPlogPlayerid(playerId); // 运动员ID plog.setPlogScheduleid(scheduleId); // 赛程ID plog.setPlogAdminid(currentAdminId); // 当前登录的登记人 // 成绩先留空,等比赛结束再录 baseDao.save(plog); return "signUpSuccess"; } // 成绩录入:按参赛记录ID更新成绩 public String inputScore() { Plog plog = (Plog) baseDao.get(Plog.class, plogId); plog.setPlogScore(score); // 录入成绩 baseDao.update(plog); return "scoreSuccess"; }

逻辑说明:登记和录成绩分成两步,是因为比赛前不知道成绩,赛后才有数据,这样设计符合真实赛事流程。参数说明:plog_adminid记录是谁录的成绩,对应论文表 4_5 里的"登记人"字段,出问题能追溯到人。这里有个容易翻车的地方——如果同一个运动员重复登记同一个赛程,plog表没有唯一约束,会插入两条重复记录,成绩统计时就算重了。建议在plog表上加一个UNIQUE KEY (plog_playerid, plog_scheduleid),从数据库层杜绝重复报名。

成绩统计模块本质是对plog表按赛程分组、按成绩排序:

-- 按赛程统计成绩排名 SELECT p.player_name, p.player_number, g.plog_score FROM plog g JOIN player p ON g.plog_playerid = p.player_id WHERE g.plog_scheduleid = ? ORDER BY g.plog_score DESC;

ORDER BY ... DESC让成绩高的排前面,WHERE锁定某个赛程,这就是论文说的"对整体的成绩进行统计查询"。

4. 避坑与排查:这份 JSP 毕设最容易翻车的五个地方

老项目跑不起来,十有八九不是代码逻辑错,而是环境和配置的细节没对齐。下面五条是我拆这类 JSP + Struts2 项目时反复遇到的,每条按"现象 → 原因 → 解决"写,照着排查能省不少时间。

4.1 中文乱码:从登录名到成绩全是问号

现象:页面输入中文运动员姓名,存进数据库变成???,或者查询出来显示乱码。原因:三层编码没统一——JSP 页面pageEncoding、数据库连接 URL 的characterEncoding、MySQL 表的字符集,任何一层是gbk或latin1都会乱。解决:JSP 页面头部统一<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>;连接 URL 加useUnicode=true&characterEncoding=utf8mb4;建库建表用utf8mb4。三处对齐后重启 Tomcat 再测。

4.2 Tomcat 启动报 404:项目没部署上

现象:Tomcat 启动没报错,但访问项目路径返回 404。原因:Eclipse 里项目的Dynamic Web Module版本和 Tomcat 不匹配,或者web.xml里 Struts2 过滤器没配好,请求没进到 Action。解决:右键项目Properties → Project Facets,把Dynamic Web Module调到 3.0 以下(Tomcat7 支持到 3.0);检查web.xml里org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter是否配置且url-pattern为/*。

4.3 数据库连接超时:连接池没释放

现象:系统用一会儿就报Communications link failure或连接数耗尽。原因:Struts2 项目如果用原生 JDBC 没关Connection,或者连接池配置的最大连接数太小。解决:确认每次查询后close()连接,或改用 c3p0/dbcp 连接池并在配置里设maxPoolSize至少 20;MySQL 侧检查wait_timeout,默认 8 小时,演示够用,但长时间挂着会断。

4.4 成绩统计出现重复行

现象:同一个运动员在成绩榜上出现两次。原因:plog表允许同一运动员对同一赛程重复登记,统计时 JOIN 出多条。解决:给plog表加UNIQUE KEY (plog_playerid, plog_scheduleid),并在登记参赛的 Action 里先查是否已存在再插入,双重保险。

4.5 权限形同虚设:改 URL 就能进管理页

现象:用操作员账号登录,手动在地址栏输入管理员页面的 URL,居然能打开。原因:只在菜单渲染时隐藏了入口,没有在 Action 或过滤器层做拦截。解决:写一个权限拦截器(Struts2 的Interceptor),在每个需要管理员权限的 Action 执行前检查 Session 里的adminType,不是 1 就跳回登录页。菜单隐藏只是体验,拦截器才是安全底线。

5. 从能跑到能讲:把这份毕设变成你自己的东西

把系统跑起来只是及格线,答辩或面试时真正拉开差距的,是你能不能讲清楚"为什么这么设计"以及"哪里还能改"。这一章给几个进阶方向和验证方法,帮你把这份现成的资源吃透。

先说验证。跑通之后别急着截图交差,按这条链路完整走一遍:管理员登录 → 新增一个操作员 → 新增一个运动员 → 建一个项目分类 → 在该分类下建一个赛程 → 用运动员登记参赛 → 录入成绩 → 看成绩统计排名。每一步都去数据库里SELECT一下,确认数据真的落表了,而不是页面假象。这一步能暴露 80% 的隐藏问题,比如外键没生效、成绩没更新、排序不对。

再说改造方向,按投入产出比排序:

改造点现状建议做法价值
密码安全明文存储加 MD5 或 BCrypt答辩必问,改了加分
成绩精度FLOAT换 DECIMAL(6,2)避免统计误差
重复报名无约束加联合唯一索引数据一致性
权限控制仅菜单隐藏加 Struts2 拦截器真正的安全
分页查询全量返回加 LIMIT 分页数据量大时不卡

如果你想让这份系统在答辩时更有说服力,我建议重点做两件事。第一,把权限拦截器补上,这是从"能演示"到"像个正经系统"的分水岭,代码量不大,一个 Interceptor 类加配置就行。第二,给成绩统计加一个导出功能,把排名结果导成 Excel 或 CSV,用 POI 或简单的字符串拼接都能实现,演示时点一下导出,比干看页面有冲击力。

最后说个我自己的习惯。每次拿到这种老技术栈的毕设项目,我都会先不看代码,而是照着论文的数据库设计把表建出来,手动插几条测试数据,再用 SQL 把每个模块要用的查询写一遍。等 SQL 都跑通了,再回头看 Java 代码,会发现它不过是在调这些 SQL 而已,整个系统的脉络一下就清楚了。从那以后我每次拆 JSP 项目都强制走一遍"先建库、再写 SQL、最后看代码"的流程,比一上来就啃 Action 快得多。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询