ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

SpringBoot学生考勤管理系统源码实战:从环境搭建到二次开发

SpringBoot学生考勤管理系统源码实战:从环境搭建到二次开发 简介这是一套面向计算机专业毕业设计场景的学生考勤管理系统完整源码包采用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连接串末尾加上serverTimezoneAsia/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?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 你的密码参数说明useUnicodetruecharacterEncodingutf8保证中文不乱码serverTimezoneAsia/Shanghai解决时区问题useSSLfalse关掉 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 用一段真实链路看懂增删改查以「新增考勤记录」为例前端提交表单后请求打到AttendanceControllerPostMapping(/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 idsave parameterTypecom.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); ListAttendanceRecord list attendanceService.findByCondition(studentName); PageInfoAttendanceRecord pageInfo new PageInfo(list); return Result.success(pageInfo); }参数说明pageNum当前页码pageSize每页条数studentName是可选筛选条件。PageHelper.startPage()必须紧挨着查询语句写中间不能插别的数据库操作否则分页会作用到错误的查询上这是 PageHelper 最经典的坑。PageInfo会自动算出总条数、总页数、是否有下一页前端直接拿这些字段渲染分页组件就行。4. 避坑排查启动报错、乱码、登录失败的常见原因4.1 启动报Table xxx doesnt exist现象项目能启动但一访问接口就报表不存在。原因数据库脚本没导入完整或者导入到了错误的库里。解决进 MySQL 执行SHOW TABLES确认表在不在不在就重新source导入如果表在但还是报错检查application.yml里的库名和实际建库名是否一致大小写也要对Linux 下 MySQL 默认区分库名大小写。4.2 页面中文全是问号现象学生姓名、班级名称显示成???。原因数据库、表、连接串三处字符集不统一。解决先确认建库时用了utf8mb4再检查表的字符集SHOW CREATE TABLE student最后看连接串有没有characterEncodingutf8。三处都对了还乱码就是 IDEA 控制台编码问题在Help → Edit Custom VM Options里加-Dfile.encodingUTF-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 8080Windows找到占用进程 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_recordstudent_id改成reader_id。第二改 Entity 类的字段名和 getter/setterIDEA 里用ShiftF6重命名最省事。第三改 Mapper XML 里的 SQL 语句和 Controller 的 URL 映射。三层改完业务逻辑就换了个皮底层增删改查和分页逻辑完全复用。5.2 加一个导出 Excel 的功能考勤数据最终要交给辅导员导出 Excel 是刚需。项目里如果没带这个功能自己加一个也不难。引入 EasyExcel 依赖dependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version3.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;filenameattendance.xlsx); // 查出全部数据写入 Excel ListAttendanceRecord 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 传参错」两类问题分开定位省掉大量瞎猜的时间。从那以后我每次拿到一份新源码都强制先跑通登录页再动任何代码因为登录能通说明数据库、连接串、启动类这三条命脉全对了后面再出问题一定是业务代码层面的排查范围直接缩小一半。希望这份拆解能帮你少走点弯路。本文还有配套的精品资源点击获取
返回列表