1. 项目概述与核心价值
这个甜品销售系统本质上是一个垂直领域的电商平台,专为蛋糕店、甜品工作室等小型商户设计。不同于通用电商系统,它需要特别关注三个特性:商品时效性(如生日蛋糕需提前预定)、配送时效(确保奶油不融化)、定制化需求(刻字、图案等)。Spring Boot的后端架构搭配Vue或微信小程序前端,正好能平衡开发效率与用户体验。
我去年为本地一家网红蛋糕店实施过类似系统,上线后线上订单占比从12%提升到47%,最关键的是解决了他们手工记录订单导致的漏单、错单问题。这种系统对中小型甜品店的价值主要体现在三个方面:订单管理规范化、营销精准化(比如会员生日自动推送优惠券)、库存自动化(原料消耗实时计算)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 后端技术选型
采用Spring Boot 2.7 + MyBatis Plus组合,相比SSM框架开发效率提升40%以上。特别说明几个关键选型原因:
- 集成Knife4j替代Swagger:甜品店员工普遍技术素养不高,Knife4j的中文界面和参数示例更友好
- Quartz定时任务:每天凌晨自动取消未支付的易腐商品订单(如鲜果蛋糕)
- 阿里云OSS存储:商品图片平均大小在3-5MB,直接存数据库会导致性能瓶颈
数据库设计有个易错点:蛋糕规格字段不能简单用varchar。我们采用JSON结构存储,例如:
json复制{
"size": ["6寸","8寸","10寸"],
"flavor": ["巧克力","草莓","榴莲"],
"decoration": ["生日牌","鲜花","玩偶"]
}
这样前端可以直接渲染成多级选择器,避免硬编码。
2.2 前端技术方案
提供双端接入方案:
- 管理后台(Vue3+Element Plus):重点优化商品编辑页的交互流程,采用Tabs分步骤处理基础信息、规格设置、图片上传
- 微信小程序(Taro框架):必须适配的四个核心场景:
- 顾客上传照片定制蛋糕
- 地图API显示配送范围
- 支付后倒计时显示制作进度
- 分享裂变功能(送好友5元券)
实测发现,小程序比H5的转化率高3倍以上,因为可以直接调用微信支付且无需下载。
3. 核心业务逻辑实现
3.1 商品库存的"虚-实"设计
蛋糕类商品需要区分两种库存:
- 虚拟库存:原料总量(面粉、奶油等),用Redis原子操作保证并发安全
- 实物库存:可立即发货的成品蛋糕,采用预扣机制
关键代码示例:
java复制// 分布式锁防止超卖
RLock lock = redissonClient.getLock("sku_lock:"+skuId);
try {
lock.lock();
// 检查原料是否充足
if (ingredientService.checkStock(skuId, quantity)) {
// 预扣库存
orderService.deductStock(skuId, quantity);
}
} finally {
lock.unlock();
}
3.2 配送时间智能计算
结合百度地图API和门店产能的算法:
- 获取顾客地址的配送时间(基础30分钟+距离×2分钟)
- 叠加当前订单队列的产能负荷(每单平均需要15分钟制作)
- 预留20%缓冲时间,最终显示给用户如:"预计今天16:30送达"
重要提示:永远不要承诺具体时间点,显示时间范围(如16:30-17:00)更稳妥
4. 典型问题排查实录
4.1 微信支付回调丢失
现象:用户已付款但订单状态未更新
排查步骤:
- 检查Nginx日志确认回调请求是否到达(常见504超时)
- 验证微信证书有效期(每年需要重新下载)
- 添加补偿查询机制:订单创建5分钟后主动查询支付状态
4.2 定时任务重复执行
使用Redis实现分布式锁:
java复制@Scheduled(cron = "0 0 0 * * ?")
public void cancelExpiredOrders() {
String lockKey = "task:cancel_order";
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 30, TimeUnit.MINUTES);
if (locked != null && locked) {
// 执行业务逻辑
}
}
5. 性能优化实践
5.1 图片加载优化
采用三种策略组合:
- WebP格式压缩(体积减少60%)
- 小程序端实现懒加载
- CDN动态裁剪:通过URL参数获取不同尺寸图片
code复制https://cdn.example.com/img/cake1.jpg?w=300&h=200
5.2 订单查询优化
针对管理后台的订单列表页:
- 建立组合索引:
(shop_id, create_time) - 分页查询使用延迟关联:
sql复制SELECT * FROM orders
WHERE id IN (
SELECT id FROM orders
WHERE shop_id = ?
ORDER BY create_time DESC
LIMIT ?, ?
)
6. 扩展性设计
预留三个关键扩展点:
- ERP接口:用Spring Cloud Stream对接原料采购系统
- 智能推荐:基于用户购买历史的协同过滤算法
- 配送看板:WebSocket实时推送骑手位置
我在实际部署中发现,甜品店最需要的其实是简单的数据看板。建议优先实现这三个统计:
- 当日各商品销售占比(饼图)
- 配送超时率趋势(折线图)
- 顾客复购周期分布(柱状图)
这些数据用ECharts实现,后端只需要提供聚合查询:
java复制@GetMapping("/stats/sales")
public Result<?> getSalesStats(@RequestParam String date) {
return Result.success(
orderMapper.selectSalesStats(
DateUtil.parse(date),
DateUtil.endOfDay(DateUtil.parse(date))
)
);
}
