Spring Boot 3 + Vue 3 学生管理系统毕业设计实战:功能拆解、数据库设计与源码结构
面向正在选题、开题或准备答辩的同学:这篇文章不讲空泛的「系统架构」,只讲一个能跑起来的学生管理系统到底由哪些部分组成、每一部分该怎么做、哪些地方最容易翻车。
配套源码(0 积分下载):学生管理系统完整源码 · 含 schema.sql 与 Knife4j 接口文档
一、为什么「学生管理系统」是毕业设计的高性价比选题
选题时最容易走两个极端:要么选一个「AI 辅助诊疗」这种听着高级、实际只能做界面壳子的题目;要么选一个「图书借阅」这种烂大街、答辩时老师都提不起兴趣的题目。
学生管理系统的优势在于:需求边界清晰、业务闭环完整、评审老师一眼能看懂价值。它能同时覆盖这几类考察点:
- 数据库设计能力(多表关联、唯一约束、外键)
- 权限控制能力(管理员 / 学生两种角色,接口级鉴权)
- 前后端分离工程能力(REST 接口、跨域、状态管理)
- 业务细节处理(签到状态、分级管理、签署状态)
劣势也很明确:题目太常见,所以必须在细节上做出差异——比如考勤签到、行为守则签署与签名文件上传,这些就不是烂大街模板里有的东西。
二、技术栈选型
后端:
| 层次 | 选型 | 说明 |
|---|---|---|
| 语言 / 运行时 | Java 21 | LTS 版本,虚拟线程对 I/O 密集接口有收益 |
| 框架 | Spring Boot 3.5 | 与 Java 21 匹配,原生支持 GraalVM |
| 安全 | Spring Security + JWT | 无状态鉴权,适合前后端分离 |
| 持久层 | Spring Data JPA | 实体映射 + 方法名派生查询,减少样板 SQL |
| 数据库 | MySQL 8 | 毕业设计最稳妥的选择,资料多、答辩老师熟悉 |
| 缓存 | Redis | 存放登录态 / 验证码 / 热点数据 |
| 接口文档 | Knife4j | 基于 Swagger 的增强 UI,答辩演示很加分 |
| 切面 | Spring AOP | 统一记录接口耗时、操作审计 |
前端:
| 层次 | 选型 |
|---|---|
| 框架 | Vue 3(Composition API) |
| 构建 | Vite |
| 状态管理 | Pinia |
| 路由 | Vue Router |
| 组件库 | Element Plus(后台)+ Vant(移动端) |
| 图表 | ECharts |
这套组合的关键优势是:每一层都能在答辩时讲出「为什么选它」,而不是「教程这么写的」。
三、功能模块拆解
一个能通过答辩的学生管理系统,至少要有下面这些模块:
- 学生信息管理
- 基础信息增删改查
- 学号唯一约束(数据库层做,不靠代码判断)
- 手机号唯一约束(同样落库)
- 考勤签到
- 签到记录写入与查询
- 按学生 / 按日期维度统计
- 学生分级管理
- 按年级或等级分组
- 分级结果影响可访问的功能范围
- 管理员—学生归属关系
- 一个管理员管理一批学生
- 归属关系用外键表达,而不是在代码里写死
- 行为守则签署
- 签署状态字段(已签 / 未签)
- 签名图片上传与存储路径记录
- 接口文档与演示
- Knife4j 暴露全部接口
- 答辩时直接现场调接口,比 PPT 有说服力
这套模块是我实际做成源码并上传到资源站的那一版,包含完整前后端与建表脚本。
四、数据库设计要点
毕业设计里最容易失分的地方不是 SQL 写得不好,而是约束没落库。
三个必须写进 DDL 的东西:
- 唯一约束:学号、手机号必须
UNIQUE。只在 Service 里if (exists)判断,并发下必然重复。 - 外键与级联策略:管理员删除学生时,签到记录是级联删除还是置空?必须显式定义,不能听天由命。
- 状态字段用枚举值:签署状态、签到状态不要用 0/1 裸数字,要么用
TINYINT+ 常量类,要么直接VARCHAR存语义值。
配一份schema.sql一起交付,答辩时老师问「你怎么建库」直接给他看脚本,比口头解释强得多。
五、鉴权设计:为什么用 JWT 而不是 Session
前后端分离场景下,Session 需要额外处理跨域 Cookie 与分布式共享,成本高于收益。JWT 的方案是:
- 登录成功 → 服务端签发 token,payload 里放用户 id 与过期时间
- 前端存 token,每次请求放进请求头
- 服务端用过滤器校验签名与过期时间,通过则放行
两个容易翻车的点:
- 密钥不能写死在代码里。一旦源码公开,任何人都能伪造 token。正确做法是从环境变量读取,缺失时启动直接失败。
- 不要只校验签名,还要校验过期。
exp必须在服务端比对,不能只信前端。
六、工程结构(前后端分离)
BackEnd/ ├── sql/schema.sql # 建表脚本 ├── src/main/java/... # 分层:controller / service / repository / entity └── src/main/resources/ └── application.yaml # 数据库、JWT、Redis 配置(占位符) FrontEnd/ ├── src/views/ # 页面 ├── src/api/ # 接口封装 ├── src/store/ # Pinia 状态 └── vite.config.ts # 代理配置(解决开发期跨域)两个建议:
- 开发期用 Vite 的
proxy解决跨域,不要在后端到处加@CrossOrigin; - 配置项一律用占位符,交付前把真实数据库密码、内网 IP、域名全部替换掉。
七、四步启动
# 1. 建库建表mysql-uroot-p<BackEnd/sql/schema.sql# 2. 改配置(数据库账号密码、JWT 密钥、IP 白名单均为占位符)vimBackEnd/src/main/resources/application.yaml# 3. 启动后端cdBackEnd&&mvn spring-boot:run# 4. 启动前端cdFrontEnd&&npminstall&&npmrun dev启动后访问 Knife4j 的接口文档地址,即可看到全部接口。
八、常见坑(踩过才知道)
application.yaml里的 IP 白名单:不少模板会留一个内网地址,换机器直接连不上数据库。- Redis 没启动:Spring Boot 启动时不会报错,但登录接口会 500。建议把 Redis 依赖做成可降级。
- Knife4j 与 Spring Boot 3 版本不匹配:用 3.x 的 starter,别混用 2.x 配置。
- 签名图片上传路径:写相对路径,绝对路径换机器就废。
- 前端打包后 404:Vue Router 用 history 模式时,Nginx 要配
try_files。
九、源码获取
这套系统的完整前后端源码(含schema.sql、Knife4j 接口文档、脱敏后的配置文件)已整理成可直接运行的项目包,需要的同学可以到这里下载:
资源地址:点此下载(0 积分,登录即可)
资源特点:0 积分下载、源码已做凭据脱敏、含建表脚本、可直接作为毕业设计基础版本二次开发。
十、小结
学生管理系统不难,但做到「能跑、能讲、能改」,需要三样东西:约束落库的数据库设计、可解释的鉴权方案、以及一份能交付的启动文档。
如果你的毕设还卡在「跑不起来」这一步,先把建表脚本和配置占位补齐,比继续堆功能有用得多。