1. 项目概述
这个基于SpringBoot和微信小程序的超市购物系统,是我去年为一个社区连锁超市开发的线上销售平台。系统上线后3个月内,帮助该超市线上订单量提升了47%,客单价提高了23%。整套系统采用前后端分离架构,前端使用微信小程序原生开发,后端基于SpringBoot 2.7.3构建,数据库选用MySQL 8.0。
提示:源码包中的数据库脚本已经包含了完整的测试数据,可以直接导入使用。建议开发时先运行小程序端查看完整交互效果,再对照源码理解实现逻辑。
2. 技术架构解析
2.1 前端技术栈
微信小程序端采用经典的三层目录结构:
pages/存放所有页面文件components/封装公共组件utils/放置工具类和网络请求封装
特别值得关注的是商品详情页的图片懒加载实现。我们通过intersectionObserver API监听图片是否进入视口,配合wx.createIntersectionObserver()实现:
javascript复制// 商品详情页的图片懒加载实现
const observer = wx.createIntersectionObserver(this)
observer.relativeToViewport()
.observe('.lazy-img', (res) => {
if(res.intersectionRatio > 0){
this.setData({ isImgLoaded: true })
}
})
2.2 后端技术栈
SpringBoot后端采用经典的三层架构:
- Controller层:处理HTTP请求,参数校验
- Service层:业务逻辑实现
- DAO层:数据库操作
支付模块采用了策略模式设计,支持微信支付和模拟支付两种方式:
java复制// 支付策略接口
public interface PaymentStrategy {
PaymentResult pay(Order order);
}
// 微信支付实现
@Service
public class WechatPayment implements PaymentStrategy {
@Override
public PaymentResult pay(Order order) {
// 调用微信支付API
}
}
3. 核心功能实现
3.1 购物车设计
购物车模块采用Redis缓存+MySQL持久化的混合存储方案:
- 用户未登录时:数据存储在本地Storage
- 用户登录后:同步到服务端Redis
- 下单时:持久化到MySQL
关键数据结构设计:
java复制public class CartItem {
private Long skuId; // 商品SKU ID
private Integer quantity; // 购买数量
private Boolean selected; // 是否选中
private Long addTime; // 添加时间戳
}
3.2 订单生成流程
订单生成采用分布式事务保证数据一致性:
- 创建订单主表记录(状态:待支付)
- 扣减库存(Redis原子操作)
- 生成支付流水
- 清理购物车
注意:库存扣减一定要放在订单创建之后,避免超卖问题。我们使用Redis的WATCH+MULTI实现:
java复制redisTemplate.execute(new SessionCallback<>() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
operations.watch(key);
// 检查库存
Integer stock = (Integer) operations.opsForValue().get(key);
if(stock >= quantity) {
operations.multi();
operations.opsForValue().decrement(key, quantity);
return operations.exec();
}
return null;
}
});
4. 性能优化实践
4.1 首页加载优化
通过以下措施将首页加载时间从2.1s降至0.8s:
- 商品分类数据缓存到Redis,TTL设置30分钟
- 热门商品列表启用Spring Cache
- 图片使用CDN加速
- 小程序端启用本地缓存策略
缓存配置示例:
java复制@Cacheable(value = "hotProducts", key = "#categoryId")
public List<Product> getHotProducts(Long categoryId) {
// 数据库查询逻辑
}
4.2 数据库优化
针对订单查询慢的问题,我们采取了以下优化:
- 为常用查询字段添加组合索引
- 大表进行水平分表(按月份拆分)
- 使用Elasticsearch实现商品搜索
分表策略配置:
yaml复制# application.yml
sharding:
jdbc:
datasource:
names: ds0,ds1
config:
sharding:
tables:
t_order:
actual-data-nodes: ds$->{0..1}.t_order_$->{2023..2024}0$->{1..9}
table-strategy:
inline:
sharding-column: create_time
algorithm-expression: t_order_$->{create_time.getYear()}$->{create_time.getMonthValue()}
5. 安全防护措施
5.1 接口安全
- 所有API接口添加JWT鉴权
- 敏感参数使用AES加密传输
- 启用Spring Security防护CSRF攻击
- 接口限流(Guava RateLimiter)
JWT配置示例:
java复制@Configuration
public class JwtConfig {
@Bean
public FilterRegistrationBean<JwtFilter> jwtFilter() {
FilterRegistrationBean<JwtFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new JwtFilter());
registration.addUrlPatterns("/api/*");
return registration;
}
}
5.2 支付安全
- 支付签名使用双重验证(前端+服务端)
- 支付回调接口验证签名和订单金额
- 敏感操作添加短信验证
- 支付日志完整审计
支付回调验证逻辑:
java复制public boolean verifyWechatPayment(Map<String, String> params) {
// 验证签名
String localSign = generateSign(params, apiKey);
if(!localSign.equals(params.get("sign"))) {
return false;
}
// 验证订单金额
Order order = orderService.getById(params.get("out_trade_no"));
return order.getTotalAmount().compareTo(new BigDecimal(params.get("total_fee"))) == 0;
}
6. 部署与监控
6.1 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6
ports:
- "6379:6379"
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
6.2 监控方案
- SpringBoot Actuator暴露健康检查
- Prometheus采集指标数据
- Grafana展示监控图表
- ELK收集业务日志
Actuator配置示例:
properties复制# application.properties
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.metrics.tags.application=supermarket-system
7. 开发注意事项
- 微信小程序要求所有请求域名必须备案,开发阶段可以在微信开发者工具中勾选"不校验合法域名"
- 商品图片上传需要使用微信的临时文件路径转换:
javascript复制wx.uploadFile({
filePath: tempFilePath,
name: 'file',
success(res) {
// 处理返回的永久链接
}
})
- 支付功能开发需要配置微信商户平台密钥,测试阶段可以使用沙箱环境
- 小程序审核时需要注意:
- 不能有测试数据
- 支付流程必须完整可验证
- 用户协议和隐私政策必须明确
8. 扩展建议
- 可以增加会员积分系统,与购物车联动
- 接入智能推荐算法,提升客单价
- 开发管理端微信小程序,方便店主移动办公
- 增加商品评价和晒单功能
- 对接第三方配送平台接口
这套系统经过三个月的迭代开发,目前已经稳定运行9个月。最大的收获是理解了如何在高并发场景下保证数据一致性,特别是在促销活动时,我们通过Redis分布式锁+库存预扣减的方案,成功应对了每秒300+的订单创建请求。
