1. 家政小程序系统概述
这套基于PHP+MySQL的家政小程序系统是一套完整的行业解决方案,包含前后端完整代码和详细的部署文档。系统采用经典的LAMP(Linux+Apache+MySQL+PHP)架构,前端使用微信小程序原生开发框架,后端采用ThinkPHP 5.1作为基础框架,数据库使用MySQL 5.7版本。
提示:虽然系统支持Windows环境运行,但生产环境强烈建议使用Linux服务器,性能和安全性能得到更好保障。
系统主要功能模块包括:
- 用户端:服务预约、订单管理、在线支付、评价反馈
- 服务人员端:接单管理、日程安排、收入统计
- 管理后台:服务项目管理、人员调度、财务统计、系统配置
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统环境准备与部署
2.1 服务器环境配置
对于生产环境部署,推荐以下配置方案:
bash复制# Ubuntu服务器基础环境安装
sudo apt update
sudo apt install -y apache2 mysql-server php7.4 libapache2-mod-php7.4 php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring
关键配置参数说明:
- PHP内存限制:建议设置为256M以上(php.ini中memory_limit)
- MySQL缓冲池大小:对于4GB内存服务器,建议设置innodb_buffer_pool_size=2G
- Apache KeepAlive:高并发场景建议设置为Off
2.2 数据库初始化
源码包中包含数据库初始化脚本(database.sql),导入前需要特别注意:
sql复制-- 创建数据库用户并授权
CREATE DATABASE home_service DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'service_admin'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON home_service.* TO 'service_admin'@'localhost';
FLUSH PRIVILEGES;
重要安全提示:切勿使用默认数据库密码,生产环境必须修改为强密码并定期更换。
3. 系统核心功能实现解析
3.1 预约服务模块设计
系统采用状态机模式管理订单生命周期,核心状态转换逻辑如下:
php复制class OrderService {
const STATUS_WAITING = 0; // 待接单
const STATUS_ACCEPTED = 1; // 已接单
const STATUS_SERVING = 2; // 服务中
const STATUS_FINISHED = 3; // 已完成
const STATUS_CANCELED = 4; // 已取消
public function changeStatus($orderId, $newStatus) {
// 状态转换校验逻辑
$currentStatus = $this->getCurrentStatus($orderId);
$validTransitions = [
self::STATUS_WAITING => [self::STATUS_ACCEPTED, self::STATUS_CANCELED],
// 其他状态转换规则...
];
if (!in_array($newStatus, $validTransitions[$currentStatus])) {
throw new Exception('非法状态转换');
}
// 更新状态并记录日志
$this->updateStatus($orderId, $newStatus);
$this->logStatusChange($orderId, $currentStatus, $newStatus);
}
}
3.2 支付系统集成
系统支持微信支付和余额支付两种方式,支付流程关键点:
- 微信支付采用V3接口,需要配置商户证书
- 支付结果异步通知需要进行签名验证
- 余额支付需要严格的事务处理
php复制public function handlePayment($orderId, $paymentMethod) {
try {
DB::beginTransaction();
$order = Order::find($orderId);
if ($paymentMethod == 'wechat') {
// 微信支付处理逻辑
$result = $this->wechatPay->createOrder($order);
} elseif ($paymentMethod == 'balance') {
// 余额支付处理逻辑
$this->deductUserBalance($order->user_id, $order->amount);
$order->payment_status = 1;
$order->save();
}
DB::commit();
return $result;
} catch (Exception $e) {
DB::rollBack();
throw $e;
}
}
4. 系统安全加固方案
4.1 常见安全防护措施
-
SQL注入防护:
- 全系统使用PDO预处理语句
- 输入参数使用filter_var过滤
-
XSS防护:
- 输出到前端的内容全部经过htmlspecialchars处理
- 富文本内容使用HTML Purifier过滤
-
CSRF防护:
- 关键操作需要验证CSRF Token
- 表单自动生成并验证Token
php复制// 安全过滤示例
public function safeInput($input) {
$input = trim($input);
$input = stripslashes($input);
$input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
return $input;
}
4.2 文件上传安全
家政服务人员需要上传资质证明,系统对文件上传做了严格限制:
php复制$allowedExtensions = ['jpg', 'png', 'pdf'];
$maxSize = 2 * 1024 * 1024; // 2MB
if (!in_array($fileExt, $allowedExtensions)) {
throw new Exception('不支持的文件类型');
}
if ($fileSize > $maxSize) {
throw new Exception('文件大小超过限制');
}
// 重命名文件防止脚本执行
$newFilename = md5(uniqid()) . '.' . $fileExt;
move_uploaded_file($tmpFile, UPLOAD_PATH . $newFilename);
5. 性能优化实践
5.1 数据库优化
-
索引优化:
- 订单表建立复合索引 (user_id, status)
- 服务人员表建立地理位置索引
-
查询优化:
- 避免SELECT * 查询
- 大数据量表使用分页查询
sql复制-- 优化后的查询示例
EXPLAIN SELECT o.id, o.create_time, s.service_name
FROM orders o
JOIN services s ON o.service_id = s.id
WHERE o.user_id = 123 AND o.status = 1
ORDER BY o.create_time DESC
LIMIT 10;
5.2 缓存策略
系统采用多级缓存方案:
- 使用Redis缓存热门服务数据
- 静态资源使用CDN加速
- 浏览器端缓存策略配置
php复制// Redis缓存使用示例
public function getPopularServices($limit = 5) {
$cacheKey = 'popular_services_' . $limit;
if ($redis->exists($cacheKey)) {
return json_decode($redis->get($cacheKey), true);
}
$services = Service::where('status', 1)
->orderBy('order_count', 'desc')
->limit($limit)
->get()
->toArray();
$redis->setex($cacheKey, 3600, json_encode($services));
return $services;
}
6. 部署与运维实践
6.1 Nginx配置优化
对于高并发场景,建议使用Nginx替代Apache:
nginx复制server {
listen 80;
server_name yourdomain.com;
root /var/www/home_service/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
6.2 定时任务管理
系统需要运行的定时任务包括:
- 自动取消超时未支付订单
- 服务评价提醒
- 每日数据统计报表
使用Linux crontab配置:
bash复制# 每天凌晨执行数据统计
0 0 * * * /usr/bin/php /var/www/home_service/artisan stats:daily >> /var/log/home_service_stats.log
# 每30分钟检查超时订单
*/30 * * * * /usr/bin/php /var/www/home_service/artisan order:check-timeout
7. 常见问题排查
7.1 微信登录失败排查步骤
- 检查小程序appid和secret配置是否正确
- 验证服务器IP是否加入微信白名单
- 检查网络连通性:telent api.weixin.qq.com 443
- 查看PHP的openssl扩展是否启用
7.2 数据库连接问题
典型错误信息及解决方案:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
| SQLSTATE[HY000] [2002] Connection refused | MySQL服务未启动 | sudo service mysql start |
| SQLSTATE[HY000] [1045] Access denied | 用户名密码错误 | 检查.env配置文件 |
| SQLSTATE[42000] Syntax error | SQL语句错误 | 检查执行的SQL语句 |
7.3 性能瓶颈分析
使用以下命令快速定位性能问题:
bash复制# 查看PHP进程状态
top -c -p $(pgrep -d',' php)
# MySQL慢查询分析
mysqldumpslow -s t /var/log/mysql/mysql-slow.log
# 网络连接分析
ss -tnlp | grep php
8. 二次开发建议
8.1 扩展功能方向
- 增加会员等级体系
- 实现智能派单算法
- 开发管理端APP
- 接入第三方家政平台API
8.2 代码结构说明
主要目录结构:
code复制app/
├── Http/
│ ├── Controllers/
│ │ ├── WechatController.php # 微信相关接口
│ │ ├── OrderController.php # 订单管理
│ │ └── ServiceController.php # 服务管理
│ └── Middleware/ # 中间件
config/ # 配置文件
database/ # 数据库迁移和种子
public/ # 公开资源
resources/ # 视图和语言包
routes/ # 路由定义
8.3 API开发规范
系统采用RESTful风格API设计:
php复制// 典型API控制器结构
class OrderController extends Controller {
// 获取订单列表 GET /api/orders
public function index(Request $request) {}
// 创建新订单 POST /api/orders
public function store(Request $request) {}
// 获取订单详情 GET /api/orders/{id}
public function show($id) {}
// 更新订单 PUT /api/orders/{id}
public function update(Request $request, $id) {}
// 取消订单 DELETE /api/orders/{id}
public function destroy($id) {}
}
对于需要处理复杂业务逻辑的服务类,建议使用领域驱动设计(DDD)模式:
php复制class OrderService {
public function createOrder(CreateOrderDto $dto) {
// 验证业务规则
$this->validateOrder($dto);
// 创建订单实体
$order = new Order();
$order->fill($dto->toArray());
// 处理支付相关逻辑
$payment = $this->processPayment($order);
// 保存数据
DB::transaction(function() use ($order, $payment) {
$order->save();
$payment->order_id = $order->id;
$payment->save();
});
return $order;
}
}
