1. 项目概述
最近完成了一个家政服务系统的全栈开发项目,采用Java+Vue技术栈实现了一套完整的在线家政服务平台。这个系统主要解决传统家政服务中信息不对称、预约流程繁琐、服务评价缺失等行业痛点。从技术实现角度来看,项目涵盖了前后端分离架构、微服务设计、数据库优化等核心环节,是一套具备商业落地价值的解决方案。
2. 系统架构设计
2.1 技术选型分析
后端采用Spring Boot 2.7 + MyBatis Plus框架组合,主要基于以下考虑:
- Spring Boot的自动配置特性大幅减少了XML配置工作量
- MyBatis Plus提供的通用Mapper和Wrapper简化了90%的CRUD操作
- 内置的Druid连接池保障了数据库访问性能
前端选用Vue 3 + Element Plus组合:
- Composition API更适合复杂业务逻辑的组织
- Element Plus的组件库能快速构建管理后台界面
- Axios拦截器统一处理HTTP请求和响应
数据库使用MySQL 8.0:
- JSON字段类型支持存储服务详情等半结构化数据
- 窗口函数便于生成各类统计报表
- 事务隔离级别配置为READ_COMMITTED平衡性能与一致性
2.2 微服务拆分方案
将系统拆分为四个独立服务:
- 用户中心服务:处理注册登录、权限管理
- 订单服务:管理预约、支付、评价全流程
- 家政人员服务:维护服务者资料、技能标签
- 消息服务:处理站内通知和短信提醒
服务间通过OpenFeign进行通信,配合Nacos实现服务发现。这种设计使得各模块可以独立部署和扩展,特别是在促销活动期间可以单独扩容订单服务。
3. 核心功能实现
3.1 智能匹配算法
服务人员匹配是系统的核心功能,实现逻辑包含:
java复制public List<Worker> matchWorkers(OrderDTO dto) {
// 基础筛选:服务类型、时间窗口
LambdaQueryWrapper<Worker> wrapper = new LambdaQueryWrapper<Worker>()
.eq(Worker::getServiceType, dto.getServiceType())
.apply("JSON_CONTAINS(available_time, {0})",
JSON.toJSONString(dto.getTimeSlot()));
// 加入评分权重
wrapper.orderByDesc(Worker::getAvgScore)
.orderByAsc(Worker::getDistance);
return workerMapper.selectList(wrapper);
}
匹配策略考虑因素:
- 服务类型匹配度(首要条件)
- 历史服务评分(权重40%)
- 距离因素(权重30%)
- 接单响应速度(权重20%)
- 价格区间(权重10%)
3.2 预约状态机设计
订单状态流转采用状态机模式实现:
mermaid复制stateDiagram
[*] --> PENDING
PENDING --> CONFIRMED: 服务者接单
PENDING --> CANCELLED: 用户取消
CONFIRMED --> SERVING: 服务开始
SERVING --> COMPLETED: 服务完成
COMPLETED --> EVALUATED: 用户评价
每个状态变更都会触发相应业务逻辑:
- 接单时:生成服务合同PDF
- 开始时:发送服务提醒短信
- 完成时:释放服务人员时间档期
- 评价后:更新服务者评分
4. 数据库设计要点
4.1 主要表结构
用户表(users)设计示例:
sql复制CREATE TABLE `users` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE,
`password` VARCHAR(100) COMMENT 'BCrypt加密',
`phone` VARCHAR(20) UNIQUE,
`avatar` VARCHAR(255),
`gender` TINYINT,
`credit_score` INT DEFAULT 100,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
INDEX `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
订单表(orders)关键字段:
- service_type:关联服务类型字典
- time_slot:JSON格式存储时间段
- worker_id:关联服务人员
- status:使用TINYINT映射状态枚举
- price:DECIMAL(10,2)存储金额
4.2 查询优化实践
针对高频查询做了以下优化:
-
服务人员列表查询:
- 建立(service_type, avg_score)联合索引
- 使用覆盖索引避免回表
-
订单分页查询:
sql复制SELECT * FROM orders WHERE user_id = ? AND status = ? ORDER BY create_time DESC LIMIT ?, ?- 建立(user_id, status, create_time)复合索引
- 采用延迟关联优化深分页
-
统计报表查询:
- 使用物化视图预计算常用指标
- 定时任务凌晨更新统计结果
5. 安全防护措施
5.1 认证授权方案
采用JWT + RBAC实现权限控制:
-
登录成功后生成包含用户角色的JWT
-
后端通过注解进行权限校验:
java复制@PreAuthorize("hasRole('ADMIN') || #userId == authentication.principal.id") public User getUserById(Long userId) { // ... } -
前端根据权限动态渲染菜单:
javascript复制const hasPermission = (permission) => { return store.state.user.permissions.includes(permission) }
5.2 敏感数据保护
关键防护措施包括:
- 密码存储:BCrypt算法+随机盐值
- 接口防刷:Guava RateLimiter限流
- XSS防护:Jackson转义HTML标签
- SQL注入:MyBatis参数化查询
- 数据脱敏:手机号显示为138****1234
6. 部署实施方案
6.1 容器化部署
使用Docker Compose编排服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6-alpine
user-service:
build: ./user-service
ports:
- "8081:8080"
depends_on:
- mysql
- redis
6.2 性能调优参数
关键JVM参数配置:
code复制-server
-Xms1g
-Xmx2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:ParallelGCThreads=4
Nginx优化配置:
code复制worker_processes auto;
worker_connections 10240;
keepalive_timeout 65;
gzip on;
7. 典型问题排查
7.1 并发预约冲突
现象:同一时段被重复预约
解决方案:
-
数据库添加唯一索引:
sql复制ALTER TABLE orders ADD UNIQUE INDEX idx_worker_time (worker_id, time_slot); -
使用分布式锁:
java复制String lockKey = "lock:worker:" + workerId + ":" + timeSlot; try { boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, "1", 5, TimeUnit.MINUTES); if (!locked) throw new BusinessException("时段已被预约"); // 执行业务逻辑 } finally { redisTemplate.delete(lockKey); }
7.2 地理位置计算偏差
问题:距离排序结果不准确
优化方案:
- 使用PostGIS扩展存储坐标
- 采用Haversine公式计算距离:
sql复制SELECT id, (6371 * acos( cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) - radians(?)) + sin(radians(?)) * sin(radians(latitude)) )) AS distance FROM workers ORDER BY distance
8. 扩展优化方向
-
引入Elasticsearch实现服务搜索:
- 建立服务人员索引
- 支持按技能标签、评价等多维度检索
-
增加智能调度功能:
- 考虑交通路况预测
- 优化服务人员行程路线
-
开发微信小程序端:
- 利用地理位置API获取精准位置
- 集成微信支付能力
-
数据分析看板:
- 使用Apache Doris实时分析订单数据
- 可视化展示业务指标
这个项目从技术实现到业务逻辑都有不少值得深入探讨的细节。在实际开发过程中,特别要注意家政服务行业的特殊性——既要保证系统的易用性,又要处理好各类异常情况。比如服务人员临时取消订单时的应急方案,用户评价的防刷机制等,都需要在系统设计阶段充分考虑。