☰
SpringBoot学生考勤管理系统源码实战:从环境搭建到二次开发
2026/9/25 1:56:40 网站建设 项目流程

简介:这是一套面向计算机专业毕业设计场景的学生考勤管理系统完整源码包,采用Java语言与SpringBoot框架开发,后端基于JDK1.8、Tomcat7与MySQL5.7,前端使用Vue构建,适合正在准备毕设或需要SpringBoot实战项目的学生与开发者参考。系统覆盖登录注册、学生与教师管理、班级与课程信息管理、签到与考勤信息管理、请假信息管理以及考勤统计等核心模块,管理员可在后台完成各项数据的增删改查操作,业务逻辑较为完整。压缩包共426个文件,约9.31MB,其中107个Java源文件承载后端业务逻辑,43个Vue组件负责前端页面交互,另有大量svg图标、jpg与png图片资源、xml与yml配置文件、js脚本及sql数据库脚本,并附带bat启动脚本与mvnw构建工具,目录结构清晰,便于快速导入IDEA或Eclipse运行调试。目前已有694人学习下载,可作为毕设选题参考、课程设计模板或SpringBoot入门练手项目,帮助读者理解前后端分离架构下的考勤类系统实现思路。

1. 从一份能跑通的考勤系统源码说起:它到底解决了谁的燃眉之急

如果你正在做计算机毕业设计,或者需要一套能直接跑起来的 SpringBoot 管理系统来交差、二次开发、练手,那这份「基于 SpringBoot 开发的学生考勤管理系统(源码+数据库)」大概率能省掉你从零搭架子的一两周。它不是一个只放几张截图的空壳,而是带完整数据库脚本、能导入 IDE 直接启动的后端项目。核心场景很明确:老师点名、学生签到、辅导员查考勤记录、管理员维护班级和学生信息。适合三类人——赶毕业设计进度的同学、想拿一个真实业务练 SpringBoot 增删改查的初学者、以及需要快速搭管理后台原型的开发者。下面我按「拿到手怎么跑 → 代码怎么读 → 坑在哪 → 怎么改成自己的」这条线拆一遍。

2. 环境准备与数据库导入:把项目从压缩包跑到登录页

2.1 先确认技术栈和依赖版本,别急着点运行

拿到源码包,第一件事不是双击 IDEA 打开,而是先看pom.xml。SpringBoot 项目翻车最常见的原因就是 JDK 版本和 SpringBoot 版本对不上。这份项目属于典型的 SpringBoot 2.x 结构,配套 JDK 8 最稳。如果你本机装的是 JDK 17 或 21,启动时大概率报java.lang.UnsupportedClassVersionError或者 MyBatis 相关的反射异常。常见做法是装一个 JDK 8 单独给这个项目用,IDEA 里在File → Project Structure → SDK指定,不要动系统全局的 JAVA_HOME。

数据库用的是 MySQL,版本 5.7 或 8.0 都能跑,但要注意 8.0 的驱动类名和连接串参数跟 5.7 不一样。源码里如果写的是com.mysql.jdbc.Driver,在 8.0 驱动下会提示过时,改成com.mysql.cj.jdbc.Driver,连接串末尾加上serverTimezone=Asia/Shanghai,否则时间字段会差 8 小时,考勤时间全乱。

2.2 建库、导数据、改连接串,三步不能省

数据库脚本一般在src/main/resources/sql或者项目根目录的db文件夹里,文件名类似attendance.sql。导入方式我一般用命令行,比 Navicat 图形界面更可控,出错信息也看得清。

# 登录 MySQL,注意 -p 后面不要跟空格再跟密码,回车后输入 mysql -u root -p # 创建数据库,字符集必须用 utf8mb4,否则学生姓名里的生僻字会变问号 CREATE DATABASE attendance_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 退出后用 source 导入脚本,路径换成你本机的实际路径 exit mysql -u root -p attendance_db < /path/to/attendance.sql

导入完成后进库检查一下表数量和关键表结构:

USE attendance_db; SHOW TABLES; -- 正常应该有 student、teacher、class、attendance_record、user 这几张核心表 SELECT COUNT(*) FROM student; -- 如果返回 0,说明脚本里只有建表没有插数据,需要自己补测试数据

逻辑说明:先建库再导脚本,顺序反了会报「Unknown database」。字符集选 utf8mb4 而不是 utf8,是因为 MySQL 的 utf8 实际只支持 3 字节,emoji 和部分生僻汉字存不进去。参数上,attendance_db是库名,你可以改成任何名字,但改完必须同步改application.yml里的连接串。

2.3 改配置文件,把连接串指向你自己的库

打开src/main/resources/application.yml(有的是application.properties),找到spring.datasource这一段:

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/attendance_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: 你的密码

参数说明:useUnicode=true&characterEncoding=utf8保证中文不乱码;serverTimezone=Asia/Shanghai解决时区问题;useSSL=false关掉 SSL 警告,本地开发不需要。改完这三处,在 IDEA 里找到主启动类(带@SpringBootApplication注解的那个),右键 Run。控制台看到Started XxxApplication in x.xx seconds就算起来了,浏览器访问http://localhost:8080,默认账号密码一般在 SQL 脚本的user表里,或者项目 README 里写着,通常是admin/123456这类。

3. 代码结构拆解:Controller、Service、Mapper 三层怎么读

3.1 先看包结构,定位核心业务模块

SpringBoot 项目的包结构基本是固定的:controller层接请求,service层写业务逻辑,mapper(或dao)层操作数据库,entity放实体类。这份考勤系统的核心业务模块通常有四个:学生管理、班级管理、考勤记录、用户登录。你打开controller包,看到StudentController、AttendanceController这些类名,就对应上了。

读代码的顺序我建议从 Controller 倒着往 Mapper 读。因为 Controller 里的方法名和 URL 映射最直观,比如@GetMapping("/student/list")一看就知道是查学生列表。顺着它调用的 Service 方法往下追,就能理清一条完整的请求链路。这种读法比从 Entity 开始正着读效率高得多,尤其适合接手别人写的项目。

3.2 用一段真实链路看懂增删改查

以「新增考勤记录」为例,前端提交表单后,请求打到AttendanceController:

@PostMapping("/attendance/add") @ResponseBody public Result addAttendance(@RequestBody AttendanceRecord record) { // 补全创建时间,避免前端不传导致数据库报错 record.setCreateTime(new Date()); // 调用 service 层,返回影响行数 int rows = attendanceService.save(record); return rows > 0 ? Result.success() : Result.error("添加失败"); }

逻辑说明:@RequestBody表示前端传的是 JSON,不是表单参数,这两种传参方式混用是新手常犯的错,前端Content-Type必须设成application/json。Result是项目自定义的统一返回体,一般包含code、msg、data三个字段。参数上,AttendanceRecord实体类的字段名必须和前端 JSON 的 key 完全一致,大小写敏感,studentId和studentid在部分框架配置下会被当成两个字段。

Service 层通常只是转发,真正的 SQL 在 Mapper 的 XML 文件里:

<insert id="save" parameterType="com.example.entity.AttendanceRecord"> INSERT INTO attendance_record (student_id, course_id, status, create_time) VALUES (#{studentId}, #{courseId}, #{status}, #{createTime}) </insert>

#{}是预编译占位符,能防 SQL 注入;${}是字符串拼接,除非做动态表名或排序字段,否则不要用。parameterType写全限定类名,写错会报ClassNotFoundException。status字段一般用 0/1/2 表示出勤、迟到、缺勤,具体含义去 Entity 类的注释里找,或者看 SQL 脚本里的字段注释。

3.3 分页查询和条件筛选怎么调

考勤记录多了必须分页,项目里一般用 PageHelper 插件。看AttendanceController里有没有类似这样的方法:

@GetMapping("/attendance/page") public Result page(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, String studentName) { PageHelper.startPage(pageNum, pageSize); List<AttendanceRecord> list = attendanceService.findByCondition(studentName); PageInfo<AttendanceRecord> pageInfo = new PageInfo<>(list); return Result.success(pageInfo); }

参数说明:pageNum当前页码,pageSize每页条数,studentName是可选筛选条件。PageHelper.startPage()必须紧挨着查询语句写,中间不能插别的数据库操作,否则分页会作用到错误的查询上,这是 PageHelper 最经典的坑。PageInfo会自动算出总条数、总页数、是否有下一页,前端直接拿这些字段渲染分页组件就行。

4. 避坑排查:启动报错、乱码、登录失败的常见原因

4.1 启动报Table 'xxx' doesn't exist

现象:项目能启动,但一访问接口就报表不存在。原因:数据库脚本没导入完整,或者导入到了错误的库里。解决:进 MySQL 执行SHOW TABLES确认表在不在,不在就重新source导入;如果表在但还是报错,检查application.yml里的库名和实际建库名是否一致,大小写也要对,Linux 下 MySQL 默认区分库名大小写。

4.2 页面中文全是问号

现象:学生姓名、班级名称显示成???。原因:数据库、表、连接串三处字符集不统一。解决:先确认建库时用了utf8mb4,再检查表的字符集SHOW CREATE TABLE student,最后看连接串有没有characterEncoding=utf8。三处都对了还乱码,就是 IDEA 控制台编码问题,在Help → Edit Custom VM Options里加-Dfile.encoding=UTF-8重启。

4.3 登录一直提示密码错误

现象:账号密码明明对着 SQL 脚本抄的,就是登不进去。原因:密码在数据库里存的是 MD5 或 BCrypt 加密后的值,你看到的可能是明文注释。解决:看登录逻辑里用的什么加密方式,如果是 MD5,把123456的 MD5 值e10adc3949ba59abbe56e057f20f883e直接更新到数据库;如果是 BCrypt,每次加密结果不同,需要用项目里的注册接口重新生成,或者临时把校验逻辑改成明文比对(仅本地调试用,别提交)。

4.4 端口 8080 被占用

现象:启动报Port 8080 was already in use。原因:本机有其他程序占了 8080,常见的是另一个 SpringBoot 项目或者 Tomcat。解决:改application.yml里的server.port,换成 8081 或 9090;或者用netstat -ano | findstr 8080(Windows)找到占用进程 PID,任务管理器里结束掉。

4.5 前端页面 404 但接口能通

现象:访问http://localhost:8080白屏或 404,但直接访问/student/list能返回 JSON。原因:静态资源没放对位置,或者项目是前后端分离的,前端单独跑在另一个端口。解决:确认src/main/resources/static下有没有index.html;如果是前后端分离,前端项目要单独npm run serve,并且改前端请求的 baseURL 指向后端端口,跨域问题在后端加@CrossOrigin注解或配置全局 CORS。

5. 二次开发技巧:把考勤系统改成你自己的业务

5.1 换业务模块的最快路径

想把这套系统改成「图书管理系统」或「宿舍管理系统」,不用重写架构,改三个地方就行。第一,改数据库表名和字段,比如attendance_record改成borrow_record,student_id改成reader_id。第二,改 Entity 类的字段名和 getter/setter,IDEA 里用Shift+F6重命名最省事。第三,改 Mapper XML 里的 SQL 语句和 Controller 的 URL 映射。三层改完,业务逻辑就换了个皮,底层增删改查和分页逻辑完全复用。

5.2 加一个导出 Excel 的功能

考勤数据最终要交给辅导员,导出 Excel 是刚需。项目里如果没带这个功能,自己加一个也不难。引入 EasyExcel 依赖:

<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency>

然后在 Controller 里加导出接口:

@GetMapping("/attendance/export") public void export(HttpServletResponse response) throws IOException { // 设置响应头,告诉浏览器这是下载文件 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-Disposition", "attachment;filename=attendance.xlsx"); // 查出全部数据,写入 Excel List<AttendanceRecord> list = attendanceService.findAll(); EasyExcel.write(response.getOutputStream(), AttendanceRecord.class).sheet("考勤记录").doWrite(list); }

参数说明:Content-Disposition里的filename如果带中文,要做 URL 编码,否则部分浏览器下载下来文件名是乱码。AttendanceRecord类上要用@ExcelProperty("学生姓名")注解标好每列的表头,EasyExcel 会按注解顺序生成列。数据量超过几万条时,别一次性findAll,用分页查出来分批写,避免内存溢出。

5.3 验证改动是否生效的检查清单

改完代码别急着说「好了」,按这个顺序过一遍:先看控制台有没有报错,再看数据库里数据有没有真的变了,然后刷新前端页面看展示对不对,最后用不同角色账号登录一遍,确认权限没串。我自己的习惯是每次改完 Mapper XML,先在 MySQL 客户端里把 SQL 粘进去跑一遍,确认语法和结果都对,再放回项目里启动。这样能把「SQL 写错」和「Java 传参错」两类问题分开定位,省掉大量瞎猜的时间。

从那以后我每次拿到一份新源码,都强制先跑通登录页再动任何代码,因为登录能通说明数据库、连接串、启动类这三条命脉全对了,后面再出问题一定是业务代码层面的,排查范围直接缩小一半。希望这份拆解能帮你少走点弯路。

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

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

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

立即咨询