Spring Boot+微信小程序考勤系统源码解析与工程化部署
发布时间:2026/10/26 16:57:37 锦皓数字建站

简介这是一套面向本科毕业设计的Java上课考勤系统完整源码包基于Spring Boot开发涵盖小程序前端、后台管理、GPS签到与定位打卡、迟到统计等核心模块适合Java学习者、毕业设计选题者及小程序开发者参考。压缩包共488个文件4.3MB主要包含JavaScript、JSON、WXML、WXSS等小程序前端文件约350余个以及Java后端源码51个、SQL数据库脚本、Dockerfile、Maven相关配置与系统操作文档结构清晰便于按需查阅。目前已有944人学习下载。资源附有详细系统操作文档并包含启动脚本、配置文件、前端页面资源等可帮助读者快速理解考勤业务闭环参考其后台管理、定位打卡和统计报表的实现思路亦可作为毕业设计文档撰写与答辩展示的支撑材料。1. 上课考勤系统源码这不是一个普通的毕设而是一套能跑的工程第一次见到这份名为java开发项目本科毕业设计小程序上课考勤系统源代码.zip的资源时我以为是又一份仓库里堆了三年的教学代码。解压之后才发现它是一个可以直接跑起来交付的完整工程Spring Boot 后端、微信小程序前端、Dockerfile、mvnw 包装器、系统操作文档.docx 一应俱全。它解决的问题很具体——上课考勤的 GPS 签到、定位打卡和迟到统计不是抽象的考勤模块而是把二维码、定位、后台管理串成一条链路的完整业务闭环。适合两类人一类是正在做毕业设计、需要一套能讲清架构又能演示运行的学生另一类是公司里急着交付一个轻量考勤小程序的开发想直接拿可复现的工程做底子而不是从空项目开始搭。后面几章我把导入数据库、启动后端、调通小程序定位这条链路完整拆给你看坑也一并标出来。2. 工程结构和技术选型看懂 Spring Boot 与小程序之间的分工2.1 从 zip 解压到文件清单哪些文件是启动必需的下载下来的 zip 解压后根目录里一堆文件初看有点杂其实分成三类。第一类是启动与构建脚本winStart.bat和mvnw.cmd是 Windows 下的启动入口maven-wrapper.jar配合mvnw使用保证本机没有 Maven 也能按固定版本拉依赖第二类是容器与文档Dockerfile提供了后端镜像构建能力系统操作文档.docx是整个工程的操作手册第三类是前后端代码app.css是小程序端的全局样式simple-total.html和publish-sign.html这类静态文件通常是管理端或说明页面的辅助页面。后端的主逻辑并不会散落在根目录Spring Boot 工程的标准布局是src/main/java和src/main/resources。第一次打开的人容易犯的错是直接去根目录找application.yml其实它大概率在src/main/resources下。如果导入 IDE 后看到src目录没有变成源码目录说明没按 Maven 工程导入正确做法是在 IDEA 里选择pom.xml作为项目文件导入而不是直接 Open 文件夹。2.2 Spring Boot 小程序的职责边界为什么考勤逻辑要留在后端这套系统选择 Spring Boot 做后端、小程序做前端是典型的轻量前后端分离架构。GPS 签到这种操作如果放在小程序端直接写库任何人都能伪造签到请求所以后端必须承担两件事接收经纬度并落库、计算签到距离并判定是否在范围内。小程序端只负责调起微信定位接口拿坐标、展示考勤结果。后端的技术栈从依赖文件里能看到常规组合Spring Boot 作为 Web 容器MyBatis 或 MyBatis-Plus 做数据访问MySQL 5.7 做存储。这里需要注意环境约束项目正文明确写了jdk1.8和mysql5.7不要自作主张用 JDK 17 或 MySQL 8.0 跑大概率会遇到驱动兼容或sql_mode语法问题。2.3 数据库命名和排序规则utf8 与 utf8_general_ci 为什么不能乱动操作文档里有一条非常具体的指示导入mykq.sql时选择编码 utf8排序规则选utf8_general_ci。这条要求背后是实际项目踩过的坑。utf8_general_ci是 MySQL 5.7 时代的默认排序规则它对大部分中文场景足够如果选成utf8mb4_unicode_ci或者建库时没指定排序规则某些 SQL 语句在查询比对中文时行为会不同。更关键的是如果你本机 MySQL 默认字符集是 latin1直接source mykq.sql会导致所有中文变成乱码之后小程序显示的学生姓名、课程名全是一串问号。我一般会在命令行里用显式参数建库而不是靠 Navicat 的图形界面点选因为字符集这个选项在图形界面里藏得深容易漏。CREATE DATABASE IF NOT EXISTS mykq DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;这条语句先把数据库的字符集和排序规则钉死再导入 SQL 文件就不会出现建库和表结构字符集不一致的问题。执行完建库语句后用mysql -uroot -p --default-character-setutf8 mykq mykq.sql导入注意导入命令里也要带--default-character-setutf8否则命令行客户端默认字符集可能不是你想要的。3. 把工程跑起来从建库到小程序联调3.1 MySQL 导库的完整顺序先建库还是先导表这个工程导库顺序有讲究先建库再导表最后验证。上面已经讲了建库 SQL接下来是导入表结构和初始数据。项目给出的mykq.sql是完整备份类型包含建表语句和 INSERT 数据。导入后要做一个验证动作——查询出默认的管理员账号和签到记录因为它能同时证明数据库连接和表结构正确。USE mykq; SHOW TABLES; SELECT id, username, role FROM sys_user LIMIT 10;如果SHOW TABLES能看到至少 5 张表用户表、课程表、签到记录表等说明导库成功。sys_user这张表通常是后台管理员和教师账号所在role字段区分管理员与普通教师。如果这条查询报错Table mykq.sys_user doesnt exist说明你导入的 SQL 文件里建表语句没执行可能是文件编码问题导致 SQL 中断。3.2 后端启动winStart.bat 和 mvnw 的命令本质工程提供了winStart.bat作为一键启动入口但我不建议你双击就跑。先打开看一眼内容确认它执行的命令是mvnw spring-boot:run还是先编译后启动。mvnw.cmd是 Maven Wrapper 的 Windows 版本它会自动下载pom.xml里声明的 Maven 版本然后执行后续命令。这样做的好处是团队成员不必各自装 Maven缺点是首次执行会花几分钟下载 Maven 发行版。# 手动启动的话在工程根目录执行 mvnw.cmd clean package -DskipTests java -jar target/xxx-0.0.1-SNAPSHOT.jarclean package -DskipTests先把旧的编译产物清掉然后重新打包-DskipTests跳过单元测试节省时间。如果报错说找不到mvnw.cmd检查当前工作目录是不是工程根目录——mvnw.cmd必须和.mvn目录、pom.xml在同一层。启动成功后控制台出现Tomcat started on port(s): 8080再用浏览器访问http://localhost:8080看到登录页或接口文档这一步就算过了。3.3 配置小程序端本地开发环境的 URL 指向后端起了小程序端还需要改接口地址。微信开发者工具里打开小程序源码目录找到config.js或项目里的request.js把baseURL从正式的 HTTP 地址切换成http://localhost:8080。这里有一个微信开发者工具的老问题默认情况下开发者工具不允许访问 localhost需要在工具栏勾选不校验合法域名选项否则请求直接被拦。// request.js 中常见的配置 module.exports { baseURL: http://localhost:8080 // 本地联调时使用真机预览改为服务器 IP }baseURL决定所有 wx.request 的请求前缀。本地联调时填localhost只对开发工具有效手机真机预览时 localhost 指向手机自己要改成电脑的局域网 IP比如http://192.168.1.100:8080。这一步经常有人忽略结果真机点签到一直超时查半天发现是 baseURL 没改。3.4 登录与签到联调从获取 openid 到写入考勤记录小程序端的核心链路是登录-获取身份-签到。微信小程序通过wx.login获取 code后端拿 code 换 openid 并生成自定义 token。这个 token 在后续所有签到请求的 header 里携带。完整的关键步骤是开发者工具点登录 → 后端日志出现 openid 入参 → 数据库sys_user找到对应用户 → 前端进入签到页。签到页的核心动作是调用wx.getLocation获取经纬度然后请求签到接口后端根据课程设置的范围判定是否有效。判定逻辑在大章第 4 章单独展开这里先把链路跑通。如果联调时点击签到提示签到失败优先看后端控制台是否有 SQL 异常——最常见的错误是经纬度字段类型不匹配后端实体类是Double数据库字段是VARCHAR导致数据落库时隐式转换失败。4. 核心功能拆解GPS 签到的判定逻辑和迟到统计的边界4.1 经纬度采集到服务端用什么格式传才不会被精度坑小程序端wx.getLocation返回的经纬度是带小数的浮点数常规情况下精度到小数点后 6 位对应约 0.1 米的误差。传输时我建议统一用字符串格式比如31.230416,121.473701因为 JSON 序列化浮点数时很多框架默认保留 15 位有效数字传到后端容易出现意料之外的进位。在请求体里定义成一个结构清晰的 JSON 对象是常见做法{ courseId: 1001, studentId: 20240001, latitude: 31.230416, longitude: 121.473701 }后端接收时String 类型的纬度在服务端解析成 double 再做距离计算。避免直接用Double接收前端的经纬度是因为 iOS 的微信客户端在某些版本返回的坐标字符串会丢失精度String 接收最稳。4.2 距离判断的标准做法半正矢公式与阈值设置判断学生位置是否在教室范围内业界通用做法是用半正矢公式Haversine formula计算两点间球面距离再与课程设置的范围阈值对比。核心代码如下public double getDistance(double lat1, double lon1, double lat2, double lon2) { double radLat1 Math.toRadians(lat1); double radLat2 Math.toRadians(lat2); double a radLat1 - radLat2; double b Math.toRadians(lon1) - Math.toRadians(lon2); double s 2 * Math.asin(Math.sqrt( Math.pow(Math.sin(a / 2), 2) Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2) )); return s * 6371000; // 地球半径 6371km返回单位: 米 }这段代码里 6371000 是地球平均半径半正矢公式适合短距离几公里内计算精度够用。判断签到是否成功常见做法是拿这个距离和课程表中预设的有效签到半径比较。教学楼场景我一般建议 100-150 米太严学生稍微偏移一点就签不上太松学生在隔壁食堂也签上了。参数怎么调可以在课程管理后台加一个字段动态配置而不是写死在代码里。4.3 迟到统计的边界条件以签到时间为准还是课程开始时间为准迟到判定的逻辑看着简单其实边界坑很多。系统的通常做法是课程表里定义每节课的开始时间例如 08:00学生 GPS 签到后记录服务端收到请求的时间server_time将两者相减得到迟到时长。 工程常见的设计方式是把签到记录表里的create_time作为判定时间基准而不是小程序端点击的时间因为客户端时间可以被修改服务端时间不可控。 签到表里通常有两个字段sign_time客户端展示用和server_time实际判定用。 用服务端时间的另一个原因是为了防止学生把手机时间改早规避迟到。迟到统计还有一个 bug 高发区跨天课程。晚上 22:00 的课如果课程结束时间是 23:30sign_time和create_time都正常但如果统计逻辑用日期字符串比较而不是时间戳比较就会出现今天 23:00 的签到和昨天 22:00 的课程匹配不上的问题。通常的做法是课程 ID 与签到记录都存一个course_date字段按日期过滤后再用时间戳计算迟到分钟数。5. 避坑指南这份源码最常见的翻车现场5.1 中文乱码导库没问题页面显示却锟斤拷现象数据库导入没有报错但前端页面显示的学生姓名变成锟斤拷或鏄犲。 原因SQL 文件里的中文是按 utf8 编码存储的导入工具连接时用的却是系统默认字符集Windows 下很可能是 GBK导致存储层的编码被转坏。 解决重建数据库严格按照前面第三节的命令方式导入——建库时指定utf8_general_ci导入命令加上--default-character-setutf8。如果已经导入了两个办法一是删除库重新导二是ALTER TABLE xxx CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci修复现有表。5.2 GPS 定位偏差绿色箭头显示在隔壁楼现象学生明明坐在教室里签到时定位显示在 200 米外的另一栋楼。 原因微信的wx.getLocation默认协调在室内或高楼密集区精度会漂移这是 GPS 信号的物理特性不是代码问题。 解决签到判定逻辑需要引入容错逻辑——将基站辅助定位的结果与 GPS 结果做融合。常见做法是前端获取定位成功后同时传给后端accuracy精度值然后后端将这个值作为半径权重纳入距离判定。我一般把签到范围阈值和accuracy值合并判断比如实际判定距离 计算距离 - accuracy这样当精度为 65 米时教室限制 150 米学生即使漂移 80 米依然还在容忍区可有效降低误判率。5.3 Maven 依赖下载超时或 jar 包损坏现象执行mvnw.cmd clean package时卡在下载依赖或者报Process terminated和一个奇怪的 jar 包 hash 不匹配。 原因maven-wrapper.jar下载发行版和依赖的过程依赖中央仓库网络不稳导致 jar 包下载不完整也可能配置的镜像源不可达。 解决把本地 Maven 的settings.xml加阿里云镜像或者直接在工程根目录建.mvn目录下的maven.config文件。手动加镜像的操作是打开settings.xml在 mirrors 节点内加入阿里云中央仓库地址。加好后重新执行mvnw.cmd clean package -DskipTests这次 Maven 会优先从内网镜像拉取速度会有明显提升。5.4 前端请求失败并提示域名不合法现象开发者工具里点登录/签到Network 面板直接红标报url not in domain list。 原因微信小程序的合法域名校验是默认打开的localhost不在正式域名白名单内。 解决打开微信开发者工具的详情 - 本地设置勾选不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书这是本地开发阶段最快的方式。注意这个选项只对开发工具有效预览版真机扫码测试时需要在小程序管理后台把服务器地址加进 request 合法域名。5.5 端口被占用导致后端启动失败现象控制台报Port 8080 was already in use紧接着 Spring Boot 进程退出。 原因机器上其他应用占用了 8080 端口。微信开发者工具内置的调试服务偶尔也会占用。 解决两个方案任选——找到占用进程结束它或者在application.yml里改server.port。如果改了端口小程序端的baseURL记得同步改不然前端连不上。我自己的习惯是本地开发固定用 8081 做考勤后端能避开大部分冲突。6. 把毕设扩展成可交付的工程一个能落地的二次开发方案比起直接交源码更值钱的是给它加上一层产品化能力。如果你要把这个系统部署到真实的服务器上而不是停留在本地演示我建议做三件事数据库初始化脚本化、后端接口增加签名校验、小程序端增加自动签到兜底逻辑。数据库初始化脚本化是指不再手动source mykq.sql而是把建库、建表、初始化账号写成 SQL 文件交给 Spring Boot 的spring.sql.init机制自动执行。在application.yml里加这样一段spring: sql: init: mode: always schema-locations: classpath:db/schema.sql style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。