1. 项目背景与核心需求
家政服务行业近年来呈现爆发式增长,万师傅作为头部平台日订单量已突破50万单。传统家政小程序普遍存在三个痛点:多端适配成本高(需分别开发微信、支付宝等版本)、服务流程标准化程度低、后台管理功能薄弱。这正是我们采用"Java+uni-app"技术栈开发开源家政小程序的核心出发点。
uni-app的跨端特性可一次性生成微信、支付宝等10+平台小程序,实测可减少70%重复开发工作量。而Java后台则凭借其成熟的生态体系,完美支撑高并发订单处理(实测单机QPS可达3000+)和复杂业务逻辑实现。这套组合方案特别适合中小型家政公司快速搭建自有平台,避免从零造轮子的高昂成本。
2. 技术架构设计解析
2.1 整体架构分层
采用经典前后端分离架构:
- 前端:uni-app(Vue3+TypeScript)
- 网关:Spring Cloud Gateway
- 业务层:Spring Boot 2.7 + MyBatis-Plus
- 数据层:MySQL 8.0(分库分表)+ Redis 7(缓存)
- 消息队列:RabbitMQ 3.11(订单状态异步通知)
- 文件存储:MinIO(服务图片/合同存储)
2.2 关键技术选型依据
-
uni-app跨端方案:
- 实测打包后的微信小程序主包仅1.2MB
- 通过条件编译实现各平台差异化代码
javascript复制// #ifdef MP-WEIXIN wx.login() // #endif -
Java后台性能优化:
- 采用Caffeine本地缓存+Redis多级缓存
- 数据库分片键按城市ID哈希(家政服务强地域性)
java复制@DS("ds_#{cityId % 4}") // 动态数据源切换 public List<Order> getOrdersByCity(Integer cityId){...}
3. 核心功能模块实现
3.1 服务预约系统
-
智能调度算法:
- 基于K-D树实现师傅地理位置索引
- 综合评分=0.6距离+0.3好评率+0.1*接单速度
sql复制SELECT * FROM workers WHERE skills LIKE '%保洁%' ORDER BY (0.6*(6371*acos(cos(radians(39.9))*cos(radians(lat))*cos(radians(lng)-radians(116.4))+sin(radians(39.9))*sin(radians(lat))))) + 0.3*rating_score + 0.1*(1/response_time) DESC -
预约日历组件:
- 自定义实现支持服务时长选择(2小时起)
- 自动避开师傅已预约时段
vue复制<uni-calendar :disabled-date="disabledDate" @change="handleDateChange" />
3.2 支付与消息系统
-
多支付渠道集成:
- 微信/支付宝/银联全渠道支持
- 采用策略模式封装支付逻辑
java复制public interface PaymentStrategy { PaymentResult pay(Order order); } @Service("wechatPay") public class WechatPay implements PaymentStrategy {...} -
消息推送方案:
- 微信模板消息+短信+APP推送三端同步
- 采用责任链模式处理消息优先级
mermaid复制graph LR A[新订单] --> B{是否紧急} B -->|是| C[短信+电话] B -->|否| D[微信模板消息]
4. 性能优化实战
4.1 首屏加载优化
-
图片处理方案:
- 服务图片采用WebP格式(体积减少40%)
- 实现懒加载+骨架屏
javascript复制<image lazy-load :src="item.imgUrl" mode="aspectFill" /> -
接口性能优化:
- 使用GraphQL实现按需查询
- 热点数据预加载
graphql复制query { services(cityId: 1) { id name price coverImg } }
4.2 高并发应对策略
-
订单超卖解决方案:
- Redis分布式锁+数据库乐观锁双校验
java复制// Redis原子操作 Boolean locked = redisTemplate.opsForValue().setIfAbsent("lock:"+orderId, "1", 10, TimeUnit.SECONDS); // MySQL乐观锁 UPDATE orders SET status=2 WHERE id=1001 AND status=1; -
降级预案:
- 当MQ积压时自动切换本地队列
- 服务评分系统降级为随机分配
5. 部署与运维方案
5.1 容器化部署
-
Docker编排文件:
dockerfile复制FROM openjdk:17-jdk COPY target/service-0.0.1.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"] -
K8S健康检查配置:
yaml复制livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60
5.2 监控体系搭建
-
Prometheus监控指标:
- 订单创建成功率
- 平均响应时间
- JVM内存使用率
-
日志收集方案:
- ELK收集各节点日志
- 关键业务日志染色
java复制@Slf4j(topic = "ORDER_TRACE") public class OrderService { public void createOrder() { log.info("[订单创建] 用户ID:{}", userId); } }
6. 开源代码使用指南
6.1 快速启动步骤
-
前端运行:
bash复制
npm install npm run dev:mp-weixin -
后端启动:
properties复制# application-local.properties spring.datasource.url=jdbc:mysql://localhost:3306/homestay spring.redis.host=127.0.0.1
6.2 定制开发建议
-
修改服务类型:
- 编辑
service_type字典表 - 更新前端
/pages/service分类组件
- 编辑
-
调整分账规则:
java复制// 在PaymentServiceImpl修改 BigDecimal platformRate = new BigDecimal("0.15"); // 平台抽成比例
项目已在实际家政公司稳定运行6个月,日均订单量3000+。特别提醒:上线前务必进行压力测试,建议使用JMeter模拟500并发用户持续30分钟的极端场景。我在实际部署中发现,当Redis连接数超过500时需要调整线程池参数:
properties复制spring.redis.lettuce.pool.max-active=1000
