# 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 架构团队
