146 KiB
健身房管理系统产品设计文档
版本: v2.0 日期: 2026-02-28 作者: 张翔 更新日期: 2026-03-04
文档变更记录
| 版本 | 日期 | 变更内容 | 作者 |
|---|---|---|---|
| v1.0 | 2026-02-28 | 初始版本,包含基础系统架构设计 | 张翔 |
| v2.0 | 2026-03-04 | 新增产品版本架构、订阅与配置模块、营销分析与预测模块 | 张翔 |
一、项目概述
1.1 项目背景
打造一款全场景覆盖的健身房管理系统,支持综合型健身俱乐部、精品工作室、连锁品牌等多种业态,实现会员端便捷预约签到、管理后台数据洞察的核心需求。
1.2 核心目标
- 会员端:一站式查看个人所有信息(会员卡、权益、预约、签到、训练数据)
- 管理后台:全维度数据整理与分析,支撑运营决策
- 便捷体验:约课、签到流程简单高效
- 灵活配置:支持业务流程模块化配置,满足不同规模客户需求
- 订阅模式:基础版保证业务闭环,订阅模块提供增值服务
1.3 适用场景
| 场景类型 | 说明 | 推荐版本 |
|---|---|---|
| 综合型健身俱乐部 | 多种团课 + 私教 + 器械区,会员规模 500-2000 人 | 基础版 + 体验升级类订阅 |
| 精品工作室 | 专注某一类课程,会员规模 100-300 人 | 基础版 |
| 连锁品牌 | 多门店运营,跨店约课,统一数据管理 | 基础版 + 业务扩展类订阅 |
| 大型连锁 | 10+门店,需要精细化运营和数据分析 | 基础版 + 全部订阅模块 |
1.4 产品版本架构
本系统采用基础版 + 订阅模块的产品架构,满足不同规模和业态的健身房需求:
1.4.1 基础版
基础版保证业务闭环,适合小型工作室、个人教练等场景:
包含模块:
- ✅ 会员管理(完整)
- ✅ 会员卡管理(完整)
- ✅ 权益管理(完整)
- ✅ 团课预约(完整)
- ✅ 扫码签到(完整)
- ✅ 基础数据统计(完整)
- ✅ 系统管理(基础)
技术栈:
- 前端:uniapp + Vue3 + TypeScript + Pinia
- 后端:Spring Boot 3 + WebFlux + JDK 21
- 数据库:PostgreSQL + R2DBC + Flyway
- 缓存:Caffeine(本地缓存)
功能限制:
- 单门店运营
- 不支持营销精算模型
- 不支持自定义促销活动预测
- 不支持高级数据分析
1.4.2 订阅模块体系
订阅模块分为四大类别,客户可根据需求灵活订阅:
业务扩展类
| 模块名称 | 功能描述 | 月费 | 适用场景 |
|---|---|---|---|
| 多门店管理 | 支持多门店运营、跨店约课、统一数据管理 | ¥299 | 连锁品牌 |
| 私教管理 | 私教课程管理、教练排班、学员跟进 | ¥199 | 有私教业务的健身房 |
| 器械预约 | 器械时段预约、器械使用统计 | ¥99 | 器械资源紧张的场景 |
体验升级类
| 模块名称 | 功能描述 | 月费 | 适用场景 |
|---|---|---|---|
| 人脸识别 | 刷脸签到、无感通行、人脸考勤 | ¥199 | 高端健身房 |
| NFC一卡通 | NFC手环/卡片签到、储物柜联动 | ¥149 | 传统健身房 |
| 在线课程 | 线上课程预约、视频点播、直播课 | ¥249 | 混合运营模式 |
营销增长类
| 模块名称 | 功能描述 | 月费 | 适用场景 |
|---|---|---|---|
| 会员营销 | 会员标签、精准营销、自动化营销 | ¥299 | 需要精细化运营 |
| 促销活动 | 优惠券、拼团、秒杀、限时折扣 | ¥199 | 需要促销活动 |
| 推荐奖励 | 邀请奖励、裂变营销、会员推荐 | ¥149 | 需要拉新裂变 |
数据智能类
| 模块名称 | 功能描述 | 月费 | 适用场景 |
|---|---|---|---|
| 营销精算模型 | 基于历史数据的促销策略预测 | ¥499 | 需要数据驱动决策 |
| 自定义促销预测 | 多维度自定义促销活动效果预测 | ¥399 | 需要灵活促销策略 |
| 高级数据分析 | 会员行为分析、流失预警、收入预测 | ¥399 | 需要深度数据分析 |
1.4.3 计费方式
我们提供灵活的计费方式,满足不同客户的预算需求。
付费模式选择
我们提供两种付费模式,客户可根据自身情况选择:
模式A:固定月费模式
适合客户:交易量小、预算稳定的客户
计费方式:
- 基础版:¥299/月
- 订阅模块:按模块定价(¥99-499/月)
- 订阅周期:月付/季付/半年付/年付(享受相应折扣)
优势:
- 成本可预测,便于预算管理
- 无交易量限制
- 适合业务稳定的客户
模式B:成功费模式
适合客户:交易量大、希望按量付费的客户
计费方式:
- 基础版:交易额的1%-1.5%
- 订阅模块:交易额的0.3%-0.8%
- 交易额包括:会员卡充值、会员卡消费、私教课程购买、促销活动交易等
优势:
- 完全按使用量付费,降低门槛
- 系统收益与客户业务增长绑定
- 适合交易量大的客户
切换机制:
- 客户可随时在两种模式间切换
- 切换后下个计费周期生效
- 提供计算器帮助客户对比两种模式成本
订阅周期优惠
| 订阅周期 | 折扣力度 | 说明 |
|---|---|---|
| 月付 | 标准价格 | 灵活选择,随时调整 |
| 季付 | 9折优惠 | 适合短期试用 |
| 半年付 | 85折优惠 | 平衡成本与灵活性 |
| 年付 | 8折优惠 | 最大优惠,长期合作 |
行业类型推荐套餐
我们根据不同行业类型的特点,预设推荐套餐,同时采用动态折扣(模块越多,折扣越大)。
行业类型
1. 瑜伽工作室
- 特点:会员规模小(100-300人)、课程单一、预算有限
- 核心需求:会员管理、团课预约、基础统计
- 推荐模块:在线课程、会员营销
2. 综合健身房
- 特点:会员规模中等(500-2000人)、业务多样、需要私教
- 核心需求:会员管理、团课预约、私教管理、基础统计
- 推荐模块:私教管理、器械预约、人脸识别、会员营销
3. 连锁品牌
- 特点:会员规模大(2000+人)、多门店、需要精细化运营
- 核心需求:全功能 + 多门店管理 + 数据分析
- 推荐模块:多门店管理、全部营销模块、全部数据智能模块
动态折扣规则
| 订阅模块数量 | 折扣力度 |
|---|---|
| 1个模块 | 9.5折 |
| 2个模块 | 9折 |
| 3个模块 | 8.5折 |
| 4-5个模块 | 8折 |
| 6-8个模块 | 7.5折 |
| 9-11个模块 | 7折 |
| 全部12个模块 | 6.5折 |
推荐套餐
🧘 瑜伽工作室推荐套餐
入门套餐(适合小型工作室)
- 包含:基础版 + 在线课程
- 模块数量:1个
- 折扣:9.5折
- 月费:¥299 + ¥249 × 0.95 = ¥536
成长套餐(适合中型工作室)
- 包含:基础版 + 在线课程 + 会员营销
- 模块数量:2个
- 折扣:9折
- 月费:¥299 + (¥249 + ¥299) × 0.9 = ¥763
🏋️ 综合健身房推荐套餐
标准套餐(适合小型健身房)
- 包含:基础版 + 私教管理 + 器械预约
- 模块数量:2个
- 折扣:9折
- 月费:¥299 + (¥199 + ¥99) × 0.9 = ¥538
专业套餐(适合中型健身房)
- 包含:基础版 + 私教管理 + 器械预约 + 人脸识别 + 会员营销
- 模块数量:4个
- 折扣:8折
- 月费:¥299 + (¥199 + ¥99 + ¥199 + ¥299) × 0.8 = ¥875
🏢 连锁品牌推荐套餐
企业套餐(适合区域连锁)
- 包含:基础版 + 多门店管理 + 全部营销模块(3个)
- 模块数量:4个
- 折扣:8折
- 月费:¥299 + (¥299 + ¥299 + ¥199 + ¥149) × 0.8 = ¥1,116
旗舰套餐(适合全国连锁)
- 包含:基础版 + 全部订阅模块(12个)
- 模块数量:12个
- 折扣:6.5折
- 月费:¥299 + ¥3,590 × 0.65 = ¥2,633
客户选择流程
- 选择行业类型:瑜伽工作室 / 综合健身房 / 连锁品牌
- 查看推荐套餐:系统根据行业类型推荐2-3个套餐
- 自定义或选择:客户可以选择推荐套餐,或自定义模块组合
- 选择计费模式:固定月费 / 成功费模式
- 系统自动计算:根据模块数量和计费模式计算月费
智能动态推荐
我们提供智能动态推荐系统,根据客户业务发展自动调整推荐套餐。
初始推荐
推荐维度:
- 行业类型(瑜伽工作室 / 综合健身房 / 连锁品牌)
- 员工数量(教练、前台、管理人员总数)
- 会员数量(当前会员总数)
- 门店数量(门店总数)
- 月交易额(月度交易总额)
推荐算法:
- 收集客户规模信息
- 计算规模得分(0-100分)
- 匹配推荐套餐
- 提供上下两个套餐供选择
动态调整
触发时机:
- 会员数量增长超过阈值(如增长50%)
- 月交易额增长超过阈值(如增长30%)
- 门店数量增加(如新增门店)
- 员工数量增加(如新增员工)
- 季度业务回顾(每季度自动评估)
调整策略:
- 升级推荐:业务增长后,推荐更高级的套餐
- 降级推荐:业务萎缩后,推荐更经济的套餐
- 模块调整:根据业务变化,推荐增减订阅模块
- 个性化推荐:基于历史行为和行业趋势调整推荐
推荐通知
通知方式:
- 系统通知:在管理后台显示推荐提示
- 邮件通知:发送推荐建议到客户邮箱
- 短信通知:重要推荐变更发送短信提醒
- 客服跟进:客服主动联系客户,解释推荐理由
通知内容:
- 当前套餐分析:当前套餐的使用情况
- 业务变化分析:业务指标的变化情况
- 推荐理由:为什么推荐新套餐
- 对比分析:新旧套餐的对比
- 预期收益:切换到新套餐的预期收益
推荐示例
场景1:会员数量增长
初始状态:
- 行业类型:综合健身房
- 员工数量:8人
- 会员数量:300人
- 当前套餐:标准套餐(¥538/月)
业务变化:
- 会员数量增长到600人(增长100%)
动态推荐:
- 推荐套餐:专业套餐(¥875/月)
- 推荐理由:会员数量增长,需要更多营销和数据分析功能
- 预期收益:提升会员留存率,增加营销效率
场景2:门店数量增加
初始状态:
- 行业类型:连锁品牌
- 门店数量:2家
- 会员数量:800人
- 当前套餐:企业套餐(¥1,116/月)
业务变化:
- 门店数量增加到5家(增长150%)
动态推荐:
- 推荐套餐:专业套餐(¥2,067/月)
- 推荐理由:门店数量增加,需要更多数据智能功能
- 预期收益:提升跨店运营效率,增强数据分析能力
场景3:月交易额增长
初始状态:
- 行业类型:瑜伽工作室
- 员工数量:3人
- 会员数量:80人
- 月交易额:¥20,000
- 当前套餐:入门套餐(¥536/月)
业务变化:
- 月交易额增长到¥50,000(增长150%)
动态推荐:
- 推荐套餐:成长套餐(¥763/月)
- 推荐理由:交易额增长,需要更多营销功能
- 预期收益:提升营销效率,增加会员活跃度
试用政策
- 免费试用:所有订阅模块提供14天免费试用
- 随时取消:试用期内可随时取消,无需任何费用
- 自动续费:试用到期后自动续费,可提前取消
二、系统架构
2.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ 客户端层 │
├─────────────┬─────────────┬─────────────┬─────────────────────────┤
│ 会员小程序 │ 教练端App │ 管理后台PC │ 硬件设备(人脸/NFC) │
│ (uniapp) │ (uniapp) │ (Vue3) │ │
└──────┬──────┴──────┬──────┴──────┬──────┴────────────┬────────────┘
│ │ │ │
└─────────────┴──────┬──────┴───────────────────┘
│
┌───────▼───────┐
│ 应用网关 │
│ (统一入口) │
└───────┬───────┘
│
┌───────▼───────┐
│ 单体应用 │
│ (Spring Boot) │
├───────────────┤
│ • 会员模块 │
│ • 预约模块 │
│ • 签到模块 │
│ • 订阅模块 │
│ • 营销模块 │
│ • 数据模块 │
│ • 核心引擎层 │
└───────┬───────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌──────▼──────┐ ┌───────▼───────┐ ┌──────▼──────┐
│ PostgreSQL │ │ Redis │ │ Elasticsearch│
│ (主数据库) │ │ (缓存) │ │ (搜索) │
└─────────────┘ └───────────────┘ └─────────────┘
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 |
| 缓存 | Redis(分布式缓存) |
| 搜索 | Elasticsearch(全文搜索) |
| 消息队列 | RabbitMQ(异步处理) |
| 部署 | Docker Compose(单机部署) |
三、会员权益引擎
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 模块概述
订阅与配置模块是系统的核心基础设施,支持:
- 业务流程模块化配置
- 多租户多门店配置管理
- 订阅生命周期管理
- 计费管理
12.2 三层配置架构
┌─────────────────────────────────────────────────────────────────┐
│ 三层配置架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 系统默认配置 (System Default) │ │
│ │ - 业务模块开关 │ │
│ │ - 默认业务规则 │ │
│ │ - 系统参数 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ 继承 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 租户级配置 (Tenant Config) │ │
│ │ - 租户业务模块配置 │ │
│ │ - 租户业务规则覆盖 │ │
│ │ - 租户参数 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ 继承 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 门店级配置 (Store Config) │ │
│ │ - 门店业务模块配置 │ │
│ │ - 门店业务规则覆盖 │ │
│ │ - 门店参数 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
12.3 配置继承机制
12.3.1 继承模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 继承 | 完全继承上级配置 | 门店与租户规则一致 |
| 继承+覆盖 | 继承上级配置,部分覆盖 | 门店需要调整部分规则 |
| 自定义 | 完全自定义配置 | 门店有特殊业务需求 |
12.3.2 配置优先级
配置读取优先级(从高到低):
1. 门店自定义配置
2. 门店覆盖配置
3. 租户自定义配置
4. 租户覆盖配置
5. 系统默认配置
12.4 业务模块配置
12.4.1 模块配置数据模型
interface ModuleConfig {
id: number;
tenantId: number;
storeId: number | null;
moduleCode: string;
moduleName: string;
enabled: boolean;
inheritMode: "inherit" | "inherit_override" | "custom";
config: Record<string, any>;
createdAt: string;
updatedAt: string;
}
12.4.2 基础版模块配置
{
"member": {
"enabled": true,
"config": {
"allowRegister": true,
"requirePhoneVerification": true,
"maxMembers": 1000
}
},
"card": {
"enabled": true,
"config": {
"allowCustomCard": false,
"maxCardTypes": 5
}
},
"benefit": {
"enabled": true,
"config": {
"benefitTypes": ["duration", "count", "balance", "level"],
"validationPriority": ["count", "duration", "balance", "level"]
}
},
"groupClass": {
"enabled": true,
"config": {
"maxDailyClasses": 20,
"maxBookingDays": 7,
"cancelHours": 2
}
},
"checkin": {
"enabled": true,
"config": {
"methods": ["qr"],
"allowWalkin": true,
"checkinWindow": 30
}
},
"statistics": {
"enabled": true,
"config": {
"reportTypes": ["daily", "weekly", "monthly"]
}
}
}
12.5 订阅生命周期管理
12.5.1 订阅状态流转
┌─────────┐ 订阅申请 ┌─────────┐ 支付成功 ┌─────────┐
│ 试用 │──────────────▶│ 待支付 │─────────────▶│ 活跃 │
│ TRIAL │ │PENDING │ │ ACTIVE │
└─────────┘ └────┬────┘ └────┬────┘
│ │
取消│ 到期/取消
▼ ▼
┌─────────┐ ┌─────────┐
│ 已取消 │ │ 已过期 │
│CANCELLED│ │EXPIRED │
└─────────┘ └─────────┘
12.5.2 订阅数据模型
interface Subscription {
id: number;
tenantId: number;
storeId: number | null;
moduleCode: string;
moduleName: string;
planType: "monthly" | "quarterly" | "half_yearly" | "yearly";
status: "trial" | "pending" | "active" | "cancelled" | "expired";
trialEndAt: string | null;
startDate: string;
endDate: string;
autoRenew: boolean;
price: number;
discountRate: number;
actualPrice: number;
createdAt: string;
updatedAt: string;
}
12.6 计费管理
12.6.1 计费规则
interface BillingRule {
moduleCode: string;
basePrice: number;
discounts: {
quarterly: 0.9;
halfYearly: 0.85;
yearly: 0.8;
};
bundleDiscounts: {
basic: 0.85; // 3个模块
professional: 0.8; // 6个模块
enterprise: 0.75; // 全部模块
};
}
12.6.2 计费流程
1. 订阅申请
↓
2. 计算价格(基础价格 × 周期折扣 × 套餐折扣)
↓
3. 生成账单
↓
4. 支付处理
↓
5. 激活订阅
↓
6. 定期续费检查
12.7 配置管理API
12.7.1 配置读取API
// 获取租户级配置
GET /api/v1/config/tenant/:tenantId
// 获取门店级配置
GET /api/v1/config/store/:storeId
// 获取模块配置
GET /api/v1/config/module/:moduleCode
12.7.2 配置更新API
// 更新租户级配置
PUT /api/v1/config/tenant/:tenantId
// 更新门店级配置
PUT /api/v1/config/store/:storeId
// 更新模块配置
PUT /api/v1/config/module/:moduleCode
12.8 订阅管理API
12.8.1 订阅操作API
// 订阅模块
POST /api/v1/subscription/subscribe
// 取消订阅
POST /api/v1/subscription/cancel/:subscriptionId
// 续费订阅
POST /api/v1/subscription/renew/:subscriptionId
// 查询订阅
GET /api/v1/subscription/:subscriptionId
12.9 缓存策略
12.9.1 配置缓存
// 配置缓存策略
const configCache = {
systemConfig: {
ttl: 86400, // 24小时
refreshInterval: 3600, // 1小时
},
tenantConfig: {
ttl: 3600, // 1小时
refreshInterval: 600, // 10分钟
},
storeConfig: {
ttl: 1800, // 30分钟
refreshInterval: 300, // 5分钟
},
};
12.9.2 订阅缓存
// 订阅缓存策略
const subscriptionCache = {
activeSubscription: {
ttl: 300, // 5分钟
refreshInterval: 60, // 1分钟
},
};
十三、营销分析与预测模块
13.1 模块概述
营销分析与预测模块提供数据驱动的营销决策支持,包括:
- 营销精算模型
- 促销策略预测
- 多维度自定义促销活动
- 促销活动效果预测
13.2 营销精算模型
13.2.1 模型架构
┌─────────────────────────────────────────────────────────────────┐
│ 营销精算模型架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 数据采集层 │ │
│ │ - 会员行为数据 │ │
│ │ - 交易数据 │ │
│ │ - 营销活动数据 │ │
│ │ - 外部数据(节假日、天气等) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 数据处理层 │ │
│ │ - 数据清洗 │ │
│ │ - 特征工程 │ │
│ │ - 数据聚合 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 模型训练层 │ │
│ │ - 回归模型(收入预测) │ │
│ │ - 分类模型(会员流失预测) │ │
│ │ - 聚类模型(会员分群) │ │
│ │ - 时间序列模型(趋势预测) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 预测服务层 │ │
│ │ - 促销策略推荐 │ │
│ │ - 收入预测 │ │
│ │ - 会员流失预警 │ │
│ │ - 最优定价建议 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
13.2.2 数据特征
interface MarketingFeatures {
// 会员特征
memberFeatures: {
memberCount: number;
activeMemberCount: number;
newMemberCount: number;
avgMemberAge: number;
memberDistribution: Record<string, number>;
};
// 交易特征
transactionFeatures: {
totalRevenue: number;
avgTransactionValue: number;
transactionFrequency: number;
revenueTrend: number[];
};
// 营销特征
marketingFeatures: {
campaignCount: number;
avgCampaignCost: number;
campaignConversionRate: number;
campaignROI: number;
};
// 外部特征
externalFeatures: {
season: string;
holiday: boolean;
weather: string;
localEvents: string[];
};
}
13.2.3 预测模型
interface PredictionModel {
// 收入预测模型
revenuePrediction: {
model: "linear_regression" | "random_forest" | "lstm";
features: string[];
accuracy: number;
predictionHorizon: number; // 预测天数
};
// 会员流失预测模型
churnPrediction: {
model: "logistic_regression" | "xgboost" | "neural_network";
features: string[];
accuracy: number;
riskThreshold: number;
};
// 促销策略推荐模型
promotionRecommendation: {
model: "collaborative_filtering" | "content_based" | "hybrid";
features: string[];
accuracy: number;
recommendationCount: number;
};
}
13.3 促销策略预测
13.3.1 促销策略推荐
interface PromotionStrategy {
id: string;
name: string;
type: "discount" | "bundle" | "loyalty" | "referral";
targetAudience: {
segments: string[];
criteria: Record<string, any>;
};
offer: {
discountType: "percentage" | "fixed" | "buy_x_get_y";
discountValue: number;
minPurchase?: number;
maxDiscount?: number;
};
timing: {
startDate: string;
endDate: string;
duration: number;
};
predictedMetrics: {
expectedRevenue: number;
expectedConversion: number;
expectedROI: number;
confidence: number;
};
}
13.3.2 推荐算法
促销策略推荐流程:
1. 分析历史促销活动效果
↓
2. 识别高价值会员群体
↓
3. 计算不同促销策略的预期效果
↓
4. 生成个性化促销策略推荐
↓
5. 预测促销活动效果
13.4 多维度自定义促销活动
13.4.1 促销活动配置
interface CustomPromotion {
id: string;
name: string;
description: string;
// 目标维度
targetDimensions: {
memberSegments: string[];
memberLevels: number[];
cardTypes: string[];
stores: number[];
};
// 优惠配置
offerConfig: {
type: "percentage" | "fixed" | "buy_x_get_y" | "tiered";
value: number;
conditions: {
minPurchase?: number;
maxDiscount?: number;
applicableItems?: string[];
excludedItems?: string[];
};
};
// 时间配置
timeConfig: {
startDate: string;
endDate: string;
validDays: number[];
validHours: {
start: string;
end: string;
};
};
// 使用限制
usageLimits: {
maxUsesPerMember: number;
maxTotalUses: number;
firstTimeOnly: boolean;
memberLevelOnly: boolean;
};
// 渠道配置
channelConfig: {
online: boolean;
offline: boolean;
mobile: boolean;
wechat: boolean;
};
}
13.4.2 促销活动效果预测
interface PromotionPrediction {
promotionId: string;
promotionName: string;
// 预测指标
predictedMetrics: {
// 参与度预测
expectedParticipants: number;
participationRate: number;
// 收入预测
expectedRevenue: number;
revenueIncrease: number;
revenueIncreaseRate: number;
// 转化预测
expectedConversions: number;
conversionRate: number;
// ROI预测
expectedCost: number;
expectedROI: number;
paybackPeriod: number;
// 会员增长预测
newMemberAcquisition: number;
memberRetention: number;
// 时间维度预测
dailyMetrics: {
date: string;
revenue: number;
participants: number;
conversions: number;
}[];
};
// 风险评估
riskAssessment: {
cannibalizationRisk: number;
profitMarginRisk: number;
brandRisk: number;
overallRisk: "low" | "medium" | "high";
};
// 优化建议
optimizationSuggestions: {
timingAdjustment: string[];
offerAdjustment: string[];
targetingAdjustment: string[];
channelAdjustment: string[];
};
// 置信度
confidence: {
overall: number;
revenue: number;
conversion: number;
roi: number;
};
}
13.5 技术实现
13.5.1 技术栈
| 组件 | 技术选型 |
|---|---|
| 数据存储 | PostgreSQL + Elasticsearch |
| 数据处理 | Apache Spark |
| 机器学习 | Python + scikit-learn + TensorFlow |
| API服务 | Spring Boot + Python FastAPI |
| 可视化 | ECharts + D3.js |
13.5.2 数据流
1. 数据采集
- 从PostgreSQL读取历史数据
- 从Elasticsearch读取实时数据
- 从外部API获取节假日、天气等数据
↓
2. 数据处理
- 使用Spark进行数据清洗和特征工程
- 存储处理后的特征数据
↓
3. 模型训练
- 使用Python训练机器学习模型
- 定期更新模型
↓
4. 预测服务
- 提供REST API进行预测
- 缓存预测结果
↓
5. 可视化展示
- 前端展示预测结果
- 支持交互式分析
13.6 API设计
13.6.1 营销精算API
// 获取促销策略推荐
GET / api / v1 / marketing / promotion - recommendations;
// 预测促销活动效果
POST / api / v1 / marketing / predict - promotion;
// 获取收入预测
GET / api / v1 / marketing / revenue - prediction;
// 获取会员流失预警
GET / api / v1 / marketing / churn - warning;
13.6.2 自定义促销API
// 创建自定义促销活动
POST /api/v1/marketing/custom-promotions
// 更新自定义促销活动
PUT /api/v1/marketing/custom-promotions/:id
// 预测自定义促销活动效果
POST /api/v1/marketing/custom-promotions/:id/predict
// 获取促销活动效果
GET /api/v1/marketing/custom-promotions/:id/performance
十四、项目实施规划
14.1 MVP版本功能范围
P0 - 核心功能(必须)
├── 会员端
│ ├── 微信授权登录
│ ├── 会员卡展示 & 权益查看
│ ├── 团课预约 & 取消
│ ├── 扫码签到
│ └── 预约记录查看
│
├── 管理后台
│ ├── 数据看板(基础统计)
│ ├── 会员管理(增删改查)
│ ├── 课程排期(日历视图)
│ ├── 签到记录查询
│ └── 门店管理
│
└── 后端服务
├── 会员服务(注册、登录、信息管理)
├── 预约服务(团课预约、库存管理)
├── 签到服务(扫码签到)
└── 基础数据服务
P1 - 重要功能(第二阶段)
├── 私教预约 & 教练端
├── 会员等级体系
├── 储值 & 次卡管理
├── 训练计划模块
└── 财务报表
P2 - 增强功能(第三阶段)
├── 多门店连锁
├── 刷脸签到硬件集成
├── 营销活动模块
├── App版本
└── 数据分析高级功能
14.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
├── 生产环境部署
├── 小程序审核提交
└── 运维文档编写
14.3 技术风险与应对
| 风险 | 影响 | 应对措施 | 优先级 |
|---|---|---|---|
| 高并发预约抢课 | 热门课程开抢时系统压力 | PostgreSQL行级锁 + Caffeine缓存 + WebFlux响应式 + 候补机制 | 高 |
| 微信小程序审核 | 上线时间不可控 | 提前了解审核规范、预留修改时间、准备H5备选 | 中 |
| 硬件设备集成 | 刷脸/NFC设备对接复杂 | MVP仅支持扫码、签到网关预留扩展接口 | 低(P2) |
| 多租户数据隔离 | 连锁门店数据安全 | tenant_id强制过滤 + 数据库RLS策略 | 中(P2) |
十四、ERPNext评估与方案选择
14.1 ERPNext评估结论
经过深入分析ERPNext开源项目的技术架构、核心功能模块以及当前健身房管理系统的设计文档,结论:ERPNext无法完全满足本项目需求。虽然ERPNext具备强大的企业资源规划能力,但在健身房行业的特定业务场景、多租户架构、订阅计费模型等方面存在显著差距。
14.1.1 功能覆盖度分析
| 模块 | 可直接复用 | 需深度定制 | 需完全开发 | 总覆盖度 |
|---|---|---|---|---|
| 会员管理 | 注册与信息管理(88%) | 统计与分析(70%) | 会员卡与权益体系(5%) | 54% |
| 预约管理 | - | - | 团课预约(7%)、私教预约(23%)、场地预约(0%) | 10% |
| 签到管理 | - | 记录与统计(40%) | 签到方式(0%) | 13% |
| 订阅计费 | 财务集成(94%) | - | 订阅管理(4%) | 49% |
| 营销增长 | 会员营销(73%) | 会员营销(73%) | 促销活动(8%)、推荐奖励(0%) | 27% |
| 数据智能 | 数据分析(92%) | - | AI预测(0%) | 46% |
总体覆盖度:
- 可直接复用:35%(用户管理、权限控制、财务模块、基础报表)
- 需深度定制:40%(会员体系、预约系统、营销活动)
- 需完全开发:25%(会员卡权益、时段管理、签到系统、订阅计费、AI预测)
14.1.2 技术栈对比
| 维度 | ERPNext | 项目需求 | 兼容性 |
|---|---|---|---|
| 后端语言 | Python | Java | ❌ 不兼容 |
| 后端框架 | Frappe Framework | Spring Boot 3 | ❌ 不兼容 |
| 数据库 | MariaDB/PostgreSQL | PostgreSQL | ✅ 兼容 |
| 前端框架 | Vue.js (Frappe UI) | Vue3 + Element Plus | ⚠️ 部分兼容 |
| 架构模式 | 单体应用 + 插件系统 | 单体应用 + 模块化设计 | ✅ 兼容 |
| 部署方式 | Docker/K8s | Docker Compose | ✅ 兼容 |
14.1.3 成本对比
| 方案 | 开发成本 | 周期 | 说明 |
|---|---|---|---|
| 基于ERPNext深度定制 | 245-375万 | 15-21个月 | 复用35%,定制65% |
| 自研系统(微服务) | 365-615万 | 15-21个月 | 完全自主开发 |
| 自研系统(单体) | 200-280万 | 12-15个月 | 单体架构,简化部署 |
| 基于ERPNext设计思路自研 | 122-180万 | 10-12个月 | 借鉴设计,单体架构 |
14.2 ERPNext核心设计思路分析
14.2.1 元数据驱动架构(Metadata-Driven Architecture)
ERPNext设计精髓:
- DocType不仅是数据库表,而是元数据驱动的完整定义
- 通过元数据自动生成UI、API、验证逻辑
- 实现低代码开发能力
核心优势:
- ✅ 快速构建业务实体
- ✅ 自动生成CRUD操作
- ✅ 统一的验证机制
- ✅ 灵活的字段扩展
14.2.2 工作流引擎(Workflow Engine)
ERPNext设计精髓:
- 内置状态机和工作流引擎
- 可视化配置业务流程
- 支持条件分支、自动操作
核心优势:
- ✅ 业务流程标准化
- ✅ 状态转换可控
- ✅ 自动化操作执行
14.2.3 权限系统(RBAC)
ERPNext设计精髓:
- 基于角色的访问控制
- 细粒度的权限控制
- 数据权限过滤
核心优势:
- ✅ 权限管理灵活
- ✅ 数据安全可控
- ✅ 权限审计完整
14.2.4 动态报表系统
ERPNext设计精髓:
- 可视化报表构建器
- SQL查询支持
- 图表自动生成
核心优势:
- ✅ 报表开发快速
- ✅ 数据分析灵活
- ✅ 可视化展示
14.2.5 插件化架构
ERPNext设计精髓:
- 模块化设计
- 可扩展的App系统
- 独立部署能力
核心优势:
- ✅ 系统可扩展
- ✅ 功能可独立升级
- ✅ 代码可复用
14.3 设计思路在健身房系统的应用价值
14.3.1 元数据驱动的价值
| 应用场景 | 传统开发方式 | 元数据驱动方式 | 价值提升 |
|---|---|---|---|
| 会员管理 | 手写Entity、Controller、Service、Mapper | 定义元数据,自动生成 | 开发效率提升60% |
| 会员卡类型 | 手写多个Entity、复杂关联 | 定义元数据,自动关联 | 维护成本降低50% |
| 预约时段 | 手写复杂的时间算法 | 定义元数据,自动计算 | 业务逻辑清晰度提升80% |
| 报表开发 | 手写SQL、前端图表 | 可视化配置,自动生成 | 报表开发效率提升70% |
核心价值:
- 🚀 开发效率:元数据驱动可减少60-70%的重复代码
- 🎯 业务聚焦:开发人员专注于业务逻辑,而非CRUD
- 🔧 灵活扩展:通过元数据配置即可扩展功能
- 📊 统一规范:所有业务实体遵循统一的元数据规范
14.3.2 工作流引擎的价值
| 应用场景 | 传统开发方式 | 工作流引擎方式 | 价值提升 |
|---|---|---|---|
| 预约流程 | 手写状态判断、分支逻辑 | 可视化配置工作流 | 业务流程清晰度提升90% |
| 会员卡激活 | 手写多个if-else | 配置状态机 | 维护成本降低70% |
| 权益扣减 | 手写复杂的事务逻辑 | 配置自动化操作 | 开发效率提升50% |
| 订阅计费 | 手写复杂的计费逻辑 | 配置计费规则 | 计费规则灵活性提升80% |
核心价值:
- 🔄 流程可视化:业务流程一目了然
- ⚙️ 自动化执行:减少人工干预
- 🎛️ 灵活配置:无需修改代码即可调整流程
- 🔍 可追溯性:每个状态转换都有记录
14.3.3 权限系统的价值
| 应用场景 | 传统开发方式 | ERPNext权限系统 | 价值提升 |
|---|---|---|---|
| 角色管理 | 手写Role表、关联表 | 内置RBAC系统 | 开发效率提升80% |
| 数据权限 | 手写复杂的过滤逻辑 | 自动数据过滤 | 维护成本降低60% |
| 权限审计 | 手写日志记录 | 自动审计日志 | 安全性提升90% |
核心价值:
- 🔐 安全性:细粒度的权限控制
- 📝 可审计:所有权限操作都有记录
- 🎯 灵活性:支持复杂的权限规则
- ⚡ 高性能:自动权限过滤,查询效率高
14.4 可借鉴的设计模式和最佳实践
14.4.1 元数据驱动设计模式
核心设计思路:
- 通过元数据定义业务实体(EntityMetadata)
- 元数据引擎自动生成CRUD代码、REST API、前端UI
- 支持字段类型、验证规则、关联关系等完整定义
应用到健身房系统:
- 会员元数据:自动生成会员CRUD、API、表单
- 会员卡元数据:自动生成会员卡CRUD、关联查询
- 预约时段元数据:自动生成时段管理、冲突检测
- 报表元数据:自动生成报表查询、图表展示
预期收益:
- ✅ 减少重复代码60-70%
- ✅ 统一代码规范
- ✅ 快速响应需求变更
- ✅ 自动生成文档
14.4.2 工作流引擎设计模式
核心设计思路:
- 定义工作流(WorkflowDefinition)、状态(StateDefinition)、转换(TransitionDefinition)
- 工作流引擎执行状态转换、触发自动化操作
- 支持条件判断、分支逻辑、日志记录
应用到健身房系统:
- 预约工作流:草稿→已预约→已签到→已完成
- 会员卡工作流:未激活→有效→已过期
- 权益扣减工作流:预约→扣减→记录日志
预期收益:
- ✅ 业务流程可视化
- ✅ 状态转换可控
- ✅ 自动化操作执行
- ✅ 易于维护和扩展
14.4.3 权限系统设计模式
核心设计思路:
- 定义权限(Permission)、角色(Role)、数据权限(DataPermission)
- 权限引擎执行权限检查、数据过滤
- 支持细粒度的权限控制和审计
应用到健身房系统:
- 角色管理:会员、教练、店长、超级管理员
- 功能权限:查看、编辑、删除、管理
- 数据权限:门店数据、个人数据
预期收益:
- ✅ 细粒度权限控制
- ✅ 数据权限自动过滤
- ✅ 权限审计完整
- ✅ 易于配置和管理
14.4.4 动态报表系统设计模式
核心设计思路:
- 定义报表(ReportDefinition)、查询参数(QueryParameter)、报表列(ReportColumn)
- 报表引擎执行报表查询、生成图表数据
- 支持SQL查询、可视化配置、多格式导出
应用到健身房系统:
- 会员统计报表:新增、活跃、流失统计
- 预约统计报表:预约量、完成率、取消率
- 签到统计报表:签到次数、高峰时段
- 财务统计报表:收入、成本、利润
预期收益:
- ✅ 报表开发效率提升70%
- ✅ 支持可视化配置
- ✅ 灵活的参数配置
- ✅ 自动生成图表
14.5 基于ERPNext设计思路的自研架构方案
14.5.1 整体架构设计
┌─────────────────────────────────────────────────────────────────┐
│ 健身房管理系统架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 前端层 │ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ • 会员端小程序 • 管理端Web • 教练端App │ │
│ └───────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 应用网关层 │ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ • 统一入口 • 认证授权 • 限流熔断 │ │
│ └───────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 单体应用层 │ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 业务模块层 │ │ │
│ │ ├─────────────────────────────────────────────┤ │ │
│ │ │ • 会员模块 • 预约模块 • 签到模块 │ │ │
│ │ │ • 订阅模块 • 营销模块 • 数据模块 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 核心引擎层 │ │ │
│ │ ├─────────────────────────────────────────────┤ │ │
│ │ │ • 元数据引擎 • 工作流引擎 │ │ │
│ │ │ • 权限引擎 • 报表引擎 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 数据访问层 │ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ • PostgreSQL • Redis缓存 • Elasticsearch搜索 │ │
│ └───────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ 基础设施层 │ │
│ ├───────────────────────────────────────────────────────┤ │
│ │ • Docker Compose • RabbitMQ • 监控日志 │ │
│ └───────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
14.5.2 核心引擎设计
元数据引擎:
- 职责:管理业务实体元数据、自动生成CRUD代码、生成REST API、生成前端UI组件
- 核心类:EntityMetadata、FieldMetadata、MetadataEngine、CodeGenerator
- 应用场景:会员管理、会员卡管理、预约管理、签到管理
工作流引擎:
- 职责:管理业务流程定义、执行状态转换、触发自动化操作、记录流程日志
- 核心类:WorkflowDefinition、StateDefinition、TransitionDefinition、WorkflowEngine
- 应用场景:预约流程、会员卡流程、权益扣减流程
权限引擎:
- 职责:管理角色和权限、执行权限检查、过滤数据权限、记录权限审计
- 核心类:Permission、Role、PermissionEngine、DataPermissionFilter
- 应用场景:角色管理、功能权限、数据权限
报表引擎:
- 职责:管理报表定义、执行报表查询、生成图表数据、导出报表数据
- 核心类:ReportDefinition、QueryParameter、ReportEngine、ChartGenerator
- 应用场景:会员统计、预约统计、签到统计、财务统计
14.5.3 技术栈选择
| 层级 | 技术选型 | 说明 |
|---|---|---|
| 前端 | Vue.js + Element Plus | 参考ERPNext的Frappe UI |
| 应用网关 | Spring MVC + Filter | 统一入口、认证授权 |
| 业务服务 | Spring Boot 3 + WebFlux | 单体应用,模块化设计 |
| 元数据引擎 | 自研 + JavaPoet | 代码生成 |
| 工作流引擎 | 自研 + Spring State Machine | 状态机 |
| 权限引擎 | 自研 + Spring Security | RBAC |
| 报表引擎 | 自研 + Apache ECharts | 图表生成 |
| 数据库 | PostgreSQL + R2DBC | 主数据库 |
| 缓存 | Redis | 分布式缓存 |
| 搜索 | Elasticsearch | 全文搜索 |
| 消息队列 | RabbitMQ | 异步处理 |
| 部署 | Docker Compose | 单机部署 |
14.6 实施建议与成本估算
14.6.1 分阶段实施计划
阶段1:核心引擎开发(2-3个月)
| 模块 | 工作内容 | 工作量 |
|---|---|---|
| 元数据引擎 | 元数据定义、代码生成、API生成 | 3-4人月 |
| 工作流引擎 | 状态机、流程执行、日志记录 | 2-3人月 |
| 权限引擎 | RBAC、数据权限、审计日志 | 2-3人月 |
| 报表引擎 | 报表定义、查询执行、图表生成 | 2-3人月 |
| 小计 | 9-13人月 |
阶段2:基础业务开发(3-4个月)
| 模块 | 工作内容 | 工作量 |
|---|---|---|
| 会员管理 | 元数据定义、工作流配置 | 2-3人月 |
| 会员卡管理 | 元数据定义、工作流配置 | 3-4人月 |
| 团课预约 | 元数据定义、工作流配置 | 4-5人月 |
| 签到管理 | 元数据定义、工作流配置 | 3-4人月 |
| 基础报表 | 报表定义、图表配置 | 2-3人月 |
| 小计 | 14-19人月 |
阶段3:增值业务开发(2-3个月)
| 模块 | 工作内容 | 工作量 |
|---|---|---|
| 私教管理 | 元数据定义、工作流配置 | 3-4人月 |
| 场地预约 | 元数据定义、工作流配置 | 2-3人月 |
| 营销活动 | 元数据定义、工作流配置 | 4-5人月 |
| 订阅计费 | 元数据定义、工作流配置 | 5-6人月 |
| 小计 | 14-18人月 |
阶段4:高级功能开发(2个月)
| 模块 | 工作内容 | 工作量 |
|---|---|---|
| AI预测 | 模型训练、预测执行 | 5-6人月 |
| 智能推荐 | 推荐算法、规则引擎 | 3-4人月 |
| 小计 | 8-10人月 |
阶段5:优化与上线(1-2个月)
| 模块 | 工作内容 | 工作量 |
|---|---|---|
| 性能优化 | 数据库优化、缓存、索引 | 2-3人月 |
| 安全加固 | 权限控制、数据加密、审计 | 1-2人月 |
| 用户测试 | 功能测试、压力测试、UAT | 2-3人月 |
| 正式上线 | Docker Compose部署、监控、运维 | 1-2人月 |
| 小计 | 6-10人月 |
14.6.2 总工作量与成本估算
| 阶段 | 工作量 | 说明 |
|---|---|---|
| 阶段1:核心引擎 | 9-13人月 | 构建核心引擎框架 |
| 阶段2:基础业务 | 14-19人月 | 基础版功能 |
| 阶段3:增值业务 | 14-18人月 | 付费订阅版功能 |
| 阶段4:高级功能 | 8-10人月 | AI预测功能 |
| 阶段5:优化与上线 | 6-10人月 | 性能、安全、测试 |
| 总计 | 51-70人月 | 约4-6人团队,10-12个月 |
| 成本项 | 估算 | 说明 |
|---|---|---|
| 人力成本 | 102-140万 | 4-6人团队,10-12个月,人均2万/月 |
| 基础设施 | 5-10万 | 单机部署,Docker Compose |
| 第三方服务 | 10-20万 | 短信、支付、人脸识别等 |
| 测试与运维 | 5-10万 | 测试工具、监控、运维工具 |
| 总计 | 122-180万 | 约120-180万 |
14.7 预期收益
14.7.1 技术收益
| 收益维度 | 预期收益 | 说明 |
|---|---|---|
| 开发效率 | 提升60-70% | 元数据驱动减少重复代码 |
| 维护成本 | 降低50-60% | 统一的元数据和规范 |
| 扩展性 | 提升80% | 插件化架构,易于扩展 |
| 灵活性 | 提升70% | 工作流和权限可配置 |
14.7.2 业务收益
| 收益维度 | 预期收益 | 说明 |
|---|---|---|
| 业务响应 | 提升50% | 元数据驱动,快速响应需求变更 |
| 流程优化 | 提升60% | 工作流引擎,业务流程标准化 |
| 数据分析 | 提升70% | 动态报表,灵活的数据分析 |
| 权限控制 | 提升80% | 细粒度权限,数据安全可控 |
14.7.3 长期收益
| 收益维度 | 预期收益 | 说明 |
|---|---|---|
| 技术债务 | 降低70% | 统一的架构和规范 |
| 团队成长 | 提升50% | 学习优秀的设计模式 |
| 产品竞争力 | 提升60% | 快速迭代,灵活响应市场 |
| 商业化潜力 | 提升80% | 可形成行业解决方案 |
14.8 最终建议
14.8.1 推荐方案:基于ERPNext设计思路的自研
理由:
-
技术栈匹配:项目设计基于Java/Spring Boot 3,自研可完全匹配,避免技术栈转型风险
-
业务独特性:健身房行业的会员卡、权益体系、时段管理等业务逻辑高度专业化,ERPNext无法满足
-
架构要求:项目要求单体应用、多租户、高可用架构,简化部署和运维,适合中小规模业务
-
性能要求:项目要求API响应≤500ms、支持500并发用户,自研可通过架构优化达到
-
长期维护:自研系统代码完全可控,无技术债务,长期维护成本更低
-
部署简化:采用Docker Compose单机部署,降低运维复杂度,减少基础设施成本
-
设计借鉴:借鉴ERPNext的元数据驱动、工作流引擎、权限系统等优秀设计思路,提升开发效率60-70%
14.8.2 关键成功因素
| 因素 | 说明 | 应对措施 |
|---|---|---|
| 元数据设计 | 需要合理的元数据模型 | 参考ERPNext,结合业务特点 |
| 工作流设计 | 需要清晰的业务流程 | 业务调研、流程梳理 |
| 权限设计 | 需要细粒度的权限控制 | 参考RBAC模型,结合数据权限 |
| 报表设计 | 需要灵活的报表配置 | 支持SQL查询、可视化配置 |
14.8.3 风险控制
| 风险 | 应对措施 |
|---|---|
| 开发周期超期 | 采用敏捷开发,分阶段交付,及时调整计划 |
| 技术难点 | 提前技术预研,引入专家,必要时寻求外部支持 |
| 需求变更 | 严格需求管理,变更需评估影响,控制变更频率 |
| 性能不达标 | 早期性能测试,持续优化,必要时架构调整 |
14.9 总结
经过全面评估,ERPNext无法完全满足健身房管理系统项目需求。虽然ERPNext在财务、HR等通用模块方面表现优秀,但在健身房行业的专业化业务(会员卡、权益体系、时段管理、签到系统、订阅计费、AI预测)方面存在巨大差距。
最终建议:采用基于ERPNext设计思路的自研方案,在Java/Spring Boot 3技术栈上,构建元数据驱动、工作流引擎、权限系统、动态报表等核心能力,实现健身房管理系统的全部业务需求。
预期收益:
- ✅ 实现全部业务需求
- ✅ 技术栈匹配,团队熟悉
- ✅ 开发效率提升60-70%
- ✅ 维护成本降低50-60%
- ✅ 技术债务降低70%
- ✅ 可形成行业解决方案
预期挑战:
- ⚠️ 需要深入理解ERPNext设计思路
- ⚠️ 需要团队具备架构设计能力
- ⚠️ 核心引擎开发周期较长
- ⚠️ 需要持续优化和迭代
十五、总结
15.1 设计方案总览
业务范围
- 支持综合俱乐部、精品工作室、连锁品牌全场景
- 会员体系:时长卡 + 次卡 + 储值 + 等级体系
- 预约类型:团课 + 私教 + 场地 + 线上课程
- 签到方式:扫码 + 刷脸 + NFC + 教练代签
- 计划体系:训练计划 + 课程排期 + 会员目标 + 教练排班
- 订阅模式:基础版 + 四大类订阅模块(业务扩展、体验升级、营销增长、数据智能)
- 配置管理:三层配置架构(系统默认 → 租户 → 门店)+ 三种继承模式
- 营销分析:营销精算模型 + 促销策略预测 + 多维度自定义促销活动
技术架构
- 前端: uniapp(Vue3+TS) + Vue3管理后台
- 后端: Spring Boot 3 + WebFlux + JDK 21
- 数据库: PostgreSQL + R2DBC + Flyway
- 缓存: Caffeine(本地)+ Redis(可选扩展)
- 数据分析: Elasticsearch + Apache Spark + Python(scikit-learn + TensorFlow)
- 部署: Docker + CI/CD
核心设计理念
- 多租户架构支持连锁扩展
- 资源抽象统一预约模型
- 响应式编程应对高并发
- 软删除保证数据可追溯
- 模块化设计支持渐进式开发
- 订阅模式满足不同规模客户需求
- 配置继承机制支持灵活业务定制
- 数据驱动营销决策支持
产品版本策略
- 基础版:保证业务闭环,适合小型工作室
- 订阅模块:按需订阅,灵活组合
- 试用政策:14天免费试用,随时取消
- 计费方式:多种周期选择,组合套餐优惠
十六、未来优化计划
我们持续优化产品和服务,为客户提供更好的体验。以下是我们的优化计划:
16.1 短期优化(1-3个月)
16.1.1 首月特惠
方案描述:新客户首月5折优惠
适用对象:首次注册的新客户
优惠力度:
- 基础版:¥149.5/月(原价¥299)
- 订阅模块:按原价5折计算
限制条件:
- 首月必须选择固定月费模式
- 同一手机号/身份证号3个月内只能享受一次
预期效果:
- 降低获客成本50%
- 转化率提升20-30%
- 快速扩大用户基数
实施步骤:
- 系统开发:新客户标识、首月优惠逻辑、计费计算
- 营销物料:制作首月特惠宣传材料
- 推广渠道:官网、销售团队、社交媒体推广
- 数据监控:监控首月转化率、留存率
风险评估:
- 可能被滥用:客户注册后取消,重新注册享受优惠
- 缓解措施:限制同一手机号/身份证号3个月内只能享受一次首月优惠
16.1.2 模块独立试用
方案描述:每个订阅模块独立14天试用
试用规则:
- 每个模块独立14天试用
- 可同时试用多个模块,每个模块独立计时
- 模块A试用后转正,模块B仍可继续试用
预期效果:
- 降低试用门槛
- 模块订阅率提升15-20%
- 客单价提升10-15%
实施步骤:
- 系统开发:模块独立试用逻辑、试用期管理
- 计费调整:模块试用转正后,单独计费
- 用户体验:试用管理界面优化,清晰显示每个模块试用状态
风险评估:
- 系统复杂度增加:需要管理多个模块的试用状态
- 缓解措施:优化试用管理界面,提供批量操作功能
16.1.3 在线计算器
方案描述:提供在线计费计算器,帮助客户对比两种付费模式
计算功能:
- 固定月费模式:根据选择的模块数量和订阅周期计算月费
- 成功费模式:根据预估月交易额计算月费
- 模式对比:自动计算两种模式的成本,推荐更优模式
输入参数:
- 行业类型(瑜伽工作室/综合健身房/连锁品牌)
- 预估月交易额(成功费模式)
- 选择模块数量
- 订阅周期(月付/季付/半年付/年付)
预期效果:
- 决策时间缩短83%(从30分钟缩短到5分钟)
- 转化率提升10-15%
- 客户满意度提升
实施步骤:
- 前端开发:计算器界面、参数输入、结果展示
- 后端开发:计费逻辑、模式对比算法
- 数据分析:收集客户使用数据,优化计算器推荐算法
风险评估:
- 预估交易额不准确:客户可能低估或高估交易额
- 缓解措施:提供历史数据参考,引导客户合理预估
16.2 中期优化(3-6个月)
16.2.1 忠诚折扣
方案描述:连续订阅3年以上,额外享受95折优惠
适用条件:
- 连续订阅满36个月(3年)
- 在当前折扣基础上额外95折
- 适用范围:基础版 + 所有订阅模块
重置条件:中断订阅后,忠诚期重新计算
预期效果:
- 留存率提升15-20%
- 客单价提升10-15%
- 收入稳定性提升
实施步骤:
- 系统开发:忠诚期计算、折扣叠加逻辑
- 客户通知:忠诚期即将到期提醒、续费优惠提醒
- 营销活动:忠诚客户专属活动、感恩回馈
风险评估:
- 客户等待忠诚期:客户可能故意中断订阅,等待忠诚期
- 缓解措施:设置忠诚期上限(如最多享受2次),避免长期等待
16.2.2 推荐奖励
方案描述:老客户推荐新客户,双方获得优惠
推荐人奖励:
- 推荐成功:获得1个月免费订阅或等值优惠券
- 推荐数量:无上限,鼓励持续推荐
被推荐人奖励:
- 新客户注册:首月5折优惠(可与首月特惠叠加)
- 必须输入推荐码才能享受优惠
奖励发放:推荐成功后7天内发放
预期效果:
- 获客成本降低50-70%
- 获客速度提升30-40%
- 客户粘性提升20-30%
实施步骤:
- 系统开发:推荐码生成、推荐关系追踪、奖励发放
- 营销物料:推荐活动宣传材料、推荐码分享工具
- 数据分析:推荐转化率、推荐人活跃度、被推荐人留存率
风险评估:
- 推荐作弊:客户可能虚假推荐获取奖励
- 缓解措施:设置推荐条件(如被推荐人需消费满¥100才发放奖励)
16.2.3 行业扩展
方案描述:增加普拉提工作室、拳击馆、游泳馆等行业类型
新增行业类型:
普拉提工作室
- 特点:会员规模小(50-200人)、课程单一、预算有限
- 核心需求:会员管理、团课预约、基础统计
- 推荐模块:在线课程、会员营销
- 推荐套餐:
- 入门套餐:基础版 + 在线课程(¥536/月)
- 成长套餐:基础版 + 在线课程 + 会员营销(¥763/月)
拳击馆
- 特点:会员规模小(100-300人)、课程多样、需要私教
- 核心需求:会员管理、团课预约、私教管理
- 推荐模块:私教管理、器械预约、会员营销
- 推荐套餐:
- 标准套餐:基础版 + 私教管理 + 器械预约(¥538/月)
- 专业套餐:基础版 + 私教管理 + 器械预约 + 会员营销(¥875/月)
游泳馆
- 特点:会员规模中等(200-500人)、课程单一、时段管理复杂
- 核心需求:会员管理、团课预约、时段管理
- 推荐模块:器械预约、会员营销
- 推荐套餐:
- 标准套餐:基础版 + 器械预约(¥398/月)
- 成长套餐:基础版 + 器械预约 + 会员营销(¥623/月)
预期效果:
- 市场覆盖扩大50%
- 转化率提升15-20%
- 客单价提升5-10%
实施步骤:
- 需求调研:深入调研各行业特点和需求
- 套餐设计:设计各行业的推荐套餐
- 系统开发:行业类型选择、推荐套餐展示
- 营销推广:针对各行业的营销活动
风险评估:
- 行业分类不准确:客户可能选择错误的行业类型
- 缓解措施:提供行业类型说明、允许客户修改行业类型
16.2.4 基于规模维度的智能推荐
方案描述:基于行业类型 + 规模维度(员工数量、会员数量、门店数量、月交易额)提供更精准的推荐套餐
规模维度:
| 维度 | 说明 | 取值范围 |
|---|---|---|
| 员工数量 | 教练、前台、管理人员总数 | 1-5人 / 6-10人 / 11-20人 / 21人+ |
| 会员数量 | 当前会员总数 | 1-100人 / 101-300人 / 301-1000人 / 1001人+ |
| 门店数量 | 门店总数 | 1家 / 2-5家 / 6-10家 / 11家+ |
| 月交易额 | 月度交易总额 | ¥1万以下 / ¥1-5万 / ¥5-20万 / ¥20万+ |
推荐算法:
1. 收集客户信息
- 行业类型(必选)
- 员工数量(可选)
- 会员数量(可选)
- 门店数量(可选)
- 月交易额(可选)
2. 计算规模得分
- 员工数量得分(0-25分)
- 会员数量得分(0-25分)
- 门店数量得分(0-25分)
- 月交易额得分(0-25分)
- 总分:0-100分
3. 匹配推荐套餐
- 行业类型 + 规模得分 → 推荐套餐
- 提供上下两个套餐供选择
4. 个性化推荐
- 根据客户历史行为调整推荐
- 根据行业趋势调整推荐
推荐套餐矩阵示例:
瑜伽工作室
| 规模 | 员工数量 | 会员数量 | 推荐套餐 | 月费 |
|---|---|---|---|---|
| 微型 | 1-2人 | 1-50人 | 入门套餐:基础版 + 在线课程 | ¥536 |
| 小型 | 3-5人 | 51-100人 | 成长套餐:基础版 + 在线课程 + 会员营销 | ¥763 |
| 中型 | 6-10人 | 101-200人 | 专业套餐:基础版 + 在线课程 + 会员营销 + 促销活动 | ¥962 |
综合健身房
| 规模 | 员工数量 | 会员数量 | 推荐套餐 | 月费 |
|---|---|---|---|---|
| 小型 | 3-8人 | 51-300人 | 标准套餐:基础版 + 私教管理 + 器械预约 | ¥538 |
| 中型 | 9-15人 | 301-800人 | 专业套餐:基础版 + 私教管理 + 器械预约 + 人脸识别 + 会员营销 | ¥875 |
| 大型 | 16-30人 | 801-2000人 | 企业套餐:基础版 + 私教管理 + 器械预约 + 人脸识别 + 会员营销 + 促销活动 | ¥1,074 |
连锁品牌
| 规模 | 门店数量 | 会员数量 | 推荐套餐 | 月费 |
|---|---|---|---|---|
| 区域连锁 | 2-5家 | 501-2000人 | 企业套餐:基础版 + 多门店管理 + 全部营销模块(3个) | ¥1,116 |
| 中型连锁 | 6-10家 | 2001-5000人 | 专业套餐:基础版 + 多门店管理 + 全部营销模块 + 全部数据智能模块 | ¥2,067 |
| 大型连锁 | 11家+ | 5001人+ | 旗舰套餐:基础版 + 全部订阅模块(12个) | ¥2,633 |
预期效果:
- 推荐准确率提升:从60%提升到85%(+25%)
- 客户满意度提升:从75%提升到90%(+15%)
- 转化率提升:从15%提升到22%(+7%)
- 客单价提升:从¥800提升到¥950(+19%)
实施步骤:
- 短期(1-2个月):收集客户规模信息,基于行业类型 + 员工数量推荐套餐
- 中期(3-6个月):完善推荐算法,增加更多规模维度
- 长期(6-12个月):使用机器学习算法,提供更精准的推荐
风险评估:
- 客户不愿意提供规模信息:可能影响推荐准确性
- 缓解措施:规模信息设为可选,基于已有信息进行推荐,引导客户补充信息
16.3 优化优先级
| 优化项 | 实施周期 | 预期效果 | 优先级 |
|---|---|---|---|
| 在线计算器 | 1个月 | 决策时间-80%,转化率+12% | 🔴 高 |
| 首月特惠 | 1个月 | 转化率+25%,获客成本-50% | 🔴 高 |
| 模块独立试用 | 2-3个月 | 模块渗透率+18%,客单价+12% | 🟡 中 |
| 行业扩展(普拉提、拳击) | 2-3个月 | 市场覆盖+30%,转化率+17% | 🟡 中 |
| 基于规模维度的智能推荐 | 3-6个月 | 推荐准确率+25%,转化率+7% | 🟡 中 |
| 推荐奖励 | 4-6个月 | 获客成本-60%,转化率+35% | 🟡 中 |
| 行业扩展(游泳馆) | 4-6个月 | 市场覆盖+20%,转化率+15% | 🟡 中 |
| 忠诚折扣 | 7-12个月 | 留存率+18%,客单价+12% | 🟢 低 |
综合预期:
- 转化率提升:30-40%
- 获客成本降低:50-60%
- 留存率提升:15-20%
- 客单价提升:10-15%
- 推荐准确率提升:25%
16.4 实施建议
第一阶段(1个月):立即实施
- 首月特惠:快速获客,提升转化率
- 在线计算器:降低决策成本,提升转化率
第二阶段(2-3个月):快速跟进 3. 模块独立试用:提升模块渗透率 4. 行业扩展(普拉提、拳击):扩大市场覆盖
第三阶段(4-6个月):稳定运营 5. 推荐奖励:建立推荐体系,降低获客成本 6. 行业扩展(游泳馆):完善行业覆盖 7. 基于规模维度的智能推荐:提升推荐准确率
第四阶段(7-12个月):长期优化 8. 忠诚折扣:提升留存率,增加收入稳定性
文档结束