研究背景
随着二胎、三胎政策的放开及居民消费水平的提升,科学坐月子成为现代家庭的刚需。传统线下中介存在信息不透明、匹配效率低、服务监管难等痛点。本项目旨在利用“互联网+”思维,构建一个连接雇主(产妇家庭)与月嫂的垂直服务平台,实现服务标准化、流程透明化。
技术选型
前端:微信小程序(原生 WXML/WXSS/JS) 后端:Java Spring Boot 2.x 数据库:MySQL 8.0 缓存:Redis (用于存储验证码、热点月嫂信息) 文件存储:本地存储或 OSS (存储月嫂照片、证书) 开发工具:微信开发者工具、IntelliJ IDEA、Navicat
系统需求分析
客户端(雇主):浏览月嫂、查看简历/证书、预约面试、下单支付、评价服务。 服务端(月嫂):完善档案、上传证书、接单管理、日程查看。 管理端(后台):审核月嫂资质、订单调度、投诉处理、数据统计。
数据库设计
- 用户 (User) 与 订单 (Order):1:N (一个用户可下多个订单)
- 月嫂 (Nanny) 与 订单 (Order):1:N (一个月嫂可接多个订单)
- 月嫂 (Nanny) 与 证书 (Certificate):1:N (一个月嫂可上传多张证书)
- 用户 (User) 与 收藏 (Favorite):M:N (多对多,需中间表)
- 订单 (Order) 与 评价 (Review):1:1 (一单对应一条评价)
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`openid` varchar(64) NOT NULL COMMENT '微信OpenID',
`nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
`avatar_url` varchar(255) DEFAULT NULL COMMENT '头像',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`status` tinyint(1) DEFAULT '1' COMMENT '状态 0禁用 1正常',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_openid` (`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
CREATE TABLE `nanny_profile` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL COMMENT '关联sys_user.id',
`real_name` varchar(50) NOT NULL COMMENT '真实姓名',
`age` int(3) NOT NULL COMMENT '年龄',
`experience_years` int(2) NOT NULL COMMENT '从业年限',
`skill_tags` varchar(255) DEFAULT NULL COMMENT '技能标签(催乳/早教/月子餐)',
`base_price` decimal(10,2) NOT NULL COMMENT '基础月薪',
`level` varchar(20) DEFAULT '初级' COMMENT '等级(初级/中级/高级/金牌)',
`audit_status` tinyint(1) DEFAULT '0' COMMENT '审核状态 0待审 1通过 2拒绝',
`rating` decimal(3,2) DEFAULT '5.00' COMMENT '综合评分',
`bio` text COMMENT '个人简介',
PRIMARY KEY (`id`),
KEY `idx_level` (`level`),
KEY `idx_audit` (`audit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月嫂档案表';
CREATE TABLE `nanny_certificate` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nanny_id` bigint(20) NOT NULL COMMENT '关联nanny_profile.id',
`cert_name` varchar(100) NOT NULL COMMENT '证书名称(如母婴护理师证)',
`cert_image` varchar(255) NOT NULL COMMENT '证书图片URL',
`issue_date` date DEFAULT NULL COMMENT '颁发日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月嫂证书表';
CREATE TABLE `service_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL COMMENT '订单编号',
`user_id` bigint(20) NOT NULL COMMENT '下单用户',
`nanny_id` bigint(20) DEFAULT NULL COMMENT '指派月嫂(下单时可为空,面试后确定)',
`service_type` varchar(20) NOT NULL COMMENT '服务类型(住家/白班)',
`start_date` date NOT NULL COMMENT '预产期/开始日期',
`duration_days` int(3) NOT NULL COMMENT '服务天数(26/42/56)',
`total_amount` decimal(10,2) NOT NULL COMMENT '订单总额',
`status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '状态:0待支付 1待面试 2待服务 3服务中 4已完成 5已取消',
`pay_time` datetime DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务订单表';
CREATE TABLE `order_review` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
`nanny_id` bigint(20) NOT NULL,
`score` tinyint(1) NOT NULL COMMENT '评分1-5',
`content` varchar(500) DEFAULT NULL COMMENT '评价内容',
`images` varchar(1000) DEFAULT NULL COMMENT '评价图片(逗号分隔)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评价表';
核心代码实现
@RestController
@RequestMapping("/api/nanny")
public class NannyController {
@Autowired
private NannyService nannyService;
/**
* 获取月嫂列表(支持筛选:等级、经验、技能)
*/
@GetMapping("/list")
public Result<Page<NannyVO>> getNannyList(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String level,
@RequestParam(required = false) Integer minExperience,
@RequestParam(required = false) String skill) {
NannyQueryDTO query = new NannyQueryDTO();
query.setPage(page);
query.setSize(size);
query.setLevel(level);
query.setMinExperience(minExperience);
query.setSkill(skill);
Page<NannyVO> result = nannyService.queryNannies(query);
return Result.success(result);
}
/**
* 获取月嫂详情(含证书列表)
*/
@GetMapping("/{id}")
public Result<NannyDetailVO> getNannyDetail(@PathVariable Long id) {
NannyDetailVO detail = nannyService.getDetailById(id);
if (detail == null) {
return Result.error("月嫂不存在");
}
return Result.success(detail);
}
}
@Service
public class NannyServiceImpl implements NannyService {
@Autowired
private NannyMapper nannyMapper;
@Autowired
private CertificateMapper certificateMapper;
@Override
public Page<NannyVO> queryNannies(NannyQueryDTO dto) {
// 构建动态查询条件
LambdaQueryWrapper<NannyProfile> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(NannyProfile::getAuditStatus, 1) // 只查已审核通过的
.orderByDesc(NannyProfile::getRating); // 按评分排序
if (StringUtils.isNotBlank(dto.getLevel())) {
wrapper.eq(NannyProfile::getLevel, dto.getLevel());
}
if (dto.getMinExperience() != null) {
wrapper.ge(NannyProfile::getExperienceYears, dto.getMinExperience());
}
if (StringUtils.isNotBlank(dto.getSkill())) {
wrapper.like(NannyProfile::getSkillTags, dto.getSkill());
}
Page<NannyProfile> page = new Page<>(dto.getPage(), dto.getSize());
Page<NannyProfile> resultPage = nannyMapper.selectPage(page, wrapper);
// 转换 VO (简化对象,隐藏敏感信息)
List<NannyVO> voList = resultPage.getRecords().stream()
.map(this::convertToVO)
.collect(Collectors.toList());
Page<NannyVO> voPage = new Page<>();
BeanUtils.copyProperties(resultPage, voPage);
voPage.setRecords(voList);
return voPage;
}
// ... 其他方法
}
测试用例
| 测试模块 | 测试点 | 预期结果 |
|---|---|---|
| 月嫂筛选 | 选择“金牌” + “5年经验” | 列表仅显示符合两个条件的月嫂 |
| 下单流程 | 库存不足/月嫂档期冲突 | 提示“该月嫂当前时段不可约”,阻止下单 |
| 资质审核 | 上传模糊证书图片 | 后台审核驳回,提示重新上传 |
| 并发测试 | 多人同时预约同一热门月嫂 | 仅一人成功,其他人提示名额已满 |
- 本系统实现了月嫂服务的全流程数字化管理。
- 创新点:引入了严格的资质审核机制和双向评价体系,解决了传统中介信任缺失的问题;设计了灵活的档期管理算法,有效避免撞单。
- 应用价值:降低了雇主的筛选成本,提升了月嫂的接单效率,具有良好的市场推广前景
UI设计
后台管理系统