docs: 添加预约模块和签到模块详细设计文档及API接口文档
- 添加预约模块详细设计文档(LLD-预约模块详细设计.md) - 添加签到模块详细设计文档(LLD-签到模块详细设计.md) - 添加API接口文档(API接口文档.md) 文档包含: - 模块概述与边界定义 - 数据模型设计(含SQL建表语句) - 领域模型设计 - 业务流程设计 - 接口设计 - 核心代码设计 - 高并发处理方案 - 缓存设计 - 定时任务设计 - 异常处理 - 附录(枚举定义、错误码)~
This commit is contained in:
+1382
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,925 @@
|
||||
# 健身房管理系统概要设计文档(HLD)
|
||||
|
||||
> 文档编号: GYM-HLD-001
|
||||
> 版本: v1.0
|
||||
> 日期: 2026-02-28
|
||||
> 作者: 张翔
|
||||
> 状态: 初稿
|
||||
|
||||
---
|
||||
|
||||
## 文档修订历史
|
||||
|
||||
| 版本 | 日期 | 作者 | 修订内容 |
|
||||
| ---- | ---------- | ---- | -------- |
|
||||
| v1.0 | 2026-02-28 | 张翔 | 初稿 |
|
||||
|
||||
---
|
||||
|
||||
## 一、引言
|
||||
|
||||
### 1.1 编写目的
|
||||
|
||||
本文档为健身房管理系统的概要设计文档(High-Level Design),旨在:
|
||||
|
||||
1. 从总体上描述系统的技术架构、模块划分、接口设计
|
||||
2. 为详细设计提供指导和约束
|
||||
3. 作为开发人员、测试人员、运维人员的技术参考
|
||||
|
||||
### 1.2 项目背景
|
||||
|
||||
健身房管理系统是一款面向综合型健身俱乐部、精品工作室、连锁品牌的全场景管理平台,核心解决:
|
||||
|
||||
- 会员端:一站式查看个人所有信息,便捷预约签到
|
||||
- 管理后台:全维度数据整理与分析,支撑运营决策
|
||||
- 多业态支持:灵活适配不同规模和类型的健身场所
|
||||
|
||||
### 1.3 术语定义
|
||||
|
||||
| 术语 | 定义 |
|
||||
| ----------------------------- | ------------------------------------------------ |
|
||||
| 租户(Tenant) | 系统的多租户架构中的独立业务实体,如一个连锁品牌 |
|
||||
| 门店(Store) | 租户下的具体经营场所 |
|
||||
| 会员(Member) | 在门店注册的用户 |
|
||||
| 权益(Benefit) | 会员卡包含的时长、次数、储值、等级等权益 |
|
||||
| 可预约资源(Bookable Resource) | 团课、私教、场地、线上课程等可被预约的对象 |
|
||||
| 时段(Slot) | 资源的可预约时间窗口 |
|
||||
|
||||
### 1.4 参考文档
|
||||
|
||||
- 《健身房管理系统产品设计文档》 GYM-PRD-001
|
||||
- Spring Boot 3 官方文档
|
||||
- R2DBC 规范文档
|
||||
- PostgreSQL 官方文档
|
||||
|
||||
---
|
||||
|
||||
## 二、系统概述
|
||||
|
||||
### 2.1 系统目标
|
||||
|
||||
| 目标 | 描述 | 度量标准 |
|
||||
| ------ | -------------------------- | ---------------- |
|
||||
| 高可用 | 系统稳定运行,故障快速恢复 | SLA ≥ 99.9% |
|
||||
| 高并发 | 支撑热门课程抢课场景 | QPS ≥ 1000 |
|
||||
| 可扩展 | 支持功能模块渐进式扩展 | 模块化设计 |
|
||||
| 易维护 | 代码规范,文档完善 | 代码覆盖率 ≥ 80% |
|
||||
|
||||
### 2.2 用户角色
|
||||
|
||||
| 角色 | 描述 | 主要功能 |
|
||||
| ---------- | -------------- | ---------------------------- |
|
||||
| 会员 | 健身房注册用户 | 预约课程、签到、查看个人信息 |
|
||||
| 教练 | 健身房教练 | 排课、私教预约确认、学员签到 |
|
||||
| 前台 | 门店前台人员 | 会员接待、签到辅助、会员管理 |
|
||||
| 店长 | 门店管理者 | 单店全功能管理、数据查看 |
|
||||
| 运营管理员 | 平台运营人员 | 营销活动配置、数据分析 |
|
||||
| 财务专员 | 财务人员 | 账单管理、财务报表 |
|
||||
| 超级管理员 | 平台最高权限 | 全平台管理、系统配置 |
|
||||
|
||||
### 2.3 业务范围
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────┐
|
||||
│ 业务范围 │
|
||||
├─────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ 会员管理 │ │ 预约管理 │ │ 签到管理 │ │
|
||||
│ │ 会员注册 │ │ 团课预约 │ │ 扫码签到 │ │
|
||||
│ │ 会员卡管理 │ │ 私教预约 │ │ 刷脸签到 │ │
|
||||
│ │ 权益管理 │ │ 场地预约 │ │ NFC签到 │ │
|
||||
│ │ 等级管理 │ │ 线上课程 │ │ 教练代签 │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ 课程管理 │ │ 教练管理 │ │ 财务管理 │ │
|
||||
│ │ 课程类型 │ │ 教练信息 │ │ 营收统计 │ │
|
||||
│ │ 课程排期 │ │ 排班管理 │ │ 账单管理 │ │
|
||||
│ │ 场地管理 │ │ 课时统计 │ │ 退款管理 │ │
|
||||
│ │ 价格配置 │ │ 评价管理 │ │ 对账管理 │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||
│ │ 计划中心 │ │ 数据分析 │ │ 系统管理 │ │
|
||||
│ │ 训练计划 │ │ 会员分析 │ │ 租户管理 │ │
|
||||
│ │ 课程排期 │ │ 课程分析 │ │ 门店管理 │ │
|
||||
│ │ 会员目标 │ │ 财务分析 │ │ 权限管理 │ │
|
||||
│ │ 教练排班 │ │ 运营分析 │ │ 系统配置 │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、系统架构设计
|
||||
|
||||
### 3.1 总体架构
|
||||
|
||||
采用分层架构 + 微服务思想的模块化设计:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 客户端层 │
|
||||
├──────────────────┬──────────────────┬──────────────────┬───────────────┤
|
||||
│ 会员小程序 │ 教练端App │ 管理后台PC │ 硬件设备 │
|
||||
│ (uniapp+Vue3) │ (uniapp+Vue3) │ (Vue3+Vite) │ (人脸/NFC) │
|
||||
└────────┬─────────┴────────┬─────────┴────────┬─────────┴───────┬───────┘
|
||||
│ │ │ │
|
||||
└──────────────────┴────────┬─────────┴─────────────────┘
|
||||
│
|
||||
┌────────▼────────┐
|
||||
│ API Gateway │
|
||||
│ (统一网关) │
|
||||
│ - 路由转发 │
|
||||
│ - 认证鉴权 │
|
||||
│ - 限流熔断 │
|
||||
│ - 日志追踪 │
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌───────────────────────────┼───────────────────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ 会员服务 │ │ 预约服务 │ │ 数据服务 │
|
||||
│ Member Service │ │ Booking Service │ │ Data Service │
|
||||
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
|
||||
│ - 会员管理 │ │ - 课程管理 │ │ - 数据统计 │
|
||||
│ - 会员卡管理 │ │ - 预约管理 │ │ - 报表生成 │
|
||||
│ - 权益管理 │ │ - 签到管理 │ │ - 数据导出 │
|
||||
│ - 等级管理 │ │ - 库存管理 │ │ - 数据分析 │
|
||||
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
|
||||
│ │ │
|
||||
└──────────────────────────┼──────────────────────────┘
|
||||
│
|
||||
┌───────────────────────────┼───────────────────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||||
│ 公共服务层 │ │ 基础设施层 │ │ 外部服务 │
|
||||
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
|
||||
│ - 认证服务 │ │ - PostgreSQL │ │ - 微信开放平台 │
|
||||
│ - 消息服务 │ │ - R2DBC │ │ - 短信服务 │
|
||||
│ - 文件服务 │ │ - Caffeine │ │ - 支付服务 │
|
||||
│ - 缓存服务 │ │ - Redis(可选) │ │ - OSS存储 │
|
||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
### 3.2 技术架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 技术架构分层 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ 表现层 (Presentation) │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
|
||||
│ │ │ 会员端 uniapp │ │ 教练端 uniapp │ │ 管理后台 Vue3 │ │ │
|
||||
│ │ │ - Vue3 + TS │ │ - Vue3 + TS │ │ - Vue3 + TS │ │ │
|
||||
│ │ │ - Pinia │ │ - Pinia │ │ - Pinia │ │ │
|
||||
│ │ │ - uni-ui │ │ - uni-ui │ │ - Element Plus│ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
|
||||
│ └───────────────────────────────────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ 网关层 (Gateway) │ │
|
||||
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
|
||||
│ │ │ Spring Cloud Gateway │ │ │
|
||||
│ │ │ - 路由转发 - 认证鉴权 - 限流熔断 - 日志追踪 - 灰度发布 │ │ │
|
||||
│ │ └─────────────────────────────────────────────────────────────┘ │ │
|
||||
│ └───────────────────────────────────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ 业务层 (Business) │ │
|
||||
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
|
||||
│ │ │ Spring Boot 3 + WebFlux + JDK 21 │ │ │
|
||||
│ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │
|
||||
│ │ │ │ Controller│ │ Service │ │ Repository│ │ Model │ │ │ │
|
||||
│ │ │ │ (API) │ │ (业务逻辑) │ │ (数据访问) │ │ (领域模型) │ │ │ │
|
||||
│ │ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ │
|
||||
│ │ └─────────────────────────────────────────────────────────────┘ │ │
|
||||
│ └───────────────────────────────────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ 数据层 (Data) │ │
|
||||
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
|
||||
│ │ │ PostgreSQL │ │ Caffeine │ │ Redis(可选) │ │ │
|
||||
│ │ │ - R2DBC │ │ - 本地缓存 │ │ - 分布式缓存 │ │ │
|
||||
│ │ │ - Flyway │ │ - 热点数据 │ │ - 分布式锁 │ │ │
|
||||
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
|
||||
│ └───────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3.3 部署架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 部署架构 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────────┐ │
|
||||
│ │ 负载均衡器 │ │
|
||||
│ │ (Nginx/ALB) │ │
|
||||
│ └────────┬────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────────────────┼───────────────────┐ │
|
||||
│ │ │ │ │
|
||||
│ ▼ ▼ ▼ │
|
||||
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
|
||||
│ │ API Gateway │ │ API Gateway │ │ API Gateway │ │
|
||||
│ │ (实例1) │ │ (实例2) │ │ (实例N) │ │
|
||||
│ └───────┬────────┘ └───────┬────────┘ └───────┬────────┘ │
|
||||
│ │ │ │ │
|
||||
│ └───────────────────┼───────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────────────┼──────────────────┐ │
|
||||
│ │ │ │ │
|
||||
│ ▼ ▼ ▼ │
|
||||
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
|
||||
│ │ Application │ │ Application │ │ Application │ │
|
||||
│ │ Server (Pod1) │ │ Server (Pod2) │ │ Server (PodN) │ │
|
||||
│ └───────┬────────┘ └───────┬────────┘ └
|
||||
```
|
||||
───────┬────────┘ │
|
||||
│ │ │ │ │
|
||||
│ └───────────────────┼───────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌───────────────────────────┼───────────────────────────┐ │
|
||||
│ │ │ │ │
|
||||
│ ▼ ▼ ▼ │
|
||||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||||
│ │ PostgreSQL │ │ Redis │ │ OSS │ │
|
||||
│ │ (主从复制) │ │ (哨兵模式) │ │ (对象存储) │ │
|
||||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、模块设计
|
||||
|
||||
### 4.1 模块划分
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 模块划分 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ gym-manage-server (父工程) │
|
||||
│ │ │
|
||||
│ ├── gym-common (公共模块) │
|
||||
│ │ ├── gym-common-core # 核心工具类、常量、枚举 │
|
||||
│ │ ├── gym-common-redis # Redis配置(可选) │
|
||||
│ │ ├── gym-common-security # 安全认证公共组件 │
|
||||
│ │ └── gym-common-log # 日志公共组件 │
|
||||
│ │ │
|
||||
│ ├── gym-api (API网关模块) │
|
||||
│ │ ├── controller # HTTP接口 │
|
||||
│ │ ├── dto # 数据传输对象 │
|
||||
│ │ ├── vo # 视图对象 │
|
||||
│ │ └── config # API配置 │
|
||||
│ │ │
|
||||
│ ├── gym-service (业务服务模块) │
|
||||
│ │ ├── gym-service-member # 会员服务 │
|
||||
│ │ ├── gym-service-booking # 预约服务 │
|
||||
│ │ ├── gym-service-checkin # 签到服务 │
|
||||
│ │ ├── gym-service-course # 课程服务 │
|
||||
│ │ ├── gym-service-coach # 教练服务 │
|
||||
│ │ ├── gym-service-finance # 财务服务 │
|
||||
│ │ └── gym-service-data # 数据服务 │
|
||||
│ │ │
|
||||
│ ├── gym-domain (领域模型模块) │
|
||||
│ │ ├── model # 领域模型 │
|
||||
│ │ ├── event # 领域事件 │
|
||||
│ │ └── service # 领域服务 │
|
||||
│ │ │
|
||||
│ ├── gym-infrastructure (基础设施模块) │
|
||||
│ │ ├── repository # 数据仓储 │
|
||||
│ │ ├── cache # 缓存配置 │
|
||||
│ │ ├── external # 外部服务集成 │
|
||||
│ │ └── config # 基础配置 │
|
||||
│ │ │
|
||||
│ └── gym-starter (启动模块) │
|
||||
│ └── gym-admin # 管理后台启动器 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 4.2 模块职责
|
||||
|
||||
| 模块 | 职责 | 依赖 |
|
||||
|------|------|------|
|
||||
| gym-common-core | 提供通用工具类、常量定义、异常处理 | 无 |
|
||||
| gym-common-security | 提供JWT认证、权限校验 | gym-common-core |
|
||||
| gym-common-log | 提供统一日志处理 | gym-common-core |
|
||||
| gym-domain | 定义领域模型、领域事件、领域服务 | gym-common-core |
|
||||
| gym-infrastructure | 提供数据访问、缓存、外部服务集成 | gym-domain |
|
||||
| gym-service-member | 会员、会员卡、权益管理 | gym-domain, gym-infrastructure |
|
||||
| gym-service-booking | 课程预约、库存管理 | gym-domain, gym-infrastructure |
|
||||
| gym-service-checkin | 签到处理、权益扣减 | gym-domain, gym-infrastructure |
|
||||
| gym-api | HTTP接口定义、参数校验 | gym-service-* |
|
||||
| gym-starter | 应用启动、配置加载 | gym-api |
|
||||
|
||||
### 4.3 模块交互
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 模块交互流程 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ HTTP Request │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ API │───▶│ Service │───▶│ Domain │───▶│ Repo │ │
|
||||
│ │ Layer │ │ Layer │ │ Layer │ │ Layer │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
|
||||
│ │ │ │ │ │
|
||||
│ │ │ │ │ │
|
||||
│ │ ▼ ▼ ▼ │
|
||||
│ │ ┌─────────────────────────────────────┐ │
|
||||
│ │ │ Infrastructure │ │
|
||||
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────┐ │ │
|
||||
│ │ │ │ Cache │ │ MQ │ │ DB │ │ │
|
||||
│ │ │ └─────────┘ └─────────┘ └─────┘ │ │
|
||||
│ │ └─────────────────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ HTTP Response │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、接口设计
|
||||
|
||||
### 5.1 接口规范
|
||||
|
||||
#### 5.1.1 RESTful API 规范
|
||||
|
||||
```
|
||||
基础URL: https://api.gym-manage.com/v1
|
||||
|
||||
资源命名规范:
|
||||
- 使用名词复数形式: /members, /bookings, /courses
|
||||
- 使用小写字母和连字符: /member-cards, /booking-slots
|
||||
- 避免动词: /members (正确) vs /getMembers (错误)
|
||||
|
||||
HTTP方法语义:
|
||||
- GET: 查询资源
|
||||
- POST: 创建资源
|
||||
- PUT: 全量更新资源
|
||||
- PATCH: 部分更新资源
|
||||
- DELETE: 删除资源
|
||||
```
|
||||
|
||||
#### 5.1.2 请求响应格式
|
||||
|
||||
```json
|
||||
// 统一响应格式
|
||||
{
|
||||
"code": 0, // 业务状态码,0表示成功
|
||||
"message": "success", // 响应消息
|
||||
"data": {}, // 响应数据
|
||||
"timestamp": 1709123456789 // 时间戳
|
||||
}
|
||||
|
||||
// 分页响应格式
|
||||
{
|
||||
"code": 0,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"list": [], // 数据列表
|
||||
"total": 100, // 总记录数
|
||||
"page": 1, // 当前页码
|
||||
"pageSize": 20 // 每页大小
|
||||
},
|
||||
"timestamp": 1709123456789
|
||||
}
|
||||
|
||||
// 错误响应格式
|
||||
{
|
||||
"code": 40001, // 错误码
|
||||
"message": "参数校验失败", // 错误消息
|
||||
"data": {
|
||||
"errors": [ // 详细错误信息
|
||||
{"field": "phone", "message": "手机号格式不正确"}
|
||||
]
|
||||
},
|
||||
"timestamp": 1709123456789
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.1.3 状态码定义
|
||||
|
||||
| 状态码 | 含义 | 说明 |
|
||||
|--------|------|------|
|
||||
| 0 | 成功 | 请求处理成功 |
|
||||
| 40001 | 参数错误 | 请求参数校验失败 |
|
||||
| 40002 | 资源不存在 | 请求的资源不存在 |
|
||||
| 40003 | 资源已存在 | 创建的资源已存在 |
|
||||
| 40101 | 未登录 | 用户未登录或Token过期 |
|
||||
| 40102 | 无权限 | 用户无访问权限 |
|
||||
| 40301 | 业务异常 | 业务逻辑校验失败 |
|
||||
| 50001 | 系统异常 | 系统内部错误 |
|
||||
|
||||
### 5.2 接口分组
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ API 接口分组 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ /v1/auth # 认证接口 │
|
||||
│ ├── POST /login # 登录 │
|
||||
│ ├── POST /logout # 登出 │
|
||||
│ ├── POST /refresh # 刷新Token │
|
||||
│ └── POST /wechat-login # 微信登录 │
|
||||
│ │
|
||||
│ /v1/members # 会员接口 │
|
||||
│ ├── GET / # 会员列表 │
|
||||
│ ├── GET /{id} # 会员详情 │
|
||||
│ ├── POST / # 创建会员 │
|
||||
│ ├── PUT /{id} # 更新会员 │
|
||||
│ ├── GET /{id}/cards # 会员卡列表 │
|
||||
│ ├── GET /{id}/benefits # 权益列表 │
|
||||
│ └── GET /{id}/bookings # 预约记录 │
|
||||
│ │
|
||||
│ /v1/courses # 课程接口 │
|
||||
│ ├── GET / # 课程列表 │
|
||||
│ ├── GET /{id} # 课程详情 │
|
||||
│ ├── POST / # 创建课程 │
|
||||
│ ├── PUT /{id} # 更新课程 │
|
||||
│ └── GET /{id}/slots # 可预约时段 │
|
||||
│ │
|
||||
│ /v1/bookings # 预约接口 │
|
||||
│ ├── GET / # 预约列表 │
|
||||
│ ├── GET /{id} # 预约详情 │
|
||||
│ ├── POST / # 创建预约 │
|
||||
│ ├── POST /{id}/cancel # 取消预约 │
|
||||
│ └── GET /my # 我的预约 │
|
||||
│ │
|
||||
│ /v1/checkins # 签到接口 │
|
||||
│ ├── GET / # 签到列表 │
|
||||
│ ├── POST /scan # 扫码签到 │
|
||||
│ ├── POST /manual # 手动签到(教练代签) │
|
||||
│ └── GET /my # 我的签到 │
|
||||
│ │
|
||||
│ /v1/coaches # 教练接口 │
|
||||
│ ├── GET / # 教练列表 │
|
||||
│ ├── GET /{id} # 教练详情 │
|
||||
│ ├── GET /{id}/schedule # 教练排班 │
|
||||
│ └── GET /{id}/slots # 可预约时段 │
|
||||
│ │
|
||||
│ /v1/dashboard # 数据看板 │
|
||||
│ ├── GET /overview # 今日概览 │
|
||||
│ ├── GET /trends # 趋势数据 │
|
||||
│ └── GET /rankings # 排行数据 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 5.3 接口版本管理
|
||||
|
||||
```
|
||||
版本策略:
|
||||
1. URL路径版本: /v1/members, /v2/members
|
||||
2. 向后兼容原则: 新版本接口保留旧版本功能
|
||||
3. 废弃通知: 旧版本接口返回 Warning 头,提前3个月通知
|
||||
|
||||
版本生命周期:
|
||||
- 开发中: 内部测试,不对外发布
|
||||
- 当前版本: 正式发布,完全支持
|
||||
- 已废弃: 仍可使用,但建议迁移
|
||||
- 已下线: 不再可用
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、安全设计
|
||||
|
||||
### 6.1 认证机制
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 认证机制 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────────────────────────────┐ │
|
||||
│ │ JWT Token 认证流程 │ │
|
||||
│ │ │ │
|
||||
│ │ 1. 用户登录 │ │
|
||||
│ │ POST /v1/auth/login │ │
|
||||
│ │ { phone, code } │ │
|
||||
│ │ │ │ │
|
||||
│ │ ▼ │ │
|
||||
│ │ 2. 服务端验证 │ │
|
||||
│ │ - 验证手机号和验证码 │ │
|
||||
│ │ - 查询用户信息 │ │
|
||||
│ │ - 生成 JWT Token │ │
|
||||
│ │ │ │ │
|
||||
│ │ ▼ │ │
|
||||
│ │ 3. 返回 Token │ │
|
||||
│ │ { accessToken, refreshToken, expiresIn } │ │
|
||||
│ │ │ │ │
|
||||
│ │ ▼ │ │
|
||||
│ │ 4. 后续请求携带 Token │ │
|
||||
│ │ Authorization: Bearer {accessToken} │ │
|
||||
│ │ │ │ │
|
||||
│ │ ▼ │ │
|
||||
│ │ 5. 服务端验证 Token │ │
|
||||
│ │ - 解析 Token │ │
|
||||
│ │ - 验证签名和有效期 │ │
|
||||
│ │ - 提取用户信息 │ │
|
||||
│ │ │ │
|
||||
│ └─────────────────────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ Token 结构: │
|
||||
│ { │
|
||||
│ "sub": "member:12345", // 用户标识 │
|
||||
│ "tenant": "tenant:001", // 租户标识 │
|
||||
│ "store": "store:001", // 门店标识 │
|
||||
│ "roles": ["MEMBER"], // 角色列表 │
|
||||
│ "exp": 1709123456, // 过期时间 │
|
||||
│ "iat": 1709120000 // 签发时间 │
|
||||
│ } │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 6.2 权限控制
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ RBAC 权限模型 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌─────────┐ M:N ┌─────────┐ M:N ┌─────────┐ │
|
||||
│ │ 用户 │─────────────▶│ 角色 │─────────────▶│ 权限 │ │
|
||||
│ │ User │ │ Role │ │Permission│ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ │
|
||||
│ │
|
||||
│ 角色定义: │
|
||||
│ ┌────────────────┬────────────────────────────────────────────────┐ │
|
||||
│ │ 角色 │ 权限范围 │ │
|
||||
│ ├────────────────┼────────────────────────────────────────────────┤ │
|
||||
│ │ ROLE_MEMBER │ 会员端功能:预约、签到、个人信息 │ │
|
||||
│ │ ROLE_COACH │ 教练端功能:排课、签到、学员管理 │ │
|
||||
│ │ ROLE_RECEPTION │ 前台功能:接待、签到、会员查询 │ │
|
||||
│ │ ROLE_STORE_MGR │ 店长功能:单店全功能管理 │ │
|
||||
│ │ ROLE_OPERATOR │ 运营功能:营销活动、数据分析 │ │
|
||||
│ │ ROLE_FINANCE │ 财务功能:账单、报表 │ │
|
||||
│ │ ROLE_ADMIN │ 超管功能:全平台管理 │ │
|
||||
│ └────────────────┴────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ 权限标识: │
|
||||
│ 格式: {模块}:{资源}:{操作} │
|
||||
│ 示例: │
|
||||
│ - member:user:read # 查看会员信息 │
|
||||
│ - member:user:write # 编辑会员信息 │
|
||||
│ - booking:course:create # 创建课程预约 │
|
||||
│ - booking:course:cancel # 取消课程预约 │
|
||||
│ - checkin:scan:execute # 执行扫码签到 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 6.3 数据安全
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 数据安全措施 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 敏感数据加密 │
|
||||
│ ├── 手机号: 存储时AES加密,展示时脱敏(138****1234) │
|
||||
│ ├── 身份证: 存储时AES加密,不对外展示 │
|
||||
│ ├── 密码: 使用BCrypt加密存储 │
|
||||
│ └── 支付信息: 不存储,仅保留支付渠道token │
|
||||
│ │
|
||||
│ 2. 传输安全 │
|
||||
│ ├── 全站HTTPS │
|
||||
│ ├── 敏感接口签名验证 │
|
||||
│ └── 防重放攻击(timestamp + nonce) │
|
||||
│ │
|
||||
│ 3. SQL注入防护 │
|
||||
│ ├── 使用R2DBC参数化查询 │
|
||||
│ ├── 禁止拼接SQL │
|
||||
│ └── 输入参数校验 │
|
||||
│ │
|
||||
│ 4. XSS防护 │
|
||||
│ ├── 输入过滤 │
|
||||
│ ├── 输出编码 │
|
||||
│ └── Content-Security-Policy头 │
|
||||
│ │
|
||||
│ 5. CSRF防护 │
|
||||
│ ├── CSRF Token验证 │
|
||||
│ └── SameSite Cookie │
|
||||
│ │
|
||||
│ 6. 多租户数据隔离 │
|
||||
│ ├── tenant_id 强制过滤 │
|
||||
│ ├── 数据库行级安全策略(RLS) │
|
||||
│ └── API层租户上下文自动注入 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 6.4 接口安全
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 接口安全措施 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 限流策略 │
|
||||
│ ├── 全局限流: 10000 QPS │
|
||||
│ ├── 单IP限流: 100 QPS │
|
||||
│ ├── 单用户限流: 50 QPS │
|
||||
│ └── 敏感接口限流: 登录10次/分钟,短信1次/分钟 │
|
||||
│ │
|
||||
│ 2. 熔断降级 │
|
||||
│ ├── 错误率阈值: 50% │
|
||||
│ ├── 熔断时间窗口: 30秒 │
|
||||
│ └── 降级策略: 返回默认值或友好提示 │
|
||||
│ │
|
||||
│ 3. 黑白名单 │
|
||||
│ ├── IP白名单: 管理后台接口 │
|
||||
│ ├── IP黑名单: 恶意攻击IP │
|
||||
│ └── 用户黑名单: 违规用户 │
|
||||
│ │
|
||||
│ 4. 日志审计 │
|
||||
│ ├── 操作日志: 记录所有写操作 │
|
||||
│ ├── 访问日志: 记录所有API请求 │
|
||||
│ └── 异常日志: 记录系统异常 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、性能设计
|
||||
|
||||
### 7.1 性能目标
|
||||
|
||||
| 指标 | 目标值 | 说明 |
|
||||
|------|--------|------|
|
||||
| 响应时间 | P99 < 200ms | 99%的请求响应时间小于200ms |
|
||||
| 吞吐量 | QPS ≥ 1000 | 系统每秒处理请求数 |
|
||||
| 并发用户 | ≥ 5000 | 同时在线用户数 |
|
||||
| 可用性 | SLA ≥ 99.9% | 年度可用性 |
|
||||
|
||||
### 7.2 性能优化策略
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 性能优化策略 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 数据库优化 │
|
||||
│ ├── 索引优化: 合理创建索引,避免全表扫描 │
|
||||
│ ├── 连接池: R2DBC连接池,max-size=20 │
|
||||
│ ├── 读写分离: 主库写入,从库读取(后期扩展) │
|
||||
│ └── 分库分表: 按租户分库(后期扩展) │
|
||||
│ │
|
||||
│ 2. 缓存优化 │
|
||||
│ ├── L1缓存: Caffeine本地缓存,热点数据 │
|
||||
│ ├── L2缓存: Redis分布式缓存(可选扩展) │
|
||||
│ ├── 缓存策略: 写穿透 + 延迟双删 │
|
||||
│ └── 缓存预热: 系统启动时预加载热点数据 │
|
||||
│ │
|
||||
│ 3. 代码优化 │
|
||||
│ ├── 响应式编程: WebFlux非阻塞IO │
|
||||
│ ├── 异步处理: 非核心流程异步化 │
|
||||
│ ├── 批量操作: 减少数据库往返 │
|
||||
│ └── 虚拟线程: JDK 21虚拟线程优化阻塞操作 │
|
||||
│ │
|
||||
│ 4. 网络优化 │
|
||||
│ ├── CDN加速: 静态资源CDN分发 │
|
||||
│ ├── GZIP压缩: 响应数据压缩 │
|
||||
│ ├── HTTP/2: 多路复用 │
|
||||
│ └── Keep-Alive: 连接复用 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 7.3 高并发场景处理
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 高并发预约场景处理 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 场景: 热门课程开抢,大量用户同时预约 │
|
||||
│ │
|
||||
│ 解决方案: │
|
||||
│ │
|
||||
│ 1. 库存预热 │
|
||||
│ └── 开抢前将课程库存加载到Caffeine缓存 │
|
||||
│ │
|
||||
│ 2. 原子操作 │
|
||||
│ └── 使用PostgreSQL原子更新: │
|
||||
│ UPDATE booking_slot │
|
||||
│ SET booked_count = booked_count + 1 │
|
||||
│ WHERE id = ? AND booked_count < capacity │
|
||||
│ │
|
||||
│ 3. 乐观锁 │
|
||||
│ └── 版本号控制,冲突时重试 │
|
||||
│ │
|
||||
│ 4. 排队机制 │
|
||||
│ └── 请求进入队列,异步处理结果 │
|
||||
│ │
|
||||
│ 5. 限流保护 │
|
||||
│ └── 令牌桶限流,防止系统过载 │
|
||||
│ │
|
||||
│ 6. 候补机制 │
|
||||
│ └── 满员后自动进入候补队列,有人取消时自动补位 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 八、可扩展性设计
|
||||
|
||||
### 8.1 水平扩展
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 水平扩展方案 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 无状态设计 │
|
||||
│ ├── Session外置到Redis │
|
||||
│ ├── 本地不存储用户状态 │
|
||||
│ └── 任意实例可处理任意请求 │
|
||||
│ │
|
||||
│ 2. 负载均衡 │
|
||||
│ ├── 轮询: 默认策略 │
|
||||
│ ├── 加权轮询: 根据服务器性能分配权重 │
|
||||
│ └── 最少连接: 请求分配给连接数最少的服务器 │
|
||||
│ │
|
||||
│ 3. 服务拆分(后期) │
|
||||
│ ├── 会员服务独立部署 │
|
||||
│ ├── 预约服务独立部署 │
|
||||
│ └── 数据服务独立部署 │
|
||||
│ │
|
||||
│ 4. 数据库扩展(后期) │
|
||||
│ ├── 读写分离 │
|
||||
│ ├── 分库分表 │
|
||||
│ └── 多活架构 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 8.2 功能扩展
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 功能扩展点 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 支付扩展 │
|
||||
│ ├── 预留支付接口抽象 │
|
||||
│ ├── 支持微信支付、支付宝、银联等 │
|
||||
│ └── 可扩展其他支付渠道 │
|
||||
│ │
|
||||
│ 2. 硬件扩展 │
|
||||
│ ├── 签到网关抽象设计 │
|
||||
│ ├── 支持多种签到设备 │
|
||||
│ └── 可扩展智能硬件 │
|
||||
│ │
|
||||
│ 3. 消息扩展 │
|
||||
│ ├── 消息模板可配置 │
|
||||
│ ├── 支持多渠道推送 │
|
||||
│ └── 可扩展新的消息渠道 │
|
||||
│ │
|
||||
│ 4. 报表扩展 │
|
||||
│ ├── 报表模板可配置 │
|
||||
│ ├── 支持自定义报表 │
|
||||
│ └── 可扩展BI工具对接 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 九、监控与运维
|
||||
|
||||
### 9.1 监控体系
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 监控体系 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 基础监控 │
|
||||
│ ├── CPU使用率 │
|
||||
│ ├── 内存使用率 │
|
||||
│ ├── 磁盘使用率 │
|
||||
│ ├── 网络IO │
|
||||
│ └── 进程状态 │
|
||||
│ │
|
||||
│ 2. 应用监控 │
|
||||
│ ├── JVM监控(GC、堆内存、线程) │
|
||||
│ ├── 请求QPS/响应时间 │
|
||||
│ ├── 错误率/异常数 │
|
||||
│ └── 数据库连接池状态 │
|
||||
│ │
|
||||
│ 3. 业务监控 │
|
||||
│ ├── 登录数/在线用户数 │
|
||||
│ ├── 预约成功率 │
|
||||
│ ├── 签到成功率 │
|
||||
│ └── 支付成功率 │
|
||||
│ │
|
||||
│ 4. 告警策略 │
|
||||
│ ├── CPU > 80% 告警 │
|
||||
│ ├── 内存 > 85% 告警 │
|
||||
│ ├── 错误率 > 1% 告警 │
|
||||
│ └── 响应时间 P99 > 500ms 告警 │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 9.2 日志规范
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────────┐
|
||||
│ 日志规范 │
|
||||
├─────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ 1. 日志级别 │
|
||||
│ ├── ERROR: 错误日志,需要立即处理 │
|
||||
│ ├── WARN: 警告日志,需要关注 │
|
||||
│ ├── INFO: 重要业务日志 │
|
||||
│ └── DEBUG: 调试日志(生产环境关闭) │
|
||||
│ │
|
||||
│ 2. 日志格式 │
|
||||
│ { │
|
||||
│ "timestamp": "2024-02-28T10:00:00.000+08:00", │
|
||||
│ "level": "INFO", │
|
||||
│ "traceId": "abc123", │
|
||||
│ "spanId": "def456", │
|
||||
│ "tenantId": "tenant:001", │
|
||||
│ "userId": "member:12345", │
|
||||
│ "class": "MemberService", │
|
||||
│ "method": "createMember", │
|
||||
│ "message": "创建会员成功", │
|
||||
│ "args": {"phone": "138****1234"}, │
|
||||
│ "result": {"memberId": 12345}, │
|
||||
│ "duration": 50 │
|
||||
│ } │
|
||||
│ │
|
||||
│ 3. 日志存储 │
|
||||
│ ├── 本地文件: 保留7天 │
|
||||
│ ├── ELK: 集中存储和分析 │
|
||||
│ └── 归档: 超过30天归档到OSS │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 十、附录
|
||||
|
||||
### 10.1 技术选型清单
|
||||
|
||||
| 分类 | 技术 | 版本 | 说明 |
|
||||
|------|------|------|------|
|
||||
| 后端框架 | Spring Boot | 3.x | 主框架 |
|
||||
| 响应式 | Spring WebFlux | 3.x | 响应式Web框架 |
|
||||
| JDK | OpenJDK | 21+ | 虚拟线程支持 |
|
||||
| 数据库 | PostgreSQL | 15+ | 主数据库 |
|
||||
| 数据访问 | R2DBC | 1.x | 响应式数据库访问 |
|
||||
| 数据库迁移 | Flyway | 9.x | 数据库版本管理 |
|
||||
| 缓存 | Caffeine | 3.x | 本地缓存 |
|
||||
| 缓存(可选) | Redis | 7.x | 分布式缓存 |
|
||||
| 前端框架 | Vue | 3.x | 前端框架 |
|
||||
| 跨端框架 | uniapp | 3.x | 跨端开发框架 |
|
||||
| 状态管理 | Pinia | 2.x | 状态管理 |
|
||||
| UI组件 | Element Plus | 2.x | 管理后台UI |
|
||||
| 构建工具 | Vite | 5.x | 前端构建工具 |
|
||||
| 容器 | Docker | 24.x | 容器化部署 |
|
||||
|
||||
### 10.2 术语表
|
||||
|
||||
| 术语 | 英文 | 定义 |
|
||||
|------|------|------|
|
||||
| 高可用 | High Availability | 系统持续提供服务的能力 |
|
||||
| 响应式编程 | Reactive Programming | 基于数据流和变化传播的编程范式 |
|
||||
| 多租户 | Multi-tenancy | 单个实例服务多个租户的架构 |
|
||||
| 软删除 | Soft Delete | 通过标记删除时间而非物理删除数据 |
|
||||
| 乐观锁 | Optimistic Lock | 假设冲突较少,通过版本号控制并发 |
|
||||
| 悲观锁 | Pessimistic Lock | 假设冲突较多,通过锁机制控制并发 |
|
||||
|
||||
---
|
||||
|
||||
*文档结束*
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user