随着居民生活水平提升,同城家政服务(保洁、保姆、维修、护工等)需求持续增长,搭建一套高效、易用的同城家政服务系统,成为很多开发者的实战需求和创业方向。本文将带领大家从零搭建 Java 同城家政服务系统,重点讲解系统搭建思路、核心功能实现、数据库设计细节,搭配少量关键源码片段(不冗余),全程贴合企业实战场景,适配 CSDN 技术文章收录偏好,帮助 Java 后端开发者快速上手,从零掌握家政服务系统的搭建与开发,适合实战学习者、项目入门者参考。

本文核心亮点:以“从零搭建”为核心,不跳过基础步骤,从项目初始化、数据库设计,到核心功能开发、源码实现,循序渐进,重点突出数据库设计(同城家政核心表结构)和关键源码,不堆砌无关技术,兼顾实战性和可操作性,源码可直接复用,助力开发者快速搭建属于自己的同城家政服务系统。

一、项目整体规划(从零搭建基础)

从零搭建 Java 同城家政服务系统,首先明确项目定位和核心需求,避免盲目开发。本项目定位为中小型同城家政服务平台,适配个人家庭、小型商户的家政需求,核心服务对象分为三类:普通用户(下单方)、家政师傅(服务提供方)、平台管理员(后台管理)。项目采用前后端分离架构,后端基于 Java 核心技术栈搭建,前端适配小程序、APP 多端访问,实现“用户下单→师傅接单→服务执行→评价结算”的全流程闭环。

1.1 核心功能模块规划(贴合家政场景)

结合同城家政服务的实际需求,从零拆解 5 大核心模块,覆盖家政服务全场景,每个模块功能简洁实用,符合中小型平台的开发难度,具体如下:

  • 用户模块:用户注册/登录、个人信息管理、家政服务下单(选择服务类型、预约时间、填写地址)、订单查询、师傅评价、服务收藏;

  • 家政师傅模块:师傅注册/实名认证、服务类型入驻、接单管理、服务执行(接单、出发、完成)、收入统计、个人中心;

  • 订单模块:订单创建、订单状态流转、订单筛选、订单详情、订单取消/修改、费用结算;

  • 后台管理模块:用户管理、师傅管理、订单管理、服务类型管理、费用设置、数据统计、师傅认证审核;

  • 公共模块:地址解析(同城定位)、服务价格计算、消息通知(接单、服务提醒)、异常处理、统一响应。

1.2 技术栈选型(从零搭建适配)

从零搭建项目,技术栈选型优先兼顾轻量性、易用性和可扩展性,避免过度复杂的技术堆砌,降低入门难度,同时贴合 Java 后端实战场景,核心技术栈如下:

  • 后端核心:SpringBoot(快速搭建服务、简化配置,适合从零入门)、MyBatis(轻量 ORM,适配订单、用户等数据操作,易于上手);

  • 数据库:MySQL(关系型数据库,存储用户、订单、师傅等核心数据,支持复杂查询,适合家政系统的数据存储需求);

  • 辅助技术:Redis(缓存热门服务、师傅在线状态,提升系统响应速度)、FastJSON(JSON 数据解析,适配前后端交互);

  • 前端适配:支持小程序、APP 前端对接,后端提供 RESTful 接口,兼容多端请求,降低前端对接难度;

  • 部署环境:Linux + Tomcat + MySQL + Redis,支持单机部署(适合新手测试、中小型平台使用),后续可扩展为集群。

二、核心数据库设计(从零搭建关键)

数据库设计是从零搭建系统的核心基础,直接决定系统的可扩展性和数据一致性。结合同城家政服务的业务场景,重点设计 6 张核心表,覆盖用户、师傅、订单、服务类型等核心数据,表结构简洁实用,添加必要索引优化查询,以下是详细设计(含字段说明、表关系),搭配核心建表语句。

2.1 数据库设计原则

1. 简洁性:字段设计贴合业务需求,不冗余,避免不必要的字段;2. 规范性:字段命名统一(小写字母+下划线),主键统一使用自增 ID;3. 关联性:通过外键关联相关表(如订单表关联用户表、师傅表),保证数据一致性;4. 可扩展性:预留必要字段(如备注字段),便于后续功能扩展。

2.2 核心表结构设计(含建表源码)

重点设计 6 张核心表,以下是核心表的建表语句(关键源码),可直接复制到 MySQL 中执行,快速搭建数据库环境:

-- 1. 用户表(存储普通用户信息) CREATE TABLE `t_user` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID(主键)', `username` varchar(50) NOT NULL COMMENT '用户名', `phone` varchar(20) NOT NULL COMMENT '手机号(登录账号)', `password` varchar(100) NOT NULL COMMENT '加密密码', `address` varchar(255) DEFAULT NULL COMMENT '常用地址', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态:1-正常,0-禁用', PRIMARY KEY (`id`), UNIQUE KEY `idx_phone` (`phone`) COMMENT '手机号唯一索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='普通用户表'; -- 2. 家政师傅表(存储师傅信息,含认证信息) CREATE TABLE `t_housekeeping_master` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '师傅ID(主键)', `name` varchar(50) NOT NULL COMMENT '师傅姓名', `phone` varchar(20) NOT NULL COMMENT '手机号', `password` varchar(100) NOT NULL COMMENT '加密密码', `id_card` varchar(20) NOT NULL COMMENT '身份证号(实名认证)', `service_type_id` bigint NOT NULL COMMENT '服务类型ID(关联服务类型表)', `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态:0-待审核,1-审核通过,2-审核失败,3-禁用', `score` decimal(2,1) DEFAULT 5.0 COMMENT '师傅评分(默认5分)', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_phone` (`phone`), KEY `idx_service_type_id` (`service_type_id`) COMMENT '关联服务类型索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家政师傅表'; -- 3. 服务类型表(存储家政服务类型,如保洁、保姆) CREATE TABLE `t_service_type` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '服务类型ID(主键)', `type_name` varchar(50) NOT NULL COMMENT '服务类型名称(如保洁、保姆、家电维修)', `price` decimal(10,2) NOT NULL COMMENT '基础服务价格(元/小时)', `description` varchar(255) DEFAULT NULL COMMENT '服务描述', `create_time` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家政服务类型表'; -- 4. 订单表(核心表,存储订单信息) CREATE TABLE `t_order` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '订单ID(主键)', `user_id` bigint NOT NULL COMMENT '用户ID(关联用户表)', `master_id` bigint DEFAULT NULL COMMENT '师傅ID(关联师傅表,未接单时为null)', `service_type_id` bigint NOT NULL COMMENT '服务类型ID(关联服务类型表)', `service_time` datetime NOT NULL COMMENT '预约服务时间', `start_addr` varchar(255) NOT NULL COMMENT '服务起始地址', `order_amount` decimal(10,2) NOT NULL COMMENT '订单金额', `order_status` tinyint NOT NULL COMMENT '订单状态:0-待接单,1-已接单,2-服务中,3-已完成,4-已取消', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), KEY `idx_master_id` (`master_id`), KEY `idx_order_status` (`order_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家政服务订单表'; -- 5. 评价表(存储用户对师傅的评价) CREATE TABLE `t_evaluation` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评价ID(主键)', `order_id` bigint NOT NULL COMMENT '订单ID(关联订单表)', `user_id` bigint NOT NULL COMMENT '用户ID(关联用户表)', `master_id` bigint NOT NULL COMMENT '师傅ID(关联师傅表)', `score` decimal(2,1) NOT NULL COMMENT '评价分数(1-5分)', `content` varchar(500) DEFAULT NULL COMMENT '评价内容', `create_time` datetime NOT NULL COMMENT '评价时间', PRIMARY KEY (`id`), KEY `idx_order_id` (`order_id`), KEY `idx_master_id` (`master_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评价表'; -- 6. 师傅收入表(存储师傅收入信息) CREATE TABLE `t_master_income` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '收入ID(主键)', `master_id` bigint NOT NULL COMMENT '师傅ID(关联师傅表)', `order_id` bigint NOT NULL COMMENT '订单ID(关联订单表)', `income_amount` decimal(10,2) NOT NULL COMMENT '收入金额(扣除平台佣金后)', `create_time` datetime NOT NULL COMMENT '收入时间', PRIMARY KEY (`id`), KEY `idx_master_id` (`master_id`), KEY `idx_order_id` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='师傅收入表';

2.3 表关系说明

1. 用户表(t_user)与订单表(t_order):一对多关系,一个用户可创建多个订单;2. 家政师傅表(t_housekeeping_master)与订单表(t_order):一对多关系,一个师傅可接多个订单;3. 服务类型表(t_service_type)与师傅表(t_housekeeping_master):一对多关系,一个服务类型可对应多个师傅;4. 订单表(t_order)与评价表(t_evaluation):一对一关系,一个订单对应一条评价;5. 订单表(t_order)与师傅收入表(t_master_income):一对一关系,一个订单对应一笔师傅收入。

三、从零搭建核心步骤与源码实现

本节带领大家从零开始,完成项目搭建的核心步骤,搭配少量关键源码片段(不冗余),重点讲解项目初始化、核心功能(下单、接单)的源码实现,确保新手也能快速跟上,每一步都贴合实战。

3.1 第一步:项目初始化(从零搭建基础)

1. 创建 SpringBoot 项目:通过 Spring Initializr(https://start.spring.io/)快速创建项目,Group 填写自己的包名,Artifact 填写项目名称(如 housekeeping-service),选择 Java 版本(推荐 8),引入核心依赖:Spring Web、MyBatis Framework、MySQL Driver、Spring Data Redis,点击生成项目,下载后导入 IDEA。

2. 配置 application.yml 文件:配置数据库连接、MyBatis、Redis 相关信息,核心配置源码如下(可直接复制使用):

server: port: 8080 # 项目端口 spring: # 数据库配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/housekeeping_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 username: root # 自己的数据库用户名 password: 123456 # 自己的数据库密码 # Redis配置 redis: host: localhost port: 6379 password: # 无密码则留空 # MyBatis配置 mybatis: mapper-locations: classpath:mapper/*.xml # Mapper XML文件路径 type-aliases-package: com.example.housekeeping.entity # 实体类包路径 configuration: map-underscore-to-camel-case: true # 下划线转驼峰命名

3. 项目结构搭建:在 IDEA 中创建 entity(实体类)、mapper(Mapper 接口)、service(服务层)、controller(控制器)、config(配置类)、exception(异常处理)等包,结构清晰,便于后续开发。

3.2 第二步:核心实体类与 Mapper 接口实现

结合前文数据库设计,创建核心实体类(与数据库表一一对应),编写 Mapper 接口(实现数据增删改查),以下是关键源码片段(以订单模块为例):

/** * 订单实体类(与t_order表对应) */ @Data public class Order { private Long id; private Long userId; private Long masterId; private Long serviceTypeId; private Date serviceTime; private String startAddr; private BigDecimal orderAmount; private Integer orderStatus; // 订单状态,对应枚举 private Date createTime; private Date updateTime; // 关联字段(非数据库字段,用于返回订单详情) private User user; // 下单用户信息 private HousekeepingMaster master; // 服务师傅信息 private ServiceType serviceType; // 服务类型信息 } /** * 订单Mapper接口 */ @Mapper public interface OrderMapper { // 创建订单(用户下单) int createOrder(Order order); // 根据订单ID查询订单详情(关联用户、师傅、服务类型) Order selectOrderById(@Param("orderId") Long orderId); // 师傅接单:更新订单的师傅ID和状态 int masterReceiveOrder(@Param("orderId") Long orderId, @Param("masterId") Long masterId, @Param("orderStatus") Integer orderStatus); // 更新订单状态(服务中、完成、取消等) int updateOrderStatus(@Param("orderId") Long orderId, @Param("orderStatus") Integer orderStatus); }

3.3 第三步:核心服务层与控制器实现

服务层(Service)处理核心业务逻辑,控制器(Controller)提供接口对接前端,以下是用户下单、师傅接单的核心源码片段,简洁实用,可直接复用:

/** * 订单状态枚举(避免硬编码) */ public enum OrderStatusEnum { WAIT_RECEIVE(0, "待接单"), RECEIVED(1, "已接单"), SERVICEING(2, "服务中"), COMPLETED(3, "已完成"), CANCELLED(4, "已取消"); private final Integer code; private final String desc; OrderStatusEnum(Integer code, String desc) { this.code = code; this.desc = desc; } public Integer getCode() { return code; } public String getDesc() { return desc; } } /** * 订单Service实现类(核心业务逻辑) */ @Service @Slf4j public class OrderServiceImpl implements OrderService { @Autowired private OrderMapper orderMapper; @Autowired private ServiceTypeMapper serviceTypeMapper; // 用户下单核心方法 @Override public Long createOrder(OrderCreateDTO orderDTO, Long userId) { try { // 1. 查询服务类型,获取基础价格 ServiceType serviceType = serviceTypeMapper.selectById(orderDTO.getServiceTypeId()); if (serviceType == null) { throw new BusinessException("服务类型不存在"); } // 2. 计算订单金额(基础价格 * 服务时长) BigDecimal orderAmount = serviceType.getPrice().multiply(new BigDecimal(orderDTO.getServiceHour())); // 3. 构建订单信息 Order order = new Order(); order.setUserId(userId); order.setServiceTypeId(orderDTO.getServiceTypeId()); order.setServiceTime(orderDTO.getServiceTime()); order.setStartAddr(orderDTO.getStartAddr()); order.setOrderAmount(orderAmount); order.setOrderStatus(OrderStatusEnum.WAIT_RECEIVE.getCode()); order.setCreateTime(new Date()); order.setUpdateTime(new Date()); // 4. 保存订单 orderMapper.createOrder(order); return order.getId(); } catch (Exception e) { log.error("用户下单异常:", e); throw new BusinessException("下单失败,请重试"); } } // 师傅接单核心方法 @Override public boolean masterReceiveOrder(Long orderId, Long masterId) { try { // 1. 查询订单当前状态 Order order = orderMapper.selectOrderById(orderId); if (order == null) { throw new BusinessException("订单不存在"); } // 2. 校验状态:仅待接单订单可接单 if (!OrderStatusEnum.WAIT_RECEIVE.getCode().equals(order.getOrderStatus())) { throw new BusinessException("当前订单无法接单"); } // 3. 更新订单信息 int result = orderMapper.masterReceiveOrder(orderId, masterId, OrderStatusEnum.RECEIVED.getCode()); return result > 0; } catch (Exception e) { log.error("师傅接单异常:", e); return false; } } } /** * 订单控制器(对接前端接口) */ @RestController @RequestMapping("/api/order") public class OrderController { @Autowired private OrderService orderService; // 用户下单接口 @PostMapping("/create") public Result<Long> createOrder(@RequestBody OrderCreateDTO orderDTO, @RequestHeader("userId") Long userId) { Long orderId = orderService.createOrder(orderDTO, userId); return Result.success(orderId, "下单成功,等待师傅接单"); } // 师傅接单接口 @PostMapping("/receive") public Result<Boolean> receiveOrder(@RequestParam Long orderId, @RequestParam Long masterId) { boolean result = orderService.masterReceiveOrder(orderId, masterId); return result ? Result.success(true, "接单成功") : Result.fail("接单失败"); } }

四、项目测试与部署(从零落地)

从零搭建项目后,需完成测试与部署,确保项目能正常运行,以下是核心步骤,简化冗余操作,适合新手入门。

4.1 项目测试

  1. 数据库测试:将前文的建表语句导入 MySQL,创建数据库(housekeeping_db),执行建表语句,确保核心表创建成功;

  2. 接口测试:通过 Postman 测试核心接口(用户下单、师傅接单、订单查询等),输入正确参数,查看接口响应结果,确保接口正常返回;

  3. 异常测试:测试参数缺失、订单状态异常等场景,查看异常处理是否生效,确保系统稳定性。

4.2 项目部署(简化版)

  1. 环境准备:搭建 Linux 服务器,安装 JDK、Tomcat、MySQL、Redis,配置环境变量;

  2. 数据库部署:在 Linux 上导入数据库脚本,创建数据库用户,分配权限;

  3. 项目打包:在 IDEA 中将项目打包为 jar 包,确保打包无错误;

  4. 项目启动:将 jar 包上传至 Linux 服务器,通过命令(nohup java -jar 包名.jar &)启动项目,配置后台运行;

  5. 验证:部署完成后,通过 Postman 测试接口,确保项目正常运行。

五、项目优化与扩展建议(从零升级)

本项目为从零搭建的基础版本,可根据实际需求进行优化和扩展,提升系统的稳定性、性能和用户体验,适合后续迭代升级,具体建议如下:

5.1 性能优化

  • 缓存优化:将热门服务类型、师傅在线状态、待接单订单等高频访问数据缓存到 Redis,减少数据库查询压力;

  • 数据库优化:对订单表、师傅表添加合适的索引,优化 SQL 语句,避免慢查询;

  • 并发优化:多师傅同时接单同一订单时,添加分布式锁(Redis 锁),避免重复接单。

5.2 功能扩展

  • 支付集成:对接微信支付、支付宝支付,实现订单在线支付、退款功能,贴合实际运营需求;

  • 地图集成:对接高德地图、百度地图 API,实现同城定位、师傅距离计算、路线规划;

  • 消息通知:集成短信、推送通知,订单状态变更时,及时通知用户和师傅;

  • 平台佣金:添加平台佣金设置功能,师傅完成服务后,自动扣除佣金,计算实际收入。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐