主题
基础
本文档将详细介绍 CatchAdmin 多租户系统的基础功能和使用方法,帮助您更好地理解和应用多租户架构。
日志系统
在多租户环境中,日志管理是一个重要的环节。为了清晰区分总后台(中央管理系统)和各个租户后台的运行情况,租户扩展模块对日志存储进行了合理的分割处理。
日志存储结构
总后台日志:
storage/logs
目录存储中央系统的所有运行日志,包括系统级别的操作记录、错误信息等。租户日志:
storage/logs/tenant-{uuid}
目录专门存储对应租户的运行日志,确保租户数据的隔离性。
其中 {uuid}
是系统分配给每个租户的唯一标识符,确保了日志的唯一性和可追溯性。这种结构设计使管理员能够轻松区分和查找特定租户的日志信息。
文件上传系统
多租户环境下,文件存储同样需要进行隔离管理。CatchAdmin 专业版提供了完善的文件上传和存储机制,确保不同租户的文件互不干扰。
上传磁盘类型
目前专业版本地上传系统配置了三个独立的上传磁盘,各自承担不同的存储职责:
uploads
: 主要用于上传业务相关的文件和图片,如用户头像、产品图片等。static
: 专门用于存储静态资源文件,如 CSS、JavaScript、字体文件等。certs
: 用于安全存储证书相关文件,如 SSL 证书、API 密钥等敏感资料。
存储目录结构
文件存储的目录结构设计与日志系统类似,采用了清晰的层级划分:
- 总后台文件:
storage/uploads
目录存储中央系统的所有上传文件。 - 租户文件:
storage/uploads/tenant-{uuid}
目录存储特定租户的上传文件。
这种结构设计不仅保证了数据隔离,还便于系统进行文件管理和维护。同样的结构也适用于 static
和 certs
磁盘。
命令系统
在多租户架构中,命令执行是一个需要特别关注的环节。默认情况下,Artisan 命令只会在主后台(中央系统)中执行,这对于系统级别的操作是合适的。
多租户命令执行
然而,在某些场景下,您可能需要让命令在所有租户环境中执行,例如:
- 数据同步任务
- 定时清理作业
- 批量数据处理
- 系统通知发送
这时,您需要创建一个继承自 TenancyCommand
的命令类,系统将自动处理多租户环境下的命令执行逻辑。
示例代码
以下是创建一个多租户命令的示例:
php
use CatchTenant\Commands\TenancyCommand;
class TestCommand extends TenancyCommand
{
/**
* 命令签名
*
* @var string
*/
protected $signature = 'test';
/**
* 命令描述
*
* @var string
*/
protected $description = '测试命令 - 在所有租户环境中执行';
/**
* 命令处理逻辑
*
* @return void
*/
public function handle(): void
{
// 此处的代码将在每个租户环境中分别执行
// 可以通过 $this->tenant 获取当前租户信息
$this->info('正在租户 [' . $this->tenant->id . '] 环境中执行命令');
// 执行租户特定的业务逻辑
// ...
}
}
注册与调用
创建命令后,需要在 app/Console/Kernel.php
中注册该命令,然后可以通过以下方式调用:
bash
php artisan test
系统将自动遍历所有租户并在每个租户的环境中执行该命令。