1. 项目概述:从零构建前后端分离的外卖小程序
"苍穹外卖"是一个典型的商业级微信小程序项目,采用前后端分离架构,后端基于Java技术栈开发,前端使用微信小程序原生框架。这个项目完整覆盖了从本地开发环境搭建到线上部署的全流程,是学习现代企业级应用开发的优质案例。
作为一名经历过多个商业项目的老兵,我认为这类实战教程的价值在于还原真实开发场景。不同于简单的Demo练习,"苍穹外卖"涉及订单状态机设计、第三方支付对接、微信生态集成等实际业务难点。特别是前后端分离模式下,开发者需要掌握API契约管理、跨域解决方案、JWT鉴权等关键技术点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端技术栈选型
Spring Boot 2.7 + MyBatis-Plus构成了我们的核心后端框架。选择这个组合主要基于:
- Spring Boot的自动配置特性大幅减少了XML配置
- MyBatis-Plus的ActiveRecord模式简化了DAO层开发
- 内置分页插件完美支持移动端分页需求
数据库采用MySQL 8.0,特别注意了以下几点设计:
sql复制CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '订单流水号',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0待支付 1已支付 2已取消',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
`wx_openid` varchar(64) NOT NULL COMMENT '微信用户标识',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_openid` (`wx_openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2.2 前端技术方案
微信小程序端采用原生WXML+WXSS开发,没有选用uniapp等跨平台方案,主要考虑:
- 直接使用微信官方组件性能更优
- 避免跨平台框架的兼容性问题
- 方便调用微信原生API(如获取用户手机号)
关键目录结构示例:
code复制/miniprogram
/components # 公共组件
/pages # 页面目录
/order # 订单模块
index.json
index.wxml
index.wxss
index.js
/utils # 工具类
app.js # 小程序入口
app.json # 全局配置
3. 前后端协作规范
3.1 API契约管理
我们使用Swagger + YAPI搭建接口文档平台,具体实践:
- 后端通过注解自动生成Swagger文档
- 使用YAPI的Mock功能实现前后端并行开发
- 接口变更时通过Webhook通知前端团队
示例订单创建接口:
java复制@RestController
@RequestMapping("/api/order")
@Api(tags = "订单管理")
public class OrderController {
@PostMapping
@ApiOperation("创建订单")
public Result<OrderVO> createOrder(
@RequestBody @Valid OrderCreateDTO dto,
@RequestHeader("Authorization") String token) {
// 业务逻辑实现
}
}
3.2 跨域解决方案
开发环境采用CORS方案,生产环境使用Nginx反向代理。特别注意微信小程序要求的HTTPS协议:
nginx复制# Nginx配置示例
location /api/ {
proxy_pass http://backend-service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
add_header Access-Control-Allow-Origin $http_origin;
add_header Access-Control-Allow-Credentials true;
}
4. 核心业务实现
4.1 微信支付集成
支付流程实现要点:
- 小程序端调用wx.login获取code
- 后端用code换取openid
- 调用微信支付统一下单API
- 返回支付参数给小程序端
关键安全措施:
java复制// 支付签名验证
public boolean verifySign(Map<String,String> params, String signKey){
String sign = params.remove("sign");
String localSign = generateSign(params, signKey);
return sign != null && sign.equals(localSign);
}
4.2 订单状态管理
采用状态机模式设计订单流转:
java复制public enum OrderStatus {
UNPAID(0, "待支付") {
@Override
public boolean canChangeTo(OrderStatus newStatus) {
return newStatus == PAID || newStatus == CANCELLED;
}
},
PAID(1, "已支付") {
// 其他状态转换逻辑
};
// 枚举实现
}
5. 部署实践
5.1 后端部署方案
采用Docker + Jenkins持续部署:
dockerfile复制# Dockerfile示例
FROM openjdk:17-jdk-alpine
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Jenkins关键配置:
- 代码检出后执行mvn clean package
- 构建成功后通过SSH插件推送到服务器
- 执行docker-compose up -d重新部署
5.2 小程序发布流程
- 开发版本:使用微信开发者工具测试
- 体验版本:上传供测试人员验证
- 审核版本:提交微信官方审核
- 生产版本:审核通过后发布
特别注意:微信小程序要求所有接口必须为HTTPS,且域名需要备案
6. 性能优化实践
6.1 数据库优化
- 为高频查询字段添加合适索引
- 采用Sharding-JDBC实现水平分片
- 使用Redis缓存热点数据
示例缓存策略:
java复制@Cacheable(value = "menu", key = "#shopId")
public List<MenuVO> getByShopId(Long shopId) {
return menuMapper.selectByShopId(shopId);
}
6.2 小程序端优化
- 使用分包加载减少首包体积
- 图片资源走CDN加速
- 合理使用setData局部更新
性能检测工具:
- 微信开发者工具Audits面板
- 自定义性能埋点
- 使用wx.getPerformance()API
7. 常见问题排查
7.1 微信登录失败
典型错误场景:
- code无效或过期(有效期5分钟)
- appid与secret不匹配
- 服务器IP未加入微信白名单
排查步骤:
- 检查网络请求是否到达后端
- 验证微信API返回的errmsg
- 核对微信开放平台配置
7.2 支付回调处理
关键注意事项:
- 必须处理重复通知
- 做好日志记录
- 实现异步补单机制
回调处理示例:
java复制@PostMapping("/pay/notify")
public String handleNotify(@RequestBody String xmlData) {
// 1. 验签
// 2. 处理业务
// 3. 返回成功XML
return "<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>";
}
8. 项目扩展方向
- 增加管理后台:使用Vue+ElementUI构建
- 实现数据大屏:Echarts可视化
- 接入智能推荐:基于用户历史订单
- 开发配送系统:集成地图API
技术演进建议:
- 微服务化改造
- 引入消息队列削峰
- 实现灰度发布能力
这个项目最让我印象深刻的是状态机设计在业务逻辑中的巧妙应用。在实际开发中,我建议使用状态模式+策略模式组合来实现复杂的订单流转,这样当新增状态时只需添加新的策略类,不会影响现有代码。另外,微信小程序的setData操作非常昂贵,应该避免频繁调用和大数据量传输,这是很多新手容易忽视的性能陷阱。
