从0到1:基于微信小程序的“月嫂上门”服务平台设计与实现笔记(一)

0 阅读5分钟

研究背景

随着二胎、三胎政策的放开及居民消费水平的提升,科学坐月子成为现代家庭的刚需。传统线下中介存在信息不透明、匹配效率低、服务监管难等痛点。本项目旨在利用“互联网+”思维,构建一个连接雇主(产妇家庭)与月嫂的垂直服务平台,实现服务标准化、流程透明化。

技术选型

前端:微信小程序(原生 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设计

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

后台管理系统

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

git仓库代码下载

git代码下载