17. 健身房会员管理系统(technical-architecture)
1. 系统架构设计
1.1 总体架构
本系统采用前后端分离的微服务架构(或模块化单体架构,视规模而定),以适应移动端(会员/教练)和PC端(管理后台)的不同交互需求。
- 客户端:
- 会员端: 微信小程序/APP,侧重轻量级交互、预约、数据查看。
- 教练端: 微信小程序/APP,侧重日程管理、学员互动。
- 管理后台: Web端 SPA,侧重复杂的数据录入、报表分析、全局配置。
- 服务端: 提供统一的 RESTful API 或 GraphQL 接口。
- 数据层: 关系型数据库存储核心业务数据,缓存层处理高频读写和会话,时序数据库(可选)存储IoT设备或高频运动数据。
1.2 模块划分
- User Center: 用户认证、角色权限、基础档案管理。
- Membership Service: 会员卡核心逻辑,包括发卡、续费、状态变更、权益计算。
- Course & Booking Service: 课程排期、库存管理、预约逻辑、签到核销。
- Training Service: 健身计划库、动作库、体测数据记录。
- Analytics Service: 报表生成、数据聚合、大屏展示接口。
- Notification Service: 消息推送(预约提醒、过期提醒、营销通知)。
2. 技术栈选型
2.1 前端
- 会员/教练端 (小程序/APP):
- 框架: Uni-app (跨平台推荐) 或 Taro / React Native / Flutter。
- UI库: uView UI / Vant Weapp - 轻量、美观、适合移动端。
- 管理后台 (Web):
- 框架: Vue 3 或 React。
- UI组件库: Element Plus (Vue) 或 Ant Design (React)。
- 数据可视化: ECharts (百度开源,功能丰富,适合各类统计图表) 或 AntV F2 (移动端优化)。
- 日历组件: FullCalendar 或 tui-calendar (处理排课视图)。
2.2 后端
- 开发语言: Node.js (NestJS/Koa) / Java (Spring Boot) / Go (Gin)。
- 数据库:
- MySQL / PostgreSQL: 核心业务数据存储。
- Redis: 缓存热门课程信息、处理抢课锁、存储用户Session。
- 对象存储: 阿里云OSS / AWS S3 (存储会员头像、体测照片、课程封面)。
2.3 关键中间件
- 消息队列: RabbitMQ / Kafka (用于预约成功通知、解耦数据统计任务)。
- 定时任务: XXL-JOB 或 Quartz (用于每日扫描过期会员卡、自动释放未支付预约)。
3. 数据库设计 (核心表结构示例)
3.1 会员卡表 (membership_cards)
id: Primary Keymember_id: Foreign Key, 持卡人card_template_id: Foreign Key, 卡种模板type: Enum (Time, Count, StoredValue), 卡类型balance: Decimal/Integer, 余额/余次start_date: Date, 生效日期end_date: Date, 失效日期status: Enum (Active, Frozen, Expired), 状态frozen_start_date: Date, 冻结开始时间 (用于计算顺延)
3.2 课程排期表 (course_schedules)
id: Primary Keycourse_id: Foreign Key, 课程定义coach_id: Foreign Key, 授课教练room_id: Foreign Key, 教室start_time: DateTime, 上课时间end_time: DateTime, 下课时间max_attendees: Integer, 最大人数booked_count: Integer, 已约人数 (需并发控制)status: Enum (Open, Full, Cancelled, Finished)
3.3 预约记录表 (bookings)
id: Primary Keyschedule_id: Foreign Key, 排期IDmember_id: Foreign Key, 会员IDcard_id: Foreign Key, 使用的会员卡IDstatus: Enum (Confirmed, Cancelled, CheckedIn, Absent)create_time: DateTimequeue_number: Integer, 候补排位 (若为候补状态)
3.4 体测数据表 (body_metrics)
id: Primary Keymember_id: Foreign Keyrecord_date: Date, 记录日期weight: Decimal, 体重body_fat_rate: Decimal, 体脂率bmi: Decimalphotos: Json, 体型照片URL列表
4. 关键技术实现方案
4.1 预约并发控制 (Booking Concurrency)
- 问题: 热门团课名额有限,可能出现多人同时点击预约导致超卖。
- 方案:
- Redis预减库存: 将课程名额存入Redis,预约请求先在Redis中扣减 (
DECR)。 - 扣减成功: 进入消息队列,异步写入数据库生成订单/预约记录。
- 扣减失败: 直接返回“已满员”或提示加入候补。
- 数据一致性: 定时任务比对Redis与DB库存,处理异常情况。
- Redis预减库存: 将课程名额存入Redis,预约请求先在Redis中扣减 (
4.2 会员卡状态自动化 (Card Status Automation)
- 过期处理: 每日凌晨运行定时任务,扫描
end_date < today且状态为Active的卡片,更新为Expired。 - 请假/冻结逻辑:
- 会员申请冻结,设置
frozen_start_date,状态变更为Frozen。 - 解冻时,计算
(today - frozen_start_date)的天数,将end_date向后顺延相应天数,状态恢复Active。
- 会员申请冻结,设置
4.3 数据可视化 (Data Visualization)
- 体测趋势图: 前端使用 ECharts 折线图组件。
- 数据处理: 后端提供聚合接口,返回按时间排序的
[date, value]数组。 - 交互: 支持缩放(DataZoom),查看不同时间跨度(近1月、近3月、近1年)的体重/体脂变化曲线。
4.4 智能排课冲突检测
- 在管理员或教练排课时,后端需校验:
- 该教练在此时段是否已有排课。
- 该教室在此时段是否被占用。
- 算法: 查询
course_schedules表,条件(new_start < existing_end) AND (new_end > existing_start)。若存在记录则提示冲突。
20大项目拆解:从PRD到架构 文章被收录于专栏
想独立做出一个完整的项目却不知从何下手?本专栏是你的终极路线图。我们由浅入深,通过20个经典项目案例,手把手带你走过产品构思、需求撰写、功能设计、技术选型、架构搭建的全过程。从“音乐播放器”到“企业后台”,你将逐步建立对软件系统的完整认知,完成从理论到实践、从单一技能到复合能力的飞跃。
查看19道真题和解析