后端 (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设计/模块详设/小程序设计/部署方案
16 KiB
16 KiB
宫中有喜 — 微客宝小程序设计
一、概述
| 项 | 值 |
|---|---|
| 产品名称 | 宫中有喜·微客宝 |
| 类型 | 微信小程序 |
| 框架 | 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 + 接口幂等 |