主题
管理后台 — 门店管理
上级文档:管理后台 Web
模块概述
门店管理是管理后台的核心基础模块,提供门店的全生命周期管理能力:从门店列表的一览监控,到单门店的多维度信息编辑,再到设备、权限、进出记录的精细化管理。支持总部模式(多店管理 + Tab 架构)和分店模式(单店 + 左侧列表架构)两种视图切换。
页面路由
| 路由 | 页面 | 说明 |
|---|---|---|
/stores | 门店列表 | 多店一览 + 筛选排序 |
/stores/:id | 门店详情(总部模式) | Tab 架构,含概览 + 各子模块 |
/stores/:id/:subTab | 门店详情子页 | 总部模式下可直达指定 Tab |
门店列表
列表字段
| 列 / 区块 | 字段 key | 类型 | 权限 | 说明 |
|---|---|---|---|---|
| 门店 ID | id | String | 全角色 | 系统内唯一标识 |
| 门店名称 | name | String | 全角色 | 多语言 |
| 营业状态 | status | Enum | 全角色 | 虚拟门店 | 装修中 | 营业中 | 已闭店 |
| 门店类型 | type | Enum | 全角色 | 直营 | 加盟 |
| 实时在场人数 | currentOccupancy | Int | 全角色 | 实时更新,来自刷脸进出统计 |
| 今日到店总人数 | todayVisits | Int | 全角色 | 当日累计到店人次 |
| 今日营收 | todayRevenue | Decimal | 老板 / 财务 | 仅超级管理员和财务可见 |
| 昨日营收 | yesterdayRevenue | Decimal | 老板 / 财务 | 仅超级管理员和财务可见 |
| 营收环比 | revenueChangeRate | Percentage | 老板 / 财务 | (今日-昨日)/昨日 × 100%,正数绿色↑负数红色↓ |
| 操作 | — | — | 按角色 | 「进入管理」按钮 / 行内快捷操作 |
营收列权限控制:营收相关三列(今日营收、昨日营收、环比)仅对
boss和finance角色可见。前端通过can('store:revenue_view')控制,后端接口同样按角色过滤返回字段。
营收列交互
| 交互 | 说明 |
|---|---|
| 今日营收 | 大字突出显示,如「¥ 3,280」 |
| 昨日营收 | 小字辅助,如「昨日 ¥ 2,950」 |
| 环比 | 彩色百分比标签,如「🟢 +11.2%」或「🔴 -8.5%」 |
| 刷新频率 | 今日营收每 30 秒自动刷新(WebSocket 推送变更时即时更新) |
| 0 营收 | 显示「¥ 0」,不显示环比 |
多维度快速搜索与排序
筛选维度
| 维度 | key | 类型 | 说明 |
|---|---|---|---|
| 关键词 | keyword | 输入框 | 门店 ID(精确)、名称模糊、地址片段(省市区/详细地址) |
| 营业状态 | status | 多选 | 虚拟门店 | 装修中 | 营业中 | 已闭店 |
| 门店类型 | type | 单选 | 直营 | 加盟 |
| 区域 / 城市 | region | 级联选择 | 省 → 市 → 区,与后台主数据枚举对齐 |
| 渠道绑定 | channel | 单选 | 美团/抖音:已绑定、未绑定、授权异常 |
| 设备状态 | deviceStatus | 单选 | 全部 / 设备正常 / 有告警 / 有离线 |
排序能力
| 可排序字段 | key | 默认排序 | 说明 |
|---|---|---|---|
| 门店名称 | name | A→Z | 按拼音首字母排序 |
| 营业状态 | status | — | 营业中优先 |
| 实时在场人数 | currentOccupancy | 高→低 | — |
| 今日到店 | todayVisits | 高→低 | — |
| 今日营收 | todayRevenue | 高→低 | 仅 boss/finance 可选 |
| 营收环比 | revenueChangeRate | 高→低 | 仅 boss/finance 可选 |
| 创建时间 | createdAt | 新→旧 | — |
排序交互:列表每列标题可点击切换升序/降序,当前排序列标题显示箭头指示器。支持多字段组合排序(长按列标题添加为第二排序字段)。
搜索交互
| 交互 | 说明 |
|---|---|
| 条件组合 | 多条件默认 AND 组合 |
| 一键清空 | 重置所有筛选和排序条件 |
| 关键词防抖 | 输入后 300ms 防抖触发查询,或回车立即触发 |
| 分页 | 服务端分页 + 虚拟滚动 |
| 移动端 | 切换器以全屏搜索 + 最近使用 + 扫码辅助快速定位 |
| 排序持久化 | 用户排序偏好保存到 localStorage,下次进入自动恢复 |
门店详情页架构
两种视图模式
| 模式 | 触发条件 | 布局 |
|---|---|---|
| 总部模式 | 老板、财务等全局角色,或处于全体店模式 | Tab 架构:顶部 Tab 切换各子模块 |
| 分店模式 | 店长等单店角色 | 左侧列表 + 右侧内容:左侧导航列表,右侧展示选中模块内容 |
总部模式 — Tab 架构
┌─────────────────────────────────────────────────────────────┐
│ ← 返回 朝阳门店 [营业中 🟢] │
├─────────────────────────────────────────────────────────────┤
│ [概览] [基本信息] [结算配置] [商业配套] [门店照片] [公告] │
│ [POI 管理] [渠道管理] [设备管理] [进出记录] [权限管理] │
├─────────────────────────────────────────────────────────────┤
│ │
│ 当前 Tab 内容区 │
│ │
└─────────────────────────────────────────────────────────────┘分店模式 — 左侧列表 + 右侧内容
┌─────────────────────────────────────────────────────────────┐
│ ← 返回 朝阳门店 [营业中 🟢] │
├──────────────┬──────────────────────────────────────────────┤
│ │ │
│ 📊 门店概览 │ 当前选中模块内容区 │
│ 📋 基本信息 │ │
│ 🅿️ 商业配套│ │
│ 📷 门店照片 │ │
│ 📢 门店公告 │ │
│ 🏋️ 器械管理│ │
│ 📍 POI 管理│ │
│ 📡 设备管理│ │
│ 📋 进出记录│ │
│ │ │
├──────────────┴──────────────────────────────────────────────┤分店模式下隐藏的模块:结算配置、渠道管理、权限管理(总部专属),不在左侧列表中显示。
前端实现建议
typescript
// 门店详情页根据角色自动切换布局
const layout = computed(() => {
if (isBranch.value) return 'sidebar' // 分店模式:左侧列表
return 'tabs' // 总部模式:顶部 Tab
})
// Tab / 左侧列表定义,支持 requireHQ / requirePermission
const storeModules = [
{ key: 'overview', label: '门店概览', icon: '📊' },
{ key: 'basic-info', label: '基本信息', icon: '📋' },
{ key: 'settlement', label: '结算配置', icon: '💰', requireHQ: true },
{ key: 'facilities', label: '商业配套', icon: '🅿️' },
{ key: 'photos', label: '门店照片', icon: '📷' },
{ key: 'announcements', label: '门店公告', icon: '📢' },
{ key: 'equipment', label: '器械管理', icon: '🏋️' },
{ key: 'poi', label: 'POI 管理', icon: '📍' },
{ key: 'channels', label: '渠道管理', icon: '🔗', requireHQ: true },
{ key: 'devices', label: '设备管理', icon: '📡' },
{ key: 'access-logs', label: '进出记录', icon: '📋' },
{ key: 'permissions', label: '权限管理', icon: '🔐', requireHQ: true },
]Tab 1:门店概览(只读)
所有角色可见,纯只读面板。展示门店的核心经营数据概览,用于快速了解门店运营状态。
数据面板
| 区块 | 指标 | 说明 |
|---|---|---|
| 经营状态 | 营业状态、营业时间 | 当前状态一目了然 |
| 实时数据 | 在场人数、今日到店人次 | 实时更新 |
| 营收概览 | 今日营收、昨日营收、环比、本月累计 | 仅 boss/finance 可见 |
| 会员概况 | 总会员数、本月新增、活跃会员(近 30 天到店) | — |
| 设备概况 | 设备总数、在线数、离线数、告警数 | — |
营收概览面板权限
| 指标 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 今日营收 | ✅ | ✅ | ❌ | ❌ |
| 昨日营收 | ✅ | ✅ | ❌ | ❌ |
| 营收环比 | ✅ | ✅ | ❌ | ❌ |
| 本月累计 | ✅ | ✅ | ❌ | ❌ |
Tab 2:基本信息(可编辑)
字段定义
| 字段 | key | 类型 | 必填 | 多语言 | 说明 |
|---|---|---|---|---|---|
| 门店编号 | storeCode | String | ✅ | ❌ | 系统生成或手动设定,唯一 |
| 门店名称 | name | String | ✅ | ✅ (zh/en) | 对外展示的门店名称 |
| 营业状态 | status | Enum | ✅ | ❌ | 虚拟门店 | 装修中 | 营业中 | 已闭店 |
| 门店类型 | type | Enum | ✅ | ❌ | 直营 | 加盟 |
| 营业时间 | businessHours | Object | ✅ | ❌ | 见下方详细定义 |
| 联系电话 | phone | String | ✅ | ❌ | 门店联系电话 |
| 店长企微 | managerWechat | Object | ❌ | ❌ | 企微姓名 + 头像 + 联系方式 |
| 门店面积 | area | Decimal | ✅ | ❌ | 数值,单位 ㎡ |
| 开业日期 | openDate | Date | ❌ | ❌ | YYYY-MM-DD |
| 所在城市 | city | String | ✅ | ✅ (zh/en) | 省 → 市 → 区 |
| 门店简介 | description | Text | ❌ | ✅ (zh/en) | 富文本,用于小程序门店详情页展示 |
闲时时段配置
用于闲时卡产品的进店时段校验。每个门店可独立配置自己的闲时时段。
typescript
interface StoreOffPeakConfig {
isEnabled: boolean // 是否启用闲时卡功能
offPeakSlots: { // 闲时时段列表,可配置多条
dayOfWeek: 1-7 // 周几(1=周一, 7=周日)
startTime: string // 如 "06:00"
endTime: string // 如 "14:00"
}[]
}门店基本信息 Tab 中增加的配置字段:
| 字段 | key | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 启用闲时卡 | offPeakEnabled | Boolean | ✅ | 开启后该门店支持闲时卡产品 |
| 闲时时段 | offPeakSlots | Array | 条件必填 | 启用闲时卡后必填至少一条 |
角色权限:闲时时段配置由 boss 编辑,店长只读。属于门店维度的运营策略配置。
营业时间详细定义
typescript
interface BusinessHours {
is24Hours: boolean // 是否 24 小时营业
timeSlots: { // 非全天营业时的时段定义
openTime: string // 如 "06:00"
closeTime: string // 如 "23:00"
}
weeklySchedule?: { // 按周定义(可选,默认全周相同)
[day: 1-7]: {
isOpen: boolean
openTime?: string
closeTime?: string
} | null // null 表示跟随默认时段
}
holidaySchedule?: HolidayRule[] // 节假日特殊安排(可选)
}店长企微详细定义
typescript
interface ManagerWechat {
name: string // 企微姓名
avatarUrl: string // 头像 URL
contactUrl: string // 企微联系链接 / 二维码
phone?: string // 店长手机号(不对外公开)
}小程序对外公开配置
每个字段可独立控制是否在小程序中对外公开(如门店列表、门店详情页)。
字段级公开开关
| 字段 | 公开开关 key | 默认 | 说明 |
|---|---|---|---|
| 联系电话 | publicPhone | 关闭 | 开启后在小程序门店详情页展示 |
| 店长企微 | publicWechat | 开启 | 店长企微名片卡片 |
| 门店面积 | publicArea | 开启 | 小程序门店详情展示 |
| 开业日期 | publicOpenDate | 关闭 | 展示「已运营 X 年」 |
| 门店简介 | publicDescription | 开启 | 门店详情页富文本展示 |
| 营业时间 | publicBusinessHours | 开启 | — |
小程序列表展示开关
| 开关 | key | 默认 | 说明 |
|---|---|---|---|
| 是否在小程序门店列表中展示 | visibleInApp | 开启 | 关闭后该门店不出现在小程序的门店列表和门店选择器中 |
使用场景:
虚拟门店或已闭店的门店默认关闭此开关。装修中的门店可保持开启(用户仍可见,显示「装修中」状态)。
基本资料 — 角色编辑权限
| 字段 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 门店编号 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 门店名称 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 营业状态 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 门店类型 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 营业时间 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| 联系电话 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| 店长企微 | ✅ 编辑 | 只读 | ❌ | ❌ |
| 门店面积 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 开业日期 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 所在城市 | ✅ 编辑 | 只读 | 只读 | 只读 |
| 门店简介 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| 对外公开开关 | ✅ 编辑 | ❌ | ❌ | ❌ |
| 列表展示开关 | ✅ 编辑 | ❌ | ❌ | ❌ |
Tab 2.5:结算配置(总部配置)
在门店详情中配置门店与总部的分成关系,以及技术服务费计费口径。结算计算规则见 结算系统。
配置字段
| 字段 | key | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 门店分成比例 | storeShareRate | Percentage | ✅ | 门店可得比例 |
| 总部分成比例 | hqShareRate | Percentage | ✅ | 总部可得比例 |
| 分成基准 | settlementBase | Enum | ✅ | 定价 / 实际销售金额 / 扣除支付通道费后的实收金额 |
| 技术服务费费率 | fitronTechRate | Percentage | ✅ | 默认 1%,由 FCC 按客户配置后客户云同步;本页只读 |
| 技术服务费计费基准 | fitronFeeBase | Enum | ✅ | 与分成基准一致 |
| 配置生效时间 | effectiveFrom | DateTime | ✅ | 仅影响生效后新订单 |
校验规则
storeShareRate + hqShareRate = 100%fitronTechRate在门店详情中只读展示,不允许手工修改- 变更分成规则不回溯历史订单,历史按订单快照结算
角色权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 查看结算配置 | ✅ | ✅ | ✅(只读) | ❌ |
| 编辑结算配置 | ✅ | ✅ | ❌ | ❌ |
Tab 3:商业配套
管理门店的商业配套设施信息,用于小程序门店详情页展示,帮助用户提前了解门店环境。
停车场信息
| 字段 | key | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 是否有停车场 | hasParkingLot | Boolean | ✅ | 开启后展开下方字段 |
| 停车场类型 | parkingType | Enum | ❌ | 地下 | 地面 | 立体 |
| 可供车位 | parkingSpaces | Int | ❌ | 数量 |
| 免费停车时长 | freeParkingDuration | Int | ❌ | 分钟数;0 表示不免费 |
| 收费标准 | parkingFeeDesc | String | ❌ | 文本描述,如「首小时 5 元,之后 3 元/小时」 |
充电宝 & 售卖机
| 字段 | key | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 充电宝 | hasPowerBank | Boolean | ✅ | 是否有共享充电宝 |
| 自助售卖机 | hasVendingMachine | Boolean | ✅ | 是否有饮料/零食售卖机 |
储物柜
| 字段 | key | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 是否有储物柜 | hasLockers | Boolean | ✅ | — |
| 储物柜类型 | lockerType | Enum | ❌ | 电子密码柜 | 投币柜 | 人脸识别柜 |
| 储物柜数量 | lockerCount | Int | ❌ | 总柜门数 |
| 是否免费 | lockerFree | Boolean | ❌ | false 时展示收费标准描述 |
| 收费标准 | lockerFeeDesc | String | ❌ | 如「¥ 3/次」 |
WiFi
| 字段 | key | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| 是否有 WiFi | hasWifi | Boolean | ✅ | — |
| WiFi 名称 | wifiName | String | ❌ | SSID |
| WiFi 密码 | wifiPassword | String | ❌ | 明文展示 |
场地空间(功能分区)
展示门店内部的功能分区信息,帮助用户了解器械和空间布局。
| 字段 | key | 类型 | 说明 |
|---|---|---|---|
| 功能分区列表 | zones | Array | 可拖拽排序,每个分区包含以下字段 |
单个分区定义:
typescript
interface StoreZone {
id: string
name: string // 分区名称,多语言 (zh/en),如「力量区」「有氧区」
description?: string // 分区描述,多语言,如「自由重量训练区,包含深蹲架、卧推架等」
imageUrl?: string // 分区照片(可选)
sortOrder: number // 展示排序
}预设分区枚举(运营可在预设基础上自由增减):
| 预设分区 | 说明 |
|---|---|
| 力量区 | 杠铃、哑铃、自由重量器械 |
| 有氧区 | 跑步机、椭圆机、划船机等 |
| 固定器械区 | 插片式、插销式固定器械 |
| 拉伸/放松区 | 瑜伽垫、泡沫轴、拉伸带 |
| 更衣室 | 更衣储物空间 |
| 淋浴区 | 淋浴间 |
场地空间分区信息与小程序门店详情页联动展示,也用于首页的「门店特色设备展示」区块。
商业配套 — 角色编辑权限
| 模块 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 停车场信息 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| 充电宝 & 售卖机 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| 储物柜 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| WiFi | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
| 场地空间 | ✅ 编辑 | 只读 | ✅ 编辑 | 只读 |
Tab 4:门店照片
| 要素 | 说明 |
|---|---|
| 照片上传 | 支持 JPG/PNG,单张 ≤ 5MB |
| 照片分类 | 门头 | 环境 | 器械区 | 休息区 | 其他 |
| 封面设置 | 从上传的照片中选择 1 张作为封面(用于小程序门店卡片) |
| 排序 | 拖拽调整展示顺序 |
| 批量操作 | 批量删除 |
角色编辑权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 上传/删除照片 | ✅ | ❌ | ✅ | ❌ |
| 设置封面/排序 | ✅ | ❌ | ✅ | ❌ |
| 查看照片 | ✅ | ✅ | ✅ | ✅ |
Tab 5:门店公告
管理门店公告,公告会同步展示在小程序首页和门店详情页。
| 字段 | key | 类型 | 说明 |
|---|---|---|---|
| 公告标题 | title | String | 多语言 (zh/en) |
| 公告内容 | content | RichText | 富文本,支持图片 |
| 生效时间 | effectiveAt | DateTime | 公告开始展示时间 |
| 失效时间 | expiresAt | DateTime | 公告停止展示时间;为空则永久有效 |
| 优先级 | priority | Int | 数字越大越靠前 |
公告列表
| 列 | 说明 |
|---|---|
| 标题 | 多语言,默认中文 |
| 状态 | 生效中(绿色)/ 未生效(灰色)/ 已过期(红色) |
| 有效期 | 生效时间 ~ 失效时间 |
| 操作 | 编辑 / 删除 / 置顶 |
角色编辑权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 发布/编辑公告 | ✅ | ❌ | ✅ | ❌ |
| 删除公告 | ✅ | ❌ | ✅ | ❌ |
| 查看公告 | ✅ | ✅ | ✅ | ✅ |
Tab 6:器械管理
管理门店的器械设备清单,用于小程序门店详情页展示,也用于器械报修入口的联动。
器械列表字段
| 字段 | key | 类型 | 说明 |
|---|---|---|---|
| 器械名称 | name | String | 多语言 (zh/en) |
| 所属分区 | zoneId | FK | 关联「商业配套 → 场地空间」中的分区 |
| 品牌型号 | model | String | — |
| 数量 | quantity | Int | 该器械的数量 |
| 维护状态 | maintenanceStatus | Enum | 正常 | 维护中 | 待报废 |
| 报修记录 | — | — | 点击查看该器械的报修历史 |
器械列表操作
| 操作 | 说明 |
|---|---|
| 新增器械 | 填写名称、分区、品牌型号、数量 |
| 编辑器械 | 修改信息 |
| 删除器械 | 确认后删除 |
| 标记维护 | 将状态改为「维护中」,记录维护原因 |
| 查看报修记录 | 跳转到该器械的报修历史 |
角色编辑权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 新增/编辑/删除器械 | ✅ | ❌ | ✅ | ❌ |
| 标记维护状态 | ✅ | ❌ | ✅ | ✅ |
| 查看器械列表 | ✅ | ✅ | ✅ | ✅ |
Tab 7:POI 管理
管理门店的地图位置信息,供小程序导航使用。
| 字段 | key | 类型 | 说明 |
|---|---|---|---|
| POI 名称 | poiName | String | 地图平台上的点位名称 |
| 地址 | address | String | 完整地址,多语言 |
| 经纬度 | latitude / longitude | Decimal | — |
| 交通提示 | trafficHint | String | 多语言,如「地铁 5 号线 XX 站 B 出口步行 5 分钟」 |
| 地图平台 ID | mapPlatformId | String | 高德/腾讯地图的 POI ID(如有) |
POI 拾取交互
- 在表单内嵌入地图组件,支持点击地图或搜索地址拾取坐标
- 拾取后自动填充地址字段(可手动修改)
角色编辑权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 编辑 POI 信息 | ✅ | ❌ | ❌ | ❌ |
| 查看 POI 信息 | ✅ | ✅ | ✅ | ✅ |
Tab 8:渠道管理(总部专属)
仅总部角色可见。管理门店在第三方平台(美团、抖音)的账号绑定。
| 平台 | 字段 | 说明 |
|---|---|---|
| 美团 | meituanStoreId | 门店在美团侧的 ID |
| 美团 | meituanBindStatus | 未绑定 | 已绑定 | 授权异常 |
| 美团 | meituanBindAccount | 绑定的美团账号 |
| 抖音 | douyinStoreId | 门店在抖音侧的 ID |
| 抖音 | douyinBindStatus | 未绑定 | 已绑定 | 授权异常 |
| 抖音 | douyinBindAccount | 绑定的抖音账号 |
操作
| 操作 | 说明 |
|---|---|
| 绑定 | 填写平台门店 ID,发起授权流程 |
| 解绑 | 确认后解除绑定 |
| 刷新状态 | 重新检查授权状态 |
Tab 9:设备管理
管理门店的智能硬件设备。详细 PRD 参见 硬件控制面板。
门店维度设备概览
| 设备类型 | 说明 |
|---|---|
| 工控机(边缘盒子) | 核心控制设备,在线状态、运行时间 |
| A 门 / B 门 | 门锁状态、门磁状态 |
| 灯光控制 | 各分区灯光开关状态 |
| UPS 电源 | 电池电量、市电状态 |
| 温湿度传感器 | 最新读数、告警阈值 |
| 淋浴控制器 | 淋浴间状态 |
| 摄像头 | 在线状态、预览(如接入) |
本 Tab 功能
| 功能 | 说明 |
|---|---|
| 设备列表 | 展示当前门店绑定的所有设备 |
| 设备状态 | 在线/离线/告警状态实时展示 |
| 远程操作 | 远程开门、灯光控制等(需权限) |
| 设备绑定 | 新增/解绑设备(仅总部) |
| 快速跳转 | 「前往硬件控制面板 →」跳转 /hardware/:storeId |
角色编辑权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 查看设备状态 | ✅ | ❌ | ✅(本店) | ❌ |
| 远程开门 | ✅ | ❌ | ✅ | ✅(紧急情况) |
| 灯光控制 | ✅ | ❌ | ✅ | ❌ |
| 新增/解绑设备 | ✅ | ❌ | ❌ | ❌ |
Tab 10:进出记录
查看门店的用户刷脸进出日志,即门禁事件记录。
筛选条件
| 维度 | key | 类型 | 说明 |
|---|---|---|---|
| 时间范围 | dateRange | DateRange | 默认今天 |
| 事件类型 | eventType | 单选 | 全部 / 进店 / 离店 |
| 用户搜索 | userKeyword | 输入框 | 手机号 / 昵称 / 用户 ID |
| 识别方式 | authMethod | 单选 | 全部 / 人脸识别 / 远程开门 / 临时权限 |
记录列表字段
| 列 | key | 说明 |
|---|---|---|
| 时间 | eventTime | 进出事件发生时间 |
| 事件类型 | eventType | 进店(绿色)/ 离店(灰色) |
| 用户 | userName | 昵称 + 头像缩略图 |
| 手机号 | userPhone | 脱敏显示,如 138****5678 |
| 识别方式 | authMethod | 人脸识别 / 远程开门 / 临时权限 / 二维码 |
| 识别照片 | capturePhoto | 缩略图,点击可查看大图(按权限) |
| 滞留时长 | duration | 仅离店事件展示,如「1 小时 23 分钟」 |
操作
| 操作 | 说明 |
|---|---|
| 导出 | 导出当前筛选条件下的记录为 CSV/Excel |
| 跳转用户 | 点击用户 → 跳转会员详情页 |
| 查看照片 | 点击识别照片 → 查看抓拍大图(需 member:face_view 权限) |
角色查看权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 查看进出记录 | ✅(全部门店) | ✅(全部门店) | ✅(本店) | ✅(全部门店) |
| 查看识别照片 | ✅ | ❌ | ✅ | 按策略 |
| 导出记录 | ✅ | ✅ | ✅(本店) | 按策略 |
Tab 11:权限管理(总部专属)
仅总部角色可见。管理门店维度的角色分配和开门权限。
11.1 人员与角色管理
| 功能 | 说明 |
|---|---|
| 门店管理员列表 | 查看该门店绑定的所有管理员 |
| 分配角色 | 为指定人员分配门店维度的角色(店长、客服等) |
| 移除权限 | 取消某人在该门店的管理权限 |
| 快速跳转 | 「前往系统设置 →」跳转全局权限配置 |
11.2 开门权限管理
用户刷脸开门权限
| 功能 | 说明 |
|---|---|
| 冻结用户进门权限 | 冻结后该用户无法刷脸进门,需解冻后恢复 |
| 解冻用户进门权限 | 恢复用户的刷脸进门权限 |
| 批量冻结 | 按条件批量冻结(如欠费、违规等) |
| 冻结记录 | 查看冻结/解冻操作日志 |
冻结触发方式:
- 手动冻结:管理员在此页面手动操作
- 系统自动冻结:如订单退款成功后自动冻结(可配置)
- 违规冻结:多次违规行为触发自动冻结(可配置规则)
临时开门权限
| 功能 | 说明 |
|---|---|
| 发放临时权限 | 为非会员(访客、临时工、维修人员等)发放限时进门权限 |
| 权限类型 | 单次 / 限时(如 2 小时)/ 指定日期范围 |
| 授权方式 | 人脸录入(临时) / 二维码(一次性) |
| 权限列表 | 查看当前有效的临时权限及其状态 |
| 撤销权限 | 提前撤销已发放的临时权限 |
临时权限字段:
| 字段 | key | 类型 | 说明 |
|---|---|---|---|
| 授权对象 | targetName | String | 访客姓名 |
| 授权对象手机 | targetPhone | String | — |
| 权限类型 | tempType | Enum | 单次 | 限时 | 日期范围 |
| 有效时段 | validFrom / validTo | DateTime | 权限生效和失效时间 |
| 授权方式 | authMethod | Enum | 临时人脸 | 一次性二维码 |
| 授权人 | grantedBy | String | 发放此权限的管理员 |
| 使用状态 | usageStatus | Enum | 未使用 | 已使用 | 已过期 | 已撤销 |
远程开门权限
| 功能 | 说明 |
|---|---|
| 远程开门权限列表 | 查看哪些角色可以通过管理后台远程开 AB 门 |
| 配置远程开门权限 | 编辑角色 → 开启/关闭远程开门能力 |
远程开门权限与全局角色权限矩阵联动,参见 硬件控制面板权限。
权限管理 — 角色权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 查看 Tab | ✅ | ✅ | ❌ | ❌ |
| 人员角色管理 | ✅ | ❌ | ❌ | ❌ |
| 冻结/解冻进门权限 | ✅ | ❌ | ❌ | ✅(紧急情况) |
| 发放临时开门权限 | ✅ | ❌ | ✅ | ✅ |
| 配置远程开门权限 | ✅ | ❌ | ❌ | ❌ |
门店详情页 Tab 权限矩阵(汇总)
L1 主 Tab 可见性
| Tab | 老板 | 财务 | 店长(本店) | 客服 | 模式 |
|---|---|---|---|---|---|
| 门店概览 | ✅ | ✅ | ✅ | ✅ | 只读面板 |
| 基本信息 | ✅(全部可编辑) | ✅(只读) | ✅(部分可编辑) | ✅(只读) | 编辑表单 |
| 结算配置 | ✅(可编辑) | ✅(可编辑) | ❌ | ❌ | 总部专属 |
| 商业配套 | ✅(全部可编辑) | ✅(只读) | ✅(全部可编辑) | ✅(只读) | 编辑表单 |
| 门店照片 | ✅ | ✅(只读) | ✅ | ❌ | 图集管理 |
| 门店公告 | ✅ | ✅(只读) | ✅ | ✅(只读) | 公告 CRUD |
| 器械管理 | ✅ | ✅(只读) | ✅ | ✅(只读+标记维护) | 列表 CRUD |
| POI 管理 | ✅ | ✅(只读) | ✅(只读) | ✅(只读) | 位置编辑 |
| 渠道管理 | ✅ | ✅ | ❌ | ❌ | 总部专属 |
| 设备管理 | ✅(完整) | ❌ | ✅(操作) | ❌ | 设备列表+操作 |
| 进出记录 | ✅ | ✅ | ✅(本店) | ✅ | 日志列表 |
| 权限管理 | ✅ | ❌ | ❌ | ❌ | 总部专属 |
分店模式 — 左侧列表可见性
分店模式下,requireHQ 的 Tab 从左侧列表中移除,店长可见模块:
| 左侧菜单项 | 可见 |
|---|---|
| 📊 门店概览 | ✅ |
| 📋 基本信息 | ✅ |
| 🅿️ 商业配套 | ✅ |
| 📷 门店照片 | ✅ |
| 📢 门店公告 | ✅ |
| 🏋️ 器械管理 | ✅ |
| 📍 POI 管理 | ✅(只读) |
| 📡 设备管理 | ✅ |
| 📋 进出记录 | ✅ |
API 接口规划
text
# 门店列表
GET /api/v1/admin/stores
Query: { keyword?, status?, type?, region?, channel?, deviceStatus?,
sortField?, sortOrder?, page?, pageSize? }
Response: {
items: StoreListItem[],
total: number
}
StoreListItem {
id, name, status, type, currentOccupancy, todayVisits,
todayRevenue?, // 仅 boss/finance 返回
yesterdayRevenue?, // 仅 boss/finance 返回
revenueChangeRate? // 仅 boss/finance 返回
}
# 门店详情
GET /api/v1/admin/stores/:id
Response: StoreDetail { ...全部字段, facilities, zones, photos, announcements, equipment }
# 更新门店基本信息
PUT /api/v1/admin/stores/:id/basic-info
Body: { name, status, type, businessHours, phone, managerWechat, area,
openDate, city, description, publicFields, visibleInApp }
# 更新门店结算配置
PUT /api/v1/admin/stores/:id/settlement
Body: { storeShareRate, hqShareRate, settlementBase, fitronTechRate, fitronFeeBase, effectiveFrom }
# 更新商业配套
PUT /api/v1/admin/stores/:id/facilities
Body: { parking, powerBank, vendingMachine, lockers, wifi, zones }
# 门店照片管理
POST /api/v1/admin/stores/:id/photos # 上传照片
DELETE /api/v1/admin/stores/:id/photos/:photoId # 删除照片
PUT /api/v1/admin/stores/:id/photos/cover # 设置封面
PUT /api/v1/admin/stores/:id/photos/sort # 调整排序
# 门店公告管理
GET /api/v1/admin/stores/:id/announcements
POST /api/v1/admin/stores/:id/announcements
PUT /api/v1/admin/stores/:id/announcements/:id
DELETE /api/v1/admin/stores/:id/announcements/:id
# 器械管理
GET /api/v1/admin/stores/:id/equipment
POST /api/v1/admin/stores/:id/equipment
PUT /api/v1/admin/stores/:id/equipment/:id
DELETE /api/v1/admin/stores/:id/equipment/:id
# POI 管理
PUT /api/v1/admin/stores/:id/poi
Body: { poiName, address, latitude, longitude, trafficHint, mapPlatformId }
# 渠道管理
POST /api/v1/admin/stores/:id/channels/:platform/bind # 绑定渠道
DELETE /api/v1/admin/stores/:id/channels/:platform/unbind # 解绑渠道
GET /api/v1/admin/stores/:id/channels/:platform/status # 查看授权状态
# 进出记录
GET /api/v1/admin/stores/:id/access-logs
Query: { dateRange?, eventType?, userKeyword?, authMethod?, page?, pageSize? }
Response: { items: AccessLog[], total: number }
# 权限管理 — 人员角色
GET /api/v1/admin/stores/:id/admins
POST /api/v1/admin/stores/:id/admins
DELETE /api/v1/admin/stores/:id/admins/:adminId
# 权限管理 — 开门权限
POST /api/v1/admin/stores/:id/access-control/freeze/:userId # 冻结
POST /api/v1/admin/stores/:id/access-control/unfreeze/:userId # 解冻
GET /api/v1/admin/stores/:id/access-control/freeze-logs # 冻结日志
# 权限管理 — 临时权限
GET /api/v1/admin/stores/:id/temp-access
POST /api/v1/admin/stores/:id/temp-access
DELETE /api/v1/admin/stores/:id/temp-access/:tempId