docs: 将所有设计文档中的ASCII图转换为Mermaid格式

- HLD-系统概要设计.md: 转换业务范围、总体架构、技术架构、部署架构、模块划分、模块交互、API接口分组等图
- LLD-会员模块详细设计.md: 转换模块边界、实体关系图
- LLD-预约模块详细设计.md: 转换模块边界、实体关系图
- LLD-签到模块详细设计.md: 转换模块边界、实体关系图

Mermaid格式优势:
- 更好的可维护性和可读性
- 支持在Markdown编辑器中实时预览
- 更容易进行版本对比和修改
- 支持多种图表类型(mindmap, graph, erDiagram, sequenceDiagram)~
This commit is contained in:
张翔
2026-02-28 16:49:19 +08:00
parent 8a7936ba4e
commit e89f5f1f7f
4 changed files with 665 additions and 560 deletions
+401 -334
View File
@@ -79,36 +79,54 @@
### 2.3 业务范围 ### 2.3 业务范围
``` ```mermaid
┌─────────────────────────────────────────────────────────────────┐ mindmap
│ 业务范围 │ root((业务范围))
├─────────────────────────────────────────────────────────────────┤ 会员管理
│ │ 会员注册
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 会员卡管理
│ │ 会员管理 │ │ 预约管理 │ │ 签到管理 │ │ 权益管理
│ │ 会员注册 │ │ 团课预约 │ │ 扫码签到 │ │ 等级管理
│ │ 会员卡管理 │ │ 私教预约 │ │ 刷脸签到 │ │ 预约管理
│ │ 权益管理 │ │ 场地预约 │ │ NFC签到 │ │ 团课预约
│ │ 等级管理 │ │ 线上课程 │ │ 教练代签 │ │ 私教预约
│ └─────────────┘ └─────────────┘ └─────────────┘ │ 场地预约
│ │ 线上课程
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 签到管理
│ │ 课程管理 │ │ 教练管理 │ │ 财务管理 │ │ 扫码签到
│ │ 课程类型 │ │ 教练信息 │ │ 营收统计 │ │ 刷脸签到
│ │ 课程排期 │ │ 排班管理 │ │ 账单管理 │ │ NFC签到
│ │ 场地管理 │ │ 课时统计 │ │ 退款管理 │ │ 教练代签
│ │ 价格配置 │ │ 评价管理 │ │ 对账管理 │ │ 课程管理
│ └─────────────┘ └─────────────┘ └─────────────┘ │ 课程类型
│ │ 课程排期
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 场地管理
│ │ 计划中心 │ │ 数据分析 │ │ 系统管理 │ │ 价格配置
│ │ 训练计划 │ │ 会员分析 │ │ 租户管理 │ │ 教练管理
│ │ 课程排期 │ │ 课程分析 │ │ 门店管理 │ │ 教练信息
│ │ 会员目标 │ │ 财务分析 │ │ 权限管理 │ │ 排班管理
│ │ 教练排班 │ │ 运营分析 │ │ 系统配置 │ │ 课时统计
│ └─────────────┘ └─────────────┘ └─────────────┘ │ 评价管理
│ │ 财务管理
└─────────────────────────────────────────────────────────────────┘ 营收统计
账单管理
退款管理
对账管理
计划中心
训练计划
课程排期
会员目标
教练排班
数据分析
会员分析
课程分析
财务分析
运营分析
系统管理
租户管理
门店管理
权限管理
系统配置
``` ```
--- ---
@@ -119,147 +137,186 @@
采用分层架构 + 微服务思想的模块化设计: 采用分层架构 + 微服务思想的模块化设计:
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ graph TB
│ 客户端层 │ subgraph ClientLayer[客户端层]
├──────────────────┬──────────────────┬──────────────────┬───────────────┤ A1[会员小程序<br/>uniapp+Vue3]
│ 会员小程序 │ 教练端App │ 管理后台PC │ 硬件设备 │ A2[教练端App<br/>uniapp+Vue3]
│ (uniapp+Vue3) │ (uniapp+Vue3) │ (Vue3+Vite) │ (人脸/NFC) │ A3[管理后台PC<br/>Vue3+Vite]
└────────┬─────────┴────────┬─────────┴────────┬─────────┴───────┬───────┘ A4[硬件设备<br/>人脸/NFC]
│ │ │ │ end
└──────────────────┴────────┬─────────┴─────────────────┘
subgraph Gateway[API Gateway<br/>统一网关]
┌────────▼────────┐ B1[路由转发]
│ API Gateway │ B2[认证鉴权]
│ (统一网关) │ B3[限流熔断]
│ - 路由转发 │ B4[日志追踪]
│ - 认证鉴权 │ end
│ - 限流熔断 │
│ - 日志追踪 │ subgraph BusinessLayer[业务层]
└────────┬────────┘ C1[会员服务<br/>Member Service]
C2[预约服务<br/>Booking Service]
┌───────────────────────────┼───────────────────────────┐ C3[数据服务<br/>Data Service]
│ │ │ end
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ subgraph CommonLayer[公共服务层]
│ 会员服务 │ │ 预约服务 │ │ 数据服务 │ D1[认证服务]
│ Member Service │ │ Booking Service │ │ Data Service │ D2[消息服务]
├─────────────────┤ ├─────────────────┤ ├─────────────────┤ D3[文件服务]
│ - 会员管理 │ │ - 课程管理 │ │ - 数据统计 │ D4[缓存服务]
│ - 会员卡管理 │ │ - 预约管理 │ │ - 报表生成 │ end
│ - 权益管理 │ │ - 签到管理 │ │ - 数据导出 │
│ - 等级管理 │ │ - 库存管理 │ │ - 数据分析 │ subgraph InfraLayer[基础设施层]
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘ E1[PostgreSQL]
│ │ │ E2[R2DBC]
└──────────────────────────┼──────────────────────────┘ E3[Caffeine]
E4[Redis可选]
┌───────────────────────────┼───────────────────────────┐ end
│ │ │
▼ ▼ ▼ subgraph ExternalLayer[外部服务]
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ F1[微信开放平台]
│ 公共服务层 │ │ 基础设施层 │ │ 外部服务 │ F2[短信服务]
├─────────────────┤ ├─────────────────┤ ├─────────────────┤ F3[支付服务]
│ - 认证服务 │ │ - PostgreSQL │ │ - 微信开放平台 │ F4[OSS存储]
│ - 消息服务 │ │ - R2DBC │ │ - 短信服务 │ end
│ - 文件服务 │ │ - Caffeine │ │ - 支付服务 │
│ - 缓存服务 │ │ - Redis(可选) │ │ - OSS存储 │ A1 --> Gateway
└─────────────────┘ └─────────────────┘ └─────────────────┘ A2 --> Gateway
A3 --> Gateway
A4 --> Gateway
Gateway --> C1
Gateway --> C2
Gateway --> C3
C1 --> CommonLayer
C2 --> CommonLayer
C3 --> CommonLayer
CommonLayer --> InfraLayer
CommonLayer --> ExternalLayer
``` ```
### 3.2 技术架构 ### 3.2 技术架构
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ graph TB
│ 技术架构分层 │ subgraph Presentation[表现层 Presentation]
├─────────────────────────────────────────────────────────────────────────┤ A1[会员端 uniapp<br/>Vue3 + TS<br/>Pinia<br/>uni-ui]
│ │ A2[教练端 uniapp<br/>Vue3 + TS<br/>Pinia<br/>uni-ui]
│ ┌───────────────────────────────────────────────────────────────────┐ │ A3[管理后台 Vue3<br/>Vue3 + TS<br/>Pinia<br/>Element Plus]
│ │ 表现层 (Presentation) │ │ end
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ 会员端 uniapp │ │ 教练端 uniapp │ │ 管理后台 Vue3 │ │ │ subgraph Gateway[网关层 Gateway]
│ │ │ - Vue3 + TS │ │ - Vue3 + TS │ │ - Vue3 + TS │ │ │ B[Spring Cloud Gateway<br/>路由转发<br/>认证鉴权<br/>限流熔断<br/>日志追踪<br/>灰度发布]
│ │ │ - Pinia │ │ - Pinia │ │ - Pinia │ │ │ end
│ │ │ - uni-ui │ │ - uni-ui │ │ - Element Plus│ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ subgraph Business[业务层 Business]
│ └───────────────────────────────────────────────────────────────────┘ │ C[Spring Boot 3 + WebFlux + JDK 21]
│ │ │ C1[Controller<br/>API]
│ ▼ │ C2[Service<br/>业务逻辑]
│ ┌───────────────────────────────────────────────────────────────────┐ │ C3[Repository<br/>数据访问]
│ │ 网关层 (Gateway) │ │ C4[Model<br/>领域模型]
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ end
│ │ │ Spring Cloud Gateway │ │ │
│ │ │ - 路由转发 - 认证鉴权 - 限流熔断 - 日志追踪 - 灰度发布 │ │ │ subgraph Data[数据层 Data]
│ │ └─────────────────────────────────────────────────────────────┘ │ │ D1[PostgreSQL<br/>R2DBC<br/>Flyway]
│ └───────────────────────────────────────────────────────────────────┘ │ D2[Caffeine<br/>本地缓存<br/>热点数据]
│ │ │ D3[Redis可选<br/>分布式缓存<br/>分布式锁]
│ ▼ │ end
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ 业务层 (Business) │ │ A1 --> B
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ A2 --> B
│ │ │ Spring Boot 3 + WebFlux + JDK 21 │ │ │ A3 --> B
│ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ B --> C
│ │ │ │ Controller│ │ Service │ │ Repository│ │ Model │ │ │ │ C --> C1
│ │ │ │ (API) │ │ (业务逻辑) │ │ (数据访问) │ │ (领域模型) │ │ │ │ C1 --> C2
│ │ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ │ C2 --> C3
│ │ └─────────────────────────────────────────────────────────────┘ │ │ C3 --> C4
│ └───────────────────────────────────────────────────────────────────┘ │ C4 --> D1
│ │ │ C4 --> D2
│ ▼ │ C4 --> D3
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ 数据层 (Data) │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ PostgreSQL │ │ Caffeine │ │ Redis(可选) │ │ │
│ │ │ - R2DBC │ │ - 本地缓存 │ │ - 分布式缓存 │ │ │
│ │ │ - Flyway │ │ - 热点数据 │ │ - 分布式锁 │ │ │
│ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
``` ```
### 3.3 部署架构 ### 3.3 部署架构
```mermaid
graph TB
LB[负载均衡器<br/>Nginx/ALB]
subgraph GatewayInstances[API Gateway集群]
GW1[API Gateway<br/>实例1]
GW2[API Gateway<br/>实例2]
GW3[API Gateway<br/>实例N]
end
subgraph AppInstances[应用服务集群]
APP1[应用服务<br/>实例1]
APP2[应用服务<br/>实例2]
APP3[应用服务<br/>实例N]
end
subgraph DBLayer[数据库层]
PG1[PostgreSQL<br/>主库]
PG2[PostgreSQL<br/>从库1]
PG3[PostgreSQL<br/>从库N]
end
subgraph CacheLayer[缓存层]
REDIS1[Redis<br/>主节点]
REDIS2[Redis<br/>从节点1]
REDIS3[Redis<br/>从节点N]
end
LB --> GW1
LB --> GW2
LB --> GW3
GW1 --> APP1
GW2 --> APP2
GW3 --> APP3
APP1 --> PG1
APP2 --> PG1
APP3 --> PG1
PG1 -.->|主从复制| PG2
PG1 -.->|主从复制| PG3
APP1 --> REDIS1
APP2 --> REDIS1
APP3 --> REDIS1
REDIS1 -.->|主从复制| REDIS2
REDIS1 -.->|主从复制| REDIS3
``` ```
┌─────────────────────────────────────────────────────────────────────────┐
部署架构 └───────────────────┼───────────────────┘
├─────────────────────────────────────────────────────────────────────────┤ │ │ │
┌──────────────────┼──────────────────┐
┌─────────────────┐ │ │ │
│ 负载均衡器 │ ▼ ▼ ▼
│ (Nginx/ALB) │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐
└────────┬────────┘ │ Application │ │ Application │ │ Application │
│ Server (Pod1) │ │ Server (Pod2) │ │ Server (PodN) │
┌──────────────────────────────────────┐ │ ───────────────┘ └───────────────┘ └
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ API Gateway │ │ API Gateway │ │ API Gateway │ │
│ │ (实例1) │ │ (实例2) │ │ (实例N) │ │
│ └───────┬────────┘ └───────┬────────┘ └───────┬────────┘ │
│ │ │ │ │
│ └───────────────────┼───────────────────┘ │
│ │ │
│ ┌──────────────────┼──────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ Application │ │ Application │ │ Application │ │
│ │ Server (Pod1) │ │ Server (Pod2) │ │ Server (PodN) │ │
│ └───────┬────────┘ └───────┬────────┘ └
``` ```
───────┬────────┘ │
│ │ │ │ ───────┬────────┘
└───────────────────┼───────────────────┘ │ │ │
└───────────────────┼───────────────────┘
┌───────────────────────────┼───────────────────────────┐
│ │ │ ┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼ │ │ │
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ▼ ▼ ▼
│ PostgreSQL │ │ Redis │ │ OSS │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
(主从复制) │ │ (哨兵模式) │ │ (对象存储) │ │ │ PostgreSQL │ │ Redis │ │ OSS │
└──────────────┘ └──────────────┘ └──────────────┘ │ (主从复制) │ │ (哨兵模式) │ │ (对象存储) │
└──────────────┘ └──────────────┘ └──────────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────────────────┘
``` ```
--- ---
@@ -268,94 +325,96 @@
### 4.1 模块划分 ### 4.1 模块划分
``` ````
┌─────────────────────────────────────────────────────────────────────────┐
│ 模块划分 │ ---
├─────────────────────────────────────────────────────────────────────────┤
│ │ ## 四、模块设计
│ gym-manage-server (父工程) │
│ │ │ ### 4.1 模块划分
│ ├── gym-common (公共模块) │
│ │ ├── gym-common-core # 核心工具类、常量、枚举 │ ```mermaid
│ │ ├── gym-common-redis # Redis配置(可选) │ graph TB
│ │ ├── gym-common-security # 安全认证公共组件 │ subgraph Parent[gym-manage-server 父工程]
│ │ └── gym-common-log # 日志公共组件 │ subgraph Common[gym-common 公共模块]
│ │ │ C1[gym-common-core<br/>核心工具类、常量、枚举]
│ ├── gym-api (API网关模块) │ C2[gym-common-redis<br/>Redis配置可选]
│ │ ├── controller # HTTP接口 │ C3[gym-common-security<br/>安全认证公共组件]
│ │ ├── dto # 数据传输对象 │ C4[gym-common-log<br/>日志公共组件]
│ │ ├── vo # 视图对象 │ end
│ │ └── config # API配置 │
│ │ │ subgraph API[gym-api API网关模块]
│ ├── gym-service (业务服务模块) │ A1[controller<br/>HTTP接口]
│ │ ├── gym-service-member # 会员服务 │ A2[dto<br/>数据传输对象]
│ │ ├── gym-service-booking # 预约服务 │ A3[vo<br/>视图对象]
│ │ ├── gym-service-checkin # 签到服务 │ A4[config<br/>API配置]
│ │ ├── gym-service-course # 课程服务 │ end
│ │ ├── gym-service-coach # 教练服务 │
│ │ ├── gym-service-finance # 财务服务 │ subgraph Service[gym-service 业务服务模块]
└── gym-service-data # 数据服务 │ S1[gym-service-member<br/>会员服务]
│ │ │ S2[gym-service-booking<br/>预约服务]
│ ├── gym-domain (领域模型模块) │ S3[gym-service-checkin<br/>签到服务]
│ │ ├── model # 领域模型 │ S4[gym-service-course<br/>课程服务]
│ │ ├── event # 领域事件 │ S5[gym-service-coach<br/>教练服务]
│ │ └── service # 领域服务 │ S6[gym-service-finance<br/>财务服务]
│ │ │ S7[gym-service-data<br/>数据服务]
│ ├── gym-infrastructure (基础设施模块) │ end
│ │ ├── repository # 数据仓储 │
│ │ ├── cache # 缓存配置 │ subgraph Domain[gym-domain 领域模型模块]
│ │ ├── external # 外部服务集成 │ D1[model<br/>领域模型]
│ │ └── config # 基础配置 │ D2[event<br/>领域事件]
│ │ │ D3[service<br/>领域服务]
│ └── gym-starter (启动模块) │ end
│ └── gym-admin # 管理后台启动器 │
│ │ subgraph Infra[gym-infrastructure 基础设施模块]
└─────────────────────────────────────────────────────────────────────────┘ I1[repository<br/>数据仓储]
``` I2[cache<br/>缓存配置]
I3[external<br/>外部服务集成]
I4[config<br/>基础配置]
end
subgraph Starter[gym-starter 启动模块]
ST[gym-admin<br/>管理后台启动器]
end
end
````
### 4.2 模块职责 ### 4.2 模块职责
| 模块 | 职责 | 依赖 | | 模块 | 职责 | 依赖 |
|------|------|------| | ------------------- | ---------------------------------- | ------------------------------ |
| gym-common-core | 提供通用工具类、常量定义、异常处理 | 无 | | gym-common-core | 提供通用工具类、常量定义、异常处理 | 无 |
| gym-common-security | 提供JWT认证、权限校验 | gym-common-core | | gym-common-security | 提供JWT认证、权限校验 | gym-common-core |
| gym-common-log | 提供统一日志处理 | gym-common-core | | gym-common-log | 提供统一日志处理 | gym-common-core |
| gym-domain | 定义领域模型、领域事件、领域服务 | gym-common-core | | gym-domain | 定义领域模型、领域事件、领域服务 | gym-common-core |
| gym-infrastructure | 提供数据访问、缓存、外部服务集成 | gym-domain | | gym-infrastructure | 提供数据访问、缓存、外部服务集成 | gym-domain |
| gym-service-member | 会员、会员卡、权益管理 | gym-domain, gym-infrastructure | | gym-service-member | 会员、会员卡、权益管理 | gym-domain, gym-infrastructure |
| gym-service-booking | 课程预约、库存管理 | gym-domain, gym-infrastructure | | gym-service-booking | 课程预约、库存管理 | gym-domain, gym-infrastructure |
| gym-service-checkin | 签到处理、权益扣减 | gym-domain, gym-infrastructure | | gym-service-checkin | 签到处理、权益扣减 | gym-domain, gym-infrastructure |
| gym-api | HTTP接口定义、参数校验 | gym-service-* | | gym-api | HTTP接口定义、参数校验 | gym-service-\* |
| gym-starter | 应用启动、配置加载 | gym-api | | gym-starter | 应用启动、配置加载 | gym-api |
### 4.3 模块交互 ### 4.3 模块交互
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ sequenceDiagram
│ 模块交互流程 │ participant Client as 客户端
├─────────────────────────────────────────────────────────────────────────┤ participant API as API Layer
│ │ participant Service as Service Layer
│ HTTP Request │ participant Domain as Domain Layer
│ │ │ participant Repo as Repo Layer
│ ▼ │ participant Infra as Infrastructure
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ API │───▶│ Service │───▶│ Domain │───▶│ Repo │ │ Client->>API: HTTP Request
│ │ Layer │ │ Layer │ │ Layer │ │ Layer │ │ API->>Service: 调用业务逻辑
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ Service->>Domain: 处理领域逻辑
│ │ │ │ │ │ Domain->>Repo: 访问数据
│ │ │ │ │ │ Repo->>Infra: 访问基础设施
│ │ ▼ ▼ ▼ │ Infra-->>Repo: 返回结果
│ │ ┌─────────────────────────────────────┐ │ Repo-->>Domain: 返回数据
│ │ │ Infrastructure │ │ Domain-->>Service: 返回领域对象
│ │ │ ┌─────────┐ ┌─────────┐ ┌─────┐ │ │ Service-->>API: 返回业务结果
│ │ │ │ Cache │ │ MQ │ │ DB │ │ │ API-->>Client: HTTP Response
│ │ │ └─────────┘ └─────────┘ └─────┘ │ │
│ │ └─────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ HTTP Response │
│ │
└─────────────────────────────────────────────────────────────────────────┘
``` ```
--- ---
@@ -367,19 +426,23 @@
#### 5.1.1 RESTful API 规范 #### 5.1.1 RESTful API 规范
``` ```
基础URL: https://api.gym-manage.com/v1 基础URL: https://api.gym-manage.com/v1
资源命名规范: 资源命名规范:
- 使用名词复数形式: /members, /bookings, /courses - 使用名词复数形式: /members, /bookings, /courses
- 使用小写字母和连字符: /member-cards, /booking-slots - 使用小写字母和连字符: /member-cards, /booking-slots
- 避免动词: /members (正确) vs /getMembers (错误) - 避免动词: /members (正确) vs /getMembers (错误)
HTTP方法语义: HTTP方法语义:
- GET: 查询资源 - GET: 查询资源
- POST: 创建资源 - POST: 创建资源
- PUT: 全量更新资源 - PUT: 全量更新资源
- PATCH: 部分更新资源 - PATCH: 部分更新资源
- DELETE: 删除资源 - DELETE: 删除资源
``` ```
#### 5.1.2 请求响应格式 #### 5.1.2 请求响应格式
@@ -421,71 +484,75 @@ HTTP方法语义:
#### 5.1.3 状态码定义 #### 5.1.3 状态码定义
| 状态码 | 含义 | 说明 | | 状态码 | 含义 | 说明 |
|--------|------|------| | ------ | ---------- | --------------------- |
| 0 | 成功 | 请求处理成功 | | 0 | 成功 | 请求处理成功 |
| 40001 | 参数错误 | 请求参数校验失败 | | 40001 | 参数错误 | 请求参数校验失败 |
| 40002 | 资源不存在 | 请求的资源不存在 | | 40002 | 资源不存在 | 请求的资源不存在 |
| 40003 | 资源已存在 | 创建的资源已存在 | | 40003 | 资源已存在 | 创建的资源已存在 |
| 40101 | 未登录 | 用户未登录或Token过期 | | 40101 | 未登录 | 用户未登录或Token过期 |
| 40102 | 无权限 | 用户无访问权限 | | 40102 | 无权限 | 用户无访问权限 |
| 40301 | 业务异常 | 业务逻辑校验失败 | | 40301 | 业务异常 | 业务逻辑校验失败 |
| 50001 | 系统异常 | 系统内部错误 | | 50001 | 系统异常 | 系统内部错误 |
### 5.2 接口分组 ### 5.2 接口分组
``` ### 5.2 接口分组
┌─────────────────────────────────────────────────────────────────────────┐
│ API 接口分组 │ ```mermaid
├─────────────────────────────────────────────────────────────────────────┤ graph LR
│ │ subgraph Auth[认证接口 /v1/auth]
│ /v1/auth # 认证接口 │ A1[POST /login<br/>登录]
│ ├── POST /login # 登录 │ A2[POST /logout<br/>登出]
│ ├── POST /logout # 登出 │ A3[POST /refresh<br/>刷新Token]
│ ├── POST /refresh # 刷新Token │ A4[POST /wechat-login<br/>微信登录]
│ └── POST /wechat-login # 微信登录 │ end
│ │
│ /v1/members # 会员接口 │ subgraph Members[会员接口 /v1/members]
│ ├── GET / # 会员列表 │ M1[GET /<br/>会员列表]
│ ├── GET /{id} # 会员详情 │ M2[GET /{id}<br/>会员详情]
│ ├── POST / # 创建会员 │ M3[POST /<br/>创建会员]
│ ├── PUT /{id} # 更新会员 │ M4[PUT /{id}<br/>更新会员]
│ ├── GET /{id}/cards # 会员卡列表 │ M5[GET /{id}/cards<br/>会员卡列表]
│ ├── GET /{id}/benefits # 权益列表 │ M6[GET /{id}/benefits<br/>权益列表]
│ └── GET /{id}/bookings # 预约记录 │ M7[GET /{id}/bookings<br/>预约记录]
│ │ end
│ /v1/courses # 课程接口 │
│ ├── GET / # 课程列表 │ subgraph Courses[课程接口 /v1/courses]
│ ├── GET /{id} # 课程详情 │ C1[GET /<br/>课程列表]
│ ├── POST / # 创建课程 │ C2[GET /{id}<br/>课程详情]
│ ├── PUT /{id} # 更新课程 │ C3[POST /<br/>创建课程]
│ └── GET /{id}/slots # 可预约时段 │ C4[PUT /{id}<br/>更新课程]
│ │ C5[GET /{id}/slots<br/>可预约时段]
│ /v1/bookings # 预约接口 │ end
│ ├── GET / # 预约列表 │
│ ├── GET /{id} # 预约详情 │ subgraph Bookings[预约接口 /v1/bookings]
│ ├── POST / # 创建预约 │ B1[GET /<br/>预约列表]
│ ├── POST /{id}/cancel # 取消预约 │ B2[GET /{id}<br/>预约详情]
│ └── GET /my # 我的预约 │ B3[POST /<br/>创建预约]
│ │ B4[POST /{id}/cancel<br/>取消预约]
│ /v1/checkins # 签到接口 │ B5[GET /my<br/>我的预约]
│ ├── GET / # 签到列表 │ end
│ ├── POST /scan # 扫码签到 │
│ ├── POST /manual # 手动签到(教练代签) │ subgraph Checkins[签到接口 /v1/checkins]
│ └── GET /my # 我的签到 │ CH1[GET /<br/>签到列表]
│ │ CH2[POST /scan<br/>扫码签到]
│ /v1/coaches # 教练接口 │ CH3[POST /manual<br/>手动签到]
│ ├── GET / # 教练列表 │ CH4[GET /my<br/>我的签到]
│ ├── GET /{id} # 教练详情 │ end
│ ├── GET /{id}/schedule # 教练排班 │
│ └── GET /{id}/slots # 可预约时段 │ subgraph Coaches[教练接口 /v1/coaches]
│ │ CO1[GET /<br/>教练列表]
│ /v1/dashboard # 数据看板 │ CO2[GET /{id}<br/>教练详情]
│ ├── GET /overview # 今日概览 │ CO3[GET /{id}/schedule<br/>教练排班]
│ ├── GET /trends # 趋势数据 │ CO4[GET /{id}/slots<br/>可预约时段]
│ └── GET /rankings # 排行数据 │ end
│ │
└─────────────────────────────────────────────────────────────────────────┘ subgraph Dashboard[数据看板 /v1/dashboard]
D1[GET /overview<br/>今日概览]
D2[GET /trends<br/>趋势数据]
D3[GET /rankings<br/>排行数据]
end
``` ```
### 5.3 接口版本管理 ### 5.3 接口版本管理
@@ -670,12 +737,12 @@ HTTP方法语义:
### 7.1 性能目标 ### 7.1 性能目标
| 指标 | 目标值 | 说明 | | 指标 | 目标值 | 说明 |
|------|--------|------| | -------- | ----------- | -------------------------- |
| 响应时间 | P99 < 200ms | 99%的请求响应时间小于200ms | | 响应时间 | P99 < 200ms | 99%的请求响应时间小于200ms |
| 吞吐量 | QPS ≥ 1000 | 系统每秒处理请求数 | | 吞吐量 | QPS ≥ 1000 | 系统每秒处理请求数 |
| 并发用户 | ≥ 5000 | 同时在线用户数 | | 并发用户 | ≥ 5000 | 同时在线用户数 |
| 可用性 | SLA ≥ 99.9% | 年度可用性 | | 可用性 | SLA ≥ 99.9% | 年度可用性 |
### 7.2 性能优化策略 ### 7.2 性能优化策略
@@ -892,34 +959,34 @@ HTTP方法语义:
### 10.1 技术选型清单 ### 10.1 技术选型清单
| 分类 | 技术 | 版本 | 说明 | | 分类 | 技术 | 版本 | 说明 |
|------|------|------|------| | ---------- | -------------- | ---- | ---------------- |
| 后端框架 | Spring Boot | 3.x | 主框架 | | 后端框架 | Spring Boot | 3.x | 主框架 |
| 响应式 | Spring WebFlux | 3.x | 响应式Web框架 | | 响应式 | Spring WebFlux | 3.x | 响应式Web框架 |
| JDK | OpenJDK | 21+ | 虚拟线程支持 | | JDK | OpenJDK | 21+ | 虚拟线程支持 |
| 数据库 | PostgreSQL | 15+ | 主数据库 | | 数据库 | PostgreSQL | 15+ | 主数据库 |
| 数据访问 | R2DBC | 1.x | 响应式数据库访问 | | 数据访问 | R2DBC | 1.x | 响应式数据库访问 |
| 数据库迁移 | Flyway | 9.x | 数据库版本管理 | | 数据库迁移 | Flyway | 9.x | 数据库版本管理 |
| 缓存 | Caffeine | 3.x | 本地缓存 | | 缓存 | Caffeine | 3.x | 本地缓存 |
| 缓存(可选) | Redis | 7.x | 分布式缓存 | | 缓存(可选) | Redis | 7.x | 分布式缓存 |
| 前端框架 | Vue | 3.x | 前端框架 | | 前端框架 | Vue | 3.x | 前端框架 |
| 跨端框架 | uniapp | 3.x | 跨端开发框架 | | 跨端框架 | uniapp | 3.x | 跨端开发框架 |
| 状态管理 | Pinia | 2.x | 状态管理 | | 状态管理 | Pinia | 2.x | 状态管理 |
| UI组件 | Element Plus | 2.x | 管理后台UI | | UI组件 | Element Plus | 2.x | 管理后台UI |
| 构建工具 | Vite | 5.x | 前端构建工具 | | 构建工具 | Vite | 5.x | 前端构建工具 |
| 容器 | Docker | 24.x | 容器化部署 | | 容器 | Docker | 24.x | 容器化部署 |
### 10.2 术语表 ### 10.2 术语表
| 术语 | 英文 | 定义 | | 术语 | 英文 | 定义 |
|------|------|------| | ---------- | -------------------- | -------------------------------- |
| 高可用 | High Availability | 系统持续提供服务的能力 | | 高可用 | High Availability | 系统持续提供服务的能力 |
| 响应式编程 | Reactive Programming | 基于数据流和变化传播的编程范式 | | 响应式编程 | Reactive Programming | 基于数据流和变化传播的编程范式 |
| 多租户 | Multi-tenancy | 单个实例服务多个租户的架构 | | 多租户 | Multi-tenancy | 单个实例服务多个租户的架构 |
| 软删除 | Soft Delete | 通过标记删除时间而非物理删除数据 | | 软删除 | Soft Delete | 通过标记删除时间而非物理删除数据 |
| 乐观锁 | Optimistic Lock | 假设冲突较少,通过版本号控制并发 | | 乐观锁 | Optimistic Lock | 假设冲突较少,通过版本号控制并发 |
| 悲观锁 | Pessimistic Lock | 假设冲突较多,通过锁机制控制并发 | | 悲观锁 | Pessimistic Lock | 假设冲突较多,通过锁机制控制并发 |
--- ---
*文档结束* _文档结束_
+107 -74
View File
@@ -29,33 +29,28 @@
### 1.2 模块边界 ### 1.2 模块边界
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ graph TB
│ 会员模块边界 │ subgraph Internal[会员模块内部]
├─────────────────────────────────────────────────────────────────────────┤ M1[会员管理]
│ │ M2[会员卡管理]
│ ┌─────────────────────────────────────────────────────────────────┐ │ M3[权益管理]
│ │ 会员模块内部 │ │ M4[等级管理]
│ │ │ │ end
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐ │ │
│ │ │ 会员管理 │ │ 会员卡管理 │ │ 权益管理 │ │ 等级管理 │ │ │ subgraph ExternalDeps[外部依赖]
│ │ └───────────┘ └───────────┘ └───────────┘ └──────────┘ │ │ D1[租户模块<br/>获取租户信息]
│ │ │ │ D2[门店模块<br/>获取门店信息]
│ └─────────────────────────────────────────────────────────────────┘ │ D3[认证模块<br/>用户登录认证]
│ │ D4[消息模块<br/>发送短信验证码]
│ 外部依赖: │ end
│ ├── 租户模块: 获取租户信息 │
│ ├── 门店模块: 获取门店信息 │ subgraph Deps[被依赖]
│ ├── 认证模块: 用户登录认证 │ U1[预约模块<br/>查询会员权益、扣减权益]
│ └── 消息模块: 发送短信验证码 │ U2[签到模块<br/>查询会员信息、扣减权益]
│ │ U3[财务模块<br/>查询会员消费记录]
│ 被依赖: │ U4[数据模块<br/>会员数据分析]
│ ├── 预约模块: 查询会员权益、扣减权益 │ end
│ ├── 签到模块: 查询会员信息、扣减权益 │
│ ├── 财务模块: 查询会员消费记录 │
│ └── 数据模块: 会员数据分析 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
``` ```
--- ---
@@ -64,53 +59,91 @@
### 2.1 实体关系图 ### 2.1 实体关系图
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ erDiagram
│ 会员模块ER图 │ tenant ||--o{ store : has
├─────────────────────────────────────────────────────────────────────────┤ tenant ||--o{ member : has
│ │ store ||--o{ member : belongs
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ tenant │ │ store │ │ member │ │ member ||--o{ member_card : has
│ │─────────────│ │─────────────│ │─────────────│ │ member ||--o{ member_benefit : has
│ │ id │◀──┐ │ id │◀──┐ │ id │ │
│ │ name │ │ │ tenant_id │───┘ │ tenant_id │───┐ │ member_card }o--|| card_type : type
│ │ code │ │ │ name │ │ store_id │───┼──┐ │ member_benefit }o--|| card_type : card
│ │ status │ │ │ address │ │ member_no │ │ │ │
│ └─────────────┘ │ │ status │ │ name │ │ │ │ card_type }o--|| level_rule : has
│ │ └─────────────┘ │ phone │ │ │ │
│ │ │ gender │ │ │ │ tenant {
│ │ │ level │ │ │ │ bigint id PK
│ │ │ exp │ │ │ │ varchar name
│ │ │ status │ │ │ │ varchar code
│ │ └─────────────┘ │ │ │ smallint status
│ │ │ │ │ │ }
│ │ │ │ │ │
│ │ ▼ │ │ │ store {
│ │ ┌─────────────┐ ┌─────────────┐ │ │ │ bigint id PK
│ │ │ member_card │◀──────│ member_bene │ │ │ │ bigint tenant_id FK
│ │ │─────────────│ │ fit │ │ │ │ varchar name
│ │ │ id │ │─────────────│ │ │ │ varchar address
│ │ │ member_id │──────▶│ id │ │ │ │ smallint status
│ │ │ card_type_id│ │ member_id │───┘ │ │ }
│ │ │ card_no │ │ card_id │ │ │
│ │ │ status │ │ type │ │ │ member {
│ │ │ start_date │ │ value │ │ │ bigint id PK
│ │ │ end_date │ │ used_value │ │ │ bigint tenant_id FK
│ │ └─────────────┘ │ expire_date │ │ │ bigint store_id FK
│ │ └─────────────┘ │ │ varchar member_no
│ │ │ │ varchar name
│ │ ┌─────────────┐ ┌─────────────┐ │ │ varchar phone
│ │ │ card_type │ │ level_rule │ │ │ smallint gender
│ │ │─────────────│ │─────────────│ │ │ smallint level
│ └───│ tenant_id │ │ tenant_id │◀─────┘ │ int exp
│ │ name │ │ level │ │ smallint status
│ │ type │ │ name │ │ }
│ │ price │ │ min_exp │ │
│ │ duration │ │ max_exp │ │ member_card {
│ └─────────────┘ │ discount │ │ bigint id PK
│ └─────────────┘ │ bigint member_id FK
│ │ bigint card_type_id FK
└─────────────────────────────────────────────────────────────────────────┘ varchar card_no
smallint status
date start_date
date end_date
}
member_benefit {
bigint id PK
bigint member_id FK
bigint card_id FK
smallint type
decimal value
decimal used_value
date expire_date
}
card_type {
bigint id PK
bigint tenant_id FK
varchar name
varchar code
smallint type
decimal price
int duration_days
int total_times
decimal stored_value
smallint level
decimal discount
}
level_rule {
bigint id PK
bigint tenant_id FK
smallint level
varchar name
int min_exp
int max_exp
decimal discount
}
``` ```
### 2.2 数据表设计 ### 2.2 数据表设计
+73 -72
View File
@@ -29,33 +29,28 @@
### 1.2 模块边界 ### 1.2 模块边界
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ graph TB
│ 签到模块边界 │ subgraph Internal[签到模块内部]
├─────────────────────────────────────────────────────────────────────────┤ C1[签到网关]
│ │ C2[签到验证]
│ ┌─────────────────────────────────────────────────────────────────┐ │ C3[签到记录]
│ │ 签到模块内部 │ │ C4[签到统计]
│ │ │ │ end
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐ │ │
│ │ │ 签到网关 │ │ 签到验证 │ │ 签到记录 │ │ 签到统计 │ │ │ subgraph ExternalDeps[外部依赖]
│ │ └───────────┘ └───────────┘ └───────────┘ └──────────┘ │ │ D1[会员模块<br/>查询会员信息、验证会员状态]
│ │ │ │ D2[权益模块<br/>验证权益有效性、扣减权益]
│ └─────────────────────────────────────────────────────────────────┘ │ D3[预约模块<br/>查询预约信息、验证签到资格]
│ │ D4[设备模块<br/>人脸识别设备、NFC读卡器]
│ 外部依赖: │ D5[消息模块<br/>发送签到通知]
│ ├── 会员模块: 查询会员信息、验证会员状态 │ end
│ ├── 权益模块: 验证权益有效性、扣减权益 │
│ ├── 预约模块: 查询预约信息、验证签到资格 │ subgraph Deps[被依赖]
│ ├── 设备模块: 人脸识别设备、NFC读卡器 │ U1[财务模块<br/>签到消费记录]
│ └── 消息模块: 发送签到通知 │ U2[数据模块<br/>签到数据分析、会员活跃度统计]
│ │ U3[考勤模块<br/>教练考勤统计]
│ 被依赖: │ end
│ ├── 财务模块: 签到消费记录 │
│ ├── 数据模块: 签到数据分析、会员活跃度统计 │
│ └── 考勤模块: 教练考勤统计 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
``` ```
### 1.3 签到类型 ### 1.3 签到类型
@@ -73,51 +68,57 @@
### 2.1 实体关系图 ### 2.1 实体关系图
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ erDiagram
│ 签到模块ER图 │ member ||--o{ checkin_record : makes
├─────────────────────────────────────────────────────────────────────────┤ booking_record ||--o{ checkin_record : for
│ │ device ||--o{ checkin_record : used
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ member │ │booking_record│ │ device │ │ member ||--o{ member_face : has
│ │─────────────│ │─────────────│ │─────────────│ │
│ │ id │ │ id │ │ id │ │ member {
│ │ name │ │ member_id │ │ name │ │ bigint id PK
│ │ phone │ │ slot_id │ │ type │ │ varchar name
│ │ status │ │ status │ │ location │ │ varchar phone
│ └──────┬──────┘ │ checkin_ │ │ status │ │ smallint status
│ │ │ status │ └──────┬──────┘ │ }
│ │ └──────┬──────┘ │ │
│ │ │ │ │ booking_record {
│ │ ┌────────────────┼─────────────────────┘ │ bigint id PK
│ │ │ │ │ bigint member_id FK
│ │ ▼ ▼ │ bigint slot_id FK
│ │ ┌─────────────────────────────┐ │ smallint status
│ │ │ checkin_record │ │ smallint checkin_status
│ │ │─────────────────────────────│ │ }
│ │ │ id │ │
│ │ │ tenant_id │ │ device {
│ │ │ member_id ◀────────────┘ │ bigint id PK
│ │ │ booking_id │ │ varchar name
│ │ │ device_id │ │ smallint type
│ │ │ type │ │ varchar location
│ │ │ method │ │ smallint status
│ │ │ status │ │ }
│ │ │ checkin_at │ │
│ │ └─────────────────────────────┘ │ checkin_record {
│ │ │ bigint id PK
│ │ ┌─────────────────────────────┐ │ bigint tenant_id FK
│ │ │ member_face │ │ bigint store_id FK
│ │ │─────────────────────────────│ │ bigint member_id FK
│ │ │ id │ │ bigint booking_id FK
│ │ │ member_id ◀────────────┘ │ bigint device_id FK
│ │ │ face_feature │ │ smallint type
│ │ │ status │ │ smallint method
│ │ └─────────────────────────────┘ │ smallint status
│ │ │ timestamp checkin_at
│ └────────────────────────────────────────────────────────────┘ date checkin_date
│ │ }
└─────────────────────────────────────────────────────────────────────────┘
member_face {
bigint id PK
bigint member_id FK
bytea face_feature
smallint status
}
``` ```
### 2.2 数据表设计 ### 2.2 数据表设计
+84 -80
View File
@@ -29,32 +29,27 @@
### 1.2 模块边界 ### 1.2 模块边界
``` ```mermaid
┌─────────────────────────────────────────────────────────────────────────┐ graph TB
│ 预约模块边界 │ subgraph Internal[预约模块内部]
├─────────────────────────────────────────────────────────────────────────┤ B1[课程管理]
│ │ B2[时段管理]
│ ┌─────────────────────────────────────────────────────────────────┐ │ B3[预约管理]
│ │ 预约模块内部 │ │ B4[库存管理]
│ │ │ │ end
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────────┐ │ │
│ │ │ 课程管理 │ │ 时段管理 │ │ 预约管理 │ │ 库存管理 │ │ │ subgraph ExternalDeps[外部依赖]
│ │ └───────────┘ └───────────┘ └───────────┘ └──────────┘ │ │ D1[会员模块<br/>查询会员权益、扣减权益]
│ │ │ │ D2[教练模块<br/>查询教练信息、排班]
│ └─────────────────────────────────────────────────────────────────┘ │ D3[场地模块<br/>查询场地信息、可用性]
│ │ D4[消息模块<br/>发送预约通知]
│ 外部依赖: │ end
│ ├── 会员模块: 查询会员权益、扣减权益 │
│ ├── 教练模块: 查询教练信息、排班 │ subgraph Deps[被依赖]
│ ├── 场地模块: 查询场地信息、可用性 │ U1[签到模块<br/>查询预约信息、验证签到资格]
│ └── 消息模块: 发送预约通知 │ U2[财务模块<br/>查询预约消费记录]
│ │ U3[数据模块<br/>预约数据分析]
│ 被依赖: │ end
│ ├── 签到模块: 查询预约信息、验证签到资格 │
│ ├── 财务模块: 查询预约消费记录 │
│ └── 数据模块: 预约数据分析 │
│ │
└─────────────────────────────────────────────────────────────────────────┘
``` ```
--- ---
@@ -63,60 +58,69 @@
### 2.1 实体关系图 ### 2.1 实体关系图
``` ### 2.1 实体关系图
┌─────────────────────────────────────────────────────────────────────────┐
│ 预约模块ER图 │ ```mermaid
├─────────────────────────────────────────────────────────────────────────┤ erDiagram
│ │ coach ||--o{ booking_slot : coaches
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ course ||--o{ booking_slot : courses
│ │ coach │ │ course │ │ venue │ │ venue ||--o{ booking_slot : venues
│ │─────────────│ │─────────────│ │─────────────│ │
│ │ id │ │ id │ │ id │ │ booking_slot ||--o{ booking_record : slots
│ │ name │ │ tenant_id │ │ tenant_id │ │
│ │ specialty │ │ name │ │ name │ │ coach {
│ │ status │ │ type │ │ type │ │ bigint id PK
│ └──────┬──────┘ │ category │ │ capacity │ │ varchar name
│ │ │ duration │ │ status │ │ varchar specialty
│ │ │ capacity │ └──────┬──────┘ │ smallint status
│ │ │ status │ │ │ }
│ │ └──────┬──────┘ │ │
│ │ │ │ │ course {
│ │ ┌────────────────┼─────────────────────┘ │ bigint id PK
│ │ │ │ │ bigint tenant_id FK
│ │ ▼ ▼ │ varchar name
│ │ ┌─────────────────────────────┐ │ smallint type
│ │ │ booking_slot │ │ varchar category
│ │ │─────────────────────────────│ │ int duration
│ │ │ id │ │ int capacity
│ │ │ tenant_id │ │ smallint status
│ │ │ resource_type (course/venue)│ │ }
│ │ │ resource_id │ │
│ │ │ coach_id │◀──────────┐ │ venue {
│ │ │ venue_id │ │ │ bigint id PK
│ │ │ start_time │ │ │ bigint tenant_id FK
│ │ │ end_time │ │ │ varchar name
│ │ │ capacity │ │ │ smallint type
│ │ │ booked_count │ │ │ int capacity
│ │ │ status │ │ │ smallint status
│ │ └─────────────┬───────────────┘ │ │ }
│ │ │ │ │
│ │ ▼ │ │ booking_slot {
│ │ ┌─────────────────────────────┐ │ │ bigint id PK
│ │ │ booking_record │ │ │ bigint tenant_id FK
│ │ │─────────────────────────────│ │ │ smallint resource_type
│ │ │ id │ │ │ bigint resource_id FK
│ │ │ tenant_id │ │ │ bigint coach_id FK
│ │ │ member_id │ │ │ bigint venue_id FK
│ │ │ slot_id │───────────┘ │ timestamp start_time
│ │ │ coach_id │ │ timestamp end_time
│ │ │ status │ │ int capacity
│ │ │ price │ │ int booked_count
│ │ │ checkin_status │ │ smallint status
│ │ └─────────────────────────────┘ │ }
│ │ │
│ └────────────────────────────────────────────────────────────┘ booking_record {
│ │ bigint id PK
└─────────────────────────────────────────────────────────────────────────┘ bigint tenant_id FK
bigint member_id FK
bigint slot_id FK
bigint coach_id FK
smallint status
decimal price
smallint price_type
decimal price_value
smallint checkin_status
}
``` ```
### 2.2 数据表设计 ### 2.2 数据表设计