Skip to content

客户端小程序 — 首页

上级文档:客户端小程序


概述

对应主文档 §8.8(首页运营与客服入口)

首页是用户进入小程序后的第一个页面,定位为品牌展示与核心转化入口。首页需在首屏即传达品牌形象,快速告知用户门店位置与实时状态,并引导用户完成注册→录脸→购买→入场的关键转化链路。

核心设计原则

  1. 视觉冲击力优先:首屏以品牌形象图 + 核心数据为主,强化品牌认知
  2. 门店信息一站式呈现:用户无需跳转即可获取导航、设施、环境等关键信息
  3. 转化入口高权重:会员卡办理(产品列表)始终可见,未登录时以优惠引导登录
  4. 私域引导自然融入:加店长企微的入口穿插在合适场景中,不突兀

页面路由

路由页面说明
/pages/index/index首页TabBar 页

页面区块设计

按从上到下的视觉顺序排列,每个区块占满屏幕宽度。

1. 品牌视觉区(首屏 Hero)

首屏 Banner 支持按用户标签进行分层运营,不同用户群体看到不同的 Banner 内容。

要素说明
品牌 Banner全宽大图(建议比例 16:9),展示品牌形象或促销活动
品牌叠加层半透明渐变遮罩,底部叠加文字信息
品牌 Slogan如「24H 无人智能健身,随时随地开练」(运营可配置)
门店切换右上角切换当前查看的门店(弹出门店选择器)

Banner 分层运营规则

管理后台可为 Banner 配置适用人群标签,前端根据用户标签匹配展示:

人群标签说明Banner 示例
新用户tags 包含 NEW_USER「新人首月 19.9 元,限时体验」
未购卡用户tags 包含 NO_MEMBERSHIP「月卡 99 元起,全城通用」
活跃用户tags 包含 ACTIVE(近 30 天到店 ≥ 3 次)「连续打卡 7 天,赠送额外淋浴时长」
沉默用户tags 包含 SILENT(近 30 天未到店)「好久不见!回来就送 3 天体验卡」
即将到期tags 包含 EXPIRING_SOON「续费年卡享 8 折优惠」
VIP 用户tags 包含 VIP「VIP 专属:私教课程免费体验 1 次」
全部用户默认,无标签过滤品牌形象图 / 通用活动

Banner 匹配优先级

  1. 精确匹配用户标签的 Banner(优先展示)
  2. 「全部用户」Banner(兜底)
  3. 同优先级内按管理后台排序值排列
  4. 最多展示 1 张首屏 Banner(与下方活动轮播区分)

门店选择器(底部弹窗):

  • 按距离排序的门店列表(需定位权限)
  • 每项展示:门店名称、地址摘要、距离、营业状态标签
  • 门店公告:如该门店有公告,在门店名称下方以灰色小字展示公告摘要(最多一行,超出省略号)
    • 公告为空时自动隐藏,不占空间
    • 点击门店展开后可查看公告全文
  • 选择后刷新整个首页数据
  • 「查看全部门店 >」跳转门店列表页

2. 门店核心信息卡片

展示用户当前选中门店的关键信息,帮助用户快速决策是否到店。

要素说明
门店名称大字标题
营业状态营业中(绿色)/ 暂停营业(灰色)/ 装修中(橙色)
距离信息如「距您 1.2km」;未授权定位时显示「—」
门店面积如「300㎡」,管理后台配置
营业时间如「24 小时营业」或「06:00 - 23:00」

门店公告(位于门店核心信息卡片内,营业时间下方):

要素说明
展示条件仅当该门店有未过期的公告时显示
公告内容公告文本,最多展示 2 行,超出显示「查看全文 >」
展开/收起点击可展开查看完整公告(富文本)
无公告时整个区域自动隐藏,不占空间
多条公告如有多条,按发布时间倒序展示,每条独立展开/收起

门店特色标签(横向滚动/换行排列,管理后台可配置):

标签示例说明
🅿️ 免费停车门店是否提供免费停车位
🔋 充电宝是否有共享充电宝设备
🥤 自助售卖机是否有饮料/零食售卖机
🚿 淋浴间是否提供淋浴服务
🔒 独立更衣室是否有独立更衣空间
💧 饮水机是否有直饮水设备
📶 免费 WiFi是否提供 WiFi

门店特色设备展示

  • 展示门店的核心器械设备(如力量区、有氧区、自由力量区等)
  • 图片缩略图 + 设备区名称,横向滚动
  • 管理后台可配置展示顺序和图片

3. 实时门店状态

展示门店的实时运营数据和环境信息,增强用户到店意愿。

要素说明数据来源
在场人数如「当前 12 人在练」工控机 / 刷脸统计
温湿度如「室内 24°C · 湿度 45%」温湿度传感器(MQTT 推送)
门店实景照片轮播展示门店环境照片(门头、器械区、休息区等)管理后台上传
门店公告如「周三器械维护,部分区域暂停使用」管理后台配置

实时数据刷新策略

  • 在场人数:进入首页时请求一次,WebSocket 推送实时更新
  • 温湿度:进入首页时请求一次,每次页面回到前台时刷新
  • 如传感器离线,该区块不隐藏,显示「环境数据暂不可用」

4. 导航到店区

占据足够的视觉面积,引导用户一键导航到店。

要素说明
静态地图以门店 POI 为中心的地图截图/预览(管理后台配置)
地图面积建议占屏幕宽度 100%、高度 180-240px,视觉突出
详细地址完整地址文本
交通提示如「地铁 X 号线 XX 站 B 出口步行 5 分钟」
导航按钮大按钮「导航到店」→ 调起微信/系统地图导航

导航逻辑

  • 调用 wx.openLocation 打开微信内置地图
  • 如无定位权限,引导授权或显示地址文本供用户自行搜索

5. 状态提醒区

针对已登录用户的个性化提醒,引导完成关键动作。未登录用户不显示此区块,替换为登录引导。

已登录用户 — 提醒优先级(同一时间最多展示 1 条):

优先级条件提醒文案操作按钮
1未录脸「请完成人脸录入,录入后即可入场」「立即录入」→ 人脸录入页
2有待支付订单「您有一笔待支付订单即将超时」「去支付」→ 订单详情页
3权益即将到期(≤7天)「您的月卡将于 X 天后到期」「续费」→ 产品列表页
4无有效权益「暂无会员权益,开通后即可入场」「立即购买」→ 产品列表页
5全部正常不显示提醒区

6. 会员卡办理(核心转化入口)

首页最重要的转化区块,始终可见,视觉权重最高。

要素说明
标题如「开通会员 · 随时开练」
套餐卡片列表展示 2-4 个推荐套餐,按运营配置排序
套餐卡片内容套餐名称、价格(原价+现价)、有效期、核心权益摘要、购买按钮
「查看全部套餐 >」跳转产品列表页

套餐卡片信息

字段说明
套餐名称如「月卡」「季卡」「年卡」「体验卡」
价格现价(大字)+ 原价(删除线,如适用)
有效期如「30 天」「90 天」
权益摘要如「不限次数 · 全城通用 · 含淋浴」
标签「最受欢迎」「限时优惠」「新人专享」等运营标签
购买按钮「立即开通」→ 套餐详情页

未登录用户

  • 套餐价格隐藏,显示「登录查看优惠价格」
  • 点击任意套餐 → 跳转登录页 → 登录成功后返回首页 → 自动展开套餐区
  • 此设计利用价格好奇心驱动注册转化

7. 外部券码核销入口

为抖音、美团等渠道到店用户提供快速核销入口。

要素说明
抖音团购图标 + 「抖音团购券」→ 跳转券码核销页
美团团购图标 + 「美团团购券」→ 跳转券码核销页
更多券码「手动输入券码」→ 跳转券码核销页

详细 PRD:外部券码核销

8. 快捷功能入口

入口显示条件说明
🚿 淋浴控制仅在门店内时显示(最近进店记录存在)跳转淋浴控制页
📷 人脸录入仅在未录脸时显示跳转人脸录入页
📦 我的订单已登录时显示跳转订单列表页
🏋️ 动作库始终可见跳转动作库列表页

9. 活动 Banner

要素说明
轮播1-3 张活动 Banner,自动轮播 + 手动滑动
Banner 内容活动封面图 + 文案,由管理后台配置
跳转点击跳转至配置的目标页(门店/套餐/活动详情/自定义链接)
无活动时隐藏整个区块

10. 联系客服 & 器械咨询

要素说明
联系客服跳转微信客服对话(wx.openCustomerServiceChat 或 Button open-type)
器械咨询跳转客服对话,预填问题模板「想咨询 XX 门店的器械设备」
客服在线状态展示「在线」或「离线」标签

11. 私域引导:加店长企微

自然融入页面的私域引导,目标是将小程序用户沉淀到企业微信。

要素说明
展示位置页面底部,客服区域下方
展示形式店长头像(企微头像)+ 昵称 + 「添加店长企微,享受专属优惠」
触发方式点击跳转企微添加页(wx.openCustomerServiceChat 或企微联系卡片)
每个门店独立店长企微与门店绑定,切换门店后自动更新

引导时机(多点位触达):

触发场景引导方式
首页底部固定展示店长企微卡片
支付成功后支付结果页底部「添加店长,获取训练指导」
会员即将到期提醒区文案中附带「联系店长享续费优惠」
首次进店后下次进入首页时弹出「欢迎来到 XX 门店,添加店长了解更多」

未登录用户首页策略

核心目标:用优惠价格驱动登录,不做强制登录拦截。

未登录时首页差异

区块已登录未登录
品牌视觉区正常展示正常展示
门店核心信息正常展示正常展示
实时门店状态正常展示(在场人数可见)正常展示
导航到店区正常展示正常展示
状态提醒区个性化提醒不显示
会员卡办理显示价格价格隐藏,显示「登录查看优惠价格」
外部券码可用可用(核销时再引导登录)
快捷入口全部展示仅显示「动作库」,其他入口引导登录
活动 Banner正常展示正常展示
客服 & 私域正常展示正常展示

登录引导流程

用户点击「登录查看优惠价格」或需登录的入口
  → 跳转登录页
  → 登录成功
  → 返回首页
  → 自动展开会员卡办理区块,展示实际价格

数据刷新与缓存

数据类型刷新策略缓存
门店基本信息进入首页时 + 切换门店时请求本地缓存,30 分钟过期
在场人数WebSocket 实时推送不缓存
温湿度进入首页时 + 页面回到前台时本地缓存,5 分钟过期
套餐列表进入首页时请求本地缓存,10 分钟过期
活动 Banner进入首页时请求本地缓存,30 分钟过期
门店照片进入首页时请求 + 管理后台配置时推送更新本地缓存,1 小时过期
店长企微信息进入首页时请求本地缓存,30 分钟过期

异常处理

异常处理
门店信息加载失败展示骨架屏 → 错误态「门店信息加载失败」+ 重试按钮
定位权限拒绝距离显示「—」,门店不按距离排序,提示「开启定位查看最近门店」
传感器离线(温湿度)不隐藏区块,显示「环境数据暂不可用」
在场人数接口失败显示缓存值(如有),无缓存时显示「—」
套餐列表为空显示空态插画 + 「暂无可用套餐」
Banner 加载失败不展示该 Banner,不影响其他区块
网络完全断开首页展示本地缓存数据 + 顶部横幅「当前为离线数据,部分信息可能过期」

接口汇总

text
# 门店核心信息
GET /api/v1/stores/:id
  Response: Store {
    id, name, address, latitude, longitude,
    businessHours, status, area,
    description, facilities[],
    featuredEquipments[],
    announcements[],
    wechatContact { name, avatarUrl, qrCodeUrl },
    photos: StorePhoto[]
  }

# 门店实时状态
GET /api/v1/stores/:id/realtime
  Response: {
    currentOccupancy: number,        // 当前在场人数
    temperature: number | null,      // 温度(℃)
    humidity: number | null,         // 湿度(%)
    sensorOnline: boolean            // 传感器是否在线
  }

# WebSocket 推送 — 在场人数实时更新
WS /ws/store/:id/occupancy
  Message: { type: "occupancy_update", count: number }

# 首页推荐套餐
GET /api/v1/products/recommend
  Query: { storeId, count? }
  Response: { items: Product[] }

# 活动 Banner
GET /api/v1/activities/banners
  Query: { storeId? }
  Response: { items: ActivityBanner[] }

# 首屏 Hero Banner(分层运营)
GET /api/v1/config/hero-banner
  Auth: JWT(未登录时传匿名 token 或不传)
  Query: { storeId }
  Response: {
    image: string,          // Banner 图片 URL
    slogan: string,         // 文案
    jumpType: string,       // none / product / activity / link
    jumpTarget: string,     // 跳转目标 ID 或 URL
    tagFilter: string[]     // 后台配置的适用人群标签
  }

管理后台配置依赖

以下首页展示内容需在管理后台配置:

配置项所在模块说明
门店基本信息(面积、营业时间等)门店管理 → 基本资料门店维度
门店特色设施标签门店管理 → 基本资料 → 设施多选枚举
门店特色设备门店管理 → 基本资料图片 + 名称,排序
门店实景照片门店管理 → 门店照片图集,封面
门店公告门店管理 → 门店公告富文本
温湿度传感器门店管理 → 设备管理传感器绑定 + 告警阈值
推荐套餐排序产品管理 → 产品列表按门店配置推荐权重
活动 Banner营销 → 活动管理图片 + 跳转配置
首屏 Hero Banner营销 → Banner 管理图片 + Slogan + 跳转 + 适用人群标签
店长企微信息门店管理 → 基本资料企微姓名、头像、二维码

客户端小程序 — 门店浏览

上级文档:客户端小程序


概述

对应主文档 §8.2

门店浏览为用户提供全部门店的搜索与详情查看能力。首页已展示最近门店的核心信息,门店列表页提供更多选择与搜索能力,门店详情页提供完整信息与导航

页面路由

路由页面说明
/pages/store/list门店列表附近门店搜索
/pages/store/detail门店详情门店完整信息 + 导航 + 套餐入口

门店列表页要素

  • 返回按钮 + 「门店」标题
  • 搜索栏:关键词搜索门店名称
  • 门店卡片列表(复用首页门店卡片样式)

门店列表字段

字段说明
门店名称name(多语言)
地址摘要省市区 + 路名(多语言)
距离需定位权限;未授权时显示「获取位置」
营业状态营业中 / 暂停营业 / 装修中
基础设施标签更衣室 / 停车位 / 淋浴 等
在场人数如「12 人在练」(与首页实时数据接口一致)

门店排序规则

  1. 授权定位时:按距离升序
  2. 未授权定位时:按创建时间升序
  3. 暂停营业/装修中门店不隐藏,但标注状态并置底

门店详情页要素

  • 导航地图区(大面积静态地图预览 + 「导航到店」大按钮)
  • 门店名称 + 营业状态 + 面积
  • 营业时间 + 详细地址 + 交通信息
  • 门店公告(有公告时显示,无公告时隐藏;同首页规则)
  • 门店特色标签(设施、设备)
  • 温湿度实时数据(与首页同接口)
  • 门店实景照片轮播
  • 门店介绍文字
  • 在场人数
  • 「查看可用套餐」按钮 → 跳转产品列表页(带 storeId)
  • 店长企微卡片(与首页同组件)

门店异常处理

异常处理
列表加载失败展示错误态 + 「重试」
门店暂停营业不隐藏,显示「暂停营业」+ 不可到店提示
套餐受门店限制门店详情页明确提示「该门店适用以下套餐」

客户端小程序 — 推广活动

上级文档:客户端小程序


概述

对应主文档 §8.10

页面路由

路由页面说明
/pages/activity/list活动列表全部营销活动
/pages/activity/detail活动详情活动规则 + 参与方式

活动展示位置

位置说明
首页 Banner 轮播1-3 张活动 Banner,可左右滑动
活动列表页全部活动列表
活动详情页活动规则、参与方式、跳转

活动 Banner 配置(管理后台)

字段说明
标题Banner 文案(多语言)
图片Banner 背景图
跳转类型无 / 门店页 / 套餐列表 / 套餐详情 / 自定义链接
跳转目标对应的页面 ID 或 URL
排序展示顺序
上线时间活动展示时间范围

活动列表页要素

  • 活动卡片:封面图 + 标题 + 价格 + 活动时间
  • 「查看详情 >」跳转
  • 已结束的活动标注「已结束」或隐藏

活动异常处理

  • Banner 加载失败:不展示该 Banner,不影响其他区块
  • 活动下线/失效:列表中标注「已结束」或隐藏

客户端小程序 — 动作库

上级文档:客户端小程序


概述

对应主文档 §8.9

页面路由

路由页面说明
/pages/exercise/list动作库列表按部位分类浏览
/pages/exercise/detail动作详情图文/视频 + 说明

动作库列表页要素

  • 返回按钮 + 「动作库」标题
  • 搜索栏:关键词搜索动作名称
  • 部位 Tab:胸部 / 背部 / 腿部 / 肩部 / 核心 / 手臂
  • 动作卡片列表:缩略图 + 动作名称 + 部位 + 难度

动作详情页要素

  • 返回按钮 + 动作名称
  • 素材展示区:图片或视频
  • 基础信息:部位、难度、器械类型
  • 动作说明:详细步骤
  • 注意事项:安全提示

动作库字段

字段说明
动作名称name(多语言)
部位胸部/背部/腿部/肩部/核心/手臂
难度初级/中级/高级
器械杠铃/哑铃/固定器械/徒手
素材图片或视频 URL
动作说明详细步骤(多语言)
注意事项安全提示(多语言)

动作库异常处理

异常处理
列表加载失败展示错误态 + 「重试」
素材缺失展示默认占位图 + 说明文字
搜索无结果展示空态 + 「清除搜索」

接口汇总(门店 / 活动 / 动作库)

text
# 门店
GET /api/v1/stores
  Query: { latitude?, longitude?, keyword?, page, pageSize }
  Response: { items: Store[], total: number }

GET /api/v1/stores/:id
  Response: Store { ...全部字段, facilities, description }

# 活动
GET /api/v1/activities
  Query: { status?, page, pageSize }
  Response: { items: Activity[], total: number }

GET /api/v1/activities/:id
  Response: Activity

# 动作库
GET /api/v1/exercises
  Query: { part?, keyword?, page, pageSize }
  Response: { items: Exercise[], total: number }

GET /api/v1/exercises/:id
  Response: Exercise

飞创 Fitron 内部规划文档