Spring Boot+微信小程序开发企业级外卖系统实战

Spring Boot+微信小程序开发企业级外卖系统实战 1. 项目概述《苍穹外卖-3》是一个基于Java技术栈的微信小程序项目采用前后端分离架构完整覆盖从开发到部署的全流程。这个项目非常适合想要学习企业级外卖系统开发的Java开发者特别是对Spring Boot、微信小程序开发和云部署感兴趣的工程师。作为一款实战型教程项目它模拟了真实外卖平台的业务场景包括用户端、商家端和骑手端三个核心模块。项目采用当前主流的技术组合后端使用Spring BootMyBatis Plus构建前端使用微信小程序原生开发前后端通过RESTful API进行数据交互。提示这个项目特别适合有一定Java基础但缺乏完整项目经验的开发者通过这个项目你可以掌握从需求分析到线上部署的完整开发流程。2. 技术架构解析2.1 前后端分离架构设计项目采用清晰的三层架构设计表现层微信小程序作为用户交互界面业务逻辑层Spring Boot实现核心业务逻辑数据访问层MyBatis Plus操作MySQL数据库前后端通过定义良好的API接口进行通信这种架构的优势在于前后端可以并行开发提高开发效率技术栈选择更加灵活便于单独扩展和部署更适合多端应用场景2.2 后端技术栈后端主要技术组件// 典型的后端依赖配置 dependencies { implementation org.springframework.boot:spring-boot-starter-web implementation com.baomidou:mybatis-plus-boot-starter:3.5.3 implementation mysql:mysql-connector-java:8.0.33 implementation org.projectlombok:lombok implementation com.alibaba:fastjson:2.0.23 implementation org.springframework.boot:spring-boot-starter-data-redis }关键组件说明Spring Boot简化Spring应用初始搭建和开发过程MyBatis Plus强大的ORM框架提供丰富的CRUD接口Redis用于缓存热点数据和会话管理Fastjson高效的JSON处理库2.3 前端技术栈微信小程序前端主要技术WXML类似HTML的标记语言WXSS类似CSS的样式语言JavaScript小程序逻辑层实现微信原生API调用微信提供的各种能力// 典型的小程序页面结构 Page({ data: { restaurants: [] }, onLoad() { wx.request({ url: https://api.example.com/restaurants, success: (res) { this.setData({restaurants: res.data}) } }) } })3. 核心功能实现3.1 用户认证与授权系统采用JWT(JSON Web Token)进行用户认证流程如下用户通过微信登录获取code后端用code向微信服务器换取openid生成JWT令牌返回给小程序后续请求携带JWT进行鉴权// JWT生成示例 public String generateToken(User user) { return Jwts.builder() .setSubject(user.getId().toString()) .setExpiration(new Date(System.currentTimeMillis() EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); }注意实际项目中应该将SECRET存储在配置文件中不要硬编码在代码里。3.2 订单业务流程订单是外卖系统的核心主要流程包括下单流程用户选择商品加入购物车提交订单并选择支付方式生成待支付订单支付成功后通知商家订单状态机graph LR 待支付 -- 已取消 待支付 -- 已支付 已支付 -- 商家已接单 商家已接单 -- 骑手已接单 骑手已接单 -- 配送中 配送中 -- 已完成3.3 微信支付集成集成微信支付的关键步骤小程序端调用wx.requestPayment发起支付后端生成预支付订单微信支付回调通知处理订单状态更新// 统一下单接口示例 public MapString, String createPrepayOrder(Order order) { MapString, String params new HashMap(); params.put(appid, appId); params.put(mch_id, mchId); params.put(nonce_str, generateNonceStr()); params.put(body, 苍穹外卖-订单支付); params.put(out_trade_no, order.getOrderNo()); params.put(total_fee, order.getTotalAmount().toString()); params.put(spbill_create_ip, order.getClientIp()); params.put(notify_url, notifyUrl); params.put(trade_type, JSAPI); params.put(openid, order.getUser().getOpenid()); // 生成签名并调用微信支付API String sign generateSign(params); params.put(sign, sign); return wxPayApi.unifiedOrder(params); }4. 项目部署实践4.1 本地开发环境搭建数据库准备CREATE DATABASE sky_takeaway CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Redis配置spring.redis.hostlocalhost spring.redis.port6379 spring.redis.password微信配置wx.app-id你的小程序appid wx.app-secret你的小程序secret wx.mch-id商户号 wx.api-key商户API密钥4.2 生产环境部署推荐使用Docker Compose进行容器化部署version: 3 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: sky_takeaway ports: - 3306:3306 volumes: - ./mysql/data:/var/lib/mysql redis: image: redis:6 ports: - 6379:6379 app: build: . ports: - 8080:8080 depends_on: - mysql - redis部署步骤构建Docker镜像docker-compose build启动服务docker-compose up -d查看日志docker-compose logs -f app4.3 微信小程序发布小程序发布流程开发完成后点击上传登录微信公众平台提交审核审核通过后发布上线配置服务器域名白名单注意确保所有使用的API域名都已添加到小程序后台的request合法域名列表中。5. 常见问题与解决方案5.1 跨域问题开发阶段常见跨域问题解决方案后端配置CORSConfiguration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(*) .allowedMethods(GET, POST, PUT, DELETE) .allowCredentials(true) .maxAge(3600); } }前端代理配置开发环境// project.config.json { setting: { urlCheck: false, es6: true, postcss: true, minified: true, newFeature: true }, appid: 你的appid, projectname: sky-takeaway, condition: { search: { current: -1, list: [] }, conversation: { current: -1, list: [] }, plugin: { current: -1, list: [] }, game: { current: -1, list: [] }, miniprogram: { current: -1, list: [] } } }5.2 微信登录失败常见原因及解决方案问题现象可能原因解决方案获取code失败小程序未正确配置检查appid配置换取openid失败服务器时间不同步同步服务器时间解密用户信息失败session_key过期重新登录获取新code接口调用频率超限频繁调用登录接口增加重试机制5.3 性能优化建议数据库优化为常用查询字段添加索引避免SELECT *只查询必要字段合理使用MyBatis Plus的二级缓存API优化合并细粒度接口为粗粒度接口使用DTO进行数据传输实现分页查询小程序优化使用分包加载图片使用CDN加速合理使用setData避免频繁更新6. 项目扩展方向完成基础功能后可以考虑以下扩展管理后台使用VueElement UI开发商家管理后台数据统计集成ECharts实现销售数据可视化消息推送使用WebSocket实现订单状态实时通知智能推荐基于用户历史订单实现菜品推荐多平台支持开发H5版本和APP版本我在实际开发中发现订单超时自动取消功能是一个很好的实践点可以通过Spring的Scheduled注解实现Scheduled(cron 0 */5 * * * ?) public void cancelUnpaidOrders() { LocalDateTime timeout LocalDateTime.now().minusMinutes(30); ListOrder unpaidOrders orderMapper.selectUnpaidBefore(timeout); unpaidOrders.forEach(order - { order.setStatus(OrderStatus.CANCELLED); order.setCancelReason(超时未支付); orderMapper.updateById(order); // 释放库存等后续操作 }); }这个项目最值得关注的是它完整呈现了一个真实外卖系统的核心业务流程和技术实现特别是微信生态的深度整合经验这在当前移动互联网开发中非常有价值。