1. 项目概述
这个微信外卖小程序系统是一个典型的O2O(Online To Offline)电商平台,采用前后端分离架构。前端基于微信小程序开发框架,后端采用Java+Spring技术栈,数据库选用MySQL。系统主要包含三个角色:管理员、商家和用户,实现了从商家入驻、商品上架到用户下单的完整外卖业务流程。
提示:微信小程序作为轻量级应用,具有即用即走、无需安装的特点,非常适合外卖这类高频次、碎片化使用的场景。
我在实际开发中发现,微信小程序的外卖系统相比传统APP有几个显著优势:
- 开发成本低,无需考虑iOS和Android的兼容性问题
- 获客成本低,可以通过微信社交关系链快速传播
- 用户使用门槛低,无需下载安装
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 前端技术选型
前端采用微信小程序原生开发框架,主要基于以下考虑:
- 性能优于第三方框架(如uni-app等)
- 可以第一时间使用微信最新API
- 调试工具完善,开发体验好
核心页面结构:
code复制pages/
├── index/ # 首页
├── shop/ # 商家列表
├── food/ # 商品详情
├── order/ # 订单相关
└── user/ # 个人中心
2.2 后端技术栈
后端采用Spring Boot + MyBatis组合,这是经过多个项目验证的稳定方案:
- Spring Boot 2.7.x:简化配置,内嵌Tomcat
- MyBatis-Plus 3.5.x:增强的ORM框架,减少SQL编写
- Redis 6.x:缓存热点数据,如商家信息、商品信息
- RabbitMQ 3.9.x:处理异步任务,如订单超时取消
数据库表主要设计:
sql复制CREATE TABLE `merchant` (
`id` bigint NOT NULL AUTO_INCREMENT,
`account` varchar(32) NOT NULL COMMENT '商家账号',
`name` varchar(64) NOT NULL COMMENT '商家名称',
`shop_name` varchar(128) NOT NULL COMMENT '店铺名称',
`address` varchar(255) NOT NULL COMMENT '店铺地址',
`delivery_price` decimal(10,2) DEFAULT '0.00' COMMENT '配送费',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_account` (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能实现
3.1 商家入驻流程
商家端采用多步骤表单设计,提高信息填写完成率:
- 基础信息:店铺名称、联系方式等
- 资质认证:营业执照、食品经营许可证上传
- 配送设置:配送范围、起送价、配送费
- 商品管理:初始化添加商品
关键代码示例(商家入驻审核):
java复制@PostMapping("/merchant/apply")
public Result applyMerchant(@Valid @RequestBody MerchantApplyDTO dto) {
// 1. 验证资质图片是否上传
if(StringUtils.isEmpty(dto.getLicenseUrl())) {
return Result.fail("请上传营业执照");
}
// 2. 保存商家信息
Merchant merchant = new Merchant();
BeanUtils.copyProperties(dto, merchant);
merchant.setStatus(0); // 待审核状态
merchantService.save(merchant);
// 3. 发送审核通知
mqTemplate.send("merchant.audit", merchant.getId());
return Result.success();
}
3.2 用户下单流程
订单模块采用状态机模式设计,确保状态流转可控:
code复制待支付 → 已支付 → 商家接单 → 配送中 → 已完成
↘ 取消(用户) ↘ 取消(商家) ↘ 取消(超时)
关键表设计:
sql复制CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '订单编号',
`user_id` bigint NOT NULL,
`merchant_id` bigint NOT NULL,
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0待支付 1已支付...',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单总额',
`pay_time` datetime DEFAULT NULL COMMENT '支付时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_merchant` (`merchant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 性能优化实践
4.1 缓存策略设计
采用多级缓存提升系统响应速度:
- 本地缓存:使用Caffeine缓存商家基础信息,有效期5分钟
- 分布式缓存:Redis缓存热门商品数据,设置不同过期时间
- 数据库缓存:MySQL查询缓存(针对配置类数据)
缓存更新策略:
java复制@CacheEvict(value = "merchant", key = "#merchantId")
public void updateMerchant(Long merchantId, MerchantUpdateDTO dto) {
// 先更新数据库
merchantMapper.updateById(convertToEntity(dto));
// 异步刷新缓存
mqTemplate.send("cache.refresh", "merchant:" + merchantId);
}
4.2 高并发处理
针对秒杀、促销场景的特殊设计:
-
库存扣减:采用Redis原子操作+Lua脚本
lua复制local stock = tonumber(redis.call('GET', KEYS[1])) if stock <= 0 then return 0 end redis.call('DECR', KEYS[1]) return 1 -
订单创建:消息队列削峰填谷
java复制@RabbitListener(queues = "order.create") public void handleOrderCreate(OrderCreateDTO dto) { // 1. 校验库存 // 2. 创建订单 // 3. 超时未支付取消 }
5. 安全防护措施
5.1 接口安全
-
签名验证:所有API请求需携带签名参数
java复制public boolean checkSign(HttpServletRequest request) { String sign = request.getHeader("X-Sign"); String timestamp = request.getHeader("X-Timestamp"); // 验证时间戳有效期(防止重放攻击) // 验证签名是否正确 } -
敏感数据加密:用户手机号、地址等采用AES加密存储
5.2 支付安全
- 支付回调验证:校验微信支付签名
- 金额校验:比较回调金额与订单金额
- 幂等处理:防止重复回调
java复制@PostMapping("/pay/callback")
public String payCallback(HttpServletRequest request) {
// 1. 验证签名
if(!wxPayService.verifySign(request)) {
return "fail";
}
// 2. 处理业务
String orderNo = request.getParameter("out_trade_no");
orderService.handlePaySuccess(orderNo);
return "success";
}
6. 部署实施方案
6.1 服务器配置建议
生产环境推荐配置:
- 前端:腾讯云CDN加速静态资源
- 后端:2核4G服务器 × 2(负载均衡)
- 数据库:MySQL 8.0 主从架构
- 缓存:Redis哨兵模式
6.2 持续集成方案
基于Jenkins的自动化部署流程:
- 代码提交触发Git Webhook
- Jenkins拉取代码执行构建
- 运行单元测试
- 打包Docker镜像
- 滚动更新服务
dockerfile复制FROM openjdk:11-jre
COPY target/app.jar /app/
WORKDIR /app
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
7. 项目优化方向
在实际运营中,可以考虑以下优化:
- 智能推荐:基于用户历史订单推荐商品
- 配送路线规划:集成地图API优化配送路径
- 会员体系:增加积分、优惠券等营销工具
- 数据分析:使用ELK收集分析用户行为数据
经验分享:在开发微信小程序时,一定要注意分包加载策略。我们将商家列表、商品详情等高频访问的页面放在主包,将个人中心、订单历史等低频功能放在子包,显著提升了首屏加载速度。
这个项目从技术选型到架构设计都遵循了"简单有效"的原则,没有过度设计,但确保了核心业务流程的稳定性和扩展性。在实际开发中,最大的挑战是订单状态的并发控制,我们最终采用数据库乐观锁+消息队列的方案,既保证了性能又确保了数据一致性。
