家政系统源码全解析:同城到家+预约上门服务小程序定制指南

2025-10-27 14:07:24 0点赞 0收藏 0评论

随着消费升级和生活节奏加快,家政服务行业迎来数字化转型浪潮。同城到家预约系统及上门服务小程序已成为家政企业提升服务效率的核心工具。本文将从技术架构、核心模块开发、源码解析到小程序定制全流程进行深度剖析,为开发者提供完整的开发指南。

发帖域名:j.yunzes.top/er

系统架构设计与技术选型

家政预约系统需满足高并发预约请求、地理位置匹配、服务人员调度等核心需求,合理的技术架构是系统稳定运行的基础。

1. 整体架构设计

采用前后端分离架构,分为:

  • 前端层:用户端小程序、服务端管理后台、技师端APP

  • API层:基于RESTful规范的接口服务

  • 服务层:核心业务逻辑模块

  • 数据层:关系型数据库与缓存系统

2.技术栈选型

  • 前端:微信小程序(原生框架)、Vue.js(管理后台)

  • 后端:Node.js(Express框架)/Java(Spring Boot)

  • 数据库:MySQL(业务数据)、Redis(缓存与会话)

  • 部署:Docker容器化、Nginx反向代理

家政系统源码全解析:同城到家+预约上门服务小程序定制指南

核心架构代码示例(后端服务入口):

// server.js 服务启动配置 const express = require('express'); const app = express(); const cors = require('cors'); const mongoose = require('mongoose'); const redis = require('redis'); // 中间件配置 app.use(cors({ origin: ['https://mp.example.com', 'https://admin.example.com'] })); app.use(express.json()); // 连接数据库 mongoose.connect('mongodb://localhost:27017/housekeeping', { useNewUrlParser: true, useUnifiedTopology: true }); // Redis客户端 const redisClient = redis.createClient({ host: 'localhost', port: 6379 }); // 路由注册 app.use('/api/v1/user', require('./routes/user')); app.use('/api/v1/service', require('./routes/service')); app.use('/api/v1/order', require('./routes/order')); // 启动服务 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });

核心功能模块开发解析

1. 用户认证与权限管理

家政系统需区分用户(消费者)、技师、管理员三种角色,基于JWT实现身份认证。

用户登录模块代码

// controllers/authController.js const jwt = require('jsonwebtoken'); const User = require('../models/User'); const bcrypt = require('bcryptjs'); exports.login = async (req, res) => { try { const { phone, password } = req.body; // 查询用户 const user = await User.findOne({ phone }); if (!user) { return res.status(401).json({ message: '账号或密码错误' }); } // 验证密码 const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) { return res.status(401).json({ message: '账号或密码错误' }); } // 生成JWT const token = jwt.sign( { id: user._id, role: user.role }, process.env.JWT_SECRET, { expiresIn: '24h' } ); res.json({ token, user: { id: user._id, name: user.name, phone: user.phone, role: user.role } }); } catch (err) { res.status(500).json({ message: '服务器错误' }); } };

2. 服务预约流程设计

预约流程是核心业务链,包含服务选择、时间预约、地址定位、支付集成四个环节。

预约订单创建代码

// controllers/orderController.js const Order = require('../models/Order'); const Service = require('../models/Service'); const Technician = require('../models/Technician'); exports.createOrder = async (req, res) => { try { const { serviceId, appointmentTime, address, contactPhone, remark } = req.body; const userId = req.user.id; // 验证服务存在性 const service = await Service.findById(serviceId); if (!service) { return res.status(404).json({ message: '服务不存在' }); } // 查找附近可用技师(简化版地理匹配) const nearbyTechnicians = await Technician.find({ serviceType: service.category, isAvailable: true, location: { $near: { $geometry: { type: "Point", coordinates: [address.longitude, address.latitude] }, $maxDistance: 5000 // 5公里范围内 } } }).limit(3); if (nearbyTechnicians.length === 0) { return res.status(400).json({ message: '当前区域暂无可用技师' }); } // 创建订单 const order = new Order({ userId, serviceId, serviceName: service.name, price: service.price, appointmentTime, address, contactPhone, remark, status: 'pending', candidateTechnicians: nearbyTechnicians.map(t => t._id) }); await order.save(); res.status(201).json({ orderId: order._id }); } catch (err) { res.status(500).json({ message: '创建订单失败' }); } };

3. 技师调度与订单分配

采用抢单+系统派单结合模式,提高订单响应效率。

技师抢单代码

// controllers/technicianController.js const Order = require('../models/Order'); const Technician = require('../models/Technician'); exports.grabOrder = async (req, res) => { const session = await mongoose.startSession(); session.startTransaction(); try { const { orderId } = req.body; const technicianId = req.user.id; // 验证订单状态 const order = await Order.findById(orderId).session(session); if (!order || order.status !== 'pending') { await session.abortTransaction(); return res.status(400).json({ message: '订单不可抢' }); } // 验证技师是否在候选列表 if (!order.candidateTechnicians.includes(technicianId)) { await session.abortTransaction(); return res.status(403).json({ message: '无权抢此订单' }); } // 更新订单状态 order.status = 'confirmed'; order.technicianId = technicianId; await order.save({ session }); // 更新技师状态 await Technician.findByIdAndUpdate( technicianId, { isAvailable: false }, { session } ); await session.commitTransaction(); res.json({ message: '抢单成功' }); } catch (err) { await session.abortTransaction(); res.status(500).json({ message: '抢单失败' }); } finally { session.endSession(); } };

家政系统源码全解析:同城到家+预约上门服务小程序定制指南

上门服务小程序定制开发

1. 小程序页面结构设计

核心页面包括:

  • 首页(服务分类、推荐技师)

  • 服务详情页

  • 预约确认页

  • 订单中心

  • 个人中心

首页服务分类代码(小程序wxml):

服务分类{{item.name}}附近技师{{item.name}}★{{item.rating}}{{item.distance}}km

2. 地理位置服务集成

利用微信小程序地图API实现定位与距离计算:

// utils/location.js const getLocation = () => { return new Promise((resolve, reject) => { wx.getLocation({ type: 'gcj02', // 国测局坐标系 success: (res) => { resolve({ latitude: res.latitude, longitude: res.longitude }); }, fail: (err) => { reject(err); } }); }); }; // 计算两点距离(米) const calculateDistance = (lat1, lon1, lat2, lon2) => { const R = 6378137; // 地球半径(米) const radLat1 = lat1 * Math.PI / 180; const radLat2 = lat2 * Math.PI / 180; const a = radLat1 - radLat2; const b = lon1 * Math.PI / 180 - lon2 * Math.PI / 180; const s = 2 * Math.asin(Math.sqrt( Math.pow(Math.sin(a/2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b/2), 2) )); return Math.round(s * R); }; module.exports = { getLocation, calculateDistance };

3. 支付功能集成

对接微信支付API实现订单支付:

// pages/order/pay.js const app = getApp(); Page({ data: { orderId: '', amount: 0 }, onLoad(options) { this.setData({ orderId: options.orderId, amount: options.amount }); }, async handlePay() { try { // 1. 获取预支付订单 const res = await app.request.post('/api/v1/pay/prepay', { orderId: this.data.orderId }); const { prepayId, nonceStr, timeStamp, sign } = res.data; // 2. 发起微信支付 wx.requestPayment({ timeStamp: timeStamp.toString(), nonceStr, package: `prepay_id=${prepayId}`, signType: 'MD5', paySign: sign, success: async (res) => { // 3. 支付成功回调 await app.request.post('/api/v1/pay/notify', { orderId: this.data.orderId, tradeNo: res.tradeNo }); wx.navigateTo({ url: `/pages/order/success?orderId=${this.data.orderId}` }); }, fail: (err) => { wx.showToast({ title: '支付失败', icon: 'none' }); } }); } catch (err) { wx.showToast({ title: '发起支付失败', icon: 'none' }); } } });

系统优化与安全策略

1. 性能优化

  • 数据库索引优化:为订单表、用户表的常用查询字段建立索引

  • 接口缓存:热门服务列表、技师信息等使用Redis缓存

  • 小程序分包加载:将非首页资源分包,减少初始加载时间

2. 安全防护

  • 接口权限校验:中间件验证JWT令牌有效性

  • 数据加密:用户密码bcrypt加密存储,敏感信息传输加密

  • 防SQL注入:使用ORM框架参数化查询

  • 限流措施:对登录、预约接口实施IP限流

// middleware/rateLimiter.js const rateLimit = require('express-rate-limit'); const RedisStore = require('rate-limit-redis'); const redisClient = require('../config/redis'); // 登录接口限流:10分钟内最多5次尝试 const loginLimiter = rateLimit({ store: new RedisStore({ client: redisClient, prefix: 'rate_limit:login:' }), windowMs: 10 * 60 * 1000, // 10分钟 max: 5, // 5次请求 message: { message: '登录尝试次数过多,请稍后再试' } }); module.exports = { loginLimiter };

部署与运维建议

  1. 容器化部署:使用Docker Compose编排应用、数据库、缓存服务

  2. CI/CD流程:通过GitHub Actions实现代码提交自动测试与部署

  3. 监控告警:集成Prometheus+Grafana监控系统性能,配置关键指标告警

  4. 数据备份:数据库每日自动备份,保留30天备份记录

Docker Compose配置示例

version: '3' services: app: build: . ports: - "3000:3000" environment: - NODE_ENV=production - DB_HOST=mongodb - REDIS_HOST=redis depends_on: - mongodb - redis mongodb: image: mongo:4.4 volumes: - mongo-data:/data/db redis: image: redis:6 volumes: - redis-data:/data volumes: mongo-data: redis-data:

结语

家政服务系统开发需平衡用户体验与业务效率,从预约流程优化到技师调度算法,每个环节都需结合行业特性设计。本文提供的源码示例与架构方案可作为基础框架,实际开发中需根据业务规模进行扩展。随着物联网技术发展,未来可集成智能设备实现服务过程监控,进一步提升服务质量与用户信任度。

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
0
扫一下,分享更方便,购买更轻松