一、系统概述与技术架构

24小时自助健身房的核心在于“无人值守”与“智能运营”。要构建这样一套系统,不仅需要可靠的后台服务支撑用户管理、订单流转,还需要前端多端适配,让用户通过小程序、App或公众号就能完成入场、开柜、购课等全部操作。

基于知识库中多个预约类系统的成熟经验,推荐采用 Spring Boot + MyBatis Plus + MySQL 作为后台服务核心栈,这一组合在理发店预约、同城跑腿、棋牌室共享等场景中已经被验证足够稳定,且易于二次开发。用户端采用 UniApp 开发,一套代码同时输出小程序、H5、公众号和App;管理后台则基于 Vue + Element UI 构建,提供可视化的门店运营面板。

为什么这样选?Spring Boot 的自动配置能力能大幅降低项目初始化成本,MyBatis Plus 的代码生成器可快速产出基础 CRUD 代码,而 UniApp 的 Vue 语法生态成熟,前端人员几乎零成本上手。对于一线城市的健身房场景,高并发、多门店、跨终端的特征决定了我们必须选择一套具备横向扩展能力的技术栈。下图展示了系统整体分层关系:

层级技术选型核心职责
展示层UniApp (Vue语法) / 小程序 / H5用户端预约、入场、消费记录
管理后台Vue + Element UI门店管理、会员管理、设备监控
网关层Nginx + Spring Cloud Gateway统一鉴权、限流、日志
业务服务Spring Boot + MyBatis Plus订单、会员、设备控制、计费
数据层MySQL + Redis持久化存储 + 缓存 + 分布式锁
硬件对接Netty / MQTT门禁、储物柜、电源控制

二、核心功能模块设计

开发一套24小时自助健身房系统,必须覆盖从用户进店到离店的全链路自助流程。围绕这个目标,我们将系统拆解为以下几个核心模块。

2.1 用户端自助服务(UniApp实现)

用户端需要提供如下核心能力:

  • 自助注册与实名认证:通过验证 + 身份证OCR识别(可接入阿里云/腾讯云OCR),确保入场人员身份真实。这一步尤其重要,因为无人值守场景下,安全责任完全由系统承担。
  • 实时场地状态查看:展示当前门店空闲器械数量、各时段人流热力图,帮助用户避开高峰期。
  • 动态定价与自动计费:按分钟计费 + 按时段优惠(例如夜间包场折扣)。计费规则建议使用策略模式设计,方便后续调整。
  • 智能门禁与储物柜联动:用户下单后生成动态,扫码开锁的同时自动分配储物柜。柜门开启记录与用户订单绑定,避免纠纷。

在上述模块中,动态定价的数据库设计尤为关键。一个典型的计费规则表结构如下(示例):

CREATE TABLE billing_rule (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    store_id BIGINT NOT NULL COMMENT '门店ID',
    rule_type TINYINT NOT NULL COMMENT '1:按分钟 2:按时段 3:包场',
    unit_price DECIMAL(10,2) COMMENT '单价,单位:元/分钟',
    start_time TIME COMMENT '时段开始',
    end_time TIME COMMENT '时段结束',
    created_at DATETIME,
    updated_at DATETIME
);

2.2 管理后台(Vue + Element UI)

管理后台是健身房运营者的工作台,需要具备以下能力:

  • 多门店管理:支持区域内的连锁门店统一管理,每家门店可独立配置营业规则、设备参数。
  • 会员健康度看板:展示活跃用户数、日均访问时长、复购率等核心指标,辅助运营决策。
  • 设备远程控制:门禁、灯光、空调等IoT设备的远程开关与状态监控。这部分需要硬件厂商提供API,系统采用适配器模式进行统一封装。
  • 异常预警与处理:订单长时间未完成、设备故障、用户投诉等异常事件自动生成工单,推送到管理员手机。

以订单超时预警为例,可借助MySQL的事件调度器配合Redis过期回调实现:

@Component
public class OrderTimeoutWatcher {

    @Autowired
    private RedissonClient redissonClient;

    @PostConstruct
    public void init() {
        // 监听所有未完成订单的过期事件
        RBlockingDeque<String> queue = redissonClient.getBlockingDeque("order:timeout");
        queue.subscribeOnElements(orderId -> {
            // 自动结束订单,释放设备,异常计费处理
            handleTimeoutOrder(orderId);
        });
    }
}

2.3 硬件对接层

自助健身房离不开硬件设备。常见的对接包括:

  • 智能门禁:基于MQTT协议,用户扫码后服务端下发开门指令,同时记录入场时间。建议门禁控制器支持离线模式,断网时也能通过本地白名单放行。
  • 储物柜控制:每个柜门绑定一个继电器,通过TCP长连接控制开锁。需要设计心跳检测,设备掉线时及时告警。
  • 电源管理:跑步机、杠铃架等设备接入智能插座,用户确认开卡后自动通电,离场后断电,既节能又安全。

硬件对接的通用做法是定义一个抽象设备接口,各厂商实现自己的适配器:

public interface DeviceAdapter {
    boolean openDoor(String deviceId);
    boolean getStatus(String deviceId);
    boolean powerOn(String deviceId);
    // ...其他控制方法
}

三、关键难点与实战方案

在开发过程中,有几个技术难点需要重点攻克,这里分享三个典型场景的解决思路。

3.1 并发入场与分布式锁

高峰时段(早晚7-9点)可能出现几十人同时扫码入场。如果门禁系统瞬间收到大量开门请求,数据库锁竞争或Redis缓存穿透都会导致服务不稳定。解决方案是采用 Redis分布式锁 + 本地排队:

  1. 用户入场请求先进Redis队列,每次只处理一个订单的开门指令。
  2. 用户端表现为“正在排队中,预计等待5秒”,后端实际通过分布式锁控制并发。
  3. 锁的超时时间合理设置(如3秒),开门成功后立即释放,避免死锁。

3.2 异常订单的自动修复

实际运营中,用户可能入场后忘记扫码离场,导致订单一直计费。针对这一场景,设计“订单生命周期自动检测”服务:

  • 用户入场后,系统每10分钟检测一次设备活跃度(通过智能手环或手机GPS)。
  • 若检测到用户长时间无动作且未离场,系统自动发送推送提醒。
  • 超过2小时无响应,强制结束订单,按实际时长计费,并释放器材。

这个逻辑可以用Spring Boot的@Scheduled定时任务实现,但要注意分布式环境下的任务重复执行问题,配合Redis分布式锁或Quartz集群模式解决。

3.3 跨端数据同步

用户可能在小程序、App、H5等不同端之间切换。如果入场后用户端离线,管理后台需要能主动推送状态变更。推荐使用 WebSocket + 消息队列 的方案:

  • 用户端连接WebSocket保持心跳,管理后台通过RocketMQ广播订单状态变更。
  • 用户端收到消息后,本地更新UI,同时将本地未提交的数据(如运动记录)同步到服务端。
// 管理后台发送状态变更消息
public void sendOrderStatusChange(Order order) {
    rocketMQTemplate.send("order-status-topic",
        MessageBuilder.withPayload(order).build());
}

四、开发与部署实践

4.1 开发环境搭建

建议使用 Maven多模块项目 来组织代码,将common、user-api、admin-api、hardware-adapter等模块分离。本地开发推荐Docker Compose一键启动MySQL + Redis + Nacos环境:

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - "3306:3306"
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
  nacos:
    image: nacos/nacos-server:2.0.3
    ports:
      - "8848:8848"

4.2 部署架构建议

生产环境推荐使用 阿里云ECS + RDS + Redis集群,前端静态资源部署到OSS加速,后端服务通过SLB负载均衡。建议多区域部署(比如朝阳、海淀各部署一套),通过CNAME智能调度用户到近节点,降低时延。

部署文档建议包含以下内容:

  • 基础环境要求(JDK 17+, Node 18+, MySQL 8.0+)
  • 配置文件模板(区分开发/测试/生产)
  • 初始化SQL脚本(含默认管理员账号、门店数据)
  • Nginx反向代理示例配置

4.3 二次开发接口预留

为了让系统具备可扩展性,建议在设计时预留如下扩展点:

  • 支付通道适配器:支持支付、支付宝、银联等多种渠道,用户可自由切换。
  • 短信/推送渠道适配器:支持阿里云短信、腾讯云推送、极光推送等,统一通过MessageService接口调用。
  • 硬件适配器:支持不同厂商的门禁、柜锁、电源控制器。

每个适配器都定义好SPI接口,后续只需添加新的实现类即可无缝接入。

五、FAQ(常见技术问题)

Q1:如何处理用户入场后设备故障导致无法离场?
A:管理后台提供“强制离场”功能,管理员可远程结束订单并释放设备。同时建议在门禁旁安装物理应急按钮,用户按下后直接触发服务端订单结束逻辑。

Q2:系统支持多少人同时在线使用?
A:基于Spring Boot的架构,单台4C8G服务器可支撑约2000人同时在线操作。配合Redis缓存和MySQL读写分离,全城百家门店同时使用没有问题。

Q3:跨门店会员如何共享数据?
A:用户注册时绑定,将作为全局标识。后台设计“会员归属门店”字段,用户可在任意门店入场,订单归属当前门店,会员等级、余额等数据统一存储在全局表中。

Q4:小程序审核遇到“健身类目需要资质”怎么办?
A:提前准备营业执照(含健身服务)、门店租赁合同、消防验收证明等材料。如果暂时没有资质,可先以“生活服务-预约平台”类目提交,审核通过后再补充健身相关能力。

Q5:代码生成器和文档如何快速获得?
A:MyBatis Plus的AutoGenerator可一键生成Controller、Service、Mapper等基础代码。配合Swagger注解,自动生成API文档,缩短开发周期。

Logo

一站式 AI 云服务平台

更多推荐