Settings, Permissions, RBAC, App Config & Hierarchy | 更新时间: 2026-02-08
admin/settings/page.tsx,
admin/settings/time-clock/page.tsx,
admin/permissions/roles/page.tsx,
admin/permissions/job-titles/page.tsx,
admin/permissions/audit/page.tsx,
admin/sync-config/page.tsx,
admin/schedules/page.tsx,
admin/developer-settings/page.tsx,
admin/terminals/page.tsx,
admin/checkin/config/page.tsx,
admin/checkin/stats/page.tsx,
settings/page.tsx,
chat-test/page.tsx,
voice-test/page.tsx
SettingValueInput.tsx,
BatchSettingModal.tsx,
GuestWelcomeSettings.tsx,
BrandingSection.tsx,
FeatureTogglesSection.tsx,
HomeLayoutEditor.tsx,
HeroBannerManager.tsx,
EmployeeThemeSettings.tsx,
SettingsForm.tsx (TimeClock),
SyncTriggerModal.tsx,
CategoryManagementModal.tsx,
WeeklyTemplateModal.tsx,
GenerateScheduleModal.tsx,
AutoScheduleConfigPanel.tsx,
WelcomeMessageEditor.tsx,
PromoConfig.tsx,
AddTerminalModal.tsx,
UserPreferencesPanel.tsx
useSettings.ts,
useBookingConfig.ts,
useCheckinConfig.ts,
useScheduleTemplate.ts
api/settings.js,
api/admin/roles.js,
api/admin/job-titles.js,
api/admin/job-title-permissions.js,
api/admin/audit.js,
api/sync-config.js,
api/checkin-config.js,
api/booking-config.js,
api/messaging-config.js,
api/time-clock.js (settings endpoints)
| CUJ | 优先级 | 描述 | 触发角色 | 业务价值 | E2E 状态 |
|---|---|---|---|---|---|
| J1 | P0 | 角色与权限管理 | super_admin | 安全性 — RBAC 细粒度控制 | 已覆盖 |
| J2 | P0 | 通用业务设置 | admin+ | 基础运营 — 时区/货币/税率 | 已覆盖 |
| J3 | P0 | 预约与预订配置 | admin+ | 核心流程 — 预约规则定义 | 已覆盖 |
| J4 | P1 | 打卡系统设置 | admin+ | 人事管理 — 考勤规则定义 | 已覆盖 |
| J5 | P1 | Guest App 品牌与功能配置 | admin+ | 品牌形象 — 客户端定制 | 部分覆盖 |
| J6 | P1 | 签到终端配置 | admin+ | 到店体验 — Kiosk 行为定制 | 部分覆盖 |
| J7 | P2 | 同步与数据源配置 | super_admin | 数据管理 — 外部系统集成 | 未覆盖 |
| J8 | P1 | 排班模板管理 | admin+ | 效率 — 自动化排班 | 部分覆盖 |
| J9 | P2 | 审计日志与合规 | admin+ | 合规 — 操作可追溯 | 部分覆盖 |
| J10 | P2 | 用户级偏好设置 | 所有用户 | 体验 — 个人化定制 | 未覆盖 |
| J11 | P3 | 开发者工具 | platform_superadmin | 运维 — 调试/测试工具 | 未覆盖 |
flowchart TD
P["Platform 平台级"] --> T["Tenant 租户级"]
T --> S["Store 门店级"]
S --> U["User 用户级"]
P -.- P1["系统默认值, 由平台管理员设定"]
T -.- T1["租户级覆盖, All Stores 作用域"]
S -.- S1["门店级覆盖, 仅影响单个门店"]
U -.- U1["用户偏好, 仅影响当前用户"]
style P fill:#c62828,stroke:#b71c1c,color:#fff
style T fill:#e65100,stroke:#bf360c,color:#fff
style S fill:#1565c0,stroke:#0d47a1,color:#fff
style U fill:#455a64,stroke:#37474f,color:#fff
is_overridable: false 的设置只能在 min_scope 及以上级别修改。
| value_type | UI 渲染 | 示例设置 |
|---|---|---|
string | 文本输入框 | business_name, subdomain |
number | 数字输入框 (min/max) | tax_rate, advance_booking_days |
boolean | 开关 Toggle | sms_enabled, auto_assign |
enum | 下拉选择框 | timezone, currency, date_format |
json | JSON 编辑器 / 专用组件 | welcome_screens, home_layout |
color | 颜色选择器 (inputType: 'color') | theme_primary_color |
| 类别 (category) | 关键设置项 | 最低作用域 |
|---|---|---|
general | timezone, currency, tax_rate, tax_included, date_format, time_format, week_starts_on, business_name | tenant |
booking | advance_booking_days, cancellation_hours, buffer_minutes, no_show_policy, self_booking, notifications | store |
tips | default_commission_rate, distribution_method, job_title_overrides | store |
guest_app | branding.*, features.*, welcome.*, home.*, hero_banners | tenant |
employee_app | theme.primary_color | tenant |
time_clock | pin_enabled, click_enabled, late_tolerance, early_leave_alert, makeup_max_per_week | store |
checkin | walkin, qr_checkin, phone_checkin, auto_assign, idle_timeout, notification_sound | store |
messaging | email_provider (SES/Resend), sms_provider (Twilio/Telnyx), verified_senders | tenant |
P0 安全性 — RBAC 细粒度权限控制
flowchart TD
A["导航到 /admin/permissions"] --> B{"选择子页面"}
B -->|"角色"| C["/admin/permissions/roles"]
C --> C1["系统角色列表 + 自定义角色"]
C1 --> C2{"操作?"}
C2 -->|"新建"| C3["填写: 名称, 描述, 级别, 作用域"]
C3 --> C4["按分类勾选权限项"]
C4 --> C5["保存"]
C2 -->|"编辑"| C4
C2 -->|"删除"| C6["确认删除自定义角色"]
B -->|"职位"| D["/admin/permissions/job-titles"]
D --> D1["选择门店"]
D1 --> D2["职位列表: code, display_name, level"]
D2 --> D3{"操作?"}
D3 -->|"新建"| D4["填写: code, 名称, 描述, 佣金率, 是否可提供服务"]
D3 -->|"配置权限"| D5["关联角色到职位"]
B -->|"审计"| E["/admin/permissions/audit"]
style C fill:#2196F3,stroke:#1565C0,color:#fff
style D fill:#4CAF50,stroke:#388E3C,color:#fff
style E fill:#FF9800,stroke:#F57C00,color:#fff
| 权限格式 | 说明 | 示例 |
|---|---|---|
resource:action | 基于资源-动作对 | appointments:create |
| 分类展示 | 按功能模块分组 | Appointments, Reports, Employees... |
| 级别 | view / manage | reports:view vs reports:manage |
| 作用域 | global / store | global 角色对所有门店生效 |
platform_superadmin · super_admin · admin · manager · employee · guest
/admin/permissions/rolesappointments:create, appointments:updatereports:viewemployees:delete 等未授权操作
测试: role-management.spec.ts
reports:view 权限(无对应范围 scope)/reports测试: full-flow/07-rbac.spec.ts
/admin/permissions/job-titles 选择门店 A测试: role-management.spec.ts (职位部分)
测试: role-management.spec.ts
P0 基础运营 — 区域化、财务、租户配置
flowchart TD
A["导航到 /admin/settings"] --> B["作用域选择器"]
B -->|"All Stores"| C["租户级设置"]
B -->|"选择具体门店"| D["门店级设置 (覆盖)"]
C --> E{"Tab 选择"}
D --> E
E -->|"General"| F["区域/财务设置"]
E -->|"Appointments"| G["→ CUJ-J3"]
E -->|"Tips"| H["小费配置"]
E -->|"Guest App"| I["→ CUJ-J5"]
E -->|"Employee App"| J["Employee 主题"]
style B fill:#FF9800,stroke:#F57C00,color:#fff
style F fill:#2196F3,stroke:#1565C0,color:#fff
| 设置项 | 类型 | 作用域 | 说明 |
|---|---|---|---|
| timezone | enum | tenant | 时区 (America/New_York 等) |
| currency | enum | tenant | 货币 (USD, CNY 等) |
| tax_rate | number | store | 税率百分比 (0-100) |
| tax_included | boolean | store | 价格是否含税 |
| date_format | enum | tenant | 日期格式 (MM/DD/YYYY 等) |
| time_format | enum | tenant | 12h / 24h |
| week_starts_on | enum | tenant | 周起始日 (Sunday/Monday) |
| business_name | string | tenant | 企业名称 |
| tenant_subdomain | string | tenant | 租户子域名 |
| 设置项 | 说明 |
|---|---|
| default_commission_rate | 门店默认小费佣金率(如 100% = 技师全拿) |
| distribution_method | 分配方式 |
| job_title_overrides | 按职位覆盖佣金率(如 Manager 80%) |
/admin/settings,作用域为 "All Stores"测试: settings-hierarchy.spec.ts
测试: settings-hierarchy.spec.ts
测试: 部分覆盖
P0 核心流程 — 预约规则与通知配置
| 设置项 | 类型 | 作用域 | 说明 |
|---|---|---|---|
| advance_booking_days | number | store | 最多可提前多少天预约 |
| cancellation_hours | number | store | 取消截止时间(提前小时数) |
| buffer_minutes | number | store | 预约间隔缓冲时间 |
| no_show_policy | enum | store | 未到场策略 (none/charge/block) |
| self_booking_enabled | boolean | store | 是否允许客户自助预约 |
| sms_notification_enabled | boolean | store | 短信提醒开关 |
| email_notification_enabled | boolean | store | 邮件提醒开关 |
| booking_link | string | store | 自动生成的预约链接 |
/admin/settings Appointments tab测试: settings-hierarchy.spec.ts
测试: 部分覆盖
测试: settings-hierarchy.spec.ts
P1 人事管理 — 考勤规则与打卡方式配置
/admin/settings/time-clockSettingsForm (from @/components/TimeClock/SettingsForm)GET/PUT /api/time-clock/settings (tenant) 或 /api/time-clock/settings/:centerId (store)
| 设置项 | 类型 | 说明 |
|---|---|---|
| pin_enabled | boolean | 启用 PIN 码打卡 |
| click_enabled | boolean | 启用一键打卡 |
| late_tolerance_minutes | number | 迟到容忍时间(分钟) |
| early_leave_alert_minutes | number | 早退提醒阈值(分钟) |
| reminder_enabled | boolean | 打卡提醒开关 |
| reminder_before_minutes | number | 提前多少分钟提醒 |
| makeup_max_per_week | number | 每周补卡上限次数 |
/admin/settings/time-clock 选择门店 A测试: time-clock.spec.ts
测试: time-clock.spec.ts
P1 品牌形象 — 客户端 App 的外观和功能定制
flowchart TD
A["Admin Settings → Guest App Tab"] --> B{"子模块"}
B --> C["Branding 品牌"]
B --> D["Welcome 欢迎页"]
B --> E["Features 功能开关"]
B --> F["Home Layout 首页布局"]
B --> G["Hero Banner 轮播图"]
C --> C1["App 名称 / Logo / 主题色"]
D --> D1["欢迎页媒体轮播管理"]
E --> E1["价格/技师选择/礼品卡/忠诚度 开关"]
F --> F1["首页模块排序与显示"]
G --> G1["首页轮播图 CRUD"]
style C fill:#C89B3C,stroke:#a67c00,color:#fff
style D fill:#C89B3C,stroke:#a67c00,color:#fff
style E fill:#C89B3C,stroke:#a67c00,color:#fff
style F fill:#C89B3C,stroke:#a67c00,color:#fff
style G fill:#C89B3C,stroke:#a67c00,color:#fff
/admin/settings Guest App tab → Branding测试: 部分覆盖
测试: 未覆盖
测试: 未覆盖
P1 到店体验 — Kiosk 签到行为定制
/admin/checkin/configGET/PUT /api/checkin-config/:store_id/admin/checkin/config 选择门店测试: 部分覆盖
测试: 未覆盖
/admin/terminals测试: 未覆盖
P2 数据管理 — 外部系统集成同步控制
| 实体类型 | 方向选项 | 说明 |
|---|---|---|
| guests | read / write / both / off | 客户数据同步 |
| appointments | read / write / both / off | 预约数据同步 |
| services | read / write / both / off | 服务项目同步 |
| employees | read / write / both / off | 员工数据同步 |
| schedules | read / write / both / off | 排班数据同步 |
/admin/sync-config测试: 未覆盖
测试: 未覆盖
测试: 未覆盖
P1 效率 — 模板化排班与自动生成
/admin/schedulesWeeklyTemplateModal, GenerateScheduleModal, AutoScheduleConfigPanel
/admin/schedules测试: 部分覆盖
测试: 部分覆盖
P2 合规 — 权限变更操作追溯
/admin/permissions/auditGET /api/admin/audit/permissions (带筛选参数)
| 筛选器 | 选项 |
|---|---|
| 操作类型 (action) | create, update, delete, assign |
| 目标类型 (target_type) | role, permission, user_role |
| 操作人 | 文本搜索 |
| 时间范围 | 日期区间选择器 |
/admin/permissions/audit测试: 部分覆盖
测试: 未覆盖
测试: 未覆盖
P2 体验 — 个人化定制
/settings(注意不是 /admin/settings)/settings测试: 未覆盖
/settings Notifications tab测试: 未覆盖
P3 运维 — 调试与测试工具
platform_superadmin 可见。包含数据库切换等高危操作。
/admin/developer-settings测试: developer-settings.spec.ts
测试: developer-settings.spec.ts
/chat-test 或 /voice-test测试: 未覆盖
| 本模块 CUJ | 依赖模块 | 关系描述 |
|---|---|---|
| J1 权限 | CUJ-A (Auth) | 认证后根据角色权限渲染侧边栏和路由守卫 |
| J3 预约配置 | CUJ-G (Booking) | advance_booking_days、cancellation_hours 直接影响在线预约流程 |
| J3 预约配置 | CUJ-B (Appointments) | buffer_minutes 影响预约时段计算 |
| J4 打卡设置 | CUJ-D (Employees) | 打卡方式和容忍规则影响员工出勤记录 |
| J5 Guest App | Guest App CUJ | 品牌/功能开关直接控制 Guest App 行为 |
| J6 签到终端 | Kiosk App CUJ | checkin-config 控制 Kiosk App 行为 |
| J8 排班模板 | CUJ-D (Employees) | 模板生成排班影响员工日程和可预约时段 |
| J2 通用设置 | CUJ-F (Payments) | tax_rate, currency 影响支付计算和发票展示 |
is_overridable: false 的设置只能在 min_scope 或更高级别修改。platform_superadmin、super_admin、superadmin 自动跳过数据库权限检查。