1. 项目概述
这个基于SpringBoot和微信小程序的蛋糕订购系统,是我去年为本地一家连锁烘焙店开发的线上销售解决方案。当时客户面临的主要痛点是:传统电话订购方式效率低下、订单容易出错,且无法积累客户数据。系统上线后,三个月内线上订单量增长了217%,店员工作效率提升了40%以上。
系统采用经典的三层架构:
- 前端:微信小程序(用户端+管理端)
- 后端:SpringBoot 2.7 + MyBatis-Plus
- 数据库:MySQL 8.0
提示:选择微信小程序而非原生App,主要考虑蛋糕这类低频消费场景的用户使用习惯,小程序即用即走的特性更符合实际需求。
2. 核心功能模块设计
2.1 商品展示系统
采用懒加载+本地缓存策略解决商品图片加载性能问题:
// 商品分页查询示例 @GetMapping("/products") public Result<Page<ProductVO>> getProducts( @RequestParam(required = false) Integer categoryId, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { // 使用MyBatis-Plus的分页插件 Page<Product> pageInfo = new Page<>(page, size); LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>(); if (categoryId != null) { wrapper.eq(Product::getCategoryId, categoryId); } wrapper.eq(Product::getStatus, 1); // 只查询上架商品 return Result.success(productService.page(pageInfo, wrapper)); }2.2 智能订单系统
实现的核心功能包括:
- 多规格商品选择(尺寸/口味/装饰等)
- 预约配送时间选择
- 订单状态实时推送(使用微信模板消息)
订单状态机设计:
stateDiagram [*] --> 待支付 待支付 --> 已取消: 超时未支付 待支付 --> 已支付 已支付 --> 制作中 制作中 --> 配送中 配送中 --> 已完成 配送中 --> 已退款: 用户申请2.3 会员积分系统
采用Redis实现高性能积分计算:
- 签到积分:连续签到积分递增
- 消费积分:实付金额×积分系数
- 积分兑换:支持抵扣现金
3. 关键技术实现
3.1 微信支付集成
支付流程关键代码:
public WxPayJSAPIResponse createOrder(Order order) throws Exception { WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody("蛋糕订购 - " + order.getProductName()); request.setOutTradeNo(order.getOrderNo()); request.setTotalFee(order.getActualPrice().multiply(new BigDecimal(100)).intValue()); request.setSpbillCreateIp(order.getClientIp()); request.setNotifyUrl(notifyUrl); request.setTradeType("JSAPI"); request.setOpenid(order.getOpenid()); // 调用微信支付SDK return wxPayService.createOrder(request); }3.2 高并发库存控制
采用Redis分布式锁+乐观锁双重保障:
public boolean reduceStock(Long productId, Integer quantity) { String lockKey = "product_stock_lock:" + productId; String lockValue = UUID.randomUUID().toString(); try { // 获取分布式锁 Boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, lockValue, 10, TimeUnit.SECONDS); if (!locked) { throw new BusinessException("操作太频繁,请稍后再试"); } // 乐观锁更新库存 int updated = productMapper.updateStock(productId, quantity); return updated > 0; } finally { // 释放锁 if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) { redisTemplate.delete(lockKey); } } }3.3 智能推荐算法
基于用户行为的协同过滤推荐:
- 收集用户浏览、收藏、购买数据
- 使用Mahout计算相似度矩阵
- 实时推荐TopN商品
4. 部署与运维方案
4.1 服务器配置建议
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| 应用服务器 | 2核4G | 4核8G |
| MySQL | 2核4G | 4核8G+SSD |
| Redis | 1核2G | 2核4G |
4.2 监控指标设置
关键监控项包括:
- 订单创建QPS
- 支付成功率
- API响应时间P99
- 数据库连接池使用率
使用Prometheus+Grafana搭建监控看板:
# prometheus配置示例 scrape_configs: - job_name: 'springboot' metrics_path: '/actuator/prometheus' static_configs: - targets: ['app:8080']5. 典型问题解决方案
5.1 微信登录失败排查
常见错误及解决方法:
40029- code无效 → 检查AppSecret配置40163- code已使用 → 确保code一次性使用41008- 缺少必要参数 → 检查wx.login()调用
5.2 订单超时处理
使用延迟队列实现:
@RabbitListener(queues = "order.delay.queue") public void processExpiredOrder(OrderMessage message) { Order order = orderService.getById(message.getOrderId()); if (order != null && order.getStatus() == OrderStatus.UNPAID) { orderService.cancelOrder(order.getId()); } }5.3 性能优化实践
实测有效的优化手段:
- 启用MyBatis二级缓存
- 静态资源CDN加速
- 启用SpringBoot的Gzip压缩
- 数据库查询使用覆盖索引
6. 项目演进方向
- 接入智能客服系统(正在开发)
- 增加AR蛋糕预览功能(技术预研中)
- 扩展分销功能(规划中)
这个项目让我深刻体会到:在O2O系统中,订单状态的实时同步和库存的精确控制是两大核心挑战。我们最终通过分布式事务+可靠消息最终一致性的方案解决了这些问题。对于中小型蛋糕店来说,这套系统已经能很好地满足日常运营需求。