尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SpringBoot+小程序搭建午托晚托服务平台:毕设选题与技术实现全解析

SpringBoot+小程序搭建午托晚托服务平台:毕设选题与技术实现全解析 每年到毕业季我都能收到一堆私信“学长Java毕设选什么题好SpringBoot 的有吗小程序端的有没有现成源码”问的人多了我觉得有必要认真聊一个方向基于 SpringBoot 的午托晚托培训机构课后服务平台小程序。这个题目我前后看过不少同学在做自己也帮人排过不少坑。说实话第一次看到它的时候我觉得平平无奇但真正把业务拆开才发现它是管理系统类毕设里的“六边形战士”技术栈主流、业务场景清晰、角色划分天然、扩展空间大而且很容易讲清楚“为什么要做这件事”。这篇文章我就把这个项目从选题逻辑、技术架构、数据库设计、核心功能实现到答辩准备完整地拆给你看。1. 选题价值与业务背景1.1 为什么午托晚托这么适合当毕设先花两分钟讲清楚这个项目到底在解决什么问题。午托晚托机构可以简单理解成校门外那种“中午管饭、晚上管作业”的托管班现在很多还叠加了课后辅导、兴趣班、假期托管。这类机构的特点是学生多、班次多、老师流动性大家长对出勤和作业反馈极度敏感。传统的管理方式是微信群接龙、纸质签到表、月底手工算课时费问题非常突出。老师每天要统计谁到了谁没到家长隔三差五问“我家孩子今天作业完成了吗”机构负责人月底对账对到头疼。这个平台本质上就是把这些线下琐事搬上线家长用小程序看通知、查签到、交费用老师用小程序点名、发作业、写反馈管理员在后台管班级、排课、对账。这个业务模型对毕设来说有几个天然优势。第一角色权限非常清晰家长、教师、管理员三类的数据边界几乎不用刻意设计业务场景自己就帮你分好了。第二核心流程都是大家熟悉的不用你去调研复杂的行业知识随便找个托管班问两句就能把需求理明白。第三它的数据关系足够复杂学生、班级、课程、签到、缴费、作业反馈能撑起一张像样的数据库设计图这在答辩时非常加分。1.2 它和普通“管理系统”类毕设的区别很多人一听“后台管理系统”第一反应是老掉牙的“图书管理系统”“学生管理系统”做出来千篇一律答辩老师看一眼就没什么兴趣。午托晚托平台虽然本质上也属于管理系统但它有一个明显的差异化标签小程序端。现在的管理系统如果没有移动端说服力会弱很多。小程序意味着什么呢意味着你不是只做了一套后台 CRUD而是要考虑微信登录、手机端交互、网络请求封装、用户隐私授权这些真实场景。在答辩的时候你打开手机微信把小程序演示一遍比放十页 PPT 都有说服力。另外它的业务术语很“接地气”答辩老师不需要你解释太久就能get到你在做什么。你讲“午托晚托机构需要一个给学生签到、给家长推送反馈的平台”这句话本身就是一个完整的需求故事。很多毕设项目最大的问题就是“不知道做了什么”而这个项目天然自带一个完整的故事线。2. 技术栈选型与整体架构2.1 后端为什么是 SpringBoot MyBatis Plus后端选 SpringBoot 基本没什么悬念Java 毕设的主流选择生态成熟、资料多、遇到问题搜得到答案。不过 SpringBoot 版本这里要提醒一句不要一上来就追最新版。很多同学拿到源码或者自己新建项目时直接选了 SpringBoot 3.x结果发现 JDK 版本要 17很多老教程里的写法还不兼容。我的建议是老老实实用 SpringBoot 2.7.x JDK 8这套组合是当前海量教程和开源项目的主流通用配置你遇到的 90% 的问题都能直接搜到解决方案。等后面你有余力再去折腾 3.x 也不迟。ORM 层优先考虑 MyBatis Plus而不是 MyBatis 原生。原因很简单毕设项目的时间本来就紧MyBatis Plus 的单表 CRUD 几乎不用写 SQL自带分页插件代码生成器还能直接把实体类、Mapper、Service、Controller 一次性生成出来。你省下的时间可以用在理解业务、打磨小程序端、准备答辩上。数据层用 MySQL免费、普及率高、安装方便就够了不需要上什么复杂的数据库。2.2 小程序端用原生还是 uni-app小程序端是很多同学的纠结点。这里分两种情况说。如果你之前没有小程序开发经验我建议直接用微信小程序原生语法。原因是你不需要考虑跨平台只需要对付微信一个平台原生语法虽然啰嗦但它的逻辑最直白遇到问题在微信开发者社区里一搜就有答案。另外很多配套的组件库和完善示例都是原生的学习成本更低。如果你已经有 Vue 基础并且以后想兼顾 App 或其他小程序平台uni-app 会好一些。它的语法接近 Vue 2/Vue 3打包的时候可以同时输出微信小程序、H5 和 App。但这意味着你要多理解一层编译机制比如条件编译、平台差异处理这些对毕设来说属于额外负担。我个人倾向是毕设求稳就选原生。不要为了炫技术去引入一个自己并不熟悉的上层框架最后卡在编译问题上心态很容易崩。2.3 整体架构与目录规划项目建议拆成两个工程目录后端一个 SpringBoot 工程前端一个小程序工程有精力的同学再加一个 Web 管理后台。管理后台可以用 Vue 或者直接用 SpringBoot 自带的模板引擎做简单页面主要给机构管理员用。后端工程内部建议按这种方式分包controller 层接收前端请求service 层写业务逻辑mapper 层操作数据库entity 放实体类config 放配置类比如拦截器、跨域配置common 放统一返回结果和异常处理。这个结构本身没什么稀奇但胜在清晰答辩时你画架构图也好画老师问起来你也好答。接口设计上统一用/api/xxx前缀返回结构统一成{ code, message, data }。这个细节很多人忽略但非常关键。统一返回值意味着小程序端可以封装一个公共请求方法统一判断 code 是否成功不用每个接口都写一遍重复的错误处理逻辑。后面我会专门讲这个。3. 业务角色与功能模块拆解3.1 三类用户角色与核心场景这个系统的角色配置非常典型管理员、教师、家长学生。每个角色看到的页面和操作权限完全不同这是权限设计的出发点。管理员端主要负责基础数据配置。班级管理、课程排期、教师信息录入、学生报名、费用确认、全局数据看板。管理员是所有数据的最高权限方小程序端通常不做管理员页面管理功能更合适放在 Web 后台。教师端是日常使用频率最高的角色。老师每天到班第一件事就是打开小程序点名签到课后把学生的作业完成情况拍照上传并写一段评语还可以发布班级通知。老师不需要关心费用也不需要关心中间那些运营数据他只需要围绕“我带的班今天怎么样”来操作。家长端的需求最简单也最刚性。家长打开小程序能看到孩子的课时安排、每天的签到记录、老师留下的作业反馈、机构发布的通知以及待缴费用列表。这里要注意家长账号绑定孩子的逻辑非常关键一个家长可能有两个孩子在不同班级这直接决定后续所有查询的数据口径。3.2 功能模块清单与边界下面整理一份核心功能清单你可以直接对照着排查自己手上的源码是否完整。这些功能并不需要每一样都做得很深但每一样都得能讲明白。模块核心功能说明用户登录微信授权登录、手机号绑定、角色识别管理员账号初始化为手机号密码教师和家长走微信登录学生管理学生信息建档、报名班级、转班、退班学生的核心信息包括姓名、学校、年级、家长电话班级课程创建班级、配置课程时间、绑定授课老师要支持同一个学生报多个不同时段课程签到考勤教师按班级点名、学生状态标记可选功能签到时间窗口、补签、迟到标记作业反馈教师发布作业内容、上传图片、写评语家长在小程序端可直接查看历史反馈记录通知公告管理员或教师发布通知、家长端接收可结合微信订阅消息做提醒缴费管理费用项目创建、缴费记录、欠费标记一个学生名下有多个收费项目时需要分组展示数据看板今日出勤人数、班级人数统计、课时统计管理员后台展示即可不必做太复杂其中签到考勤和缴费管理是核心亮点模块答辩时建议重点演示。前者体现你对业务流程的理解后者能体现你对数据关联关系的处理能力。剩下的模块可以不用做成大而全够用就好。3.3 数据库表设计的关键思路数据库设计是这类项目最容易扣分的点也是最能体现功力的地方。这里我把核心表结构捋一遍。学生表student是最基础的数据字段建议包含id、name、grade、school_name、parent_name、parent_phone、status。如果同一个学生需要报多个课程就不要再往学生表里塞课程字段而是通过中间表或者课程表里的学生标识去关联否则后面想查“这个学生今天上什么课”会非常痛苦。课程表course字段建议包含id、course_name、teacher_id、classroom、start_time、end_time、day_of_week、capacity。day_of_week是周几最好存成整数 1 到 7不要存中文“周一”这种否则排序和查询都是噩梦。签到表sign_in是这个系统的核心表字段建议包含id、student_id、course_id、sign_date、status、sign_time、remark。注意这里要同时存student_id和course_id因为同一个学生一天可能在不同时间上有两节课签到记录要能区分是哪一门课的签到。sign_date直接存日期不要存带时分秒的完整时间否则按天统计的时候还要做时间格式化。缴费表payment字段建议包含id、student_id、fee_item、amount、pay_status、pay_time、operator_id。费用项比如“午托一月费”“晚托一月费”“春季兴趣班费”用一个fee_item字段区分即可不需要为每种费用建不同表。另外要重点说一个很多初学者会犯的错不要在数据库里直接存很多冗余字段来图省事。比如家长的角色在用户表里已经有了就不要又在学生表里重复存一堆家长信息。用外键逻辑关联就好不需要数据库物理外键但至少查询的角度要能通过student_id关联过去。ER 图画清楚答辩的时候老师一眼就能看出你的表设计有没有用心。4. 核心功能实现与避坑记录4.1 微信登录态与 Token 鉴权小程序登录不能直接拿数据库里的用户名密码微信小程序的登录流程是固定的三步。第一步小程序端调用wx.login()拿到一个临时code。第二步把code传给后端后端拿这个 code 去微信的接口换openid和session_key。第三步后端用openid去找对应用户找到就直接登录成功找不到可以自动注册一个账号然后签发一个自定义 Token 返回给小程序。这个 Token 建议用 JWT原因很简单无状态、方便拦截器验证、小程序端只需要在请求头里带上Authorization字段就行。签发的时候把userId、role放进去后续接口通过解析 Token 就能知道当前是谁在请求不用每次查数据库。后端要做的事情是在 SpringBoot 里配置一个拦截器统一拦截需要登录的接口。拦截器里解析请求头中的 Token如果 Token 不存在或者过期直接返回 401让小程序端跳转登录页。这里有一个坑我见过很多次Token 验证失败的时候后端返回了 200 状态码只是把code写成 401结果小程序端根本不会走统一的错误处理逻辑而是当成正常返回继续渲染页面就白屏或者报错。建议 HTTP 状态码就返回 401语义清晰小程序端处理起来也干净。写成代码大致就是public class AuthInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token request.getHeader(Authorization); if (!StringUtils.hasText(token)) { response.setStatus(401); return false; } // 解析 token把 userId 和 role 放入 request attribute JwtClaims claims JwtUtil.parseToken(token); request.setAttribute(userId, claims.getUserId()); request.setAttribute(role, claims.getRole()); return true; } }4.2 签到考勤业务很简单细节很烦签到是午托晚托平台的门面功能老师每天必用但实现起来有很多细节容易忽略。最基础的情况是这样老师进入“我的班级”列表选择一个今天有课的班级看到学生名单每个学生后面有“已到”“迟到”“请假”“未到”四个状态老师点一下就能标记。点完之后当天数据存到签到表里其他人分时段再进入时不能重复修改。这里第一个麻烦点是“班级和学生”的关联。一个班级里有很多学生一个学生可能报多个课程所以班级和学生之间是多对多关系。签到页面要展示的是“某个课程实例下的全部学生”做查询时要先把课程对应的报班记录查出来再关联学生表别把学生和课程的关系搞成一对一。第二个麻烦点是“当天不能覆盖”。老师手误点错了状态没有关系一般都允许修改。但这里的修改要加一个时间判断逻辑如果签到时间距离现在已经超过当天就不允许再修改只能做补签操作。补签的操作权限通常只给管理员或者给当班老师同时要记录操作人和补签备注这个业务规则在答辩时讲出来是一个亮点。第三个麻烦点是出勤率统计。统计口径要提前想清楚是“某个学生本月出勤了多少次”还是“某个班级某天出勤了多少人”这两个指标的 SQL 完全不一样。建议做两个接口一个是按班级维度查询“某天某班出勤人数”一个是按学生维度查询“某学生某月出勤次数”都实现好了后面做数据看板就很顺手。4.3 课程表与日期处理Java 时间里最容易翻车的地方课程表排课是晚托机构里非常核心的运营功能在系统里的表达方式其实不需要太复杂一个课程有固定的星期几、开始时间和结束时间就行比如“每周一、周三、周五 16:30-18:00 晚托班”。所以课程表存储用day_of_week、start_time、end_time三个字段组合是最实际的。日期处理是 Java 里一个非常容易翻车的地方。很多同学喜欢用SimpleDateFormat和java.util.Date但是这套 API 设计得比较早线程安全问题需要小心而毕设项目一般不需要深究那么细所以用 Java 8 的LocalDate、LocalTime、LocalDateTime就好。举个例子查询“今天这个班级有哪些课”你需要获取当前日期然后用LocalDate.now()获取今天的星期几再去课程表里匹配。注意Java 里DayOfWeek的枚举值周一对应 1周日对应 7和数据库里存的 1 到 7 可以直接用getValue()对应上不需要额外转换。这个地方我踩过坑最早的表设计里用中文字符串“周一”存后来每次查询都要先转成数字白白多了一个容易出错的分支。时间跨天的问题也要想清楚。晚托班如果到晚上 20:30 结束这本身不会跨天但有些机构排课会从 20:00 到 21:30这已经是晚上了没有跨天问题。如果你后续扩展早托业务凌晨时段就要特别小心建议做的时候统一只处理当天课程不考虑跨天扩展跨天逻辑至少保证日期是动态获取的而不是写死。4.4 列表分页与加载更多小程序端的列表查询是高频操作比如家长查看缴费记录、老师查看班级列表、管理员查看学生列表。这里最实用的做法是后端接口传pageNum和pageSize返回分页结果给前端小程序端用“上拉加载更多”的方式翻页。MyBatis Plus 的分页插件在这时候非常好用直接在配置类里加一个PaginationInnerInterceptor然后 Mapper 接口的方法返回IPageT传一个Page对象进去就行。它返回的对象里自带records、total、current、pages前端拿到总页数后对比当前页数就能判断是否还有下一页。小程序的实现上有一个细节值得注意onReachBottom是滚动到底部自动触发的但如果快速反复到底部会连续触发多个请求。建议加一个简单的防重复请求标志if (this.data.loading) return; this.setData({ loading: true });请求完成后无论成功失败都把loading改回false这样就能避免请求重发。然后是列表数据的拼接注意要使用concat之后setData不要直接修改数组元素否则渲染层可能不更新。5. 拿到源码之后怎么快速跑起来5.1 环境清单你拿到的项目源码如果是完整的通常会包含数据库脚本、后端代码、小程序前端代码和文档。先别急着打开把环境准备好再动手。推荐环境清单是这样软件版本建议说明JDK1.8 或 11SpringBoot 2.7 都用得动Maven3.6管理后端依赖MySQL5.7 或 8.0兼容性都很好Redis5.0如果项目用到缓存和 Token 存储则必须微信开发者工具最新稳定版打开小程序工程IDEA2021后端开发主工具数据库导入时要注意拿到.sql脚本后先用文本编辑器打开看一眼确认里面没有奇怪的信息再通过命令行或 Navicat 导入。导入完成后打开后端配置文件application.yml把数据库地址、用户名、密码改成自己的。这一步不改后端起不来而且报错会五花八门。5.2 前后端联调与常见启动失败原因联调是小程序项目最容易卡壳的环节。小程序开发工具里有一个“不校验合法域名”的开关在开发的阶段勾上它否则你请求http://localhost:8080或者局域网 IP 都会直接失败因为微信默认只允许 HTTPS 域名。这个开关的位置在微信开发者工具的“详情-本地设置-不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”里。后端启动常见的失败原因我整理了几个。端口被占用启动报“Port already in use”是常态改掉 SpringBoot 的server.port即可或者找到占用进程杀掉。数据库连不上报错一般是Communications link failure排查方向是 MySQL 服务有没有启动、端口是不是 3306、账号密码是否正确。依赖下载慢或失败第一次启动会下载大量 Maven 依赖建议用国内镜像源把settings.xml里的mirror配置为阿里云镜像时间能快非常多。小程序端最常见的失败原因是基础库版本和代码不兼容具体表现是编译报错指向某个 API 不存在。解决办法是打开项目配置里的“基础库版本”选一个和项目文档里描述一致的版本。其次是 AppID项目里可能配了一个测试号你可以换成自己的测试 AppID不需要企业主体个人开发者也能申请测试号。6. 答辩准备与功能扩展思路6.1 哪些点最容易被追问答辩的时候老师一般不会让你现场写代码而是会盯着项目的设计思路和关键实现问。这个项目里我认为这几个点是最容易被追问的。“你这个签到功能怎么避免老师重复签到”这个问题考的是业务规则的设计。回答思路是签到记录用student_id course_id sign_date做唯一约束或者查询时先判断是否存在当天记录存在则走更新流程而不是新增。“微信登录的逻辑是什么”这个问题几乎必问因为它是小程序项目区别于传统 Web 项目的关键点。回答思路就是前面第 4.1 节讲的先wx.login获取 code再换取 openid再生成 JWT。“你的数据库为什么这么设计”这题比较开放但只要你讲了表结构的关联思路基本不会出错。建议提前准备好 ER 图并用自己的话把从学生到课程到签到的链路讲一遍。6.2 低成本高价值的扩展方向如果时间充裕或者你想让项目更有差异化可以考虑下面几个扩展方向都是低成本高回报的。第一个是微信订阅消息。家长关心孩子到没到班这个通知很有价值。在小程序端引导用户授权订阅消息老师点签到的同时后端调用微信订阅消息接口给家长推一条模板消息“您的孩子已到班”。这个功能不需要复杂轮询也不需要 App 常驻但演示效果非常明显可以做加分项。第二个是数据统计图表。在管理后台加一个简单的出勤趋势图比如展示最近 7 天每天的总出勤人数。后端只需要提供一个聚合查询接口把签到表按日期分组统计前端用 ECharts 或简单的 Canvas 画图即可。这个功能能让项目看起来有“数据价值”而不是单纯的增删改查。第三个是学生成长档案。把教师端每次的作业反馈、评语汇总到一个按时间排序的档案页面里家长端可以按月查看孩子的成长记录。这个扩展不需要改表结构只需新写一个聚合查询接口却能让完整的故事线更丰满。我个人在实际操作中的体会是毕设项目做到最后比的不是谁代码写得花哨而是谁把自己的系统讲得清楚、讲得符合逻辑。午托晚托平台的优势就在于业务场景足够生活化老师容易理解也容易展开。但如果你只是把源码跑起来连核心表结构都说不明白答辩时反而容易被一眼看穿。拿到源码之后最忌讳的就是急着炫运行效果。第一步先看数据库脚本把每张表的字段过一遍第二步看接口文档或者 Controller 层搞清楚每个接口对应什么功能第三步再去跑前端从前端页面反推后端的接口逻辑。三遍下来这个系统才是真正属于你。这中间花的时间不会超过两天但能让你从“会跑”变成“会讲”这一字之差在答辩现场就是及格和优秀的差距。
返回列表