洗车小程序系统开发实战:基于ThinkPHP + UniApp的全栈解决方案
随着移动互联网的深度渗透和用户对便捷服务需求的日益增长,传统洗车行业正加速向数字化、智能化转型。一个功能完善、体验流畅的洗车小程序系统,不仅能提升门店运营效率,还能显著增强客户粘性与品牌竞争力。
本文将详细介绍如何利用 ThinkPHP(后端) + UniApp(前端) 这一高效技术组合,构建一套支持多端发布、功能完备的洗车预约小程序系统,涵盖技术选型、架构设计、核心功能实现与部署上线全流程。
一、为什么选择 ThinkPHP + UniApp?
✅ ThinkPHP(后端优势)
- 国产成熟框架:语法简洁,文档丰富,社区活跃,适合国内开发者快速上手。
- 高性能稳定:基于PHP,运行效率高,支持高并发访问。
- RESTful支持:轻松构建API接口,便于前后端分离。
- 生态完善:集成数据库操作、缓存、日志、验证等模块,开发效率高。
✅ UniApp(前端优势)
- 一次开发,多端发布:同一套代码可编译为微信小程序、H5、App(iOS/Android),极大降低开发与维护成本。
- 基于Vue语法:学习成本低,组件化开发,生态丰富(uView、ColorUI等UI库)。
- 原生能力调用:无缝调用扫码、定位、支付、蓝牙等手机原生功能。
组合优势:ThinkPHP 提供稳定可靠的后端服务,UniApp 实现跨平台前端体验,二者结合是中小型洗车项目开发的“黄金搭档”。
二、系统整体架构设计
+------------------+ +---------------------+
| UniApp 前端 | <---> | ThinkPHP 后端 API |
| (小程序/H5/App) | HTTP | (RESTful 接口) |
+------------------+ +----------+----------+
|
+------v-------+
| MySQL 数据库 |
+------+-------+
|
+------v-------+
| 管理后台系统 |
| (ThinkPHP Admin)|
+--------------+
- 前端:UniApp 负责用户交互、页面展示、数据请求。
- 后端:ThinkPHP 提供用户管理、预约、支付、订单等API接口。
- 数据库:MySQL 存储用户、门店、服务、订单等核心数据。
- 后台:基于ThinkPHP开发的PC端管理平台,用于运营管控。
三、核心功能模块设计
1. 用户端(UniApp 小程序)
| 功能模块 | 说明 |
|---|---|
| 首页 | 轮播图、推荐服务、附近门店(地图定位)、优惠活动 |
| 服务预约 | 选择门店 → 选择服务(普洗、精洗、打蜡等) → 选择时间 → 提交订单 |
| 在线支付 | 集成微信支付,支持定金或全额支付 |
| 订单管理 | 查看“待服务”、“已完成”、“已取消”订单,支持取消与评价 |
| 会员中心 | 用户信息、积分、优惠券、消费记录、发票申请 |
2. 商家后台(ThinkPHP Admin)
| 功能模块 | 说明 |
|---|---|
| 门店管理 | 添加/编辑门店信息、设置营业时间、上传图片 |
| 服务项目 | 创建洗车套餐,设置价格、时长、技师要求 |
| 预约排班 | 查看每日预约情况,支持手动调整技师排班 |
| 订单管理 | 实时监控订单状态,支持核销、退款 |
| 会员管理 | 发放优惠券、设置积分规则、会员等级 |
| 数据统计 | 日/周/月订单量、收入报表、热门服务分析 |
四、关键技术实现(含代码示例)
1. 后端API:用户登录与JWT认证(ThinkPHP 6)
// application/api/controller/User.php
<?php
namespace app\api\controller;
use think\Controller;
use app\common\model\User;
use Firebase\JWT\JWT;
class User extends Controller
{
// 微信登录
public function login()
{
$code = input('post.code');
// 调用微信接口获取 openid
$appid = 'your_appid';
$secret = 'your_secret';
$url = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
$res = file_get_contents($url);
$data = json_decode($res, true);
$openid = $data['openid'];
// 查找或创建用户
$user = User::where('openid', $openid)->find();
if (!$user) {
$user = User::create(['openid' => $openid, 'nickname' => '用户' . rand(1000,9999)]);
}
// 生成JWT token
$key = "your_jwt_secret_key";
$payload = [
'uid' => $user->id,
'exp' => time() + 86400 // 有效期24小时
];
$token = JWT::encode($payload, $key, 'HS256');
return json([
'code' => 200,
'msg' => '登录成功',
'data' => [
'token' => $token,
'user' => $user
]
]);
}
}
2. 前端请求封装(UniApp)
// utils/request.js
const BASE_URL = 'https://api.yourdomain.com';
uni.$http = (options) => {
const token = uni.getStorageSync('token');
return uni.request({
url: BASE_URL + options.url,
method: options.method || 'GET',
data: options.data || {},
header: {
'Content-Type': 'application/json',
'Authorization': token ? 'Bearer ' + token : ''
}
});
};
// 使用示例
uni.$http({
url: '/api/user/info',
method: 'GET'
}).then(res => {
console.log(res.data);
});
3. 预约下单接口(ThinkPHP)
// application/api/controller/Order.php
public function create()
{
$param = input('post.');
$userId = $this->auth->user_id; // 从JWT获取
$order = new Order();
$order->user_id = $userId;
$order->service_id = $param['service_id'];
$order->store_id = $param['store_id'];
$order->order_time = $param['order_time'];
$order->total_price = $param['total_price'];
$order->status = 'unpaid';
$order->order_no = 'W' . date('YmdHis') . rand(1000,9999);
if ($order->save()) {
return json(['code' => 200, 'msg' => '预约成功', 'order_id' => $order->id]);
} else {
return json(['code' => 500, 'msg' => '创建失败']);
}
}
五、数据库设计(关键表)
-- 用户表
CREATE TABLE `users` (
`id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`openid` varchar(100) UNIQUE NOT NULL,
`nickname` varchar(50),
`phone` varchar(15),
`created_at` datetime DEFAULT CURRENT_TIMESTAMP
);
-- 门店表
CREATE TABLE `stores` (
`id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` varchar(100) NOT NULL,
`address` varchar(200),
`lat` decimal(10,7),
`lng` decimal(10,7),
`phone` varchar(15),
`status` tinyint(1) DEFAULT 1
);
-- 服务项目表
CREATE TABLE `services` (
`id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` varchar(50),
`price` decimal(6,2),
`duration` int(11) COMMENT '服务时长(分钟)'
);
-- 订单表
CREATE TABLE `orders` (
`id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`user_id` int(11) NOT NULL,
`store_id` int(11) NOT NULL,
`service_id` int(11) NOT NULL,
`order_no` varchar(30) UNIQUE,
`order_time` datetime,
`status` enum('unpaid','paid','completed','cancelled'),
`total_price` decimal(6,2),
`created_at` datetime DEFAULT CURRENT_TIMESTAMP
);
六、部署与上线流程
- 服务器准备:Linux(CentOS/Ubuntu),安装PHP 7.4+、MySQL、Nginx。
- 后端部署:
- 上传ThinkPHP项目到服务器
- 配置虚拟主机,指向
public目录 - 导入数据库SQL
- 前端编译:
- 使用HBuilderX打开UniApp项目
- 修改API地址为线上域名
- 编译为微信小程序并上传
- 微信配置:
- 在公众平台配置服务器域名
- 设置支付商户号与API密钥
七、系统优势总结
| 优势 | 说明 |
|---|---|
| 开发效率高 | 前后端技术成熟,组件丰富,快速迭代 |
| 多端兼容 | 一套代码,覆盖小程序、H5、App |
| 易于维护 | 前后端分离,模块清晰,便于团队协作 |
| 可扩展性强 | 支持接入自助设备、会员卡、营销活动等 |
八、结语
通过 ThinkPHP + UniApp 的技术组合,开发者可以高效构建一个功能完整、性能稳定、易于扩展的洗车小程序系统。无论是单店运营还是连锁品牌,该方案都能提供强有力的数字化支撑。
未来,可进一步集成物联网设备(如自助洗车机)、AI识别(车牌自动匹配)、大数据分析等能力,打造真正的“智慧洗车”生态平台。
提示:如需获取完整源码或定制开发服务,可联系专业团队或在开源平台(如Gitee)搜索“洗车小程序 thinkphp uniapp”获取参考项目。