主题
基础
本文档将详细介绍 CatchAdmin 多租户系统的基础功能和使用方法,帮助您更好地理解和应用多租户架构。
日志系统
在多租户环境中,日志管理是一个重要的环节。为了清晰区分总后台(中央管理系统)和各个租户后台的运行情况,租户扩展模块对日志存储进行了合理的分割处理。
日志存储结构
总后台日志:
storage/logs目录存储中央系统的所有运行日志,包括系统级别的操作记录、错误信息等。租户日志:
storage/logs/tenant-{uuid}目录专门存储对应租户的运行日志,确保租户数据的隔离性。
其中 {uuid} 是系统分配给每个租户的唯一标识符,确保了日志的唯一性和可追溯性。这种结构设计使管理员能够轻松区分和查找特定租户的日志信息。
后台提供租户日志查看器,可按租户选择对应日志文件并直接查看内容,便于排查单个租户的运行问题。
租户生命周期
多租户后台支持对租户进行完整的生命周期管理:
- 创建租户:为租户分配套餐、域名和数据库配置
- 续期:更新租户到期时间
- 改套餐:同步新的套餐权限
- 停用:暂停租户访问并记录停用原因
- 恢复:恢复租户访问状态
订阅类型
- 一年期:未填写到期时间时,系统按创建时间自动计算一年有效期
- 自定义到期时间:由管理员指定具体到期日期
- 永久:长期有效,不受结束日期限制
到期状态
后台会根据订阅信息展示租户当前状态:
- 正常
- 即将到期:到期前 7 天内
- 已到期
- 永久
操作记录
租户操作记录会保留关键管理动作,包括创建、编辑、续期、改套餐、停用和恢复。记录内容包含操作类型、操作人、时间、原因、备注,以及变更前后的核心数据,便于后续追溯。
文件上传系统
多租户环境下,文件存储同样需要进行隔离管理。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系统将自动遍历所有租户并在每个租户的环境中执行该命令。
后台运维能力
除基础隔离能力外,后台还提供以下运维入口:
- 日志查看:按租户查看独立日志目录下的日志文件
- 队列监控:查看中央队列和租户队列的运行记录
- 调度任务监控:查看租户调度任务及其执行日志