feat: 添加管理员权限管理功能,更新 AdminUser 模型以支持权限加载,扩展 API 路由以管理后台用户及其权限

This commit is contained in:
2026-05-11 17:54:45 +08:00
parent 7e96c01da1
commit 3c92bef774
8 changed files with 356 additions and 31 deletions

View File

@@ -49,10 +49,21 @@ class AdminUser extends Authenticatable
);
}
/** @return BelongsToMany<AdminPermission, AdminUser> */
public function permissions(): BelongsToMany
{
return $this->belongsToMany(
AdminPermission::class,
'admin_user_permissions',
'admin_user_id',
'permission_id',
);
}
/** 是否具备指定权限(含 `super_admin` 角色全放行)。 */
public function hasAdminPermission(string $slug): bool
{
$this->loadMissing(['roles.permissions']);
$this->loadMissing(['roles.permissions', 'permissions']);
foreach ($this->roles as $role) {
if ($role->slug === self::ROLE_SUPER_ADMIN) {
@@ -65,6 +76,12 @@ class AdminUser extends Authenticatable
}
}
foreach ($this->permissions as $permission) {
if ($permission->slug === $slug) {
return true;
}
}
return false;
}
@@ -73,7 +90,7 @@ class AdminUser extends Authenticatable
*/
public function adminPermissionSlugs(): array
{
$this->loadMissing(['roles.permissions']);
$this->loadMissing(['roles.permissions', 'permissions']);
if ($this->roles->contains('slug', self::ROLE_SUPER_ADMIN)) {
return AdminPermission::query()->orderBy('slug')->pluck('slug')->all();
}
@@ -84,7 +101,24 @@ class AdminUser extends Authenticatable
$out[$permission->slug] = true;
}
}
foreach ($this->permissions as $permission) {
$out[$permission->slug] = true;
}
return array_keys($out);
}
/**
* @return list<string>
*/
public function adminRoleSlugs(): array
{
$this->loadMissing('roles');
return $this->roles
->pluck('slug')
->filter(static fn ($slug): bool => is_string($slug) && $slug !== '')
->values()
->all();
}
}