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 传参错」两类问题分开定位省掉大量瞎猜的时间。从那以后我每次拿到一份新源码都强制先跑通登录页再动任何代码因为登录能通说明数据库、连接串、启动类这三条命脉全对了后面再出问题一定是业务代码层面的排查范围直接缩小一半。希望这份拆解能帮你少走点弯路。本文还有配套的精品资源点击获取

相关新闻

电源芯片替代的系统化选型方法论

电源芯片替代的系统化选型方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:56:47 阅读更多 →
react-big-calendar 拖拽与缩放插件(Drag and Drop Addon)完整使用指南

react-big-calendar 拖拽与缩放插件(Drag and Drop Addon)完整使用指南

前端UI组件 【免费下载链接】react-big-calendar gcal/outlook like calendar component 项目地址: https://gitcode.com/gh_mirrors/re/react-big-calendar 点击查看 免费下载 本指南以 react-big-calendar 仓库中的 Addons 文档为核心,系统讲解其唯一…

2026/9/25 1:56:47 阅读更多 →
JSP学生管理系统部署实战:环境配置、避坑指南与二次开发

JSP学生管理系统部署实战:环境配置、避坑指南与二次开发

简介:基于JSPMySQL的学生信息管理系统源码包,面向Java Web初学者及需要完成课程设计的在校生,可帮助理解角色权限、成绩管理和数据库交互等常见业务实现。系统覆盖学生、教师、管理员三种角色:学生能维护个人资料并按条件查询成绩…

2026/9/25 1:56:47 阅读更多 →

最新新闻

PaddleSeg PP-HumanSeg-Lite(ConnectNet)实时人像分割模型完全指南

PaddleSeg PP-HumanSeg-Lite(ConnectNet)实时人像分割模型完全指南

人工智能计算机视觉预训练 【免费下载链接】PaddleSeg Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting,…

2026/9/25 2:35:10 阅读更多 →
Databasus 后端开发工作流:从 .env 配置、make 运行测试,到 goose 迁移与 Swagger 文档

Databasus 后端开发工作流:从 .env 配置、make 运行测试,到 goose 迁移与 Swagger 文档

数据库灾备 【免费下载链接】databasus PostgreSQL backup tool with Point-In-Time-Recovery and restore verification 项目地址: https://gitcode.com/gh_mirrors/po/databasus 点击查看 免费下载 本篇以 backend/README.md 为主线,讲解 Databasus 后…

2026/9/25 2:35:10 阅读更多 →
PaddleSpeech audiotools 工具箱全解析:AudioSignal 音频信号处理、数据增强与模型训练一站式指南

PaddleSpeech audiotools 工具箱全解析:AudioSignal 音频信号处理、数据增强与模型训练一站式指南

人工智能语音音频NLP媒体生成 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation …

2026/9/25 2:35:10 阅读更多 →
使用 PaddleSpeech 将 CC-CEDICT 中英词典解析为 JSON 格式的完整指南

使用 PaddleSpeech 将 CC-CEDICT 中英词典解析为 JSON 格式的完整指南

人工智能语音音频NLP媒体生成 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation …

2026/9/25 2:35:10 阅读更多 →
SSM 图书管理系统

SSM 图书管理系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论🔥🔥&am…

2026/9/25 2:35:10 阅读更多 →
PHP微信支付v3迁移实战:从签名体系到回调解密全解析

PHP微信支付v3迁移实战:从签名体系到回调解密全解析

简介:一套基于PHP微信支付V3的完整接入实例,面向需要为商城、小程序或线下收银场景快速集成微信支付的PHP开发者,重点解决统一下单、回调验签、证书配置、订单查询与退款申请等实际开发难点。压缩包共16个文件,体积仅61KB&#xf…

2026/9/25 2:34:10 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →