1. 项目背景与核心需求
攀枝花市作为四川省重要的花卉产区,近年来鲜花种植规模不断扩大,但传统线下销售模式存在信息不对称、库存管理低效等问题。这个基于SpringBoot的鲜花电商平台正是为了解决这些痛点而生。
我在实际开发中发现,鲜花行业有几个特殊需求:
- 时效性要求高:从采摘到送达消费者手中最好不超过72小时
- 库存动态变化快:受季节、天气影响大
- 价格波动频繁:节假日前后差价可达300%
平台需要同时解决三个核心问题:
- 前端销售系统:支持用户浏览、下单、支付完整流程
- 库存智能预警:根据销售数据预测库存缺口
- 供应商协同:实现花农直连消费者的短链供应
提示:鲜花类电商要特别注意设置"预计送达时间"而非"发货时间",因为运输过程中的温湿度控制直接影响商品质量。
2. 技术架构设计
2.1 整体技术栈选型
基础框架:
- SpringBoot 2.7.5(长期支持版本)
- MyBatis-Plus 3.5.1(简化CRUD操作)
- Redis 6.2(缓存热点数据和秒杀库存)
前端方案:
- Thymeleaf + Bootstrap 5(管理后台)
- Vue 3 + Element Plus(用户端H5)
数据库:
- MySQL 8.0(主库事务型数据)
- MongoDB 5.0(日志和用户行为数据)
选型考量:
- SpringBoot的自动配置特性大幅减少了XML配置
- MyBatis-Plus的Lambda查询比传统XML更易维护
- 鲜花图片较多,采用MinIO对象存储替代FastDFS
2.2 微服务拆分策略
虽然是个单体应用,但按功能做了清晰分层:
code复制com.flower
├── common # 通用组件
├── config # 配置类
├── controller # 对外接口
├── dao # 数据访问
├── entity # 实体类
├── service # 业务逻辑
└── util # 工具包
特别设计了flower-stock子模块处理库存逻辑,为将来拆分成独立服务预留接口。
3. 核心功能实现
3.1 动态库存管理
鲜花库存的特殊性在于:
- 需要区分"在圃数量"和"可售数量"
- 每日凌晨自动扣减3天前的库存(鲜花保鲜期)
- 预售商品需要单独计算
核心代码片段:
java复制// 库存扣减服务
public boolean reduceStock(Long skuId, Integer num) {
FlowerStock stock = baseMapper.selectOne(
new LambdaQueryWrapper<FlowerStock>()
.eq(FlowerStock::getSkuId, skuId)
.gt(FlowerStock::getAvailableNum, 0)
);
if(stock == null || stock.getAvailableNum() < num){
throw new BusinessException("库存不足");
}
int rows = baseMapper.updateAvailableNum(
skuId,
stock.getAvailableNum() - num
);
return rows > 0;
}
3.2 智能预警系统
通过历史销售数据训练简单的时间序列模型(使用Apache Commons Math实现):
java复制// 销量预测示例
public int predictSales(Long skuId, LocalDate date) {
List<HistoricalSales> history = salesMapper.selectBySku(skuId);
double[] values = history.stream()
.mapToDouble(HistoricalSales::getQuantity)
.toArray();
// 使用三重指数平滑
TripleExponentialSmoothing tes = new TripleExponentialSmoothing(
0.3, 0.2, 0.1, 7
);
return (int) tes.predict(values, 3)[0];
}
预警规则配置表:
| 预警类型 | 触发条件 | 通知方式 |
|---|---|---|
| 库存不足 | 可售量<3天预测销量 | 短信+邮件 |
| 价格异常 | 日降价幅度>30% | 系统告警 |
| 质量风险 | 投诉率>5% | 企业微信 |
4. 典型业务场景实现
4.1 节日促销方案
针对情人节、母亲节等高峰期的技术准备:
- 预热阶段:提前7天开启预售,使用Redis缓存商品详情
- 秒杀设计:
- 采用分段锁避免超卖
- 独立限流策略(50QPS/商品)
- 应急方案:
- 静态化商品页降级
- 自动关闭非核心功能(如评价系统)
促销核心表结构:
sql复制CREATE TABLE `flash_sale` (
`id` bigint NOT NULL AUTO_INCREMENT,
`sku_id` bigint NOT NULL COMMENT '商品ID',
`price` decimal(10,2) NOT NULL COMMENT '秒杀价',
`stock` int NOT NULL COMMENT '库存',
`start_time` datetime NOT NULL,
`end_time` datetime NOT NULL,
`version` int DEFAULT '0' COMMENT '乐观锁',
PRIMARY KEY (`id`),
KEY `idx_time` (`start_time`,`end_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 物流温控集成
与本地物流公司API对接的关键点:
- 温度监控设备每5分钟上报数据
- 异常温度自动触发补偿流程
- 运输路线优化算法:
java复制public List<DeliveryRoute> optimizeRoutes(List<Order> orders) {
// 基于K-Means聚类分组
KMeansClusterer<GeoPoint> clusterer = new KMeansClusterer<>(
3, 100, new EuclideanDistance()
);
List<GeoPoint> points = orders.stream()
.map(o -> new GeoPoint(o.getLat(), o.getLng()))
.collect(Collectors.toList());
return clusterer.cluster(points).stream()
.map(centroid -> buildRoute(centroid, orders))
.collect(Collectors.toList());
}
5. 部署与监控方案
5.1 生产环境配置
服务器规格:
- 2核4G × 3(阿里云ECS)
- 负载均衡:Nginx + Keepalived
- 文件存储:OSS挂载为本地盘
关键JVM参数:
code复制-Xms1g -Xmx1g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=4
5.2 监控指标设计
使用Prometheus采集的核心指标:
- 业务指标:
- 订单创建速率(orders/minute)
- 库存变更次数(stock/update)
- 系统指标:
- Tomcat线程池活跃数
- MySQL连接数
- 自定义指标:
- 鲜花新鲜度评分(通过NLP分析用户评价)
告警规则示例:
yaml复制- alert: HighOrderFailureRate
expr: rate(order_failed_total[5m]) / rate(order_created_total[5m]) > 0.1
for: 10m
labels:
severity: critical
annotations:
summary: "订单失败率超过10%"
6. 开发中的典型问题
6.1 并发库存超卖
最初使用简单的SQL更新:
sql复制UPDATE flower_stock
SET available_num = available_num - 1
WHERE sku_id = ? AND available_num > 0
在压测时发现仍有0.3%的超卖概率,最终采用Redis分布式锁+数据库乐观锁双重保障:
java复制public boolean safeReduce(Long skuId) {
String lockKey = "stock_lock:" + skuId;
try {
// Redis锁超时3秒
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 3, TimeUnit.SECONDS);
if(Boolean.TRUE.equals(locked)){
return stockMapper.updateWithVersion(
skuId,
stock.getVersion()
) > 0;
}
return false;
} finally {
redisTemplate.delete(lockKey);
}
}
6.2 鲜花图片处理
遇到的两个典型问题:
- 原始图片过大(花农直接上传手机拍摄的5MB+图片)
- 需要自动生成不同尺寸缩略图
解决方案:
java复制// 使用Thumbnailator库处理图片
public void generateThumbnails(MultipartFile file) throws IOException {
// 基础压缩
Thumbnails.of(file.getInputStream())
.scale(1.0)
.outputQuality(0.8)
.toFile(new File("origin.jpg"));
// 生成缩略图
int[] sizes = {800, 400, 200};
for (int size : sizes) {
Thumbnails.of(file.getInputStream())
.size(size, size)
.keepAspectRatio(true)
.toFile(new File(size + ".jpg"));
}
}
7. 项目扩展方向
-
供应链金融模块:
- 基于订单数据为花农提供信用贷款
- 区块链溯源增强品质信任
-
智能推荐升级:
- 结合LBS推荐附近花店
- 根据节日自动配置礼品组合
-
物联网集成:
- 大棚温湿度监控
- 运输车辆GPS追踪
实际开发中,我们先用最小可行版本(MVP)跑通核心流程,再逐步迭代这些扩展功能。对于课程设计/毕业设计而言,建议先确保基础功能完整,扩展功能可以作为论文中的"未来展望"部分。
