简介:这份代驾小程序源码基于微信小程序与PHP后端构建,版本为135k代驾v1.2.24,附带前端代码、后端程序及配置教程,面向希望研究代驾业务逻辑或二次开发的开发者与创业者。资源包共3153个文件,约50.95MB,其中1101个PHP文件构成后端核心,577个PNG与135个GIF提供界面素材,362个JS与121个CSS支撑前端交互,另有80个WXSS、78个WXML及100个JSON等小程序页面与配置文件,目录结构完整。功能上覆盖预付定金与抵扣设定、预售期结束自动抵扣课程价格、尾款支付、报名信息填写与后台订单查看,并支持多核销员微信扫码一键核销,减少人工记录成本。运行环境为Linux或宝塔面板,兼容PHP5.6与PHP7.3,需认证服务号及MySQL数据库。目前已有741人学习下载,适合具备一定PHP与小程序基础的读者下载研究,快速理解代驾类项目的完整实现思路。
1. 代驾小程序源码拿到手之后:135k 代驾 v1.2.24 到底能跑出什么
代驾小程序源码这个方向,最近问的人明显变多了。我手上这套 135k 代驾 v1.2.24,前端加后端一起给,还带配置教程,属于那种「拿到就能拆、拆完能改、改完能上线试水」的完整包。它解决的不是「代驾业务怎么做大」这种战略问题,而是更靠前的一步:你手里有一个能跑起来的代驾小程序,司机端、用户端、订单流转、计价规则都在,你可以直接看它怎么把「用户下单—司机接单—行程计费—订单结算」这条链路串起来。
适合谁看?三类人。第一类是想做本地代驾、跑腿类小程序的创业者,需要一套能快速验证业务的底座;第二类是接私活的前后端开发者,客户要代驾小程序,你不想从零写;第三类是想学前后端分离项目实战的学生或转行者,这套源码的目录结构、接口分层、数据库设计,比很多教学项目更接近真实业务。下面我按「先看懂结构,再本地跑通,最后改出你自己的东西」这条线讲,中间会穿插我踩过的坑和参数怎么调。
2. 拆开 135k 代驾 v1.2.24:前端、后端、数据库三层怎么分
2.1 目录结构先看这三层,别急着改代码
拿到源码包,第一件事不是打开编辑器,而是把目录树看清楚。135k 代驾 v1.2.24 的典型结构是前端、后端、数据库脚本三块。前端一般是微信小程序原生或者 uni-app 编译产物,后端常见的是 PHP 或 Java(SpringBoot)两种,这套包我见到的是 PHP 后端居多,因为代驾类小项目用 PHP 部署成本低。数据库是 MySQL,版本建议 5.7 或 8.0,8.0 要注意密码加密方式。
先执行下面这条命令看整体结构,别用鼠标一层层点:
# 查看源码包顶层目录,确认前端、后端、数据库脚本的位置 find . -maxdepth 2 -type d | sort # 输出示例: # ./backend 后端接口代码 # ./frontend 小程序前端代码 # ./database 数据库 SQL 脚本 # ./docs 配置教程和说明文档逻辑说明:-maxdepth 2限制只看到两层,避免目录太深刷屏。参数说明:-type d只看目录,不看文件。这一步的目的是让你在改任何代码之前,先知道「哪个文件夹是干什么的」。我见过太多人上来就改frontend/pages/order里的页面,结果后端接口对不上,白改。
2.2 后端接口分层:控制器、服务、模型别混着改
PHP 后端的代驾项目,常见框架是 ThinkPHP 或 Laravel。135k 代驾 v1.2.24 的后端一般分三层:Controller 接请求,Service 写业务逻辑,Model 管数据库。计价规则、司机接单逻辑、订单状态机都在 Service 层。你要改「起步价」「里程费」「夜间加价」,去 Service 里找,别在 Controller 里硬改。
// 典型计价逻辑位置:backend/app/service/OrderService.php public function calculatePrice($distance, $duration, $isNight) { $basePrice = config('price.base'); // 起步价,配置在 config/price.php $perKm = config('price.per_km'); // 每公里单价 $nightRate = $isNight ? config('price.night_rate') : 1; // 夜间系数 $price = ($basePrice + $distance * $perKm) * $nightRate; return round($price, 2); }逻辑说明:这段是计价核心,$distance是里程,$duration是时长,$isNight判断是否夜间。参数说明:config('price.base')这类配置建议单独放配置文件,不要写死在代码里,否则改价格要翻代码。我一般会把起步价、每公里单价、夜间系数、时长费四个参数做成后台可配,这样运营改价不用找你。
2.3 数据库表关系:订单表是核心,别漏了状态字段
代驾业务的数据库,核心表就几张:用户表、司机表、订单表、计价配置表、司机位置表。订单表里的status字段是状态机,常见取值:0 待接单、1 已接单、2 行程中、3 已完成、4 已取消。这个字段设计不好,后面订单流转全是坑。
-- 订单表核心字段(简化版) CREATE TABLE `order` ( `id` int NOT NULL AUTO_INCREMENT, `user_id` int NOT NULL COMMENT '用户ID', `driver_id` int DEFAULT NULL COMMENT '司机ID,未接单为空', `status` tinyint DEFAULT '0' COMMENT '0待接单 1已接单 2行程中 3已完成 4已取消', `start_address` varchar(255) DEFAULT NULL, `end_address` varchar(255) DEFAULT NULL, `distance` decimal(10,2) DEFAULT '0.00' COMMENT '里程,公里', `price` decimal(10,2) DEFAULT '0.00', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_status` (`status`), KEY `idx_driver` (`driver_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;逻辑说明:status加索引,因为司机端要频繁查「待接单」列表。driver_id加索引,因为要查某个司机的订单。参数说明:decimal(10,2)存金额和里程,别用 float,否则计价会出现 0.30000000000000004 这种玄学数字。utf8mb4支持 emoji,用户地址里可能有特殊字符。
3. 本地跑通 135k 代驾 v1.2.24:环境、配置、启动三步走
3.1 环境准备:PHP、MySQL、Nginx 版本别乱选
本地跑通这套源码,环境版本很关键。PHP 建议 7.4 或 8.0,MySQL 5.7 或 8.0,Nginx 1.18 以上。如果你用 PHP 8.1 以上,部分老代码会有兼容问题,比如each()函数被移除。我一般用宝塔面板或者 phpstudy 快速搭环境,省得配扩展。
# 检查 PHP 版本和必要扩展 php -v php -m | grep -E 'pdo_mysql|curl|gd|mbstring|openssl' # 如果缺扩展,Ubuntu 下安装示例: sudo apt install php7.4-pdo php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring逻辑说明:php -m列出已装扩展,grep过滤出代驾项目必须的几个。参数说明:pdo_mysql连数据库,curl调微信接口,gd处理图片,mbstring处理中文,openssl做加密。缺一个都可能报错,而且报错信息不一定直说缺扩展,可能是「数据库连接失败」这种误导性提示。
3.2 数据库导入与配置:SQL 文件怎么导、配置文件怎么改
数据库脚本在database目录,一般是一个.sql文件。导入之前先建库,字符集选utf8mb4。导入命令用source比图形界面稳,因为大文件图形界面容易断。
# 登录 MySQL 并导入 mysql -u root -p CREATE DATABASE daijia DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE daijia; SOURCE /path/to/database/daijia.sql; # 导入完成后检查表数量 SHOW TABLES;逻辑说明:SOURCE是 MySQL 客户端命令,不是 SQL 语句,所以不用分号结尾也可以。参数说明:utf8mb4_general_ci是排序规则,代驾项目用这个够用。导入后SHOW TABLES确认表都进来了,一般 15 到 25 张表。如果少表,看 SQL 文件是不是被截断了。
配置文件一般在backend/config/database.php或.env文件里。改数据库地址、用户名、密码、库名。改完别急着启动,先确认 PHP 能连上。
// backend/config/database.php 关键配置 return [ 'type' => 'mysql', 'hostname' => '127.0.0.1', 'database' => 'daijia', 'username' => 'root', 'password' => 'your_password', 'hostport' => '3306', 'charset' => 'utf8mb4', ];逻辑说明:hostname用127.0.0.1比localhost稳,因为localhost可能走 socket 连接,权限配置不一样。参数说明:password别用空密码,有些框架会拒绝。charset必须utf8mb4,和数据库一致。
3.3 前端配置与启动:小程序 AppID、接口地址、编译预览
前端如果是微信小程序原生,用微信开发者工具打开frontend目录。第一件事改project.config.json里的appid,换成你自己的测试号或正式号。第二件事改接口地址,一般在utils/config.js或common/config.js。
// frontend/utils/config.js const config = { baseUrl: 'http://127.0.0.1:8000/api', // 本地调试用本地地址 // baseUrl: 'https://your-domain.com/api', // 上线换成域名 appId: 'wx1234567890abcdef', version: '1.2.24' }; export default config;逻辑说明:baseUrl是后端接口前缀,本地调试指向你本机启动的后端服务。参数说明:微信开发者工具里要勾选「不校验合法域名」,否则http://127.0.0.1会被拦。上线时必须换成https域名,且在小程序后台配置合法域名。version字段有些项目用来做版本校验,别乱改。
后端启动用 PHP 内置服务器最快:
# 在 backend/public 目录下启动 cd backend/public php -S 127.0.0.1:8000 # 浏览器访问 http://127.0.0.1:8000/api/test 看是否返回逻辑说明:php -S是 PHP 内置开发服务器,适合本地调试,不适合生产。参数说明:127.0.0.1:8000是监听地址和端口,端口别和 MySQL、Nginx 冲突。如果返回 404,检查public目录下有没有index.php入口文件,以及伪静态规则。
4. 配置教程里没写全的坑:代驾小程序部署常见问题排查
4.1 接口 500 但日志没报错:先看 PHP 错误日志和权限
现象:前端请求接口返回 500,但后端日志文件空的。原因:PHP 错误没写到项目日志,而是写到了系统日志,或者runtime目录没写权限。解决:先看 Nginx 错误日志和 PHP 错误日志,再给runtime目录 755 或 777 权限。
# 查看 Nginx 错误日志 tail -f /var/log/nginx/error.log # 查看 PHP 错误日志位置 php -i | grep error_log # 给 runtime 目录权限 chmod -R 755 backend/runtime chown -R www-data:www-data backend/runtime逻辑说明:tail -f实时看日志,php -i看 PHP 配置。参数说明:www-data是 Nginx 或 Apache 的运行用户,不同系统可能叫nginx或apache。权限给 755 够用,777 只建议本地调试。
4.2 司机端定位不准:坐标系没转换
现象:司机端地图上位置偏移几百米甚至几公里。原因:微信小程序拿到的定位是wgs84,而地图 SDK 可能用gcj02,没转换。解决:在获取定位后做坐标系转换,或者统一用gcj02。
// 坐标系转换示例(wgs84 转 gcj02) function wgs84ToGcj02(lng, lat) { const a = 6378245.0; const ee = 0.00669342162296594323; let dLat = transformLat(lng - 105.0, lat - 35.0); let dLng = transformLng(lng - 105.0, lat - 35.0); const radLat = lat / 180.0 * Math.PI; let magic = Math.sin(radLat); magic = 1 - ee * magic * magic; const sqrtMagic = Math.sqrt(magic); dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI); dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * Math.PI); return [lng + dLng, lat + dLat]; }逻辑说明:这是标准转换算法,lng、lat是原始坐标,返回转换后坐标。参数说明:a是地球长半轴,ee是偏心率,这些是固定值。如果你不想自己写,可以用现成库,但要注意库的坐标系定义。
4.3 订单状态卡在「已接单」:状态机没加事务
现象:司机接单后,订单状态改了,但司机表里的「当前订单」没更新,或者反过来。原因:两个更新操作没放在同一个事务里,一个成功一个失败。解决:用数据库事务包起来。
// 接单逻辑加事务 Db::startTrans(); try { Db::name('order')->where('id', $orderId)->update(['status' => 1, 'driver_id' => $driverId]); Db::name('driver')->where('id', $driverId)->update(['current_order_id' => $orderId]); Db::commit(); } catch (\Exception $e) { Db::rollback(); return json(['code' => 500, 'msg' => '接单失败']); }逻辑说明:startTrans开始事务,commit提交,rollback回滚。参数说明:where('id', $orderId)是条件,update是更新内容。注意并发情况,两个司机同时接一单,要在where里加status=0条件,否则会超卖。
4.4 小程序真机预览接口不通:域名和 HTTPS 问题
现象:开发者工具里接口正常,真机预览请求失败。原因:真机不认http://127.0.0.1,也不认未备案域名。解决:本地调试用内网穿透或局域网 IP,上线必须 HTTPS 备案域名。
# 查看本机局域网 IP ifconfig | grep "inet " | grep -v 127.0.0.1 # 把前端 config.js 里的 baseUrl 改成 http://192.168.x.x:8000/api逻辑说明:真机和小程序开发者工具的网络环境不同,真机走的是手机网络。参数说明:192.168.x.x是局域网地址,手机和电脑要在同一个 WiFi 下。上线时在小程序后台「开发设置」里配置服务器域名,必须是 HTTPS。
4.5 计价金额对不上:浮点数精度和四舍五入
现象:用户看到的金额和后台算的差几分钱。原因:PHP 浮点数运算精度问题,或者四舍五入规则不一致。解决:金额用整数分存储,或者用bcmath扩展计算。
// 用 bcmath 计算金额,避免浮点误差 $basePrice = bcmul('8.00', '1', 2); // 起步价 $distanceFee = bcmul('2.50', '3.2', 2); // 里程费 $total = bcadd($basePrice, $distanceFee, 2); echo $total; // 输出 16.00逻辑说明:bcmul乘法,bcadd加法,第三个参数是小数位数。参数说明:金额建议统一用「分」做单位存整数,展示时再除以 100。如果不想改数据库,至少计算时用bcmath。
5. 从能跑到能改:135k 代驾 v1.2.24 的二次开发切入点
5.1 改计价规则:配置化比改代码更省事
这套源码的计价逻辑,如果你要改成「起步价 10 元含 3 公里,超出每公里 3 元,夜间 22 点到 6 点加收 20%」,别直接改OrderService.php里的数字。我一般把计价参数抽到数据库配置表,后台加个页面让运营自己改。
-- 计价配置表 CREATE TABLE `price_config` ( `id` int NOT NULL AUTO_INCREMENT, `base_price` decimal(10,2) DEFAULT '8.00' COMMENT '起步价', `base_km` decimal(10,2) DEFAULT '3.00' COMMENT '起步含公里数', `per_km` decimal(10,2) DEFAULT '2.50' COMMENT '超出每公里', `night_rate` decimal(10,2) DEFAULT '1.20' COMMENT '夜间系数', `night_start` time DEFAULT '22:00:00', `night_end` time DEFAULT '06:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;逻辑说明:把计价参数从代码里挪到数据库,改价格不用发版。参数说明:base_km是起步价包含的公里数,超出部分才按per_km算。night_rate是系数,1.2 表示加收 20%。night_start和night_end定义夜间时段。
5.2 加一个「预约代驾」功能:订单表加字段、前端加页面
代驾业务里预约单很常见。改造思路:订单表加order_type字段(0 即时,1 预约),加appoint_time字段。前端下单页加时间选择器。后端接单逻辑里,预约单不立即推给司机,而是到时间前 30 分钟才推。
ALTER TABLE `order` ADD COLUMN `order_type` tinyint DEFAULT '0' COMMENT '0即时 1预约'; ALTER TABLE `order` ADD COLUMN `appoint_time` datetime DEFAULT NULL COMMENT '预约时间';逻辑说明:加字段用ALTER TABLE,不影响现有数据。参数说明:order_type默认 0,老数据自动归为即时单。appoint_time为空表示即时单。改完记得在 Model 里加字段白名单,否则写入会被过滤。
5.3 司机端接单推送:轮询还是 WebSocket
代驾司机端要实时收到新订单。常见做法两种:轮询和 WebSocket。轮询实现简单,司机端每 5 秒请求一次「待接单列表」,但服务器压力大、有延迟。WebSocket 实时性好,但要额外维护长连接服务。135k 代驾 v1.2.24 默认一般是轮询,我建议小规模用轮询,司机超过 200 人再考虑 WebSocket。
// 司机端轮询示例 setInterval(() => { wx.request({ url: config.baseUrl + '/order/pending', method: 'GET', success(res) { if (res.data.code === 200 && res.data.data.length > 0) { // 有新订单,更新列表 this.setData({ pendingOrders: res.data.data }); } } }); }, 5000); // 5 秒一次逻辑说明:setInterval定时请求,5000是毫秒。参数说明:轮询间隔别低于 3 秒,否则服务器扛不住。可以在后端加缓存,减少数据库查询。如果司机端在后台运行,小程序会限制定时器,需要配合订阅消息。
5.4 上线前检查清单:这 6 项不过别发布
上线前我一般过一遍清单:第一,数据库密码别用 root 空密码;第二,runtime目录权限确认;第三,接口域名 HTTPS 且备案;第四,小程序后台配置合法域名;第五,计价规则用真实数据跑一遍;第六,订单状态流转每个环节点一遍。这 6 项里最容易翻车的是第三和第四,很多人本地跑通就以为能上线,结果真机请求全挂。
# 上线前检查 PHP 是否关闭错误显示 php -i | grep display_errors # 应该输出 display_errors => Off # 检查 Nginx 是否配置了 HTTPS 跳转 nginx -t逻辑说明:display_errors上线必须关,否则报错信息会暴露路径和数据库信息。参数说明:nginx -t测试配置文件语法,改完 Nginx 配置先测试再重启。HTTPS 证书可以用免费证书,但必须配。
5.5 我踩过最疼的一次:数据库没备份就改表
最后说个血泪经验。有次给客户改代驾项目的订单表,直接ALTER TABLE加字段,结果字段类型和现有数据冲突,订单表锁了十几分钟,客户电话打爆。从那以后我改任何表之前,先mysqldump备份,再在测试库跑一遍。
# 改表前备份 mysqldump -u root -p daijia order > order_backup_$(date +%Y%m%d).sql # 改完确认数据没问题再删备份逻辑说明:mysqldump导出单表,$(date +%Y%m%d)加日期后缀。参数说明:-u root -p是用户名密码,daijia是库名,order是表名。备份文件别放网站目录,放外面。这个习惯帮我省过好几次后悔药。
希望帮到你。
本文还有配套的精品资源,点击获取