SpringBoot 足球青训俱乐部管理后台:128个文件162个接口,三角色教练学员管理全流程
这是一套基于 Spring Boot 的足球青训俱乐部管理后台系统,自带源码+论文+数据库脚本,业务覆盖学员注册登录、教练排课、课程安排、上课签到、装备商品、公告发布和统计报表。本文带你看清它里面有什么、怎么跑起来,并附真实运行截图。
目录
一、你是不是也这样
二、这套是什么
三、对你具体有什么用
四、怎么跑起来
五、里面有什么
一、你是不是也这样
你在做毕业设计,方向选了 Web 开发或者后台管理系统。打开 GitHub 搜一圈发现几类问题:要么太简单撑不起论文目录,要么太复杂跑不动,要么下载下来连数据库脚本都没有、连说明文档都找不到。
这套足球青训俱乐部管理后台的好处是正好卡在中间。它有完整的一条业务链——学员注册进来、教练给他排课、上课签到、想置办装备就进购物车、俱乐部发公告通知、后台出统计报表,每一步都有独立接口和独立数据表,能写满论文的功能模块章节。又没有复杂到答辩讲不明白:没有微服务、没有消息队列,一个 MySQL 加一个 Java 进程就能跑。
而且这套项目带了三样东西:db.sql 数据库脚本(14 张表自带 66 行种子数据)、说明文档.txt 写了前后台地址和登录入口、论文.docx 可以参考结构。拿到就知道往哪敲、怎么跑、论文怎么写。

图:前台首页 —— 顶部导航、轮播图和公告模块,游客无需登录即可浏览。

图:前台公告信息列表 —— 公告卡片带封面图和标题,支持按标题搜索,底部可翻页。

图:前台商品信息列表 —— 装备商品卡片展示封面、名称和价格,顶部有分类筛选和搜索框。

图:前台课程安排列表 —— 按教练、学员、课程名筛选,课程封面和上课地点时间都在。

图:前台学员个人中心 —— 登录后显示本人资料,可改密码、换头像、看余额和订单。

图:后台管理首页 —— 左侧列出学员、教练、公告、商品、课程安排、课程签到、统计中心、系统管理和订单管理。
二、这套是什么
项目名:基于Web足球青训俱乐部管理后台系统开发
技术形态:Spring Boot 单体应用,前后端不分离——前台 HTML 页面 + 后台 Vue 页面均打包在工程内
业务领域:足球青训俱乐部的日常运营管理。跟普通电商的区别是它有教练和学员两套业务身份:教练排课、学员签到、装备交易只是俱乐部运营的一部分。
交付清单
| 交付物 | 内容 | 对毕设的意义 |
|---|---|---|
| 源码工程 | springbootr4n67 目录,128 个 Java 文件 | 可直接运行、改业务做二次开发 |
| db.sql | 14 张表建表脚本 + 66 行种子数据 | 导完库直接点着看 |
| 论文.docx | Word 格式论文文档,约 9100 中文字 | 可参考论文结构和模块划分 |
| 说明文档.txt | 后台地址、前台地址、登录说明 | 跑之前先看 |
规模数字(均可复现)
| 指标 | 数值 | 统计方式 |
|---|---|---|
| Java 文件数 | 128 | find src -name “*.java” | wc -l |
| Java 代码行数 | 13023 | find src -name “*.java” -exec cat {} + | wc -l |
| Controller 数 | 15 | ls controller/*Controller.java | wc -l |
| REST 接口数 | 162 | 全部 mapping 注解 176 条 − 类级路径前缀 14 条 |
| 数据库表数 | 14 | db.sql 中 CREATE TABLE 计数 |
| 种子数据 | 66 条 INSERT / 66 行 | db.sql 实际元组行数 |
| HTML 页面 | 47 | find src -name “*.html” | wc -l |
⛔ 这三个数字最容易写错,答辩时被问到要能当场说清:
- 162 而不是 176:15 个 Controller 里,14 个在类上有一条
@RequestMapping("/xxx")路径前缀注解——那是前缀,不是接口。真正的 162 是方法级注解条数。写多了等于把前缀当成接口。 - 14 张表不是 12 张:
CREATE TABLE一共 14 次,其中cart购物车只有 1 行、orders订单 1 行,是真实业务产生的数据,不是空表。 - 66 行不是 66 条语句:这个项目的 db.sql 每条 INSERT 只插一行,所以语句数恰好等于行数。换成别的毕设工程不一定成立——统计时必须看元组个数,不能数
insert into的出现次数。
种子数据分布
| 表 | 行数 | 表 | 行数 |
|---|---|---|---|
address | 7 | kechengqiandao | 7 |
cart | 1 | kechengxinxi | 6 |
config | 4 | orders | 1 |
gonggaoxinxi | 6 | shangpinxinxi | 6 |
jiaolian | 6 | token | 3 |
kechenganpai | 6 | users | 1 |
tongjizhongxin | 6 | xueyuan | 6 |
本文环境版本
| 组件 | 版本 | 来源 |
|---|---|---|
| JDK | 1.8 | pom.xml |
| Spring Boot | 2.2.2.RELEASE | pom.xml parent |
| ORM | MyBatis-Plus 2.3 | pom.xml |
| 数据库 | MySQL 5.7 | db.sql 导出头 |
| 后台前端 | Vue + Element UI | admin/admin/dist/ |
| 前台前端 | HTML + Layui | front/front/ |
| 构建 | Maven 3.8 | pom.xml |
系统架构

图:系统架构图 —— 浏览器 → Spring Boot 8080 → Token 拦截器 → 15 个 Controller → Service → MyBatis-Plus → MySQL。
整个系统是一个 Spring Boot 单体应用。后端一个 jar 包管所有接口,后台前端是编译好的 Vue 静态文件放在 resources 里,前台前端是 HTML 页面也放在 resources 里。数据库只有 MySQL,没有 Redis、没有消息队列。
三、对你具体有什么用
1. 三套角色一张 token 表搞定,论文「权限设计」章能直接写
这套工程有三套用户体系:管理员(users 表)、学员(xueyuan 表)、教练(jiaolian 表)。源码里 generateToken 有三处调用点,分别对应这三张表:
UserController→ 管理员,登录后写token表,tablename记usersXueyuanController→ 学员,登录后写token表,tablename记xueyuanJiaolianController→ 教练,登录后写token表,tablename记jiaolian
token 表结构是通用的:id / userid / username / tablename / role / token / addtime / expiratedtime。tablename 这个字段是整套设计的关键——它让一张表同时承载三种身份,拦截器只要读出 tablename 就知道该把请求当成谁处理。
数据库里 token 表的种子数据正好印证了这一点:3 行,tablename 分别是 users、xueyuan、jiaolian,各 1 条。
答辩老师问「你这套系统怎么区分三种角色的权限」,这张表答完。
2. 前端菜单就是现成的权限矩阵,论文「功能模块」章照抄即可
后台的 menu.js 里写着一份完整的菜单结构,直接把三套角色的能干什么写清楚了:
| 角色 | 后台能干什么 | 前台能干什么 |
|---|---|---|
| 管理员 | 学员管理、教练管理、公告信息管理、商品信息管理、课程安排管理、课程签到管理、统计中心管理、轮播图管理、订单管理 | 无(只登录后台) |
| 学员 | 无(只登录前台) | 公告信息列表、商品信息列表、课程安排列表、购物车、上课签到、个人中心、我的订单、我的地址 |
| 教练 | 公告信息管理、商品信息管理、课程安排管理、课程签到管理 | 无(只登录后台) |
菜单项还带操作按钮权限:管理员在课程安排上有「考勤签到」按钮,在课程签到上有「审核」按钮,在统计中心上有「报表」按钮;学员在课程安排上只有「上课签到」。这套按钮级权限是 isAuth() 和 isFrontAuth() 两个函数读菜单表算出来的,前端一个 v-if 就完事。
写论文「系统功能设计」章时,这张表可以直接改写成一节。
3. 通用接口 Controller,这部分最能撑起设计类章节
CommonController 是这套工程里最有讲头的部分。9 个接口里有 7 个是完全泛型的:
| 路径 | 作用 | 参数 |
|---|---|---|
/option/{tableName}/{columnName} | 取某表某列的去重值(下拉框数据源) | 表名 + 列名 |
/follow/{tableName}/{columnName} | 按去重值分组统计 | 表名 + 列名 |
/cal/{tableName}/{columnName} | 对某列求和 | 表名 + 列名 |
/group/{tableName}/{columnName} | 分组统计 | 表名 + 列名 |
/value/{tableName}/{xColumnName}/{yColumnName} | 按 x 列分组、对 y 列求和 | 表名 + x 列 + y 列 |
/sh/{tableName} | 改某条记录的审核状态 | 表名 + 状态 + id |
/remind/{tableName}/{columnName}/{type} | 待审核数量角标 | 表名 + 列 + 类型 |
/location | 百度地图经纬度转城市 | lng + lat |
/matchFace | 百度 AI 人脸比对 | 两张图片名 |
前 7 个接口的表名和列名是从前端传进来的路径参数,服务端用 EntityWrapper 拼查询。这意味着后台 Vue 页面的下拉框、统计卡片、审核角标,不用为每张表各写一套接口——一个通用接口配参数就够了。15 个 Controller 里有一半是标准 CRUD,真正手写的业务代码反而集中在 CommonController 上。
它不是「每个业务表复制一遍 CRUD」,而是抽出了「通用数据操作层」。答辩老师问「你这套代码复用体现在哪」,可以拿它当例子。
4. 课程安排表把教练和学员双向冗余,答辩有讲头
kechenganpai 表的字段能看出业务设计:
| 字段 | 含义 |
|---|---|
xueyuanzhanghao / xueyuanxingming | 上课学员的账号和姓名 |
jiaoliangonghao / jiaolianxingming | 授课教练的工号和姓名 |
kechengbianhao / kechengming | 课程编号和课程名 |
shangkeshijian / shangkedidian | 上课时间和地点 |
fengmian / xiangqing | 课程封面和详情 |
kechengqiandao(课程签到)表同样冗余了学员和教练双方,还多了 qiandaozhuangtai(签到状态)、longitude / latitude / fulladdress(经纬度和完整地址)三个定位字段——签到的时候记一下位置,这是能写进论文「考勤核验」小节的设计。
这种「主外键冗余成普通字段」的做法好处是列表页一次查询就能把名称带出来,不用连表;代价是改名字要同步改多张表。答辩老师问「你为什么这么设计」,两边的理由都能答。
5. 课程签到接口按登录身份自动过滤数据,这是个实用细节
KechengqiandaoController#page 有一段:
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("xueyuan")) {
kechengqiandao.setXueyuanzhanghao((String)request.getSession().getAttribute("username"));
}
if(tableName.equals("jiaolian")) {
kechengqiandao.setJiaoliangonghao((String)request.getSession().getAttribute("username"));
}
学员登录后只能看到自己的签到记录,教练登录后只能看到自己课的签到记录——这段逻辑不用前端传什么参数,全靠拦截器放进 session 的 tableName 和 username 判定。
这个细节在答辩时很好用:老师问「怎么防止学员看到别人的签到记录」,直接指这段代码。
6. 分页查询一行套三层,拆开讲三句话就够
每个 Controller 的分页查询都长这样:
PageUtils page = kechengqiandaoService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, kechengqiandao), params), params));
看着吓人,拆开就三层意思:
likeOrEq—— 查询框里填的值带%就走模糊匹配,否则走精确等于between—— 参数名以_start结尾的翻译成>=,以_end结尾的翻译成<=,于是「2021-01-01 到 2021-12-31」这种区间筛选不用写专门的代码sort——sort参数指定排序列,order=desc就倒序
前端的表单只要按这个约定拼参数名,后端一行代码全包。写论文「查询条件封装」那段时,这三层正好拆成三句话。
7. 改端口要改三个地方,这是最容易踩的坑
application.yml 里 static-locations 是 classpath:static/,file:static/,没有映射 front/ 目录。前台页面走 Spring Boot 对 classpath:/ 的默认兜底,所以目录是双层的但访问 URL 只写一层。
更坑的是端口。改端口不止改 application.yml 一处:
| 文件 | 处数 |
|---|---|
application.yml | 1 |
front/front/modules/http/http.js | 2 |
front/front/js/config.js | 1 |
只改 application.yml → 后台能开、前台一片白(调不到接口)。这个坑值得单独写一节,因为答辩时如果老师说「部署到别的端口」,你现场改一处就会翻车。
8. 论文和代码对得上
论文文档是 Word 格式,约 9100 中文字,目录结构是标准的六章:绪论、相关技术简介、系统分析、系统设计、系统实现、系统测试。系统实现章按角色分成三块——5.1 学员功能模块、5.2 管理员功能模块、5.3 教练功能模块,跟源码里三套角色的划分完全一致。
论文 4.3 节的数据库设计写了课程安排、教练、订单、管理员、学员五个实体 E-R 图,db.sql 里对应 kechenganpai、jiaolian、orders、users、xueyuan 五张表,一一对得上。写「系统实现」那一章时可以直接对着 Controller 一个个展开,写「数据库设计」对着 db.sql 的 14 张表展开。

图:ER 图 —— users、token 两张用户与鉴权表的字段结构,token 表靠 tablename 区分三种身份。

图:ER 图 —— config 系统配置表,只有 id、name、value 三个字段,第三方接口的密钥全存这儿。

图:ER 图 —— 学员、教练、课程安排、课程签到、商品、公告、订单等业务主表的字段结构。

图:项目指标统计 —— 128 个 Java 文件、162 个 REST 端点、15 个 Controller、14 张数据库表的实测数字。

图:后台课程安排管理 —— 管理员给学员和教练排课,表格里能看到学员账号、教练工号、课程编号、封面、上课时间和地点,行尾有详情和考勤签到按钮。

图:后台课程签到管理 —— 按学员、教练、课程名查询签到记录,能看到签到状态、备注和定位信息。

图:后台学员管理 —— 学员列表带账号、姓名、性别、手机号、出生年月和头像,管理员在此改资料或删除账号。
四、怎么跑起来
第 1 步:建库导脚本
# 创建数据库
mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS springbootr4n67 DEFAULT CHARACTER SET utf8;"
# 导脚本(脚本里已含 CREATE DATABASE 和 USE,直接导即可)
mysql -uroot -p < db.sql
# 验证:应该出 14 张表
mysql -uroot -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='springbootr4n67';"
# 验证数据量
mysql -uroot -p -e "SELECT COUNT(*) FROM springbootr4n67.kechenganpai;"
⛔ 导完先数表:14 张。其中 cart 和 orders 各只有 1 行,token 3 行,这是种子数据本来就少,不是导失败。
第 2 步:改数据源配置
application.yml 里改两处,密码换成你自己的:
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springbootr4n67?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
username: root
password: 你的数据库密码
application.yml 共 52 行。改端口记得同步改前台那两个 JS 文件,不然前台白屏。
第 3 步:启动
mvn clean package -DskipTests
java -jar target/*.jar
启动后按说明文档里的地址访问。配置表 config 里可以补 baidu_ditu_ak 和 APIKey / SecretKey,不配的话地图和人脸接口会返回错误提示,但不影响主流程跑通。
常见报错
报 Unknown column 'xxx' in 'field list' —— 大概率是导了旧版 db.sql。重新导一遍完整脚本,别只导数据不导表结构。
前台打开一片白,控制台报接口 404 —— 十有八九是只改了 application.yml 的端口,前台的 http.js 还指着旧端口。三个文件一起改。
时间差 8 小时 —— serverTimezone=GMT%2B8 这个参数被改了,改回去。
五、里面有什么
技术栈清单
| 层 | 用了什么 | 关键文件 |
|---|---|---|
| 启动 | Spring Boot 2.2.2 | Springbootr4n67Application.java |
| 鉴权 | HandlerInterceptor + Token 表 | AuthorizationInterceptor.java |
| 数据访问 | MyBatis-Plus + EntityWrapper | 各 Dao / Service / ServiceImpl |
| 通用接口 | 泛型 CRUD + 聚合统计 | CommonController.java |
| 地图 | 百度地图开放平台 | BaiduUtil.java |
| 人脸 | 百度 AI 人脸识别 | CommonController#matchFace |
| 返回格式 | 统一 R 对象 | R.java |
| 分页 | PageUtils | PageUtils.java |
| 查询构造 | EntityWrapper 封装 | MPUtil.java |
| SQL 防护 | 关键字过滤 | SQLFilter.java |
MyBatis-Plus 全局配置(答辩能答)
application.yml 里有一段 MyBatis-Plus 全局配置,答辩老师问「持久层怎么配的」,这段可以直接答:
id-type: 1—— 主键由用户输入,不是数据库自增。插入时需要在业务代码里生成 id。field-strategy: 2—— 非空判断,UPDATE 时只有非空字段才进 SET 子句,可以做部分更新。db-column-underline: true—— Java 驼峰命名自动转数据库下划线列名,实体类不用写@TableField。logic-delete-value: -1—— 逻辑删除。删除不是物理删,而是把标记字段改成 -1,查询自动过滤。refresh-mapper: true—— 改 mapper XML 不重启就生效,调试用,生产环境应该关掉。call-setters-on-nulls: true—— 查询结果里 null 字段也会调用 setter,避免部分字段丢值。
关键文件清单
| 文件 | 作用 |
|---|---|
| Springbootr4n67Application.java | 启动类 |
| AuthorizationInterceptor.java | Token 鉴权 + 跨域预检处理 |
| CommonController.java | 通用接口(聚合统计/地图/人脸) |
| BaiduUtil.java | 百度地图与百度 AI 封装 |
| R.java | 统一返回格式 |
| PageUtils.java | 分页工具 |
| MPUtil.java | 查询条件构造工具 |
| SQLFilter.java | SQL 注入关键字过滤 |
| UserController.java | 管理员 |
| XueyuanController.java | 学员(注册/登录/签到) |
| JiaolianController.java | 教练(排课/考勤) |
| KechenganpaiController.java | 课程安排 |
| KechengqiandaoController.java | 课程签到 |
| OrdersController.java | 订单 |
运行验证:截图实测
这套项目已经实际部署跑通,本文的截图全部来自真实运行环境。
前台游客无需登录即可打开首页,顶部导航、轮播图和公告模块正常展示;公告信息列表页按标题搜索,封面图加载正常。商品信息列表页展示装备商品卡片,带分类筛选和价格。课程安排列表按教练、学员、课程名筛选,课程封面和上课时间地点都在。个人中心要先登录才能看到自己的资料。
后台用管理员身份登录后,左侧菜单列出学员、教练、公告、商品、课程安排、课程签到、统计中心、系统管理和订单管理全部模块。课程安排管理页对排课记录做增删改查,同时维护学员账号、教练工号、课程编号、封面和上课地点;课程签到管理页能看到签到状态和定位信息;学员管理页的用户列表带角色和状态字段,管理员在此改资料或删除账号。
截图清单:01 前台首页、02 前台公告信息列表、03 前台商品信息列表、04 前台课程安排列表、05 前台学员个人中心、06 后台管理首页、07 后台学员管理、08 后台教练管理、09 后台课程安排管理、10 后台课程签到管理、11 后台公告信息管理、12 后台商品信息管理、13 后台统计中心管理。共 13 张运行截图 + 5 张生成图表(架构图 + 3 张 ER 图 + 指标图)。
二次开发空间
加真实支付网关 / 接第三方短信做上课提醒 / 把图片存储换成对象存储 / 加签到地理围栏(经纬度字段已经有了)/ 接教练评价体系。
本文基于 springbootr4n67 源码逐文件分析,代码片段均为原文摘录,统计数字与截图均来自真实运行环境。
本博客介绍了一个基于Spring Boot的足球青训俱乐部管理后台系统,涵盖学员、教练、管理员三角色权限体系,包含14张MySQL表、162个REST接口及128个Java文件。系统采用单体架构,集成MyBatis-Plus、Token统一鉴权、双向冗余课程安排、自动身份过滤签到、通用泛型Controller等关键技术点,专为毕业设计优化,支持快速部署与论文写作。

4673

被折叠的 条评论
为什么被折叠?



