简介:一份基于SpringBoot的学生成绩管理系统毕业设计资料,面向JavaWeb开发者、高校相关专业学生及毕业设计选题者,系统围绕管理员、教师、学生三类角色展开,覆盖院系管理、考试成绩登记、信息维护、成绩查询、班级通讯录等核心功能,适合用于课程设计、毕业设计或技术学习参考。压缩包内为1个docx格式的完整毕业设计报告,大小1.14MB,正文完整呈现绪论、系统分析、概要设计、系统设计与实现、系统测试等章节,从可行性分析、需求分析,到数据库概念模型与表结构设计,再到管理员端、教师端、学生端各功能模块实现,最后给出单元测试与集成测试说明,可系统了解SpringBoot+MySQL+JavaWeb项目的开发全流程。目前已有8554人学习浏览,实用性强,读者可参考其中角色权限划分、教务管理业务逻辑及测试方案,快速梳理自身项目的设计思路,适合作为毕业设计模板或项目开发前的需求分析参照。
1. 学生成绩管理系统,为什么说难点从来不在增删改查
学期末,某高校的教务老师处理三百多人的成绩单,Excel 里 VLOOKUP、格式刷、手工核对轮着来,稍不留神就把两个学生的分数串了行。这种场景下,基于 SpringBoot 的学生成绩管理系统才真正有了意义——它不只是一道增删改查的练习题,而是把「录入 → 审核 → 查询 → 统计」这条链路拆成清晰的角色边界和数据规范。这个标题覆盖了最典型的课设与内部工具需求:SpringBoot 搭后端,MySQL 存数据,教师录成绩、学生查成绩、管理员管课程和用户。适合正在做课设或毕设的在校生,也适合需要给小团队快速交付一个内部成绩工具的一线开发者。读完你会得到一套能直接复现的骨架,以及网上 demo 里很少讲清楚的几个坑。
2. 技术选型与骨架搭建:SpringBoot + MyBatis-Plus 为什么是稳妥组合
2.1 选型对比:从 SSH 到微服务的取舍
早期课设里常见的 SSH(Struts + Spring + Hibernate)和 SSM(Spring + SpringMVC + MyBatis)并没有消失,但新项目里我基本不会选它们。原因很直接:XML 配置太碎,一个数据源要写四五处,action 和 controller 的跳转逻辑绕来绕去,学生做课设时大量时间耗在配置上而不是业务上。微服务那套更不适合——一个成绩管理系统拆成四个服务,光 service 间调用和注册中心就够喝一壶,何况大多数场景就是单机部署、几十人并发。
SpringBoot 的优势在于自动配置和内嵌 Tomcat。一个 jar 包直接跑,不用装外部容器,数据源、MyBatis、Jackson 这些组件通过 starter 统一管理,配置集中在 application.yml 里,出问题一眼能看到。MyBatis-Plus 在 MyBatis 基础上把单表 CRUD 和分页做成了开箱即用,不需要给每张表写一套 XML mapper,这对课设和内部工具的效率提升很明显。
版本选择上有一个实际约束:学校机房或老服务器的 JDK 版本。如果确认环境是 JDK 8,就用 SpringBoot 2.7.x;如果全新环境能装 JDK 17,再考虑 SpringBoot 3.x。不要为了新版本强行上 3.x,否则部署时才发现目标机器 JDK 不匹配,返工成本很高。
| 方案 | JDK 要求 | 配置复杂度 | 适合场景 |
|---|---|---|---|
| SpringBoot 2.7.x + MyBatis-Plus 3.5.x | JDK 8 及以上 | 低 | 课设、公司内部小工具、老服务器部署 |
| SpringBoot 3.x + MyBatis-Plus 3.5.x | JDK 17 及以上 | 低 | 全新环境、想用 Jakarta EE 新特性 |
| SSM 传统组合 | JDK 8 | 高 | 维护老项目,新项目不建议 |
| 微服务拆分 | JDK 8/17 | 高 | 多团队协作、需独立扩展的大系统 |
2.2 最小可运行骨架:pom.xml 与 application.yml
我一般直接用 Maven 工程,不依赖 IDE 的向导。先建一个空的 Maven 项目,然后写 pom.xml。父工程用 spring-boot-starter-parent 可以统一管理依赖版本,省去逐个指定版本号的麻烦。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>mysql-connector-j 是 MySQL 8 之后的坐标名,如果数据库是 MySQL 5.7,需要换成 mysql-connector-java。Lombok 用来减少 getter/setter 样板代码,但要注意 IDE 里必须装 Lombok 插件,否则编译直接报符号找不到。
application.yml 是整套配置的核心,数据源、MyBatis-Plus、日志都在这里。第一次跑通时配置越简单越好,只保留必要项:
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/score_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0serverTimezone 必须显式指定,否则 MySQL 8 默认时区跟 JVM 不一致,查询时间字段会偏移 8 小时甚至直接报错。logic-delete 配置开启逻辑删除,后面设计用户表时加一个 deleted 字段,删除操作自动变成 UPDATE,避免误删成绩数据后找不回来。
入口类放在项目根包下,只做两件事:标注 SpringBootApplication 和扫描 Mapper 接口。MyBatis-Plus 的 Mapper 都是接口,不写 XML,必须让容器知道去哪里扫描。
@SpringBootApplication @MapperScan("com.example.score.mapper") public class ScoreApplication { public static void main(String[] args) { SpringApplication.run(ScoreApplication.class, args); } }@MapperScan 的包路径要和实际 mapper 包一致,这个写错了启动会报 mapper bean 找不到。跑起来之后先不要急着写页面,用一个最简单的接口验证链路:建一张测试表,写一个 controller 返回一行数据,能通就说明数据源、MyBatis-Plus、Web 三层都正常了。这个步骤看起来基础,但能过滤掉大量环境问题,后面写业务时不会排查到深夜。
3. 数据模型与权限设计:五张核心表和三个角色的边界
3.1 五张表的结构与关键约束
成绩管理系统的核心是成绩数据,但成绩不是孤立存在的,它关联学生、课程、教师,而这三类人又都需要登录账号。网上很多 demo 图省事,把用户名密码直接写进学生表和教师表,结果就是改密码要动业务表,删除学生还要考虑账号残留。我习惯把账号体系单独拆出来,做成 sys_user 表,业务表和它通过 ref_id 关联,职责清晰,答辩时也好讲。
表结构直接用 MySQL 8 的 SQL 建。注意字符集和排序规则统一用 utf8mb4,否则中文和一些特殊符号会乱码。
CREATE TABLE sys_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role VARCHAR(20) NOT NULL, ref_id BIGINT, deleted TINYINT DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE student ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_no VARCHAR(20) NOT NULL UNIQUE, student_name VARCHAR(50) NOT NULL, class_name VARCHAR(50), grade_year VARCHAR(10) ); CREATE TABLE teacher ( id BIGINT PRIMARY KEY AUTO_INCREMENT, teacher_no VARCHAR(20) NOT NULL UNIQUE, teacher_name VARCHAR(50) NOT NULL, title VARCHAR(30) ); CREATE TABLE course ( id BIGINT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(100) NOT NULL, course_code VARCHAR(30) NOT NULL UNIQUE, credit DECIMAL(3,1) DEFAULT 2.0, teacher_id BIGINT ); CREATE TABLE score ( id BIGINT PRIMARY KEY AUTO_INCREMENT, student_id BIGINT NOT NULL, course_id BIGINT NOT NULL, semester VARCHAR(20) NOT NULL, score DECIMAL(5,2), status TINYINT NOT NULL DEFAULT 0, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_student_course_semester (student_id, course_id, semester) );score 表的唯一键 uk_student_course_semester 是整个防重复设计的核心,它从数据库层面保证同一个学生同一门课同一个学期只能有一条成绩记录。很多项目只在代码里先 SELECT 再 INSERT,并发或者老师手滑点两次提交时照样插进去重复数据。唯一键约束是最后一道闸,INSERT 时如果有重复会抛 DuplicateKeyException,代码里捕获处理即可。
semester 字段用字符串存,格式建议统一成「2024-2025-1」这样的规则,跨学年查询时用 LIKE 或者前缀匹配都很方便。成绩用 DECIMAL(5,2) 而不是 FLOAT 或 DOUBLE,原因很实际:浮点数存 85.5 可能变成 85.499999,查询展示时还得再格式化。DECIMAL 是定点数,存进去是什么查出来就是什么,Java 侧配合 BigDecimal 接收,不会出精度幺蛾子。
course 表里的 teacher_id 是外键逻辑关联,不建物理外键。理由也简单:物理外键在删除和更新时约束链太长,老师调走时改一条记录可能要连带处理外键冲突,而逻辑关联通过 SQL JOIN 就能拿到完整数据,性能影响可以忽略。
3.2 登录认证与权限控制:不用 Spring Security 的做法
成绩系统天然有三种角色:管理员、教师、学生。管理员管课程和账号,教师录成绩和看统计,学生只能查自己的成绩。权限设计如果搞不好,最典型的翻车就是学生拿接口文档直接调 URL 看全班成绩。
Spring Security 功能强大,但过滤器链、UserDetailsService、SecurityContext 这些概念对课设来说是个黑匣子,配置稍微错一点整个应用起不来,排查成本高。我一般用 HandlerInterceptor 加自定义注解做角色权限,代码量不到五十行,逻辑透明,答辩时能讲清楚每一步在做
本文还有配套的精品资源,点击获取