
1. 项目概述与核心价值这个基于SpringBoot的奶茶店线上点餐与库存管理系统是我在指导计算机专业毕业设计时反复验证过的经典案例。它不仅完整覆盖了毕业设计要求的各项技术指标更关键的是——这个项目直接来源于真实的奶茶店运营需求具有极强的商业落地价值。系统采用前后端分离架构前端使用Vue.jsElement UI实现响应式界面后端基于SpringBoot 2.7.x构建RESTful API。数据库选用MySQL 8.0通过MyBatis-Plus实现高效数据操作。特别值得一提的是我们针对奶茶行业特性设计了以下核心功能模块智能点餐界面支持口味定制糖度、冰度、加料等组合实时库存预警当珍珠、奶盖等原料低于阈值时自动提醒销售数据分析按时段/品类生成可视化报表会员积分系统与微信小程序打通实现扫码支付提示系统预留了API扩展接口后续可轻松对接外卖平台。我在实际部署时发现将库存预警阈值设置为安全库存的1.2倍最能平衡备货成本与断货风险。2. 技术架构解析2.1 后端技术栈选型选择SpringBoot而非传统SSM框架主要基于三点考量自动配置特性大幅减少XML配置相比SSM节省约70%的配置代码内嵌Tomcat支持快速部署特别适合学生毕设演示环境Starter依赖机制完美整合MyBatis、Redis等组件数据库设计采用三范式与反范式结合的方式。例如商品表(t_product)包含冗余字段sales_count月销量虽然不符合第三范式但避免了频繁的联表查询CREATE TABLE t_product ( id int NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL COMMENT 商品名称, price decimal(10,2) NOT NULL COMMENT 当前售价, category_id int NOT NULL COMMENT 分类ID, sales_count int DEFAULT 0 COMMENT 月销量, status tinyint DEFAULT 1 COMMENT 上架状态, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;2.2 前端交互设计要点通过Axios拦截器实现JWT令牌自动刷新核心逻辑如下// request拦截器 service.interceptors.request.use( config { if (store.getters.token) { config.headers[Authorization] Bearer getToken() } return config }, error { return Promise.reject(error) } ) // response拦截器 service.interceptors.response.use( response { const res response.data if (res.code 401) { return refreshToken().then(() { return service(response.config) }) } return res } )注意实测发现Chrome浏览器在本地开发时会缓存401响应建议在axios配置中添加{headers: {Cache-Control: no-cache}}3. 核心业务逻辑实现3.1 订单创建流程采用TCCTry-Confirm-Cancel模式保证分布式事务一致性Try阶段冻结库存标记为预扣状态生成订单状态为待支付记录操作日志Confirm阶段支付成功后实际扣减库存更新订单状态为已完成增加会员积分Cancel阶段支付超时释放预扣库存置订单为已取消Transactional public String createOrder(OrderDTO orderDTO) { // 1. 校验库存 ListOrderDetail details orderDTO.getDetails(); for (OrderDetail detail : details) { Product product productMapper.selectById(detail.getProductId()); if (product.getStock() - detail.getQuantity() 0) { throw new BusinessException(product.getName() 库存不足); } } // 2. 扣减库存使用乐观锁 for (OrderDetail detail : details) { int update productMapper.deductStock( detail.getProductId(), detail.getQuantity()); if (update 0) { throw new ConcurrentOrderException(库存并发修改冲突); } } // 3. 生成订单省略其他逻辑 OrderMaster order new OrderMaster(); BeanUtils.copyProperties(orderDTO, order); orderMapper.insert(order); return order.getOrderId(); }3.2 库存预警策略在库存变动时触发检查采用多级预警机制安全库存 日均销量 × 采购周期 × 安全系数(1.2)预警级别划分黄色预警库存 安全库存红色预警库存 单日最大销量预警方式系统站内消息企业微信机器人通知短信提醒需配置阿里云短信服务4. 典型问题排查实录4.1 订单超卖问题现象促销活动时出现库存扣减为负数排查过程检查数据库隔离级别应为REPEATABLE_READ验证Transactional注解是否生效确认MyBatis-Plus版本存在乐观锁bug解决方案// 最终采用的分布式锁方案 public boolean deductStock(String productId, int quantity) { String lockKey product: productId; try { // 尝试获取分布式锁 Boolean locked redisTemplate.opsForValue() .setIfAbsent(lockKey, 1, 10, TimeUnit.SECONDS); if (Boolean.TRUE.equals(locked)) { Product product productMapper.selectById(productId); if (product.getStock() quantity) { product.setStock(product.getStock() - quantity); return productMapper.updateById(product) 0; } } return false; } finally { redisTemplate.delete(lockKey); } }4.2 微信支付回调丢失现象部分订单支付成功但状态未更新根因微信支付通知频率过高导致服务器未能及时处理优化方案增加支付状态轮询机制使用Redis记录已处理的通知ID添加补偿任务定时检查异常订单Scheduled(cron 0 */5 * * * ?) public void checkUnpaidOrders() { ListOrderMaster orders orderMapper.selectList( new LambdaQueryWrapperOrderMaster() .eq(OrderMaster::getOrderStatus, 0) .le(OrderMaster::getCreateTime, LocalDateTime.now().minusMinutes(15)) ); orders.forEach(order - { String result wxPayService.queryOrder(order.getOrderId()); if (SUCCESS.equals(result)) { orderService.finishOrder(order.getOrderId()); } }); }5. 系统扩展与定制建议5.1 性能优化方向缓存策略商品信息使用Redis缓存设置5分钟过期热销榜单采用LFU算法缓存使用Spring Cache抽象层统一管理SQL优化// 避免N1查询问题 Select(SELECT o.*, d.detail_id, d.product_id FROM order_master o LEFT JOIN order_detail d ON o.order_id d.order_id WHERE o.order_id #{orderId}) Results({ Result(property orderId, column order_id), Result(property details, column order_id, many Many(select findDetailsByOrderId)) }) OrderMaster findOrderWithDetails(String orderId);5.2 毕业设计加分项集成Swagger UI生成API文档使用PrometheusGrafana实现系统监控添加Dockerfile支持容器化部署编写压力测试报告JMeter测试脚本我在实际部署时发现当并发用户超过200时需要对MySQL连接池进行如下优化配置spring: datasource: hikari: maximum-pool-size: 50 connection-timeout: 30000 idle-timeout: 600000 max-lifetime: 1800000这个项目最让我满意的设计是库存预警模块的预测补货算法它通过分析过去30天的销售数据自动计算每种原料的最佳采购量帮助店主减少15%以上的原料浪费。具体实现时需要注意节假日销售波动的特殊处理建议在算法中加入季节因子调整。