735 lines
28 KiB
Markdown
735 lines
28 KiB
Markdown
|
|
# Lyzsys 架构设计文档
|
|||
|
|
|
|||
|
|
## 📖 目录
|
|||
|
|
|
|||
|
|
- [架构概述](#架构概述)
|
|||
|
|
- [架构设计原则](#架构设计原则)
|
|||
|
|
- [分层架构](#分层架构)
|
|||
|
|
- [模块化设计](#模块化设计)
|
|||
|
|
- [数据架构](#数据架构)
|
|||
|
|
- [安全架构](#安全架构)
|
|||
|
|
- [技术架构](#技术架构)
|
|||
|
|
- [部署架构](#部署架构)
|
|||
|
|
- [性能优化](#性能优化)
|
|||
|
|
- [扩展性设计](#扩展性设计)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 架构概述
|
|||
|
|
|
|||
|
|
### 整体架构
|
|||
|
|
|
|||
|
|
Lyzsys 采用**前后端分离**的**模块化单体架构**,基于**领域驱动设计(DDD)**思想进行模块划分,支持未来向微服务架构演进。
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 客户端层 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ Web 浏览器 │ │ 移动 App │ │ 小程序 │ │
|
|||
|
|
│ │ (Vue3) │ │ (UniApp) │ │ (UniApp) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 接入层 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ Nginx / │ │ API 网关 │ │ 负载均衡 │ │
|
|||
|
|
│ │ CDN │ │ (可选) │ │ │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 应用层 │
|
|||
|
|
│ ┌──────────────────────────────────────────────────────────┐ │
|
|||
|
|
│ │ lyzsys-server │ │
|
|||
|
|
│ │ (Spring Boot 应用) │ │
|
|||
|
|
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
|
|||
|
|
│ │ │ Controller │ │ Service │ │ DAL │ │ │
|
|||
|
|
│ │ │ 层 │ │ 层 │ │ 层 │ │ │
|
|||
|
|
│ │ └────────────┘ └────────────┘ └────────────┘ │ │
|
|||
|
|
│ └──────────────────────────────────────────────────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
┌─────────────────────┼─────────────────────┐
|
|||
|
|
│ │ │
|
|||
|
|
▼ ▼ ▼
|
|||
|
|
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
|
|||
|
|
│lyzsys-module-│ │lyzsys-module-xxx │ │lyzsys-module-│
|
|||
|
|
│ system │ │ (业务模块) │ │ infra │
|
|||
|
|
└──────────────┘ └──────────────────┘ └──────────────┘
|
|||
|
|
│
|
|||
|
|
┌─────────────────────┼─────────────────────┐
|
|||
|
|
│ │ │
|
|||
|
|
▼ ▼ ▼
|
|||
|
|
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
|
|||
|
|
│lyzsys- │ │lyzsys-framework │ │lyzsys- │
|
|||
|
|
│dependencies │ │ (框架组件) │ │common │
|
|||
|
|
└──────────────┘ └──────────────────┘ └──────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 数据层 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ MySQL │ │ Redis │ │ MinIO │ │
|
|||
|
|
│ │ (主数据库) │ │ (缓存) │ │ (文件存储) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 外部服务 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ AI 服务 │ │ 短信服务 │ │ 支付服务 │ │
|
|||
|
|
│ │ (OpenAI等) │ │ (阿里云等) │ │ (微信等) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 架构特点
|
|||
|
|
|
|||
|
|
1. **前后端分离**: 前端和后端独立开发、部署、扩展
|
|||
|
|
2. **模块化设计**: 业务模块独立,低耦合、高内聚
|
|||
|
|
3. **分层架构**: 清晰的分层,职责明确
|
|||
|
|
4. **微服务就绪**: 模块化设计便于微服务化改造
|
|||
|
|
5. **多租户支持**: 原生支持 SaaS 多租户场景
|
|||
|
|
6. **高可用**: 支持集群部署,无状态设计
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 架构设计原则
|
|||
|
|
|
|||
|
|
### 1. 单一职责原则 (SRP)
|
|||
|
|
|
|||
|
|
每个模块、每个类只负责一个职责。
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
- `UserController` 只负责接收 HTTP 请求
|
|||
|
|
- `UserService` 只负责业务逻辑处理
|
|||
|
|
- `UserMapper` 只负责数据库操作
|
|||
|
|
|
|||
|
|
### 2. 开闭原则 (OCP)
|
|||
|
|
|
|||
|
|
对扩展开放,对修改关闭。
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
- 通过实现接口扩展功能,而非修改原有代码
|
|||
|
|
- 使用策略模式实现不同的支付方式
|
|||
|
|
|
|||
|
|
### 3. 里氏替换原则 (LSP)
|
|||
|
|
|
|||
|
|
子类可以替换父类。
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
- `UserServiceImpl` 可以替换 `UserService`
|
|||
|
|
- `BaseMapperX` 可以替换 `BaseMapper`
|
|||
|
|
|
|||
|
|
### 4. 接口隔离原则 (ISP)
|
|||
|
|
|
|||
|
|
使用多个细粒度的接口,而非单一的总接口。
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
- `UserService`、`RoleService`、`MenuService` 各司其职
|
|||
|
|
- 前端 API 按模块划分(`/system/user`、`/system/role`)
|
|||
|
|
|
|||
|
|
### 5. 依赖倒置原则 (DIP)
|
|||
|
|
|
|||
|
|
高层模块不依赖低层模块,都依赖于抽象。
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
- Controller 依赖 Service 接口,而非实现
|
|||
|
|
- Service 依赖 Mapper 接口,而非实现
|
|||
|
|
|
|||
|
|
### 6. 迪米特法则 (LoD)
|
|||
|
|
|
|||
|
|
最少知识原则,模块之间尽量少交互。
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
- 模块之间通过 API 接口交互
|
|||
|
|
- 避免跨层调用(如 Controller 直接调用 Mapper)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 分层架构
|
|||
|
|
|
|||
|
|
### 应用分层
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ Controller 层 │
|
|||
|
|
│ • 接收 HTTP 请求 │
|
|||
|
|
│ • 参数校验 │
|
|||
|
|
│ • 调用 Service 层 │
|
|||
|
|
│ • 返回响应 │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ Service 层 │
|
|||
|
|
│ • 业务逻辑处理 │
|
|||
|
|
│ • 事务控制 │
|
|||
|
|
│ • 调用 DAL 层 │
|
|||
|
|
│ • 返回处理结果 │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ DAL 层 │
|
|||
|
|
│ • 数据访问 │
|
|||
|
|
│ • 数据库操作 │
|
|||
|
|
│ • 缓存操作 │
|
|||
|
|
│ • 返回数据对象 │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 层次交互规则
|
|||
|
|
|
|||
|
|
1. **自上而下调用**: Controller → Service → DAL
|
|||
|
|
2. **跨层访问**: 允许 Service 直接调用多个 DAL
|
|||
|
|
3. **禁止反向调用**: 下层不能调用上层
|
|||
|
|
4. **同层交互**: 同层之间通过接口交互
|
|||
|
|
|
|||
|
|
### 分层示例
|
|||
|
|
|
|||
|
|
#### Controller 层
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@RestController
|
|||
|
|
@RequestMapping("/system/user")
|
|||
|
|
@Tag(name = "管理后台 - 用户")
|
|||
|
|
public class UserController {
|
|||
|
|
|
|||
|
|
@Autowired
|
|||
|
|
private UserService userService;
|
|||
|
|
|
|||
|
|
@PostMapping("/create")
|
|||
|
|
@Operation(summary = "创建用户")
|
|||
|
|
public CommonResult<Long> createUser(@Valid @RequestBody UserCreateReqVO reqVO) {
|
|||
|
|
return success(userService.createUser(reqVO));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@GetMapping("/get")
|
|||
|
|
@Operation(summary = "获取用户详情")
|
|||
|
|
public CommonResult<UserRespVO> getUser(@RequestParam("id") Long id) {
|
|||
|
|
return success(userService.getUser(id));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Service 层
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@Service
|
|||
|
|
public class UserServiceImpl implements UserService {
|
|||
|
|
|
|||
|
|
@Autowired
|
|||
|
|
private UserMapper userMapper;
|
|||
|
|
|
|||
|
|
@Autowired
|
|||
|
|
private DeptMapper deptMapper;
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
@Transactional(rollbackFor = Exception.class)
|
|||
|
|
public Long createUser(UserCreateReqVO reqVO) {
|
|||
|
|
// 业务逻辑
|
|||
|
|
UserDO user = UserConvert.INSTANCE.convert(reqVO);
|
|||
|
|
userMapper.insert(user);
|
|||
|
|
return user.getId();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public UserRespVO getUser(Long id) {
|
|||
|
|
UserDO user = userMapper.selectById(id);
|
|||
|
|
DeptDO dept = deptMapper.selectById(user.getDeptId());
|
|||
|
|
return UserConvert.INSTANCE.convert(user, dept);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### DAL 层
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@Mapper
|
|||
|
|
public interface UserMapper extends BaseMapperX<UserDO> {
|
|||
|
|
|
|||
|
|
default UserDO selectByUsername(String username) {
|
|||
|
|
return selectOne("username", username);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
default PageResult<UserDO> selectPage(UserPageReqVO pageReqVO) {
|
|||
|
|
return selectPage(pageReqVO, new LambdaQueryWrapperX<UserDO>()
|
|||
|
|
.likeIfPresent(UserDO::getUsername, pageReqVO.getUsername())
|
|||
|
|
.betweenIfPresent(UserDO::getCreateTime, pageReqVO.getCreateTime())
|
|||
|
|
.orderByDesc(UserDO::getId));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 模块化设计
|
|||
|
|
|
|||
|
|
### 模块划分
|
|||
|
|
|
|||
|
|
项目按照**领域驱动设计(DDD)**思想进行模块划分。
|
|||
|
|
|
|||
|
|
#### 基础模块
|
|||
|
|
|
|||
|
|
| 模块 | 职责 |
|
|||
|
|
|------|------|
|
|||
|
|
| lyzsys-dependencies | 依赖版本管理 |
|
|||
|
|
| lyzsys-framework | 框架组件封装 |
|
|||
|
|
| lyzsys-server | 应用启动入口 |
|
|||
|
|
|
|||
|
|
#### 业务模块
|
|||
|
|
|
|||
|
|
| 模块 | 领域 | 职责 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| lyzsys-module-system | 系统管理 | 用户、角色、菜单、部门、字典等 |
|
|||
|
|
| lyzsys-module-infra | 基础设施 | 代码生成、文件、配置、任务等 |
|
|||
|
|
| lyzsys-module-bpm | 工作流 | 流程定义、流程实例、任务管理 |
|
|||
|
|
| lyzsys-module-pay | 支付 | 支付订单、退款、回调 |
|
|||
|
|
| lyzsys-module-member | 会员 | 会员、积分、等级 |
|
|||
|
|
| lyzsys-module-mall | 商城 | 商品、订单、营销 |
|
|||
|
|
| lyzsys-module-crm | CRM | 客户、商机、合同 |
|
|||
|
|
| lyzsys-module-erp | ERP | 采购、销售、库存 |
|
|||
|
|
| lyzsys-module-ai | AI | AI 聊天、绘图、知识库 |
|
|||
|
|
| lyzsys-module-mp | 微信公众号 | 公众号管理、粉丝、消息 |
|
|||
|
|
| lyzsys-module-iot | IoT | 设备、产品、数据采集 |
|
|||
|
|
| lyzsys-module-report | 报表 | 报表设计、大屏设计 |
|
|||
|
|
|
|||
|
|
### 模块结构
|
|||
|
|
|
|||
|
|
每个业务模块都遵循统一的结构:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
lyzsys-module-xxx/
|
|||
|
|
├── api/ # 对外 API
|
|||
|
|
│ ├── xxxApi.java
|
|||
|
|
│ └── xxxApiImpl.java
|
|||
|
|
├── controller/ # 控制器
|
|||
|
|
│ ├── admin/ # 管理后台 API
|
|||
|
|
│ │ ├── xxxController.java
|
|||
|
|
│ │ └── vo/
|
|||
|
|
│ │ ├── xxxReqVO.java
|
|||
|
|
│ │ └── xxxRespVO.java
|
|||
|
|
│ └── app/ # 用户 App API
|
|||
|
|
│ └── xxxController.java
|
|||
|
|
├── service/ # 服务层
|
|||
|
|
│ ├── xxxService.java
|
|||
|
|
│ └── xxxServiceImpl.java
|
|||
|
|
├── dal/ # 数据访问层
|
|||
|
|
│ ├── dataobject/ # 数据对象
|
|||
|
|
│ │ └── xxxDO.java
|
|||
|
|
│ ├── mysql/ # MySQL Mapper
|
|||
|
|
│ │ └── xxxMapper.java
|
|||
|
|
│ └── redis/ # Redis DAO
|
|||
|
|
│ └── xxxRedisDAO.java
|
|||
|
|
├── convert/ # 对象转换
|
|||
|
|
│ └── xxxConvert.java
|
|||
|
|
├── enums/ # 枚举
|
|||
|
|
│ └── xxxEnum.java
|
|||
|
|
└── framework/ # 框架配置
|
|||
|
|
└── xxxConfiguration.java
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 模块交互
|
|||
|
|
|
|||
|
|
#### 模块间调用规则
|
|||
|
|
|
|||
|
|
1. **禁止直接依赖**: 模块之间不能直接依赖
|
|||
|
|
2. **通过 API 调用**: 通过 API 接口进行调用
|
|||
|
|
3. **事件驱动**: 通过消息队列进行异步通信
|
|||
|
|
|
|||
|
|
#### 示例
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// mall 模块调用 pay 模块
|
|||
|
|
@DubboReference
|
|||
|
|
private PayOrderApi payOrderApi;
|
|||
|
|
|
|||
|
|
public void createOrder(OrderCreateReqVO reqVO) {
|
|||
|
|
// 创建订单
|
|||
|
|
OrderDO order = createOrder(reqVO);
|
|||
|
|
|
|||
|
|
// 调用支付模块
|
|||
|
|
PayOrderCreateReqDTO payReq = new PayOrderCreateReqDTO();
|
|||
|
|
payReq.setOrderId(order.getId());
|
|||
|
|
payOrderApi.createOrder(payReq);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 数据架构
|
|||
|
|
|
|||
|
|
### 数据存储
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 数据层 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ MySQL │ │ Redis │ │ MinIO │ │
|
|||
|
|
│ │ (主数据库) │ │ (缓存) │ │ (文件存储) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 数据库设计
|
|||
|
|
|
|||
|
|
#### 表命名规范
|
|||
|
|
|
|||
|
|
- 格式: `{模块}_{业务}_{实体}`
|
|||
|
|
- 示例: `system_users`、`system_roles`、`mall_orders`
|
|||
|
|
|
|||
|
|
#### 字段命名规范
|
|||
|
|
|
|||
|
|
- 小写字母 + 下划线
|
|||
|
|
- 示例: `user_id`、`user_name`、`create_time`
|
|||
|
|
|
|||
|
|
#### 通用字段
|
|||
|
|
|
|||
|
|
每张表都包含以下通用字段:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
id BIGINT 主键
|
|||
|
|
create_time DATETIME 创建时间
|
|||
|
|
update_time DATETIME 更新时间
|
|||
|
|
creator VARCHAR(64) 创建人
|
|||
|
|
updater VARCHAR(64) 更新人
|
|||
|
|
deleted BIT 是否删除
|
|||
|
|
tenant_id BIGINT 租户 ID (多租户表)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 多租户数据隔离
|
|||
|
|
|
|||
|
|
#### 策略
|
|||
|
|
|
|||
|
|
- **共享数据库、共享 Schema**: 所有租户共享数据库,通过 `tenant_id` 隔离
|
|||
|
|
- **自动过滤**: MyBatis Plus 拦截器自动添加租户条件
|
|||
|
|
|
|||
|
|
#### 实现
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@TableName("system_users")
|
|||
|
|
public class UserDO extends TenantBaseDO {
|
|||
|
|
private Long id;
|
|||
|
|
private String username;
|
|||
|
|
// tenant_id 由 TenantBaseDO 提供
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 查询时自动过滤
|
|||
|
|
List<UserDO> users = userMapper.selectList();
|
|||
|
|
// SQL: SELECT * FROM system_users WHERE deleted = 0 AND tenant_id = ?
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 缓存设计
|
|||
|
|
|
|||
|
|
#### 缓存策略
|
|||
|
|
|
|||
|
|
1. **本地缓存**: Caffeine(本地缓存)
|
|||
|
|
2. **分布式缓存**: Redis(分布式缓存)
|
|||
|
|
|
|||
|
|
#### 缓存使用
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 使用 Spring Cache
|
|||
|
|
@Cacheable(value = "user", key = "#id")
|
|||
|
|
public UserDO getUser(Long id) {
|
|||
|
|
return userMapper.selectById(id);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用 RedisTemplate
|
|||
|
|
@Service
|
|||
|
|
public class UserServiceImpl {
|
|||
|
|
|
|||
|
|
@Autowired
|
|||
|
|
private RedisTemplate<String, UserDO> redisTemplate;
|
|||
|
|
|
|||
|
|
public UserDO getUser(Long id) {
|
|||
|
|
String key = "user:" + id;
|
|||
|
|
UserDO user = redisTemplate.opsForValue().get(key);
|
|||
|
|
|
|||
|
|
if (user == null) {
|
|||
|
|
user = userMapper.selectById(id);
|
|||
|
|
redisTemplate.opsForValue().set(key, user, 1, TimeUnit.HOURS);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return user;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 安全架构
|
|||
|
|
|
|||
|
|
### 认证授权
|
|||
|
|
|
|||
|
|
#### 认证流程
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
1. 用户登录
|
|||
|
|
↓
|
|||
|
|
2. 后端验证用户名密码
|
|||
|
|
↓
|
|||
|
|
3. 生成 JWT Token
|
|||
|
|
↓
|
|||
|
|
4. 返回 Token 给前端
|
|||
|
|
↓
|
|||
|
|
5. 前端存储 Token
|
|||
|
|
↓
|
|||
|
|
6. 后续请求携带 Token
|
|||
|
|
↓
|
|||
|
|
7. 后端验证 Token
|
|||
|
|
↓
|
|||
|
|
8. 允许访问
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 授权模型
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
用户 (User)
|
|||
|
|
↓
|
|||
|
|
角色 (Role)
|
|||
|
|
↓
|
|||
|
|
权限 (Permission)
|
|||
|
|
↓
|
|||
|
|
资源 (Resource)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 数据权限
|
|||
|
|
|
|||
|
|
#### 权限范围
|
|||
|
|
|
|||
|
|
| 权限范围 | 说明 |
|
|||
|
|
|---------|------|
|
|||
|
|
| 全部数据权限 | 查看所有数据 |
|
|||
|
|
| 本部门数据权限 | 只能查看本部门数据 |
|
|||
|
|
| 本部门及以下数据权限 | 查看本部门及子部门数据 |
|
|||
|
|
| 仅本人数据权限 | 只能查看自己的数据 |
|
|||
|
|
| 自定义数据权限 | 自定义数据权限规则 |
|
|||
|
|
|
|||
|
|
#### 实现
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
@DataScope(deptAlias = "d", userAlias = "u")
|
|||
|
|
public List<UserDO> getUserList() {
|
|||
|
|
return userMapper.selectList();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SQL 自动添加
|
|||
|
|
// AND (d.id = ? OR d.id IN (?, ?) OR u.id = ?)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### API 安全
|
|||
|
|
|
|||
|
|
#### 接口加密
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 请求加密
|
|||
|
|
@PostMapping("/create")
|
|||
|
|
public CommonResult<Long> createUser(@RequestBody String encryptedData) {
|
|||
|
|
// 解密
|
|||
|
|
String json = decrypt(encryptedData);
|
|||
|
|
UserCreateReqVO reqVO = JSON.parseObject(json, UserCreateReqVO.class);
|
|||
|
|
|
|||
|
|
// 业务处理
|
|||
|
|
Long id = userService.createUser(reqVO);
|
|||
|
|
|
|||
|
|
// 加密返回
|
|||
|
|
return success(encrypt(id));
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 接口签名
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 请求签名
|
|||
|
|
@PostMapping("/create")
|
|||
|
|
public CommonResult<Long> createUser(
|
|||
|
|
@RequestHeader("X-Signature") String signature,
|
|||
|
|
@RequestBody UserCreateReqVO reqVO
|
|||
|
|
) {
|
|||
|
|
// 验证签名
|
|||
|
|
if (!verifySignature(signature, reqVO)) {
|
|||
|
|
return error(401, "签名验证失败");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 业务处理
|
|||
|
|
return success(userService.createUser(reqVO));
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 技术架构
|
|||
|
|
|
|||
|
|
### 技术选型
|
|||
|
|
|
|||
|
|
#### 后端技术栈
|
|||
|
|
|
|||
|
|
| 技术 | 版本 | 用途 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| Spring Boot | 2.7.18 | 应用框架 |
|
|||
|
|
| Spring Security | 5.8.16 | 安全框架 |
|
|||
|
|
| MyBatis Plus | 3.5.15 | ORM 框架 |
|
|||
|
|
| Flowable | 6.8.0 | 工作流引擎 |
|
|||
|
|
| Quartz | 2.3.2 | 定时任务 |
|
|||
|
|
| Redisson | 3.52.0 | 分布式锁 |
|
|||
|
|
| Knife4j | 3.0.3 | API 文档 |
|
|||
|
|
|
|||
|
|
#### 前端技术栈
|
|||
|
|
|
|||
|
|
| 技术 | 版本 | 用途 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| Vue | 3.2+ | 前端框架 |
|
|||
|
|
| TypeScript | 4.x | 类型系统 |
|
|||
|
|
| Vite | 4.x | 构建工具 |
|
|||
|
|
| Element Plus | 2.x | UI 组件库 |
|
|||
|
|
| Pinia | 2.x | 状态管理 |
|
|||
|
|
|
|||
|
|
### 框架封装
|
|||
|
|
|
|||
|
|
#### Web 封装
|
|||
|
|
|
|||
|
|
- 全局异常处理
|
|||
|
|
- 统一响应格式
|
|||
|
|
- 请求日志记录
|
|||
|
|
- 参数校验
|
|||
|
|
|
|||
|
|
#### 安全封装
|
|||
|
|
|
|||
|
|
- JWT 认证
|
|||
|
|
- 权限注解
|
|||
|
|
- 数据权限
|
|||
|
|
- API 加密
|
|||
|
|
|
|||
|
|
#### 数据库封装
|
|||
|
|
|
|||
|
|
- BaseMapperX
|
|||
|
|
- LambdaQueryWrapperX
|
|||
|
|
- 分页插件
|
|||
|
|
- 租户插件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 部署架构
|
|||
|
|
|
|||
|
|
### 单机部署
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 服务器 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ Nginx │ │ JDK 8 │ │ MySQL │ │
|
|||
|
|
│ │ (前端) │ │ (后端) │ │ (数据库) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ Redis │ │ MinIO │ │
|
|||
|
|
│ │ (缓存) │ │ (文件存储) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 集群部署
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 负载均衡 │
|
|||
|
|
│ (Nginx / F5) │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
│ │ │
|
|||
|
|
▼ ▼ ▼
|
|||
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|||
|
|
│ 应用服务器 1 │ │ 应用服务器 2 │ │ 应用服务器 3 │
|
|||
|
|
│ (后端服务) │ │ (后端服务) │ │ (后端服务) │
|
|||
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|||
|
|
│ │ │
|
|||
|
|
└────────────────┼────────────────┘
|
|||
|
|
▼
|
|||
|
|
┌─────────────────┐
|
|||
|
|
│ MySQL 主从 │
|
|||
|
|
│ Redis 集群 │
|
|||
|
|
└─────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 容器化部署
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────────────────────────────────────────────────┐
|
|||
|
|
│ Kubernetes 集群 │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ Pod 1 │ │ Pod 2 │ │ Pod 3 │ │
|
|||
|
|
│ │ (后端服务) │ │ (后端服务) │ │ (后端服务) │ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|||
|
|
│ │ MySQL │ │ Redis │ │ MinIO │ │
|
|||
|
|
│ │ (StatefulSet)│ │ (StatefulSet)│ │ (Deployment)│ │
|
|||
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 性能优化
|
|||
|
|
|
|||
|
|
### 数据库优化
|
|||
|
|
|
|||
|
|
1. **索引优化**: 合理创建索引
|
|||
|
|
2. **SQL 优化**: 避免全表扫描
|
|||
|
|
3. **分页查询**: 使用分页插件
|
|||
|
|
4. **读写分离**: 主从数据库配置
|
|||
|
|
5. **连接池**: Druid 连接池优化
|
|||
|
|
|
|||
|
|
### 缓存优化
|
|||
|
|
|
|||
|
|
1. **本地缓存**: Caffeine 本地缓存
|
|||
|
|
2. **分布式缓存**: Redis 缓存
|
|||
|
|
3. **缓存预热**: 系统启动时加载热点数据
|
|||
|
|
4. **缓存更新**: 定时更新缓存
|
|||
|
|
|
|||
|
|
### 接口优化
|
|||
|
|
|
|||
|
|
1. **批量操作**: 批量插入、批量更新
|
|||
|
|
2. **异步处理**: 消息队列异步处理
|
|||
|
|
3. **接口合并**: 减少请求次数
|
|||
|
|
4. **压缩传输**: Gzip 压缩
|
|||
|
|
|
|||
|
|
### 前端优化
|
|||
|
|
|
|||
|
|
1. **代码分割**: 路由懒加载
|
|||
|
|
2. **资源压缩**: Gzip、Brotli 压缩
|
|||
|
|
3. **CDN 加速**: 静态资源 CDN
|
|||
|
|
4. **浏览器缓存**: 合理设置缓存策略
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 扩展性设计
|
|||
|
|
|
|||
|
|
### 水平扩展
|
|||
|
|
|
|||
|
|
1. **应用集群**: 多台应用服务器
|
|||
|
|
2. **数据库集群**: 主从、分库分表
|
|||
|
|
3. **缓存集群**: Redis 集群
|
|||
|
|
4. **文件存储**: 分布式文件系统
|
|||
|
|
|
|||
|
|
### 垂直扩展
|
|||
|
|
|
|||
|
|
1. **升级硬件**: CPU、内存、磁盘
|
|||
|
|
2. **优化配置**: JVM、数据库参数
|
|||
|
|
|
|||
|
|
### 微服务化
|
|||
|
|
|
|||
|
|
1. **模块拆分**: 按业务模块拆分
|
|||
|
|
2. **服务注册**: Nacos、Eureka
|
|||
|
|
3. **服务调用**: Dubbo、Feign
|
|||
|
|
4. **网关路由**: Spring Cloud Gateway
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**: v1.0.0
|
|||
|
|
**最后更新**: 2025-01-19
|
|||
|
|
**维护团队**: Lyzsys 架构团队
|