简介:这是一套基于Java开发的微信外卖小程序系统完整源码,面向餐饮、商超等需要搭建在线订餐平台的开发者与商家,提供前后端一体的解决方案,可支持商家入驻、骑手接单、用户下单支付等完整业务闭环。压缩包共2825个文件,约27.61MB,以log运行日志、fr3报表模板、pdf说明文档为主,另含dll动态库、data数据文件、grf配置、ini与txt配置说明、jpg/bmp图标素材及少量exe、lib、h头文件等,覆盖源码、数据库与部署所需资源。系统包含商家管理、骑手管理、用户端小程序、订单处理、数据库设计、安全性与性能优化、多场景适用及API接口对接等模块,订单从创建、支付确认、商家接单、骑手分配到配送跟踪全程自动化。目前已有908人学习下载,适合需要二次开发、定制化改造或学习微信小程序与Java后端整合的开发者参考,可快速理解外卖系统的整体架构与业务实现。
1. 从一份“文件清单”说起:这套微信外卖小程序源码到底能跑通什么
如果你拿到一个压缩包,解压后第一眼看到的不是pom.xml,而是一串fpdfcjk.bin、左侧图标.bmp、顶端图标.bmp、license.dat、AAAemployee.rls.data、AAAemployee.fr3.data、AAAtest.rls.data、AAAtest.fr3.data、test.rls.data、test.fr3.data,大概率会愣一下——这到底是外卖系统还是报表工具?我一开始也这么想。后来把目录翻完才明白,这是一套 Java 开发的微信外卖小程序完整源码,前端小程序、后端服务、数据库脚本都在,商家端、骑手端、用户端三端齐全,支持商家入驻、菜单管理、骑手接单、订单全流程跟踪。那堆.fr3、.rls是 FastReport 的报表模板和资源文件,fpdfcjk.bin是 PDF 中文字体包,license.dat是报表组件的授权文件。换句话说,这套源码不只是“能下单”,还带了后台打印小票、导出对账单这类线下运营真正用得上的东西。适合谁?想拿一套能跑的外卖系统做二次开发的后端、想研究小程序+Java 全栈怎么串起来的学生、以及需要快速搭一个同城配送 Demo 的小团队。下面我按“先看懂结构、再跑起来、最后避坑”的顺序拆一遍。
2. 拆包先看骨架:Java 后端 + 小程序前端 + 数据库三件套怎么对号入座
2.1 目录结构里藏着的技术栈信息
拿到源码别急着mvn spring-boot:run,先把根目录扫一遍。常见做法是分三个顶层目录:wxapp(微信小程序端)、server(Java 后端)、sql(数据库脚本)。server下面一般能看到pom.xml或build.gradle,从依赖里就能确认技术栈——Spring Boot 做 Web 层,MyBatis 或 MyBatis-Plus 做持久层,MySQL 存业务数据,Redis 缓存会话和订单状态,WebSocket 推骑手位置。小程序端则是原生 WXML/WXSS 或者 uni-app 编译产物,app.json里注册页面,utils/request.js里封装wx.request。
那堆报表文件通常在server/src/main/resources/report下。.fr3是 FastReport 的模板文件,.rls是资源包,fpdfcjk.bin给 PDF 导出提供中文字形,license.dat控制报表组件授权。如果你不打算用报表功能,这几个文件可以先不动,但别删——删了启动时如果报表初始化代码没做空判断,会直接抛异常。
2.2 数据库表关系:订单表是中心,骑手和商家挂在两边
数据库脚本一般在sql/下,文件名类似waimai.sql。导入前先看字符集,必须是utf8mb4,否则微信昵称里的 emoji 会变问号。核心表大概这几张:
| 表名 | 作用 | 关键外键 |
|---|---|---|
user | 用户信息 | — |
merchant | 商家店铺 | user_id |
product | 商品/菜单 | merchant_id |
orders | 订单主表 | user_id、merchant_id、rider_id |
order_detail | 订单明细 | order_id、product_id |
rider | 骑手信息 | user_id |
delivery | 配送轨迹 | order_id、rider_id |
orders表是枢纽,status字段驱动整个流程:待支付、已支付、商家接单、骑手接单、配送中、已完成、已取消。常见做法是用枚举类在 Java 侧映射,数据库存 tinyint。导入时注意外键顺序,先导user、merchant,再导product,最后导orders和order_detail,否则外键约束会拦你。
2.3 后端启动前必须改的三个配置
配置文件通常是application.yml或application-dev.yml。不改直接启动,大概率连不上数据库。
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/waimai?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai username: root password: 你的密码 redis: host: 127.0.0.1 port: 6379 database: 0 wx: appid: 你的小程序AppID secret: 你的小程序Secreturl里的serverTimezone必须设,不然订单创建时间会差 8 小时,骑手看到的“预计送达”全是错的。wx.appid和secret在小程序后台“开发管理-开发设置”里拿,不填的话登录接口会返回40029 invalid code。Redis 如果本机没装,可以先把缓存相关代码注释掉跑通主流程,但订单状态并发更新会出问题,建议还是装一个。
3. 把系统跑起来:从数据库导入到小程序真机预览的完整链路
3.1 数据库导入与初始数据检查
先建库再导表,命令行操作最稳:
mysql -uroot -p -e "CREATE DATABASE waimai DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" mysql -uroot -p waimai < sql/waimai.sql mysql -uroot -p waimai -e "SHOW TABLES;"导入后检查三件事:一是merchant表里有没有测试商家,没有的话商家端登录后是空列表;二是product表有没有关联到商家,否则用户端搜不到商品;三是orders表是否为空,空表说明脚本只建了结构没插数据。常见做法是脚本末尾带几条INSERT测试数据,如果没带,自己手动插一条商家和两个商品,后面调试会方便很多。
3.2 后端编译与启动:注意 JDK 版本和 Maven 镜像
cd server mvn clean package -DskipTests java -jar target/waimai-server-1.0.0.jar --spring.profiles.active=dev-DskipTests不是偷懒,是有些源码包里的测试用例依赖外部微信接口,跑测试会卡住。JDK 版本看pom.xml里的<java.version>,常见是 1.8 或 11,用 17 跑可能会遇到javax包迁移问题。Maven 拉依赖慢的话,在settings.xml里换国内镜像。启动成功后控制台会打印Started Application in x.x seconds,这时候用浏览器访问http://localhost:8080/doc.html(如果集成了 Swagger)能看到接口列表,说明后端通了。
3.3 小程序端配置与真机预览
小程序端用微信开发者工具打开wxapp目录。第一件事改utils/config.js或app.js里的baseUrl,指向你后端所在机器的局域网 IP,不能写localhost,因为真机预览时手机访问不到你电脑的localhost。
// wxapp/utils/config.js const config = { baseUrl: 'http://192.168.1.100:8080/api', // 改成你电脑的局域网IP appid: '你的小程序AppID' } export default config改完在开发者工具里点“编译”,模拟器能下单后,再点“预览”用手机扫码。手机和电脑必须在同一个 WiFi 下。如果真机请求失败,先看开发者工具的“网络”面板,确认请求发出去没有;再看后端控制台有没有收到请求。常见坑是微信开发者工具默认校验合法域名,真机预览时非 HTTPS 请求会被拦,需要在“详情-本地设置”里勾上“不校验合法域名”。
3.4 商家端和骑手端的入口在哪
商家端和骑手端通常不是独立小程序,而是同一小程序里通过角色区分页面。登录后根据role字段跳不同 tab:用户看到首页和订单,商家看到“我的店铺”和“接单”,骑手看到“附近订单”和“配送中”。如果登录后页面空白,检查user表里对应用户的role字段是不是 1(商家)或 2(骑手)。有些源码包把商家端单独放在merchant目录下,需要另开一个开发者工具窗口导入,具体看project.config.json的miniprogramRoot指向哪里。
4. 避坑与排查:这套源码跑不起来时先查这五处
4.1 启动报Table 'waimai.xxx' doesn't exist
现象:后端启动时 MyBatis 抛异常,提示某张表不存在。原因:数据库脚本没导全,或者导到了错误的库。解决:SHOW TABLES确认表数量,对照sql文件里的CREATE TABLE语句逐张核对。如果脚本里有USE waimai;但你手动建了别的库名,改脚本或改配置里的库名保持一致。
4.2 小程序请求返回40029 invalid code
现象:用户端点登录,后端返回微信接口错误码 40029。原因:wx.appid和secret没填、填错,或者code被重复使用。解决:确认配置文件里的 AppID 和 Secret 与小程序后台一致;wx.login拿到的code只能用一次,如果前端在onLoad和按钮点击里各调了一次登录,第二次就会失败。把登录逻辑收敛到一个地方。
4.3 订单状态卡在“已支付”不动
现象:用户付完款,商家端看不到新订单。原因:支付回调地址没配,或者回调接口被 Spring Security 拦了。解决:检查微信支付商户平台里的回调 URL 是否指向你的后端公网地址;检查后端SecurityConfig里有没有放行/api/pay/notify。本地调试可以用内网穿透工具把回调打到本机,但注意回调必须走 HTTPS。
4.4 骑手位置不更新
现象:骑手端显示“配送中”,但用户端地图上骑手图标不动。原因:WebSocket 没连上,或者骑手端没定时上报位置。解决:看后端 WebSocket 配置的路径和小程序端wx.connectSocket的 URL 是否一致;骑手端一般用wx.startLocationUpdate加定时器上报,检查有没有在onHide时停掉,不然真机上会一直弹定位授权。
4.5 报表导出中文乱码
现象:后台导出订单 PDF,中文全是方块。原因:fpdfcjk.bin没放对位置,或者 FastReport 的字体设置没指向它。解决:确认fpdfcjk.bin在resources/report下,且代码里加载字体时用的是相对路径。如果用的是绝对路径,换机器就挂。另外license.dat过期也会导致报表导出失败,但报错信息通常很隐晦,先看日志里有没有license关键字。
5. 二次开发前先做这三件事:接口鉴权、订单幂等、报表复用
跑通之后别急着改业务代码,先把三个地方加固,不然后面越改越乱。第一是接口鉴权。这套源码常见做法是用 JWT 在登录后发 token,小程序端存storage,每次请求带Authorization头。但有些包为了调试方便,把拦截器关了。你需要在WebMvcConfig里重新注册拦截器,排除登录和支付回调接口,其余全部校验 token。第二是订单幂等。用户手抖连点两次提交,会生成两笔订单。常见做法是在orders表加唯一索引(user_id, out_trade_no),out_trade_no由前端生成 UUID 传过来,后端插入时捕获DuplicateKeyException直接返回已有订单。第三是报表复用。那堆.fr3模板不用重写,FastReport 的设计器可以打开编辑,把里面的字段名改成你数据库里的列名即可。AAAemployee.fr3和AAAtest.fr3大概率是示例模板,真正要改的是订单小票模板,找到打印小票的接口,看它加载的是哪个.fr3,复制一份改字段,别动原文件。
// 订单创建时的幂等处理示例 try { orderMapper.insert(order); } catch (DuplicateKeyException e) { // 唯一索引冲突,说明已存在,直接查出来返回 return orderMapper.selectByOutTradeNo(order.getOutTradeNo()); }out_trade_no建议用用户ID + 时间戳 + 随机数,长度别超过 32 位,微信支付要求 6 到 32 位。唯一索引建在out_trade_no单列上就够,不用复合索引,因为out_trade_no本身已经带了用户信息。
从那以后我每次拿到一套新源码,都强制先跑一遍“导入数据库 → 改配置 → 启动后端 → 真机预览”这条最小闭环,跑不通就不看业务代码。这套微信外卖小程序源码的闭环不算复杂,坑主要集中在配置和真机调试上,按上面的顺序走,半天能跑起来。希望帮到你。
本文还有配套的精品资源,点击获取