Files
gym-manage/docs/plans/2026-02-28-gym-manage-design.md
T
张翔 e7c0c8a1c2 docs: 添加健身房管理系统产品设计文档
- 系统架构设计(多租户、响应式、事件驱动)
- 会员权益引擎(时长/次数/储值/等级)
- 预约服务模块(团课/私教/场地/线上)
- 签到服务模块(扫码/刷脸/NFC/教练代签)
- 计划中心模块(训练计划/课程排期/会员目标/教练排班)
- 会员端与管理后台功能设计
- 数据库设计(PostgreSQL + R2DBC + Flyway)
- 前端技术架构(uniapp + Vue3)
- 项目实施规划与里程碑~
2026-02-28 13:36:07 +08:00

78 KiB
Raw Blame History

健身房管理系统产品设计文档

版本: v1.0
日期: 2026-02-28
作者: 张翔


一、项目概述

1.1 项目背景

打造一款全场景覆盖的健身房管理系统,支持综合型健身俱乐部、精品工作室、连锁品牌等多种业态,实现会员端便捷预约签到、管理后台数据洞察的核心需求。

1.2 核心目标

  • 会员端:一站式查看个人所有信息(会员卡、权益、预约、签到、训练数据)
  • 管理后台:全维度数据整理与分析,支撑运营决策
  • 便捷体验:约课、签到流程简单高效

1.3 适用场景

场景类型 说明
综合型健身俱乐部 多种团课 + 私教 + 器械区,会员规模 500-2000 人
精品工作室 专注某一类课程,会员规模 100-300 人
连锁品牌 多门店运营,跨店约课,统一数据管理

二、系统架构

2.1 整体架构图

┌─────────────────────────────────────────────────────────────────┐
│                         客户端层                                  │
├─────────────┬─────────────┬─────────────┬─────────────────────────┤
│  会员小程序   │  教练端App   │  管理后台PC  │   硬件设备(人脸/NFC)      │
│  (uniapp)   │  (uniapp)   │  (Vue3)     │                         │
└──────┬──────┴──────┬──────┴──────┬──────┴────────────┬────────────┘
       │             │             │                   │
       └─────────────┴──────┬──────┴───────────────────┘
                            │
                    ┌───────▼───────┐
                    │   API Gateway  │
                    │   (统一网关)    │
                    └───────┬───────┘
                            │
       ┌────────────────────┼────────────────────┐
       │                    │                    │
┌──────▼──────┐     ┌───────▼───────┐    ┌──────▼──────┐
│ 会员服务     │     │  预约服务      │    │  数据服务    │
│ (会员/卡券)  │     │ (课程/场地)    │    │ (报表/分析)  │
└──────┬──────┘     └───────┬───────┘    └──────┬──────┘
       │                    │                    │
       └────────────────────┼────────────────────┘
                            │
                    ┌───────▼───────┐
                    │  PostgreSQL   │
                    │  + Caffeine   │
                    └───────────────┘

2.2 核心设计理念

  • 多租户架构:支持连锁多门店,数据隔离,统一管理
  • 资源抽象:团课名额、教练时段、场地、线上课程统一为"可预约资源"
  • 响应式编程:WebFlux处理高并发预约请求,JDK 21虚拟线程优化阻塞操作
  • 事件驱动:签到、预约、消费等行为触发事件,驱动数据统计和通知推送

2.3 技术栈

层级 技术选型
前端-会员端 uniapp + Vue3 + TypeScript + Pinia
前端-管理后台 Vue3 + TypeScript + Vite + Element Plus
后端框架 Spring Boot 3 + WebFlux + JDK 21
数据库 PostgreSQL + R2DBC + Flyway
缓存 Caffeine(本地)+ Redis(可选扩展)
部署 Docker + CI/CD

三、会员权益引擎

3.1 会员体系数据模型

┌─────────────────────────────────────────────────────────────────┐
│                        会员体系                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌─────────┐     ┌─────────────┐     ┌─────────────┐          │
│   │  会员    │────▶│  会员卡实例  │◀────│  卡模板     │          │
│   │ Member  │     │ MemberCard  │     │ CardTemplate│          │
│   └─────────┘     └──────┬──────┘     └──────┬──────┘          │
│                          │                   │                  │
│                          ▼                   ▼                  │
│                   ┌─────────────┐     ┌─────────────┐          │
│                   │ 权益包实例   │     │ 权益包模板  │          │
│                   │ BenefitPack │     │BenefitDef   │          │
│                   └──────┬──────┘     └──────┬──────┘          │
│                          │                   │                  │
│                          ▼                   ▼                  │
│                   ┌─────────────────────────────────┐          │
│                   │         权益明细                 │          │
│                   │  - 时长权益 (有效期)             │          │
│                   │  - 次数权益 (剩余次数)           │          │
│                   │  - 储值权益 (余额)               │          │
│                   │  - 等级权益 (等级+特权)          │          │
│                   └─────────────────────────────────┘          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

3.2 四种权益类型

权益类型 数据结构 消费逻辑 典型场景
时长权益 validFrom, validTo 签到时校验有效期 月卡、年卡
次数权益 totalCount, usedCount 预约/签到时扣减 10次卡、私教课时包
储值权益 balance 消费时扣减金额 预充值账户
等级权益 level, exp, privileges 消费累计经验值 VIP会员体系

3.3 权益校验优先级

校验顺序(可配置):
1. 次数权益 → 2. 时长权益 → 3. 储值权益 → 4. 等级折扣

示例场景:
会员预约私教课 → 优先扣减私教课时包(次数) → 无则检查年卡是否有效(时长) 
→ 无则使用储值余额支付 → 根据VIP等级享受折扣

3.4 会员等级升级逻辑

升级条件(满足任一):
- 累计消费金额达到阈值
- 累计签到次数达到阈值
- 储值余额保持N元以上

等级特权(可配置):
- 课程预约优先权(提前N小时开放)
- 专属课程解锁
- 消费折扣
- 免费储物柜

四、预约服务模块

4.1 统一预约资源模型

┌─────────────────────────────────────────────────────────────────┐
│                     预约资源抽象层                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌─────────────────────────────────────────────────────────┐  │
│   │              BookableResource (可预约资源)               │  │
│   ├─────────────────────────────────────────────────────────┤  │
│   │  id, type, name, capacity, status                       │  │
│   │  availableSlots[]  // 可预约时段                         │  │
│   │  pricingRules[]    // 定价规则                          │  │
│   │  constraints[]     // 预约约束                          │  │
│   └─────────────────────────────────────────────────────────┘  │
│                              △                                  │
│         ┌──────────┬──────────┼──────────┬──────────┐         │
│         │          │          │          │          │         │
│   ┌─────▼─────┐┌───▼───┐┌─────▼─────┐┌───▼───┐┌────▼────┐   │
│   │  团课课程  ││ 私教课 ││   场地     ││线上课程││ 教练时段 │   │
│   │ GroupClass││Private││  Venue     ││Online ││CoachSlot│   │
│   └───────────┘└───────┘└───────────┘└───────┘└─────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

4.2 四种预约类型对比

类型 库存单位 预约窗口 取消规则 确认流程
团课 课程名额(如20人) 开课前N小时截止 开课前2小时免费取消 系统自动确认
私教 教练时段(1对1 需提前预约 需提前24小时取消 教练确认/系统自动
场地 场地时段(如1小时) 可预约未来7天 开始前1小时免费取消 系统自动确认
线上 观看权限(无限) 随时可预约 无需取消 付款即开通

4.3 预约状态流转

┌─────────┐    预约请求    ┌─────────┐   确认/自动   ┌─────────┐
│  初始   │──────────────▶│  待确认  │─────────────▶│  已确认  │
│ PENDING │               │PENDING  │              │CONFIRMED│
└─────────┘               └────┬────┘              └────┬────┘
                               │                        │
                          拒绝│                   签到/开始
                               ▼                        ▼
                          ┌─────────┐              ┌─────────┐
                          │  已取消  │              │  已完成  │
                          │CANCELLED│              │COMPLETED│
                          └─────────┘              └─────────┘
                               ▲                        │
                               │        未签到           │
                               └────────────────────────┘
                               │                        │
                               │        已签到           │
                               │                        ▼
                          ┌─────────┐              ┌─────────┐
                          │  缺席   │              │  已签到  │
                          │NO_SHOW │              │CHECKED_IN│
                          └─────────┘              └─────────┘

4.4 预约冲突检测

冲突检测维度:
1. 时间冲突: 会员同一时段已有其他预约
2. 名额冲突: 团课已满员
3. 权益冲突: 会员无对应权益或次数不足
4. 资源冲突: 场地/教练时段已被占用

并发处理:
- 使用PostgreSQL行级锁 + 乐观锁
- WebFlux响应式处理高并发抢课
- Caffeine缓存热点课程库存

4.5 预约提醒机制

提醒节点:
- 预约成功 → 即时推送
- 课程开始前2小时 → 提醒推送
- 课程开始前30分钟 → 最后提醒
- 课程结束后 → 邀请评价

推送渠道:
- 微信模板消息(小程序)
- 站内消息中心
- 短信(可选,付费功能)

五、签到服务模块

5.1 统一签到网关架构

┌─────────────────────────────────────────────────────────────────┐
│                        签到网关                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐          │
│   │ 扫码签到 │  │ 刷脸签到 │  │ NFC签到  │  │教练代签 │          │
│   │  QR     │  │ Face    │  │ NFC     │  │ Manual  │          │
│   └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘          │
│        │            │            │            │                │
│        └────────────┴─────┬──────┴────────────┘                │
│                           ▼                                     │
│                  ┌─────────────────┐                           │
│                  │   签到请求解析   │                           │
│                  │  - 会员身份识别  │                           │
│                  │  - 签到类型判断  │                           │
│                  └────────┬────────┘                           │
│                           ▼                                     │
│                  ┌─────────────────┐                           │
│                  │   签到规则引擎   │                           │
│                  │  - 权益校验      │                           │
│                  │  - 时段校验      │                           │
│                  │  - 防重复签到    │                           │
│                  └────────┬────────┘                           │
│                           ▼                                     │
│                  ┌─────────────────┐                           │
│                  │   签到结果处理   │                           │
│                  │  - 扣减权益      │                           │
│                  │  - 记录日志      │                           │
│                  │  - 触发事件      │                           │
│                  └─────────────────┘                           │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

5.2 四种签到方式

签到方式 硬件需求 验证流程 适用场景
扫码签到 门店展示二维码 会员扫码 → 验证门店/时段 → 签到成功 团课入场、日常健身
刷脸签到 人脸识别终端 人脸采集 → 1:N比对 → 签到成功 高端健身房、无感通行
NFC签到 读卡器/手环 刷卡/手环 → 读取会员ID → 签到成功 传统健身房、存物柜联动
教练代签 教练端App 教练选择学员 → 确认签到 → 记录教练ID 私教课、小班课

5.3 签到业务场景

场景一:团课签到
┌──────────────────────────────────────────────────────┐
│  会员预约团课 → 课程开始前30分钟开放签到入口          │
│       ↓                                              │
│  会员扫码/刷脸 → 校验预约记录 → 签到成功             │
│       ↓                                              │
│  更新预约状态(CHECKED_IN) → 记录签到时间             │
└──────────────────────────────────────────────────────┘

场景二:日常健身签到(无预约)
┌──────────────────────────────────────────────────────┐
│  会员直接到店 → 扫码/刷脸 → 校验会员卡有效性         │
│       ↓                                              │
│  有效 → 签到成功 → 扣减次数/记录入场时间             │
│  无效 → 提示续费/购卡                               │
└──────────────────────────────────────────────────────┘

场景三:私教课签到
┌──────────────────────────────────────────────────────┐
│  教练端查看今日私教预约列表                          │
│       ↓                                              │
│  学员到场 → 教练点击"签到" → 扣减私教课时            │
│       ↓                                              │
│  同步更新会员端状态 → 记录教练+学员双向确认          │
└──────────────────────────────────────────────────────┘

5.4 防作弊机制

1. 地理位置校验
   - 扫码签到时验证GPS是否在门店范围内
   - 允许误差范围可配置(如500米)

2. 时间窗口限制
   - 团课签到:开课前30分钟 ~ 开课后15分钟
   - 日常签到:门店营业时间内
   - 单日签到次数上限(防止恶意刷次数)

3. 设备绑定
   - 刷脸设备需在后台注册绑定门店
   - NFC设备MAC地址白名单

4. 异常行为检测
   - 短时间内多次签到尝试 → 触发风控
   - 同一设备多账号签到 → 标记异常

5.5 离线签到处理

网络故障场景:
1. 签到设备本地缓存会员基础信息(Caffeine本地缓存)
2. 签到记录存入本地队列
3. 网络恢复后自动同步到服务器
4. 后台标记"离线签到"供人工核对

六、计划中心模块

6.1 计划体系架构

┌─────────────────────────────────────────────────────────────────┐
│                        计划中心                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐            │
│  │ 训练计划     │  │ 课程排期     │  │ 会员目标     │            │
│  │TrainingPlan │  │ClassSchedule│  │MemberGoal   │            │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘            │
│         │                │                │                    │
│         │    ┌───────────┴───────────┐    │                    │
│         │    │                       │    │                    │
│         ▼    ▼                       ▼    ▼                    │
│  ┌─────────────────────────────────────────────────┐          │
│  │              教练工作计划 (CoachSchedule)        │          │
│  │  - 排班管理                                      │          │
│  │  - 可预约时段生成                                │          │
│  │  - 工作量统计                                    │          │
│  └─────────────────────────────────────────────────┘          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

6.2 四种计划类型

6.2.1 训练计划(教练→会员)

┌─────────────────────────────────────────────────────┐
│ 训练计划结构                                        │
├─────────────────────────────────────────────────────┤
│ TrainingPlan                                        │
│  ├─ 基本信息: 名称、目标、周期、教练ID              │
│  ├─ 适用会员: 单人/多人/公开模板                    │
│  ├─ 训练阶段[]:                                     │
│  │   ├─ 阶段名称: "适应期"、"增肌期"、"塑形期"      │
│  │   ├─ 持续周数: 2-4周                            │
│  │   └─ 每周训练[]:                                │
│  │       ├─ 训练日: 周一/三/五                     │
│  │       ├─ 训练内容[]: 动作、组数、次数、重量     │
│  │       └─ 预计时长: 60分钟                       │
│  └─ 进度追踪: 完成率、训练日志、效果评估           │
└─────────────────────────────────────────────────────┘

会员端展示:
- 今日训练任务提醒
- 训练动作视频指导
- 训练记录打卡
- 阶段完成进度可视化

6.2.2 课程排期(管理员→系统)

┌─────────────────────────────────────────────────────┐
│ 课程排期结构                                        │
├─────────────────────────────────────────────────────┤
│ ClassSchedule                                       │
│  ├─ 课程信息: 课程名、类型、教练、门店              │
│  ├─ 排期规则:                                       │
│  │   ├─ 单次排期: 指定日期时间                      │
│  │   └─ 周期排期: 每周一/三 19:00,持续N周         │
│  ├─ 容量设置: 最大人数、预约开始时间、截止时间      │
│  ├─ 价格规则: 会员价、非会员价、VIP折扣            │
│  └─ 特殊设置: 取消政策、签到窗口、等待队列         │
└─────────────────────────────────────────────────────┘

智能排课功能:
- 教练时间冲突检测
- 场地占用检测
- 历史上座率参考
- 批量复制排期

6.2.3 会员目标(会员自主)

┌─────────────────────────────────────────────────────┐
│ 会员目标结构                                        │
├─────────────────────────────────────────────────────┤
│ MemberGoal                                          │
│  ├─ 目标类型: 减重/增肌/塑形/体能提升/康复         │
│  ├─ 目标指标:                                       │
│  │   ├─ 目标体重: 70kg                             │
│  │   ├─ 目标体脂率: 15%                            │
│  │   └─ 目标日期: 2024-06-30                       │
│  ├─ 系统推荐:                                       │
│  │   ├─ 推荐课程: 基于目标的课程匹配               │
│  │   ├─ 推荐计划: 关联训练计划模板                 │
│  │   └─ 每周建议: 训练频率、饮食建议               │
│  └─ 进度记录:                                       │
│      ├─ 体重曲线图                                  │
│      ├─ 体测数据记录                                │
│      └─ 目标达成预测                                │
└─────────────────────────────────────────────────────┘

6.2.4 教练工作计划

┌─────────────────────────────────────────────────────┐
│ 教练排班结构                                        │
├─────────────────────────────────────────────────────┤
│ CoachSchedule                                       │
│  ├─ 排班规则:                                       │
│  │   ├─ 固定班次: 周一至周五 10:00-20:00           │
│  │   └─ 弹性时段: 可预约私教的时间窗口              │
│  ├─ 时段状态:                                       │
│  │   ├─ 可预约: 会员可预约私教                     │
│  │   ├─ 已预约: 显示预约会员信息                   │
│  │   ├─ 团课时间: 不可预约私教                     │
│  │   └─ 休息时间: 不可预约                         │
│  └─ 统计看板:                                       │
│      ├─ 本月课时数                                  │
│      ├─ 私教收入                                    │
│      └─ 会员评分                                    │
└─────────────────────────────────────────────────────┘

联动机制:
- 排班变更 → 自动更新可预约时段
- 请假申请 → 已有预约自动通知改约
- 课时统计 → 自动生成绩效报表

6.3 计划间联动关系

┌──────────────────────────────────────────────────────────────┐
│                                                              │
│   课程排期 ──────▶ 生成团课预约资源                          │
│       │                                                      │
│       └──────────▶ 教练工作计划(团课时段自动占用)          │
│                                                              │
│   教练工作计划 ──▶ 生成私教可预约时段                        │
│                                                              │
│   训练计划 ──────▶ 关联推荐课程 ──▶ 课程排期                 │
│       │                                                      │
│       └──────────▶ 会员目标(训练计划作为达成路径)          │
│                                                              │
│   会员目标 ──────▶ 系统推荐 ──▶ 训练计划模板                 │
│                               └─▶ 推荐课程预约               │
│                                                              │
└──────────────────────────────────────────────────────────────┘

七、会员端功能设计

7.1 信息架构

┌─────────────────────────────────────────────────────────────────┐
│                      会员小程序/App                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                      首页                                │   │
│  │  - 今日待办(预约课程、训练任务)                        │   │
│  │  - 快捷入口(预约、签到、我的卡券)                      │   │
│  │  - 推荐课程/活动                                         │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐                  │
│  │  预约   │ │  我的   │ │  训练   │ │  个人   │                  │
│  │  课程   │ │  卡券   │ │  计划   │ │  中心   │                  │
│  └────────┘ └────────┘ └────────┘ └────────┘                  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

7.2 四大核心模块

7.2.1 预约课程模块

┌─────────────────────────────────────────────────────┐
│ 预约课程                                            │
├─────────────────────────────────────────────────────┤
│                                                     │
│  筛选条件:                                          │
│  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐                  │
│  │门店 │ │类型 │ │教练 │ │时间 │                  │
│  └─────┘ └─────┘ └─────┘ └─────┘                  │
│                                                     │
│  课程列表:                                          │
│  ┌─────────────────────────────────────────────┐   │
│  │ 🧘 瑜伽基础课          周一 19:00-20:00     │   │
│  │ 教练: 张教练  |  剩余: 5/20人              │   │
│  │ [预约] [加入候补]                          │   │
│  └─────────────────────────────────────────────┘   │
│  ┌─────────────────────────────────────────────┐   │
│  │ 💪 私教-增肌训练       可选时段             │   │
│  │ 教练: 李教练  |  ¥200/课时                 │   │
│  │ [查看时段] [立即预约]                       │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  我的预约:                                          │
│  - 待参加课程                                       │
│  - 历史记录                                         │
│  - 取消记录                                         │
│                                                     │
└─────────────────────────────────────────────────────┘

7.2.2 我的卡券模块

┌─────────────────────────────────────────────────────┐
│ 我的卡券                                            │
├─────────────────────────────────────────────────────┤
│                                                     │
│  会员卡:                                            │
│  ┌─────────────────────────────────────────────┐   │
│  │ 💳 年卡会员                          VIP2   │   │
│  │ 有效期: 2024.01.01 - 2024.12.31            │   │
│  │ 状态: ✅ 正常使用                           │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  权益明细:                                          │
│  ┌─────────────────────────────────────────────┐   │
│  │ 时长权益: 剩余 286 天                        │   │
│  │ 私教课时: 剩余 8/10 次                       │   │
│  │ 储值余额: ¥1,280.00                         │   │
│  │ 会员等级: VIP2 (距VIP3还需消费¥2000)        │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  消费记录:                                          │
│  - 2024.03.15 私教课扣费 -¥200                     │
│  - 2024.03.10 储值充值 +¥1000                      │
│  - 2024.03.01 月卡续费 -¥299                       │
│                                                     │
│  快捷操作:                                          │
│  [续费] [充值] [购课] [转赠]                        │
│                                                     │
└─────────────────────────────────────────────────────┘

7.2.3 训练计划模块

┌─────────────────────────────────────────────────────┐
│ 训练计划                                            │
├─────────────────────────────────────────────────────┤
│                                                     │
│  我的目标:                                          │
│  ┌─────────────────────────────────────────────┐   │
│  │ 🎯 目标: 减重5kg                            │   │
│  │ 当前进度: 72kg → 目标 67kg                  │   │
│  │ [████████░░░░░░░░] 60%                     │   │
│  │ 预计达成: 2024.05.30                        │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  今日训练:                                          │
│  ┌─────────────────────────────────────────────┐   │
│  │ 📋 增肌计划 - 第3周 第1天                   │   │
│  │ 胸部训练日                                  │   │
│  │                                             │   │
│  │ □ 平板卧推 4组×12次                        │   │
│  │ □ 上斜哑铃飞鸟 3组×15次                    │   │
│  │ □ 绳索夹胸 3组×12次                        │   │
│  │                                             │   │
│  │ [开始训练] [查看动作演示]                   │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  训练记录:                                          │
│  - 本周训练: 3/4 次                                 │
│  - 本月打卡: 12 天                                  │
│  - 连续训练: 5 天 🔥                                │
│                                                     │
└─────────────────────────────────────────────────────┘

7.2.4 个人中心模块

┌─────────────────────────────────────────────────────┐
│ 个人中心                                            │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ┌─────────────────────────────────────────────┐   │
│  │  👤 张三                      VIP2 会员     │   │
│  │  会员号: GYM2024010001                      │   │
│  │  注册门店: XX健身·中关村店                  │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  我的数据:                                          │
│  ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐         │
│  │ 签到  │ │ 预约  │ │ 消费  │ │ 评价  │         │
│  │ 56次  │ │ 23次  │ │¥3.2k │ │ 12条  │         │
│  └───────┘ └───────┘ └───────┘ └───────┘         │
│                                                     │
│  功能列表:                                          │
│  ├── 📊 体测记录                                    │
│  ├── 📋 签到记录                                    │
│  ├── 💰 消费明细                                    │
│  ├── ⭐ 我的评价                                    │
│  ├── 🎁 邀请好友                                    │
│  ├── 📞 联系客服                                    │
│  ├── ⚙️ 账号设置                                    │
│  └── ❓ 帮助中心                                    │
│                                                     │
└─────────────────────────────────────────────────────┘

7.3 会员端信息汇总

信息类别 具体内容 入口位置
会员身份 会员号、等级、注册门店、有效期 个人中心
权益状态 时长/次数/储值/等级权益明细 我的卡券
预约信息 待参加/历史/取消的预约记录 预约课程
签到记录 签到时间、签到方式、关联课程 个人中心
训练数据 训练计划进度、打卡记录、体测数据 训练计划
消费明细 充值、消费、退款流水 我的卡券/个人中心
评价反馈 已评价课程、教练评分记录 个人中心

八、管理后台功能设计

8.1 角色与权限体系

┌─────────────────────────────────────────────────────────────────┐
│                      管理后台角色体系                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────────┐                                                │
│  │  超级管理员  │  全平台权限,多门店管理,系统配置             │
│  └──────┬──────┘                                                │
│         │                                                       │
│  ┌──────┴──────────────────────────────────┐                   │
│  │                                          │                   │
│  ▼                                          ▼                   │
│  ┌─────────────┐                    ┌─────────────┐            │
│  │  门店店长    │                    │  运营管理员  │            │
│  │ 单店全权限   │                    │ 营销活动配置 │            │
│  └──────┬──────┘                    └─────────────┘            │
│         │                                                       │
│  ┌──────┼──────────────────────────┐                           │
│  │      │                          │                           │
│  ▼      ▼                          ▼                           │
│  ┌────────┐ ┌────────┐      ┌─────────────┐                   │
│  │ 前台   │ │ 教练   │      │  财务专员    │                   │
│  │ 接待签到│ │ 排课签到│      │  账单报表    │                   │
│  └────────┘ └────────┘      └─────────────┘                   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

8.2 功能模块架构

┌─────────────────────────────────────────────────────────────────┐
│                        管理后台                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│  │ 数据看板 │ │ 会员管理 │ │ 课程管理 │ │ 教练管理 │ │ 财务管理 │  │
│  └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘  │
│                                                                 │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐  │
│  │ 门店管理 │ │ 签到管理 │ │ 营销中心 │ │ 系统设置 │ │ 硬件管理 │  │
│  └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

8.3 核心模块详解

8.3.1 数据看板

┌─────────────────────────────────────────────────────────────────┐
│ 数据看板                                    门店: 全部 ▼        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  今日概览:                                                      │
│  ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐      │
│  │  今日签到  │ │  今日预约  │ │  今日收入  │ │  新增会员  │      │
│  │    128    │ │    86     │ │  ¥12,580  │ │    15     │      │
│  │  ↑ 12%   │ │  ↑ 8%    │ │  ↑ 23%   │ │  ↓ 5%    │      │
│  └───────────┘ └───────────┘ └───────────┘ └───────────┘      │
│                                                                 │
│  ┌─────────────────────────────┐ ┌─────────────────────────┐  │
│  │     签到趋势(近7天)        │ │    课程上座率排行       │  │
│  │  📊 折线图                   │ │  1. 瑜伽课    95%       │  │
│  │                             │ │  2. 动感单车  88%       │  │
│  │                             │ │  3. 搏击课    82%       │  │
│  └─────────────────────────────┘ └─────────────────────────┘  │
│                                                                 │
│  ┌─────────────────────────────┐ ┌─────────────────────────┐  │
│  │     会员活跃度分布           │ │    即将到期会员预警     │  │
│  │  🥧 饼图                     │ │  本月到期: 45人         │  │
│  │  高活跃 35%                  │ │  已续费: 12人           │  │
│  │  中活跃 40%                  │ │  待跟进: 33人           │  │
│  │  低活跃 25%                  │ │  [一键发送续费提醒]     │  │
│  └─────────────────────────────┘ └─────────────────────────┘  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

8.3.2 会员管理

┌─────────────────────────────────────────────────────────────────┐
│ 会员管理                                                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  筛选: [门店▼] [会员等级▼] [卡类型▼] [状态▼] [注册时间]        │
│  搜索: [会员号/姓名/手机号________________] [查询] [导出]       │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ 会员号    │ 姓名 │ 等级 │ 卡类型 │ 状态 │ 签到 │ 消费   │   │
│  ├───────────┼─────┼─────┼───────┼─────┼─────┼───────┤   │
│  │ GYM001234 │ 张三 │ VIP2│ 年卡  │ 正常 │ 56次│ ¥3.2k │   │
│  │ GYM001235 │ 李四 │ VIP1│ 次卡  │ 正常 │ 23次│ ¥1.5k │   │
│  │ GYM001236 │ 王五 │ 普通│ 月卡  │ 过期 │ 12次│ ¥299  │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  批量操作: [发送通知] [批量续费] [导出数据] [标签管理]          │
│                                                                 │
│  会员详情页:                                                    │
│  ├── 基本信息: 个人资料、注册信息、绑定设备                     │
│  ├── 会员卡券: 持有卡列表、权益明细、消费记录                   │
│  ├── 预约记录: 历史预约、取消记录、爽约记录                     │
│  ├── 签到记录: 签到明细、签到趋势图                             │
│  ├── 训练数据: 体测记录、训练计划、目标进度                     │
│  └── 跟进记录: 销售跟进、客服记录、备注                         │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

8.3.3 其他模块概览

模块 核心功能
课程管理 课程类型管理、课程排期(日历视图)、场地管理、私教课程配置
教练管理 教练列表、排班管理、课时统计、会员评价、私教会员绑定
财务管理 营收概览、收入明细、财务报表、账单管理、退款管理
门店管理 门店信息、营业时间、门店配置、跨店规则
签到管理 签到记录查询、异常签到处理、签到设备绑定
营销中心 优惠券、活动配置、会员通知、短信推送
系统设置 角色权限、字典配置、操作日志、参数设置
硬件管理 人脸设备、NFC设备、扫码设备绑定与状态监控

九、数据库设计

9.1 核心实体关系

┌─────────────────────────────────────────────────────────────────────────┐
│                           核心数据模型                                   │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────┐     1:N      ┌───────────┐     N:M      ┌─────────┐      │
│  │ Tenant  │─────────────▶│   Store   │◀─────────────│  Coach  │      │
│  │ (租户)  │              │  (门店)    │              │ (教练)  │      │
│  └─────────┘              └─────┬─────┘              └────┬────┘      │
│                                 │                         │            │
│                           1:N   │                    1:N  │            │
│                                 ▼                         ▼            │
│  ┌─────────┐     N:M      ┌───────────┐     1:N      ┌─────────┐      │
│  │ Member  │◀────────────▶│   Card    │◀─────────────│CardTmpl │      │
│  │ (会员)  │              │ (会员卡)   │              │(卡模板) │      │
│  └────┬────┘              └─────┬─────┘              └─────────┘      │
│       │                         │                                      │
│       │ 1:N                     │ 1:N                                  │
│       ▼                         ▼                                      │
│  ┌──────────┐            ┌───────────┐                                │
│  │Booking   │            │ Benefit   │                                │
│  │(预约记录) │            │ (权益明细) │                                │
│  └────┬─────┘            └───────────┘                                │
│       │                                                                │
│       │ 1:1                                                            │
│       ▼                                                                │
│  ┌──────────┐            ┌───────────┐     N:M      ┌─────────┐      │
│  │CheckIn   │◀───────────│  Course   │◀─────────────│  Venue  │      │
│  │(签到记录) │     1:N    │  (课程)    │              │ (场地)  │      │
│  └──────────┘            └───────────┘              └─────────┘      │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

9.2 基础字段规范

所有业务表统一包含以下基础字段:

created_at TIMESTAMP DEFAULT NOW(),      -- 创建时间
updated_at TIMESTAMP DEFAULT NOW(),      -- 更新时间
created_by BIGINT,                       -- 创建人ID
updated_by BIGINT,                       -- 更新人ID
deleted_at TIMESTAMP DEFAULT NULL        -- 软删除时间(NULL表示未删除)

9.3 核心表结构

9.3.1 会员相关表

-- 租户表
CREATE TABLE tenant (
    id BIGSERIAL PRIMARY KEY,
    name VARCHAR(128) NOT NULL,
    code VARCHAR(32) NOT NULL UNIQUE,
    status SMALLINT DEFAULT 1,
    config JSONB,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    deleted_at TIMESTAMP DEFAULT NULL
);

-- 门店表
CREATE TABLE store (
    id BIGSERIAL PRIMARY KEY,
    tenant_id BIGINT NOT NULL REFERENCES tenant(id),
    name VARCHAR(128) NOT NULL,
    code VARCHAR(32) NOT NULL,
    address VARCHAR(256),
    longitude DECIMAL(10,6),
    latitude DECIMAL(10,6),
    phone VARCHAR(20),
    business_hours JSONB,
    status SMALLINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

-- 会员表
CREATE TABLE member (
    id BIGSERIAL PRIMARY KEY,
    tenant_id BIGINT NOT NULL REFERENCES tenant(id),
    store_id BIGINT NOT NULL REFERENCES store(id),
    member_no VARCHAR(32) NOT NULL,
    name VARCHAR(64),
    phone VARCHAR(20) NOT NULL,
    avatar VARCHAR(512),
    gender SMALLINT,
    birthday DATE,
    level SMALLINT DEFAULT 0,
    exp INT DEFAULT 0,
    status SMALLINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

-- 会员卡实例表
CREATE TABLE member_card (
    id BIGINT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    member_id BIGINT NOT NULL,
    template_id BIGINT NOT NULL,
    card_no VARCHAR(32) NOT NULL,
    status SMALLINT DEFAULT 1,
    valid_from DATE,
    valid_to DATE,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

-- 权益明细表
CREATE TABLE member_benefit (
    id BIGINT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    member_id BIGINT NOT NULL,
    card_id BIGINT NOT NULL,
    benefit_type SMALLINT NOT NULL,      -- 1时长 2次数 3储值 4等级
    benefit_name VARCHAR(64),
    total_value DECIMAL(12,2),
    used_value DECIMAL(12,2) DEFAULT 0,
    remaining_value DECIMAL(12,2),
    valid_from DATE,
    valid_to DATE,
    status SMALLINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

9.3.2 预约相关表

-- 可预约资源表
CREATE TABLE bookable_resource (
    id BIGINT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    store_id BIGINT NOT NULL,
    resource_type SMALLINT NOT NULL,     -- 1团课 2私教 3场地 4线上
    resource_name VARCHAR(128) NOT NULL,
    capacity INT DEFAULT 1,
    status SMALLINT DEFAULT 1,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

-- 预约时段表
CREATE TABLE booking_slot (
    id BIGINT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    resource_id BIGINT NOT NULL,
    coach_id BIGINT,
    venue_id BIGINT,
    start_time TIMESTAMP NOT NULL,
    end_time TIMESTAMP NOT NULL,
    capacity INT NOT NULL,
    booked_count INT DEFAULT 0,
    waitlist_count INT DEFAULT 0,
    status SMALLINT DEFAULT 1,
    price DECIMAL(10,2),
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

-- 预约记录表
CREATE TABLE booking_record (
    id BIGINT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    member_id BIGINT NOT NULL,
    slot_id BIGINT NOT NULL,
    booking_no VARCHAR(32) NOT NULL,
    status SMALLINT DEFAULT 1,
    check_in_time TIMESTAMP,
    cancel_time TIMESTAMP,
    cancel_reason VARCHAR(256),
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

9.3.3 签到相关表

-- 签到记录表
CREATE TABLE check_in_record (
    id BIGINT PRIMARY KEY,
    tenant_id BIGINT NOT NULL,
    store_id BIGINT NOT NULL,
    member_id BIGINT NOT NULL,
    booking_id BIGINT,
    check_in_type SMALLINT NOT NULL,     -- 1扫码 2刷脸 3NFC 4教练代签
    check_in_time TIMESTAMP NOT NULL,
    device_id VARCHAR(64),
    operator_id BIGINT,
    latitude DECIMAL(10,6),
    longitude DECIMAL(10,6),
    benefit_deducted JSONB,
    created_at TIMESTAMP DEFAULT NOW(),
    updated_at TIMESTAMP DEFAULT NOW(),
    created_by BIGINT,
    updated_by BIGINT,
    deleted_at TIMESTAMP DEFAULT NULL
);

9.4 索引设计

-- 部分索引:仅索引未删除数据
CREATE INDEX idx_member_phone ON member(tenant_id, phone) 
WHERE deleted_at IS NULL;

CREATE INDEX idx_member_card_member ON member_card(member_id, status) 
WHERE deleted_at IS NULL;

CREATE INDEX idx_booking_slot_time ON booking_slot(tenant_id, start_time, status) 
WHERE deleted_at IS NULL;

CREATE INDEX idx_booking_record_member ON booking_record(member_id, status, created_at) 
WHERE deleted_at IS NULL;

CREATE INDEX idx_check_in_member_time ON check_in_record(member_id, check_in_time) 
WHERE deleted_at IS NULL;

-- 唯一约束:部分索引确保删除后可重用
CREATE UNIQUE INDEX idx_member_no_unique ON member(tenant_id, member_no) 
WHERE deleted_at IS NULL;

CREATE UNIQUE INDEX idx_member_phone_unique ON member(tenant_id, phone) 
WHERE deleted_at IS NULL;

9.5 缓存策略

┌─────────────────────────────────────────────────────────────┐
│                    缓存分层设计                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  L1 - 本地缓存 (Caffeine)                                   │
│  ├── 会员基础信息: 5分钟过期                                │
│  ├── 课程库存: 30秒过期(热点课程)                         │
│  └── 系统配置: 30分钟过期                                   │
│                                                             │
│  L2 - 分布式缓存(Redis,可选扩展)                          │
│  ├── 分布式锁: 预约库存扣减                                 │
│  ├── Session: 用户登录态                                    │
│  └── 验证码: 短信验证码                                     │
│                                                             │
│  缓存更新策略:                                               │
│  ├── 写穿透: 数据变更时同步更新缓存                         │
│  ├── 延迟双删: 高一致性场景                                 │
│  └── 订阅Binlog: 异步同步(后期扩展)                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

十、后端技术实现

10.1 项目依赖

<!-- pom.xml 核心依赖 -->
<dependencies>
    <!-- Spring Boot 3 WebFlux -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    
    <!-- R2DBC PostgreSQL -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-r2dbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>r2dbc-postgresql</artifactId>
    </dependency>
    
    <!-- Flyway (需要JDBC连接用于迁移) -->
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!-- Caffeine 缓存 -->
    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
    </dependency>
</dependencies>

10.2 Flyway 迁移脚本组织

src/main/resources/db/migration/
├── V1.0.0__init_schema.sql              # 初始化表结构
├── V1.0.1__init_member_tables.sql       # 会员相关表
├── V1.0.2__init_booking_tables.sql      # 预约相关表
├── V1.0.3__init_checkin_tables.sql      # 签到相关表
├── V1.0.4__init_coach_tables.sql        # 教练相关表
├── V1.0.5__init_course_tables.sql       # 课程相关表
├── V1.0.6__init_finance_tables.sql      # 财务相关表
├── V1.0.7__init_indexes.sql             # 索引创建
└── ...

10.3 R2DBC Repository 示例

// MemberRepository.java
public interface MemberRepository extends ReactiveCrudRepository<Member, Long> {
    
    @Query("SELECT * FROM member WHERE tenant_id = :tenantId AND phone = :phone AND deleted_at IS NULL")
    Mono<Member> findByPhone(Long tenantId, String phone);
    
    @Query("SELECT * FROM member WHERE tenant_id = :tenantId AND member_no = :memberNo AND deleted_at IS NULL")
    Mono<Member> findByMemberNo(Long tenantId, String memberNo);
    
    @Query("UPDATE member SET deleted_at = NOW() WHERE id = :id AND deleted_at IS NULL")
    Mono<Integer> softDeleteById(Long id);
}

// BookingSlotRepository.java
public interface BookingSlotRepository extends ReactiveCrudRepository<BookingSlot, Long> {
    
    @Query("UPDATE booking_slot SET booked_count = booked_count + 1 WHERE id = :id AND booked_count < capacity AND deleted_at IS NULL")
    Mono<Integer> incrementBookedCount(Long id);
    
    @Query("UPDATE booking_slot SET booked_count = booked_count - 1 WHERE id = :id AND booked_count > 0 AND deleted_at IS NULL")
    Mono<Integer> decrementBookedCount(Long id);
}

10.4 响应式事务管理

@Service
public class BookingService {
    
    private final BookingRecordRepository bookingRecordRepository;
    private final BookingSlotRepository bookingSlotRepository;
    private final MemberBenefitRepository benefitRepository;
    private final ReactiveTransactionManager transactionManager;
    
    public Mono<BookingRecord> createBooking(BookingRequest request) {
        TransactionalOperator rxtx = TransactionalOperator.create(transactionManager);
        
        return Mono.defer(() -> 
            // 1. 检查时段库存
            bookingSlotRepository.findById(request.getSlotId())
                .filter(slot -> slot.getBookedCount() < slot.getCapacity())
                .switchIfEmpty(Mono.error(new BusinessException("课程已满")))
            
            // 2. 扣减权益
            .flatMap(slot -> benefitRepository.deductBenefit(
                request.getMemberId(), 
                slot.getPrice()
            ))
            
            // 3. 创建预约记录
            .flatMap(benefit -> {
                BookingRecord record = new BookingRecord();
                record.setMemberId(request.getMemberId());
                record.setSlotId(request.getSlotId());
                record.setStatus(BookingStatus.CONFIRMED);
                return bookingRecordRepository.save(record);
            })
            
            // 4. 增加预约人数
            .flatMap(record -> bookingSlotRepository
                .incrementBookedCount(request.getSlotId())
                .thenReturn(record)
            )
        ).as(rxtx::transactional);
    }
}

10.5 配置文件

# application.yml
spring:
  r2dbc:
    url: r2dbc:postgresql://localhost:5432/gym_manage
    username: gym_user
    password: ${DB_PASSWORD}
    pool:
      enabled: true
      initial-size: 5
      max-size: 20
      max-idle-time: 30m
      
  flyway:
    url: jdbc:postgresql://localhost:5432/gym_manage
    username: gym_user
    password: ${DB_PASSWORD}
    locations: classpath:db/migration
    baseline-on-migrate: true
    
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=10000,expireAfterWrite=5m

十一、前端技术架构

11.1 项目结构

gym-manage/
├── apps/
│   ├── member-app/          # 会员端 uniapp
│   │   ├── src/
│   │   │   ├── pages/       # 页面
│   │   │   ├── components/  # 组件
│   │   │   ├── stores/      # Pinia 状态管理
│   │   │   ├── api/         # 接口请求
│   │   │   ├── utils/       # 工具函数
│   │   │   └── styles/      # 样式
│   │   ├── manifest.json
│   │   └── pages.json
│   │
│   ├── coach-app/           # 教练端 uniapp
│   │   └── ...
│   │
│   └── admin-web/           # 管理后台 Vue3
│       ├── src/
│       │   ├── views/
│       │   ├── components/
│       │   ├── stores/
│       │   ├── api/
│       │   ├── router/
│       │   └── styles/
│       └── vite.config.ts
│
├── packages/                # 共享包
│   ├── shared-types/        # TypeScript 类型定义
│   ├── shared-utils/        # 共享工具函数
│   └── ui-components/       # 共享UI组件
│
└── package.json

11.2 状态管理示例

// stores/member.ts
import { defineStore } from 'pinia';
import type { Member, MemberCard, MemberBenefit } from '@shared-types';

export const useMemberStore = defineStore('member', {
  state: () => ({
    member: null as Member | null,
    cards: [] as MemberCard[],
    benefits: [] as MemberBenefit[],
    token: '',
  }),
  
  getters: {
    isLoggedIn: (state) => !!state.token && !!state.member,
    currentLevel: (state) => state.member?.level ?? 0,
    activeCards: (state) => state.cards.filter(c => c.status === 1),
    
    validBenefits: (state) => {
      const now = new Date();
      return state.benefits.filter(b => 
        b.status === 1 && 
        (!b.validTo || new Date(b.validTo) > now)
      );
    },
  },
  
  actions: {
    async login(phone: string, code: string) {},
    async fetchMemberInfo() {},
    logout() {},
  },
  
  persist: {
    key: 'gym-member',
    paths: ['token'],
  },
});

11.3 共享类型定义

// packages/shared-types/src/index.ts

export interface Member {
  id: number;
  tenantId: number;
  storeId: number;
  memberNo: string;
  name: string;
  phone: string;
  avatar: string;
  gender: number;
  birthday: string;
  level: number;
  exp: number;
  status: number;
  createdAt: string;
  updatedAt: string;
}

export interface MemberBenefit {
  id: number;
  memberId: number;
  cardId: number;
  benefitType: 1 | 2 | 3 | 4;
  benefitName: string;
  totalValue: number;
  usedValue: number;
  remainingValue: number;
  validFrom: string;
  validTo: string;
  status: number;
}

export enum BookingStatus {
  PENDING = 1,
  CONFIRMED = 2,
  CANCELLED = 3,
  COMPLETED = 4,
  NO_SHOW = 5,
  CHECKED_IN = 6,
}

export interface ApiResponse<T> {
  code: number;
  message: string;
  data: T;
}

十二、项目实施规划

12.1 MVP版本功能范围

P0 - 核心功能(必须)
├── 会员端
│   ├── 微信授权登录
│   ├── 会员卡展示 & 权益查看
│   ├── 团课预约 & 取消
│   ├── 扫码签到
│   └── 预约记录查看
│
├── 管理后台
│   ├── 数据看板(基础统计)
│   ├── 会员管理(增删改查)
│   ├── 课程排期(日历视图)
│   ├── 签到记录查询
│   └── 门店管理
│
└── 后端服务
    ├── 会员服务(注册、登录、信息管理)
    ├── 预约服务(团课预约、库存管理)
    ├── 签到服务(扫码签到)
    └── 基础数据服务

P1 - 重要功能(第二阶段)
├── 私教预约 & 教练端
├── 会员等级体系
├── 储值 & 次卡管理
├── 训练计划模块
└── 财务报表

P2 - 增强功能(第三阶段)
├── 多门店连锁
├── 刷脸签到硬件集成
├── 营销活动模块
├── App版本
└── 数据分析高级功能

12.2 开发里程碑

阶段一:基础搭建(2周)
├── Week 1
│   ├── 后端项目初始化(Spring Boot 3 + WebFlux
│   ├── 数据库设计 & Flyway迁移脚本
│   ├── 前端项目初始化(uniapp + Vue3 admin
│   └── 开发环境配置(Docker、CI/CD
│
└── Week 2
    ├── 用户认证服务(JWT + 微信登录)
    ├── 基础CRUD框架搭建
    └── 前端登录页面 & 路由守卫

阶段二:核心功能(4周)
├── Week 3-4: 会员模块
│   ├── 会员注册、信息管理
│   ├── 会员卡 & 权益管理
│   └── 会员端个人中心
│
└── Week 5-6: 预约 & 签到
    ├── 课程排期管理
    ├── 团课预约功能
    ├── 扫码签到功能
    └── 管理后台数据看板

阶段三:测试 & 上线(2周)
├── Week 7
│   ├── 集成测试
│   ├── 性能测试 & 优化
│   └── Bug修复
│
└── Week 8
    ├── 生产环境部署
    ├── 小程序审核提交
    └── 运维文档编写

12.3 技术风险与应对

风险 影响 应对措施 优先级
高并发预约抢课 热门课程开抢时系统压力 PostgreSQL行级锁 + Caffeine缓存 + WebFlux响应式 + 候补机制
微信小程序审核 上线时间不可控 提前了解审核规范、预留修改时间、准备H5备选
硬件设备集成 刷脸/NFC设备对接复杂 MVP仅支持扫码、签到网关预留扩展接口 低(P2
多租户数据隔离 连锁门店数据安全 tenant_id强制过滤 + 数据库RLS策略 中(P2

十三、总结

13.1 设计方案总览

业务范围

  • 支持综合俱乐部、精品工作室、连锁品牌全场景
  • 会员体系:时长卡 + 次卡 + 储值 + 等级体系
  • 预约类型:团课 + 私教 + 场地 + 线上课程
  • 签到方式:扫码 + 刷脸 + NFC + 教练代签
  • 计划体系:训练计划 + 课程排期 + 会员目标 + 教练排班

技术架构

  • 前端: uniapp(Vue3+TS) + Vue3管理后台
  • 后端: Spring Boot 3 + WebFlux + JDK 21
  • 数据库: PostgreSQL + R2DBC + Flyway
  • 缓存: Caffeine(本地)+ Redis(可选扩展)
  • 部署: Docker + CI/CD

核心设计理念

  • 多租户架构支持连锁扩展
  • 资源抽象统一预约模型
  • 响应式编程应对高并发
  • 软删除保证数据可追溯
  • 模块化设计支持渐进式开发

文档结束