ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

基于Spring Boot与微信小程序的奶茶店管理系统毕设全解析

2026/9/11 4:02:27 拓冰建站 浏览量
基于Spring Boot与微信小程序的奶茶店管理系统毕设全解析 如果你最近在刷毕业设计选题大概率刷到过这么一类题目“基于微信小程序的奶茶连锁店管理系统”“Spring Boot 小程序的物料出入库盘点系统”。有些同学一看这题目就觉得太普通甚至怀疑是不是烂大街了。我的看法恰恰相反这类题目在计算机毕设里属于“常青树”级别的存在——技术栈经典、业务逻辑完整、可扩展空间大而且最关键的奶茶店这个业务场景每个人都能看懂答辩的时候不用费劲解释业务背景。我这些年帮人改过不少类似的项目也带过几个学生用这套框架做毕设有一说一这个题能覆盖的后端知识面相当全面RESTful API 设计、JWT 登录鉴权、数据库表结构设计、事务处理、库存并发扣减、枚举状态机流转、数据可视化整套做下来基本把 Java 后端开发的核心技能点都过了一遍。小程序端又能锻炼微信生态开发能力比如 wx.login 授权、request 封装、tabBar 页面组织、组件化开发。技术上不超纲但写进论文里“工作量”很够看。这篇文章就把这个项目的里里外外拆开讲清楚从为什么选这个题到系统怎么设计、数据库怎么建表、核心模块怎么实现、环境怎么搭、坑怎么踩再到答辩时导师最爱问什么全部给你捋一遍。你如果正打算拿这个题做毕设看完这一篇方向感和动手路径基本就有了。1. 为什么“奶茶店管理系统”年年都是毕设常青树1.1 奶茶连锁店业务里藏着的真实痛点奶茶店的物料管理听起来简单实际操作起来要比想象中麻烦得多。一家独立的奶茶店可能还好老板自己心里有数但一旦做成连锁哪怕只有三五家店问题就出来了每家店每天的珍珠、茶底、杯子、吸管、封口膜消耗多少周六日生意好的时候某家店的奶盖粉够不够撑到下一批送货总部想搞一次统一的促销活动各家店的原料库存能不能承接住没有系统的时候这些信息全靠微信群里人肉接龙Excel 表传来传去月底盘库经常差出几百块钱的账还不知道差在哪。这个项目要解决的说白了就是三件事物料出入库有记录、库存数量实时可查、采购盘点有流程。业务链路清晰流程上又具备典型的管理系统特征——有角色权限、有单据流转、有数据统计非常适合作为毕设的业务载体。1.2 为什么是 Spring Boot 微信小程序这套组合技术选型是很多同学纠结的第一个问题。其实毕设技术选型有个原则不求最潮但求最稳、最好讲、资料最好找。Spring Boot 微信小程序这套组合完美符合这个原则。先说后端。Spring Boot 在 Java 系毕设里占有率非常高导师不陌生网上教程一搜一大把遇到问题基本都能搜到答案。它的核心优势是“约定大于配置”一个注解就能起一个 Web 服务省去大量配置文件对于毕设这种短周期项目非常友好。再加上 MyBatis Plus 这个 ORM 框架连基础的增删改查 SQL 都省得写了BaseMapper 直接给你封装好把精力集中在业务逻辑上。再说小程序端。微信小程序和“奶茶连锁店管理”这个场景天然匹配——门店员工不需要安装额外的 App微信里扫一扫或者搜索一下就能打开用完即走。而且小程序开发的资料同样极其丰富微信官方文档写得很清楚Vant Weapp 这类组件库也能快速把界面做得像模像样。从毕设角度讲小程序的“扫码即用”还能作为一个产品亮点写进论文里比单纯的网页管理系统多了一层“移动端、轻量化”的包装。当然这套组合也给了你向上扩展的空间以后想升级后端拆微服务、加 Redis 缓存、搞消息队列都能顺理成章地接进去前端也能继续加图表、加实时通知。但你也可以选择不做这些保持一个经典的单体应用形态毕业设计完全够用。2. 系统整体设计从业务流程到数据库表结构2.1 先画出业务闭环再谈代码抛开代码先想一个问题喝完一杯奶茶哪些物料就没了杯子、吸管、封口膜这些是一次性的珍珠、茶底、奶盖粉是消耗品。门店每天的物料消耗要对应到一次次的出库操作物料不够了要发起采购申请为了防止账面和实物对不上要定期盘点总部要能看到各家店的库存和消耗情况方便统一调度。这个系统的核心业务流程是一个完整闭环采购申请 → 总部审核 → 供应商供货 → 到货入库 → 门店领料出库 → 库存消耗 → 库存不足触发新的采购申请 → 定期盘点修正库存差异。中间穿插着角色权限控制——店员只能录出入库单店长能发起采购和看报表总部的超级管理员能审核采购单、管理所有门店。在设计系统之前先把这个链路想清楚后面所有表结构和接口都会变得顺理成章。2.2 功能模块全景拆解整个系统按角色权限划分大致是下面这张表角色核心权限超级管理员门店管理、用户管理、物料档案管理、采购审核、全局数据查看店长查看本店库存、发起采购申请、查看本店报表、创建盘点任务仓管/店员入库登记、出库登记、执行盘点、查看当前库存功能模块从下往上分四层基础数据层物料档案、分类、供应商、门店、业务操作层出入库单、盘点任务、采购申请、流程审批层采购单审核状态流转、数据展示层库存看板、低库存预警、月度消耗分析。这套模块划分有一个好处论文里“功能模块设计”这一章特别好写每一层都能展开讲而且每一层之间都有依赖关系顺着业务逻辑就讲完了。2.3 数据库设计一张表和它的兄弟姐妹数据库设计是这套系统里最见功夫的部分。我见过很多同学随便建两张表就开始写代码结果写到一半发现库存对不上、单据没流水、盘点差异没法处理只能推倒重来。这里给出一个经过验证的完整表设计方案表名用途关键字段sys_user用户表id, username, password, real_name, role, store_idbranch_store门店表id, store_name, address, manager_id, statusmaterial_category物料分类id, category_namematerial_info物料档案表id, material_name, category_id, unit, warn_stock, specsupplier_info供应商表id, supplier_name, contact, phonestock_info库存表id, store_id, material_id, quantity, versionstock_record出入库流水表id, store_id, material_id, change_type, quantity, before_quantity, after_quantity, order_no, create_bycheck_task盘点任务表id, task_no, store_id, status, create_by, create_timecheck_record盘点明细表id, task_id, material_id, book_quantity, real_quantity, diff_quantitypurchase_order采购单主表id, order_no, store_id, supplier_id, status, total_amount, apply_by, audit_bypurchase_order_item采购单明细表id, order_id, material_id, plan_quantity, actual_quantity, price这里重点说三个设计要点。第一库存表 stock_info 一定要加 version 字段这是做乐观锁并发控制的关键。门店员工同时操作出入库的情况很常见没有并发控制就会出现库存扣成负数的问题答辩时导师一问一个准。第二出入库流水表 stock_record 要记录操作前后的库存数量before_quantity 和 after_quantity而不是只记一个变更数量。这样做的好处是任何一笔库存变动都能追溯盘点对账的时候能还原整个库存变化轨迹。第三盘点任务表 check_task 和盘点明细表 check_record 拆成主从表。一次盘点任务对应多家物料如果只建一张表要么数据大量冗余要么没法表达“一次盘点的整体状态”。主从表是管理系统的经典设计论文里值得专门讲。3. 代码实现核心环节登录、出入库、盘点、采购怎么落地3.1 登录鉴权小程序端 JWT 的正确打开方式小程序端的登录流程跟传统网页登录不太一样不要自己去实现账号密码登录要走微信官方的 code2Session 换 openid 流程。核心逻辑是这样的前端 wx.login() 获取一个临时 code传给后端后端拿着 code 调微信接口换取用户的 openid用 openid 查本地用户表如果查到了就生成 JWT 返回给前端查不到就自动注册一个新用户。JWT 生成用 jjwt 这个库一个工具类就能搞定。关键配置点密钥不要硬编码在业务代码里写在 application.yml 里过期时间建议设 2 小时小程序端每次启动时检查本地存储的 token 是否过期过期就重新走一遍 wx.login。这里我见过不少同学栽跟头token 设置成永久有效虽然省事但答辩时被问到“token 过期怎么处理”就答不上来了。管理端那边就简单了用传统账号密码 Spring Security 或者拦截器校验都行。注意密码存储要加密推荐用 BCrypt论文里可以写一句“用户密码通过 BCrypt 加盐哈希存储防止明文泄露”加分项。3.2 出入库模块库存扣减的事务和并发问题出入库是这套系统的核心操作也是代码上最需要上心的地方。以精简出库为例一个标准的出库流程是前端提交出库单包含门店ID、操作人、多个物料明细→ 后端接收后开事务 → 逐条扣减库存 → 写入库流水 → 提交事务。核心难点在“扣减库存”这一步必须用条件更新 乐观锁来防止超卖。MyBatis Plus 的写法大致是这样Transactional(rollbackFor Exception.class) public void createOutboundOrder(StockOutDTO dto) { String orderNo generateOrderNo(CK); for (StockOutItemDTO item : dto.getItems()) { int rows stockMapper.deductStock( dto.getStoreId(), item.getMaterialId(), item.getQuantity(), item.getVersion() ); if (rows 0) { throw new RuntimeException(物料【 item.getMaterialName() 】库存不足或数据已被修改请刷新后重试); } // 写入流水记录 stockRecordMapper.insert(...); } }对应的 SQL 是核心UPDATE stock_info SET quantity quantity - #{quantity}, version version 1 WHERE store_id #{storeId} AND material_id #{materialId} AND quantity #{quantity} AND version #{version}这里有个很关键的点把库存判断直接写进 UPDATE 的 WHERE 条件里数据库层面保证“库存不足就不更新成功”比先 SELECT 判断再 UPDATE 安全得多。事务方面记得加 rollbackFor Exception.class并且抛出 RuntimeException 才能触发回滚这部分很多同学容易漏。3.3 盘点模块盘盈盘亏怎么处理才算完整盘点模块的难点不是“记录实盘数量”而是盘点差异的处理逻辑。我在不少同学的项目里看到的问题是盘点差异算出来了但是只显示在页面上库存还是原来的数字这等于盘了个寂寞。标准的盘点和库存修正流程应该这样设计创建盘点任务的时候系统自动把该门店所有物料的最新账面数量book_quantity存进盘点明细表录入完实盘数量real_quantity之后计算出差异diff_quantity生成差异结果后不能直接改库存要有一个“确认盘点结果”的操作确认时再生成一条库存修正流水把库存表改成实盘数同时记录差异原因。Transactional(rollbackFor Exception.class) public void confirmCheckTask(Long taskId) { // 1. 校验任务状态 // 2. 遍历盘点明细逐条调整库存 for (CheckRecordDTO record : recordList) { stockMapper.adjustStock(record.getStoreId(), record.getMaterialId(), record.getRealQuantity()); // 3. 写一条差异调整流水change_type ADJUST } // 4. 把任务状态置为已完成 }盘点状态机的流转也值得写进论文里待盘点 → 盘点中 → 已完成用状态字段区分配合创建时间和完成时间答辩时能讲的东西就有血有肉了。3.4 采购模块状态机驱动的单据流转采购单流程是这套系统里最有“管理味道”的部分。门店发起采购申请总部审核审核通过后供应商供货货到了门店确认入库。这个过程用状态机来控制最清晰。采购单的状态我建议这样设计0 待审核 → 1 已通过 / 2 已驳回 → 3 已到货入库完成。驳回时可以填写驳回理由店长在门店端能看到。状态变更的操作统一封装在一个 Service 方法里用枚举 switch 来校验状态流转的合法性不允许跳状态。这里有个实操细节采购单入库之后要自动生成一条入库流水也就是采购到货和库存增加要在一个事务里绑定。有的同学只做了采购单状态更新忘记调用库存模块导致采购流程走完了库存一点没变这种低级错误一旦被答辩导师发现印象分会受很大影响。采购入库后库存自动增加这条链路最好在论文“功能实现”章节里专门画一个时序图说明。3.5 数据看板用小成本换来高答辩分数据看板是性价比最高的一个模块。技术上并不复杂后端写几个聚合查询的 SQL前端用 ECharts 或者小程序端组件渲染图表一两周就能做完但是在答辩现场展示效果非常直观——图表一出来整个系统的“完整性”和“实用性”直接提升一个档次。看板我建议至少包含四个数据近 30 日出入库趋势折线图、物料库存排行柱状图、各门店库存对比图、低库存预警列表。低库存预警是其中最简单的同时也最实用给物料表加一个 warn_stock 字段查询时判断当前库存是否低于阈值低于的在列表里标红。这个功能写起来不超过半小时但几乎每次答辩都会被导师提出来讨论——因为这就是实际业务中真正的痛点。4. 从零跑通整个项目环境版本、工程搭建、联调部署全流程4.1 环境准备与版本组合避坑版本问题是我见过最坑的环节。很多同学照着一个老教程敲代码结果 Spring Boot 版本不一样启动直接报错排查半天发现是版本冲突。这里给一个我多次验证过、稳定性最高的组合组件推荐版本说明JDK1.8 或 11Spring Boot 2.x 首选Spring Boot2.7.x不要用 3.x资料少且配置变化大MyBatis Plus3.5.x与 Spring Boot 2.7 兼容性好MySQL5.7 或 8.05.7 资源占用小8.0 功能新Redis可选用了记得写缓存策略别只当摆设微信开发者工具最新稳定版AppID 用测试号即可数据库连接串记得加上参数useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai。不加 characterEncoding 的话后期插入中文数据很容易出现乱码排查起来很耗时间。MySQL 5.7 和 8.0 的驱动类名不同5.7 用com.mysql.jdbc.Driver8.0 用com.mysql.cj.jdbc.Driver别抄混了。4.2 后端工程搭建与目录规划后端工程直接用 Spring Initializr 创建勾选 Spring Web、MySQL Driver、Lombok然后手动引入 MyBatis Plus 依赖。包结构建议按分层模式组织一眼就能看懂com.example.milktea ├── controller // 接口层 ├── service // 业务逻辑层 │ └── impl ├── mapper // 数据库访问层 ├── entity // 实体类 ├── dto // 入参出参对象 ├── config // 配置类 ├── common // 公共类统一返回、异常处理、常量 └── utils // 工具类JWT、日期等com.example.milktea这个名字是我懒得换的占位符你自己做的时候记得改成自己项目的包名规范感会强很多。实体类用 Lombok 的 Data 注解能省掉大量的 getter/setter 代码实体字段建议和数据库字段驼峰对应MyBatis Plus 会自动开启驼峰映射。Controller 层接口设计遵循 RESTful 风格比如查询库存是 GET /api/stock/list创建出库单是 POST /api/stock/outbound。统一响应体用一个 Result 包装code、message、data 三个字段。一旦接口返回格式统一小程序端的数据解析会非常省事。4.3 小程序端搭建与 request 封装小程序端建议用原生框架写不要一上来就引 uniapp虽然 uniapp 开发效率确实高但毕设更看重你对微信小程序原生生态的理解原生写的项目在答辩时被问到生命周期、组件通信时不心虚。UI 组件可以引入 Vant Weapp它的表单、弹窗、按钮组件都做得比较完善能节省大量样式时间。小程序端最核心的是封装一个统一的 request 方法。我在实际项目中反复用下面这个模板稳定可靠const request (url, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL url, method, data, header: { Content-Type: application/json, Authorization: wx.getStorageSync(token) }, success: (res) { if (res.data.code 200) { resolve(res.data.data); } else if (res.data.code 401) { wx.removeStorageSync(token); wx.navigateTo({ url: /pages/login/login }); } else { wx.showToast({ title: res.data.message, icon: none }); reject(res.data); } }, fail: (err) reject(err) }); }); };BASE_URL 建议放在一个单独的 config.js 文件里。开发模式下如果你用本地后端调试小程序后台的“合法域名”不用配置只需要在微信开发者工具里勾选“不校验合法域名、web-view 业务域名、TLS 版本以及 HTTPS 证书”。这一步很多人不知道在哪里调试时接口一直报域名错误其实就是这个开关没打开。小程序页面建议用 tabBar 组织四个主入口首页看板、库存管理、采购审批、我的。登录页单独一个非 tab 页面。出入库登记、盘点操作这些功能页面从二级页面进去形成“tab 容器 二级业务页”的经典结构。4.4 联调与部署本地调试到上线的关键路径本地联调阶段后端启动在 8080 端口小程序工具里 BASE_URL 写http://localhost:8080只要开发者工具勾了“不校验合法域名”PC 端模拟器可以正常访问本地接口。但要注意真机预览时localhost指向的是手机本身访问不到电脑的后端服务。想用真机调试要么把后端部署到一台和手机在同一局域网的电脑上然后 BASE_URL 改成电脑的局域网 IP要么直接把后端部署到云服务器用公网 IP 或域名访问。部署方案推荐最省事的买一台云服务器把打包好的 jar 包传上去直接用java -jar命令后台运行配一个 Nginx 反向代理把/api路径转发到 8080 端口。小程序上线还需要做两件事一是把 request 合法域名配置成 HTTPS 的域名这要求你得有备案过的域名和 SSL 证书二是在微信公众平台配置服务器域名白名单。这些流程如果自己搞不定毕设阶段不开通“发布”权限、只用开发者工具演示也是完全可以接受的很多学校对毕设小程序的要求仅仅是“可运行演示”。5. 答辩高频问题与实战避坑清单5.1 导师最爱问的技术问题怎么答答辩环节的问题其实是可以预判的。基于我对这类项目的了解下面这些问题出现的概率极高提前准备好答案就稳了。Q1库存表为什么不直接存数量还要搞一张流水表回答思路流水表是为了保证数据的可追溯性。库存表只保存当前最新状态流水表记录每一次变化的来龙去脉。一旦发现账实不符可以通过流水表还原操作过程快速定位是哪一笔操作出了问题。这也是实际企业系统的常规做法。Q2多人同时出库怎么防止并发问题回答思路用乐观锁。库存表加 version 字段更新时校验版本号匹配才更新成功。同时把库存是否充足的条件放到 UPDATE 语句里数据库层面保证不会超扣。可以补充一句“如果用悲观锁也可以但锁表时间会更长对高并发场景不友好”表明你考虑过技术权衡。Q3盘点差异怎么处理回答思路盘点不是直接改库存而是先记录账面数、实盘数、差异数由操作人确认后再调整库存同时生成一条差异调整流水。这样既保留了盘点过程的原始记录又能让库存修正有据可查。Q4JWT 和传统 Session 有什么区别为什么选 JWT回答思路Session 存在服务器端需要维护会话状态在分布式部署下要解决 Session 共享问题。JWT 是无状态的token 本身携带用户信息服务器不需要保存会话天然适合前后端分离和分布式架构。但 JWT 也有一点不好无法主动让 token 失效所以过期时间要设置合理一般一个小时到两个小时。Q5你的系统做了哪些安全方面的考虑这里是把双刃剑答得好了是加分项。可以从几个维度展开密码 BCrypt 加密、JWT 拦截器校验、SQL 使用预编译防止注入、前端请求统一携带 token、管理端和门店端数据权限隔离。哪怕只是做了前三点也要清清楚楚讲出来。5.2 开发过程中的常见坑和排查方法这套系统从零到一跑下来以下几个坑基本是人人都会踩的提前避开能省出至少一周的 Debug 时间。坑一事务不生效。检查三件事方法必须是 public同类内部调用不走代理所以不要从同类方法里直接调用带 Transactional 的方法异常要在事务方法内抛出不能在 catch 块里吞掉。MySQL 表引擎必须是 InnoDB 才支持事务。坑二wx.login 换不到 openid。优先检查 appid 和 secret 是否匹配、是否正确填入了微信公众平台的配置。注意wx.login返回的 code 有效期很短拿到后要立即传给后端调用 code2Session不要做多余操作磨蹭。坑三小程序端图片上传显示不了。本地开发时可以预览真机就失效基本就是 HTTPS 或者域名问题。如果只是毕设演示建议把图片转成 base64 直接存数据库虽然性能差一点但是省掉文件服务器一大堆配置工作。坑四数据库字段为 create_time 查询报错。MySQL 8.0 中 time 是保留字如果表字段叫 time 会有问题。建议统一约定时间字段用 create_time、update_time不用 time、date 这种语义过于模糊的命名。坑五后端改动后小程序端数据不变。多半是小程序端的缓存问题。wx.request 没有默认缓存但如果你用了wx.setStorageSync缓存了列表数据记得在页面 onShow 里重新拉取不要只放在 onLoad 里。还有开发者工具的缓存清理快捷键 CtrlShiftDelete关键时刻能救命。5.3 如何把普通项目做成高分毕设系统功能全做完验收也能跑通这时候如果想再往上提一档分数有几个低成本高收益的方向可以试试。第一个是增加数据可视化维度。前面提到的看板只用了最基础的折线图和柱状图可以再多加一个“门店销售排行”表格或者“物料 ABC 分类”——按消耗金额把物料分成 A/B/C 三类A 类物料重点管理。ABC 分类是很经典的管理学模型写进论文里显得有理论支撑。第二个是增加通知机制。库存低于安全线时自动给店长微信发一条模板消息。微信小程序订阅消息功能在开发者工具里就可以模拟测试接入成本不高但“主动预警”这个能力讲出来系统的智能感会强很多。第三个是数据权限设计。同一套系统里不同门店的店长只能看到自己门店的库存和单据总部的管理员能看全部。这个功能用 SQL 查询条件里加 store_id 就能实现但是如果你在论文里把它抽象成“基于角色的数据权限控制”整个系统的设计层次就不一样了。我个人的体会是这类管理系统做完重要的不是功能多花哨而是每一步都有据可循。数据库为什么这么设计、接口为什么这么规划、库存更新为什么要用乐观锁这些问题想透了答辩的时候你就不是在背稿子而是在讲自己做过的东西。代码能力是一方面能不能把业务逻辑讲清楚才是毕业设计真正考察的东西。