1. 项目概述
这个基于SpringBoot的蔬菜超市系统是一个典型的B2C电商平台,专为中小型生鲜零售商设计。我在开发过程中发现,相比通用电商系统,生鲜品类有着独特的业务需求:商品保质期短、价格波动频繁、库存管理要求实时性高。系统采用SpringBoot 2.7 + MyBatis Plus + Thymeleaf的技术栈,实现了商品管理、订单处理、会员体系等核心功能模块。
特别提示:生鲜类系统要特别注意库存与价格的实时同步,我在开发时专门设计了库存预警模块,当商品库存低于设定阈值或临近保质期时,系统会自动触发站内通知和短信提醒。
2. 核心需求解析
2.1 业务需求拆解
蔬菜超市系统主要解决三个核心痛点:
- 商品保鲜管理:需要支持商品批次管理,设置不同级别的保质期预警(3天/1天/过期)
- 价格灵活调整:支持时段定价(早市/午市/晚市不同价格)
- 快速收银流程:开发了快捷键收银模式,支持扫码枪快速录入
2.2 技术需求分析
系统采用分层架构设计:
- 表现层:Thymeleaf + Bootstrap 5
- 业务层:SpringBoot + Spring Security
- 数据层:MyBatis Plus + MySQL 8.0
- 缓存层:Redis(商品分类缓存)
java复制// 典型的商品实体类设计示例
@Data
@TableName("product")
public class Product {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private BigDecimal price;
private Integer stock;
@TableField("category_id")
private Long categoryId;
@TableField("expire_date")
private LocalDate expireDate;
@TableField("alert_days")
private Integer alertDays; // 预警天数
}
3. 系统设计与实现
3.1 数据库设计关键点
设计了7张核心表:
- 商品表(product)
- 商品分类表(category)
- 会员表(member)
- 订单表(order)
- 订单明细表(order_item)
- 库存记录表(inventory)
- 促销活动表(promotion)
特别注意:商品表增加了
temperature_zone字段区分常温/冷藏/冷冻商品,这是生鲜系统的特殊需求。
3.2 核心功能实现
3.2.1 商品管理模块
- 支持Excel批量导入商品
- 实现商品多条件复合查询
- 开发了商品上下架状态管理
java复制// 商品分页查询实现
@GetMapping("/products")
public String listProducts(
@RequestParam(required = false) String name,
@RequestParam(required = false) Long categoryId,
@RequestParam(defaultValue = "1") Integer pageNum,
Model model) {
Page<Product> page = new Page<>(pageNum, 10);
LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(name)) {
queryWrapper.like(Product::getName, name);
}
if (categoryId != null) {
queryWrapper.eq(Product::getCategoryId, categoryId);
}
IPage<Product> productPage = productService.page(page, queryWrapper);
model.addAttribute("pageInfo", productPage);
return "product/list";
}
3.2.2 订单处理流程
- 购物车结算
- 库存预扣减(Redis分布式锁)
- 订单创建
- 支付回调处理
- 库存最终扣减
4. 系统特色功能
4.1 智能定价策略
实现三种定价模式:
- 时段定价(早中晚不同价格)
- 库存压力定价(库存越多折扣越大)
- 会员等级定价
java复制// 价格计算策略接口
public interface PricingStrategy {
BigDecimal calculatePrice(Product product, Member member);
}
// 时段定价实现
@Service
@Primary
public class TimeBasedPricingStrategy implements PricingStrategy {
@Override
public BigDecimal calculatePrice(Product product, Member member) {
int hour = LocalTime.now().getHour();
if (hour >= 6 && hour < 10) {
return product.getPrice().multiply(new BigDecimal("0.9")); // 早市9折
} else if (hour >= 16 && hour < 19) {
return product.getPrice().multiply(new BigDecimal("0.8")); // 晚市8折
}
return product.getPrice();
}
}
4.2 库存预警系统
设计了三层预警机制:
- 库存量预警
- 保质期预警
- 滞销商品预警
5. 部署与调优
5.1 系统部署方案
推荐部署环境:
- JDK 17
- MySQL 8.0
- Redis 6.x
- Nginx(前端静态资源)
5.2 性能优化要点
- 商品列表页添加Redis缓存
- 使用MyBatis二级缓存
- 配置连接池(HikariCP推荐配置)
yaml复制# application.yml中的关键配置
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
idle-timeout: 30000
max-lifetime: 1800000
cache:
type: redis
redis:
time-to-live: 3600000 # 1小时
6. 常见问题解决方案
6.1 商品库存超卖问题
解决方案:
- 使用乐观锁(version字段)
- Redis分布式锁
- 数据库行级锁
java复制// 使用乐观锁防止超卖
@Transactional
public boolean reduceStock(Long productId, Integer quantity) {
Product product = productMapper.selectById(productId);
if (product.getStock() < quantity) {
throw new RuntimeException("库存不足");
}
int updated = productMapper.updateStock(productId, quantity, product.getVersion());
if (updated == 0) {
throw new RuntimeException("并发修改冲突");
}
return true;
}
6.2 定时任务设计
使用Spring Scheduled实现:
- 每日凌晨统计昨日销量
- 每小时检查库存预警
- 每30分钟检查临近保质期商品
java复制// 定时任务示例
@Scheduled(cron = "0 0 0 * * ?")
public void dailySalesReport() {
log.info("开始生成每日销售报表...");
// 报表生成逻辑
}
7. 项目扩展方向
- 微信小程序端:使用uniapp开发移动端
- 数据分析看板:集成ECharts实现销售可视化
- 供应商对接:开发供应商门户子系统
- 智能推荐:基于用户购买历史的推荐算法
我在实际开发中发现,生鲜类系统最需要关注的是实时性和数据一致性。特别是在促销活动期间,系统要能承受突发流量,同时保证库存数据的准确。建议在正式上线前做好压力测试,模拟高峰时段的并发场景。
