1. 项目概述:小区家政服务预约平台
这个基于BS架构的小区家政服务预约平台,是我在毕业设计阶段完成的一个实战项目。它本质上是一个连接小区居民与家政服务提供者的在线中介系统,采用浏览器/服务器模式实现服务预约、订单管理、支付结算等核心功能。平台特别针对小区封闭式管理场景优化,解决了传统电话预约存在的服务响应慢、价格不透明、服务质量难保障等痛点。
作为全栈开发项目,我从前端页面到后端接口都进行了完整实现。平台采用主流的SpringBoot+Vue技术栈,包含用户端微信小程序和管理员PC端两个入口。源码已通过Git进行版本控制,文档涵盖需求分析、数据库设计、API接口等全流程资料,支持远程调试和二次开发。
2. 核心需求解析
2.1 用户侧核心功能
- 服务展示与筛选:按保洁、维修、育儿等分类展示服务项目,支持按距离、评分、价格多维度筛选
- 预约流程优化:独创的"时间块"选择模式,避免传统整点预约的时间冲突
- 服务保障体系:包含服务人员背景审核、服务过程保险、双向评价机制
2.2 管理端核心功能
- 动态服务定价:基于天气、节假日等因素的智能调价算法
- 服务人员调度:基于GIS的智能派单系统,考虑距离、技能匹配度等因素
- 服务质量监控:服务过程关键节点拍照上传,异常订单自动预警
3. 技术架构设计
3.1 整体架构
采用分层架构设计:
code复制表现层:Vue.js + ElementUI (PC端) + Uni-app (小程序端)
应用层:Spring Boot 2.7 + Spring Security
数据层:MySQL 8.0 + Redis 6.2
基础设施:Nginx + Docker
3.2 关键技术选型
- 微信支付集成:使用SDK实现担保交易支付流程
- 实时通知系统:WebSocket+Redis Pub/Sub实现订单状态变更推送
- LBS服务:腾讯地图API实现服务人员定位与轨迹回放
- 报表生成:Apache POI + ECharts实现数据可视化
4. 数据库设计要点
4.1 核心表结构
sql复制CREATE TABLE `service_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL COMMENT '订单编号',
`user_id` bigint NOT NULL,
`worker_id` bigint DEFAULT NULL,
`service_type` tinyint NOT NULL COMMENT '服务类型',
`time_slots` json NOT NULL COMMENT '预约时间段',
`actual_price` decimal(10,2) NOT NULL COMMENT '实际支付价',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '订单状态',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_user` (`user_id`),
KEY `idx_worker` (`worker_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 特殊设计考虑
- 使用JSON类型存储灵活的时间段数据
- 建立复合索引优化常用查询场景
- 添加审计字段记录操作日志
- 采用软删除模式保留历史数据
5. 关键功能实现
5.1 预约时间冲突检测
java复制public boolean checkTimeConflict(Long workerId, LocalDateTime start, LocalDateTime end) {
List<TimeRange> bookedSlots = orderMapper.selectBookedSlots(workerId);
TimeRange newSlot = new TimeRange(start, end);
return bookedSlots.stream()
.anyMatch(booked -> booked.overlaps(newSlot));
}
5.2 智能派单算法
python复制def dispatch_order(order):
candidates = Worker.objects.filter(
skills__contains=order.service_type,
status=Worker.Status.AVAILABLE
).annotate(
distance=Distance('location', order.location)
).order_by('distance')[:10]
best_match = max(
candidates,
key=lambda w: w.rating * 0.6 + (1 - w.distance/MAX_DISTANCE) * 0.4
)
return best_match
6. 开发中的典型问题
6.1 微信支付回调处理
问题现象:支付成功后偶发订单状态未更新
排查过程:
- 日志显示回调请求已到达
- 数据库事务提交成功但状态未变更
- 发现是缓存未及时失效导致
解决方案:
java复制@Transactional
public void handlePayNotify(String orderNo) {
updateOrderStatus(orderNo, PAID);
redisTemplate.delete("order:" + orderNo); // 清除缓存
eventPublisher.publish(new OrderPaidEvent(orderNo));
}
6.2 高并发预约冲突
场景:热门时段多人同时预约同一服务人员
解决方案:
- 采用乐观锁控制:
sql复制UPDATE worker_schedule
SET booked = 1
WHERE worker_id = ? AND time_slot = ? AND booked = 0
- 引入Redis分布式锁做前置校验
- 失败后自动推荐相近时段
7. 部署与运维方案
7.1 容器化部署
dockerfile复制FROM openjdk:11-jre
COPY target/service-platform.jar /app/
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/service-platform.jar"]
7.2 监控配置
- Prometheus采集JVM指标
- Grafana展示业务看板
- ELK收集分析日志
- 关键接口SLA监控
8. 项目扩展方向
- 智能定价引擎:引入机器学习模型动态调整服务价格
- 语音交互:集成ASR技术实现语音预约
- 智能硬件对接:与门禁系统联动实现服务人员自动放行
- 区块链存证:关键服务环节上链存证
这个项目的开发过程让我深刻体会到,一个好的业务系统需要在前端交互、业务逻辑、数据一致性等多个层面进行精细设计。特别是在处理预约冲突这类典型并发场景时,单纯依赖数据库约束是不够的,需要构建从用户界面到数据层的完整防护体系。
