Files
yuezi-saas/docs/06-miniapp-design.md
T
li 11c177a432 feat: 第一阶段基础框架搭建
后端 (Laravel 10 + Sanctum):
- RBAC 四层权限系统 (users→roles→permissions→menus)
- 门店隔离中间件 (BelongsToStore Trait + StoreIsolation Middleware)
- 操作日志中间件 (自动记录写操作)
- 权限检查中间件 (CheckPermission)
- 16张数据库表迁移 (系统基础+RBAC+字典+配置)
- 11个 Eloquent Model
- Auth API (登录/登出/用户信息)
- 系统设置模块 CRUD (门店/部门/职务/用户/角色/菜单/权限/字典/日志)
- 45条 RESTful API 路由
- InitSeeder 初始数据 (超管/角色/76权限/31菜单)

前端 (Vue 3 + Element Plus + Vite):
- Axios 请求封装 + Token 注入
- Pinia 状态管理 (user + permission store)
- 动态路由 (服务端菜单→前端路由自动生成)
- 后台布局 (侧边栏+顶栏+主内容区)
- 登录页 + 仪表盘首页
- 系统设置 7 个 CRUD 页面

技术方案文档 (7卷):
- 技术总览/数据库设计/API规范/RBAC设计/模块详设/小程序设计/部署方案
2026-03-13 19:52:09 +08:00

16 KiB
Raw Blame History

宫中有喜 — 微客宝小程序设计

一、概述

项 值
产品名称 宫中有喜·微客宝
类型 微信小程序
框架 uni-app (Vue 3)
目标用户 在住/潜在客户(产妇及家属)
核心功能 服务商城、月子餐、共伴成长、月嫂预约、学堂社区

二、页面架构

2.1 Tab 导航(底部 5 Tab)

┌──────────────────────────────────┐
│           微客宝小程序            │
├────┬────┬────┬────┬────┤
│ 首页 │ 服务 │ 成长 │ 学堂 │ 我的 │
└────┴────┴────┴────┴────┘

2.2 完整页面树

pages/
├── index/              # Tab1: 首页
│   └── index.vue       # 轮播 + 快捷入口 + 推荐 + 活动
│
├── service/            # Tab2: 服务
│   ├── index.vue       # 服务分类列表
│   ├── detail.vue      # 服务/套餐详情
│   ├── booking.vue     # 预约下单
│   ├── nanny/
│   │   ├── list.vue    # 月嫂列表
│   │   ├── detail.vue  # 月嫂详情
│   │   └── order.vue   # 月嫂预约
│   └── meal/
│       ├── today.vue   # 今日餐单
│       ├── week.vue    # 本周餐单
│       └── custom.vue  # 自选点餐
│
├── growth/             # Tab3: 共伴成长
│   ├── index.vue       # 成长首页(宝宝+妈妈)
│   ├── baby/
│   │   ├── records.vue # 宝宝护理记录
│   │   ├── chart.vue   # 宝宝数据图表
│   │   └── milestone.vue # 成长里程碑
│   └── mom/
│       ├── records.vue # 妈妈护理记录
│       └── chart.vue   # 妈妈健康图表
│
├── study/              # Tab4: 学堂
│   ├── index.vue       # 文章列表
│   ├── detail.vue      # 文章详情
│   └── community/
│       ├── index.vue   # 社区帖子列表
│       ├── detail.vue  # 帖子详情
│       └── post.vue    # 发帖
│
├── mine/               # Tab5: 我的
│   ├── index.vue       # 个人中心首页
│   ├── orders/
│   │   ├── list.vue    # 我的订单
│   │   └── detail.vue  # 订单详情
│   ├── account.vue     # 账户余额/储值卡
│   ├── coupons.vue     # 优惠券
│   ├── reviews.vue     # 我的评价
│   ├── collections.vue # 我的收藏
│   ├── messages.vue    # 消息通知
│   └── settings.vue    # 设置
│
├── auth/               # 认证
│   ├── login.vue       # 微信授权登录
│   └── bindPhone.vue   # 绑定手机号
│
├── pay/                # 支付
│   ├── cashier.vue     # 收银台
│   └── result.vue      # 支付结果
│
└── common/             # 公共页面
    ├── webview.vue     # 内嵌网页
    └── preview.vue     # 图片预览

三、核心页面设计

3.1 首页 (index)

┌────────────────────────────┐
│     [轮播图 Banner]         │
├────────────────────────────┤
│  📋公告栏(滚动)           │
├────┬────┬────┬────┤
│ 商城 │ 点餐 │ 月嫂 │ 更多 │  ← 快捷入口
├────┴────┴────┴────┤
│  ⭐ 热门服务推荐            │
│  ┌─────┐ ┌─────┐          │
│  │ 项目1│ │ 项目2│          │
│  └─────┘ └─────┘          │
├────────────────────────────┤
│  🎉 精彩活动                │
│  ┌──────────────────┐      │
│  │ 活动卡片           │      │
│  └──────────────────┘      │
├────────────────────────────┤
│  📖 孕妈课堂(文章推荐)    │
│  ┌──────────────────┐      │
│  │ 文章卡片           │      │
│  └──────────────────┘      │
└────────────────────────────┘

数据来源:

  • 轮播图:GET /client/home/banners
  • 公告:GET /client/home/notices
  • 推荐服务:GET /client/home/services
  • 活动:GET /client/home/activities
  • 文章推荐:GET /client/articles?recommend=1&limit=3

3.2 共伴成长页

┌────────────────────────────┐
│  [宝宝头像]  小明  出生第15天  │
│  体重: 3.5kg  身长: 50cm    │
├────────────────────────────┤
│  Tab: [护理记录] [数据图表] [里程碑] │
├────────────────────────────┤
│  今日护理记录                │
│  09:00 喂奶 120ml ✓        │
│  09:30 换尿布 ✓            │
│  10:00 体温测量 36.8°C ✓   │
│  11:00 洗澡 ✓              │
│  12:00 喂奶 100ml ✓        │
│  ...                       │
├────────────────────────────┤
│  切换至 [妈妈] 查看         │
└────────────────────────────┘

图表使用 uCharts 或 ECharts 小程序版,展示:

  • 体重增长曲线
  • 喂奶量趋势
  • 睡眠时长统计
  • 健康指标折线图

3.3 月子餐页

┌────────────────────────────┐
│  📅 3月15日 周五  今日餐单   │
├────────────────────────────┤
│  🌅 早餐 07:30              │
│  ┌────────────────────┐    │
│  │ [图] 红枣小米粥     │    │
│  │ [图] 蒸蛋           │    │
│  │ [图] 核桃酥         │    │
│  └────────────────────┘    │
│  [👍已送达] [💬反馈]        │
├────────────────────────────┤
│  🍵 早点心 10:00            │
│  ┌────────────────────┐    │
│  │ [图] 银耳莲子汤     │    │
│  └────────────────────┘    │
│  [⏳待送达]                 │
├────────────────────────────┤
│  🌞 午餐 12:00             │
│  ┌────────────────────┐    │
│  │ [图] 黄花菜炖鸡     │    │
│  │ [图] 时令蔬菜       │    │
│  │ [图] 乌鸡汤         │    │
│  └────────────────────┘    │
│  [🔄申请换餐]              │
├────────────────────────────┤
│  🍵🌙🌙 午点/晚餐/晚点... │
├────────────────────────────┤
│  [查看本周餐单] [自选点餐]  │
└────────────────────────────┘

四、组件设计

4.1 公共组件

components/
├── NavBar.vue           # 自定义导航栏
├── TabBar.vue           # 底部导航(自定义实现)
├── EmptyState.vue       # 空状态占位
├── LoadMore.vue         # 加载更多/到底了
├── PriceTag.vue         # 价格显示(¥ 格式化)
├── StarRating.vue       # 评分星级
├── CountDown.vue        # 倒计时
├── ImageUploader.vue    # 图片上传
├── DatePicker.vue       # 日期选择
├── OrderCard.vue        # 订单卡片
├── ServiceCard.vue      # 服务项目卡片
├── ArticleCard.vue      # 文章卡片
├── NannyCard.vue        # 月嫂卡片
├── MealCard.vue         # 菜品卡片
└── StatusTag.vue        # 状态标签

4.2 业务组件

components/business/
├── PayButton.vue        # 支付按钮(封装微信支付)
├── PhoneAuth.vue        # 手机号授权组件
├── ShareCard.vue        # 分享卡片生成
├── CouponSelector.vue   # 优惠券选择
├── ServiceBooking.vue   # 服务预约表单
└── ReviewForm.vue       # 评价表单(星级+文字+图片)

五、状态管理 (Pinia)

stores/
├── user.js              # 用户信息、Token、登录状态
├── cart.js              # 购物车/预约车
├── order.js             # 订单状态
└── app.js               # 全局配置(门店信息、系统参数)

5.1 用户状态

// stores/user.js
export const useUserStore = defineStore('user', {
    state: () => ({
        token: '',
        userInfo: null,      // 微信用户信息
        customerInfo: null,  // 客户业务信息
        isLoggedIn: false,
        storeId: null,       // 所属门店
    }),
    actions: {
        async wechatLogin(code) { ... },
        async bindPhone(encryptedData, iv) { ... },
        async fetchProfile() { ... },
        logout() { ... },
    }
})

六、API 封装

api/
├── request.js           # 请求封装(baseURL, 拦截器, Token注入)
├── auth.js              # 登录/注册
├── home.js              # 首页数据
├── service.js           # 服务/套餐
├── meal.js              # 月子餐
├── nanny.js             # 月嫂
├── growth.js            # 共伴成长
├── order.js             # 订单
├── pay.js               # 支付
├── article.js           # 文章/学堂
├── community.js         # 社区
└── user.js              # 个人中心

6.1 请求封装

// api/request.js
const BASE_URL = 'https://xxx.com/api/v1/client'

const request = (options) => {
    const userStore = useUserStore()
    return new Promise((resolve, reject) => {
        uni.request({
            url: BASE_URL + options.url,
            method: options.method || 'GET',
            data: options.data,
            header: {
                'Authorization': `Bearer ${userStore.token}`,
                'Content-Type': 'application/json'
            },
            success: (res) => {
                if (res.data.code === 0) {
                    resolve(res.data.data)
                } else if (res.data.code >= 40100 && res.data.code < 40200) {
                    // Token 过期,跳转登录
                    userStore.logout()
                    uni.navigateTo({ url: '/pages/auth/login' })
                    reject(res.data)
                } else {
                    uni.showToast({ title: res.data.message, icon: 'none' })
                    reject(res.data)
                }
            },
            fail: reject
        })
    })
}

export default request

七、微信能力集成

7.1 登录流程

用户打开小程序
  ↓
wx.login() 获取 code
  ↓
POST /client/auth/wechat-login { code }
  ↓
后端:code → openid/unionid → 查找/创建用户 → 返回 token
  ↓
若无手机号 → 弹出绑定手机号
  ↓
getPhoneNumber → 解密 → 绑定
  ↓
登录完成,进入首页

7.2 微信支付流程

用户点击支付
  ↓
POST /client/pay/wechat { order_id, ... }
  ↓
后端调用微信统一下单 → 返回支付参数
  ↓
前端 wx.requestPayment(payParams)
  ↓
支付成功/失败 → 跳转结果页
  ↓
后端接收微信回调 → 更新订单状态

7.3 分享

// 页面分享配置
onShareAppMessage() {
    return {
        title: '宫中有喜·月子会所',
        path: '/pages/index/index?inviter=' + userId,
        imageUrl: '/static/share-cover.png'
    }
}

onShareTimeline() {
    return {
        title: '宫中有喜·专业月子护理',
        imageUrl: '/static/share-cover.png'
    }
}

7.4 订阅消息

模板 触发场景
订单状态通知 下单成功、支付成功、服务完成
服务预约提醒 预约确认、服务前1小时提醒
餐单推送 每日餐单发布
护理日报 每日护理小结
活动通知 新活动上线

7.5 其他微信能力

能力 用途
地图 门店定位、导航
客服 在线客服对话
图片选择/预览 评价上传图片
扫码 扫码签到、扫码支付
生物认证 敏感操作验证

八、UI 设计规范

8.1 色彩

色彩 色值 用途
主色 #E8A87C 温暖橘粉,品牌色
辅色 #D4A574 暖棕,辅助强调
成功 #67C23A 完成/送达
警告 #E6A23C 提醒/待处理
危险 #F56C6C 异常/取消
文字主色 #303133 正文
文字次色 #909399 辅助说明
背景色 #F5F5F5 页面背景
卡片色 #FFFFFF 内容卡片

8.2 字体

场景 大小 权重
大标题 36rpx bold
标题 32rpx bold
正文 28rpx normal
辅助文字 24rpx normal
价格 36rpx bold

8.3 间距

场景 值
页面边距 32rpx
卡片间距 24rpx
卡片内边距 24rpx
元素间距 16rpx
紧凑间距 8rpx

8.4 圆角

场景 值
按钮 40rpx(胶囊)
卡片 16rpx
图片 12rpx
标签 8rpx

九、性能优化

策略 说明
分包加载 主包 < 2MB,子包按 Tab 分
图片懒加载 列表页图片按需加载
数据缓存 首页数据缓存 5 分钟
骨架屏 列表页加载时显示骨架
防抖节流 搜索输入防抖、按钮点击节流
虚拟列表 长列表使用 recycle-view

9.1 分包配置

{
    "pages": [
        "pages/index/index",
        "pages/service/index",
        "pages/growth/index",
        "pages/study/index",
        "pages/mine/index"
    ],
    "subPackages": [
        {
            "root": "pages/service",
            "pages": ["detail", "booking", "nanny/list", "nanny/detail", "nanny/order", "meal/today", "meal/week", "meal/custom"]
        },
        {
            "root": "pages/growth",
            "pages": ["baby/records", "baby/chart", "baby/milestone", "mom/records", "mom/chart"]
        },
        {
            "root": "pages/study",
            "pages": ["detail", "community/index", "community/detail", "community/post"]
        },
        {
            "root": "pages/mine",
            "pages": ["orders/list", "orders/detail", "account", "coupons", "reviews", "collections", "messages", "settings"]
        },
        {
            "root": "pages/auth",
            "pages": ["login", "bindPhone"]
        },
        {
            "root": "pages/pay",
            "pages": ["cashier", "result"]
        }
    ]
}

十、安全设计

措施 说明
Token 存储 uni.setStorageSync 加密存储
接口签名 敏感接口请求签名(timestamp + nonce + sign)
HTTPS 所有接口强制 HTTPS
输入校验 前端校验 + 后端校验双重保障
敏感数据 手机号脱敏显示(138****8000)
支付安全 服务端生成支付参数,前端不接触密钥
防重复提交 支付/下单按钮加 loading + 接口幂等