Files
KnowledgeBase/app/Filament/Resources/UserResource/Pages/ViewUser.php
lizhuoran dfe0ff42bc feat(权限): 实现用户权限管理功能
- 更新 UserResource 添加角色和权限管理
  - 添加角色选择字段(多选)
  - 添加直接权限配置(按模块分组的复选框列表)
  - 在用户列表中显示角色和权限数量
  - 添加角色筛选器
  - 防止删除超级管理员
- 创建 ViewUser 页面显示用户详细权限信息
  - 显示所有权限(角色权限 + 直接权限)
  - 按模块分组展示权限
  - 区分显示直接权限
- 创建 UserPolicy 控制用户管理权限
  - 基于 user.* 权限控制访问
  - 保护超级管理员不被编辑和删除
  - 防止用户删除自己
- 在 AppServiceProvider 中注册 UserPolicy
2026-03-11 10:03:21 +08:00

164 lines
7.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Filament\Resources\UserResource\Pages;
use App\Filament\Resources\UserResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
use Filament\Infolists;
use Filament\Infolists\Infolist;
class ViewUser extends ViewRecord
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make()
->label('编辑'),
];
}
public function infolist(Infolist $infolist): Infolist
{
return $infolist
->schema([
Infolists\Components\Section::make('基本信息')
->schema([
Infolists\Components\TextEntry::make('name')
->label('用户名称'),
Infolists\Components\TextEntry::make('email')
->label('邮箱'),
Infolists\Components\TextEntry::make('created_at')
->label('创建时间')
->dateTime('Y-m-d H:i:s'),
Infolists\Components\TextEntry::make('updated_at')
->label('更新时间')
->dateTime('Y-m-d H:i:s'),
])
->columns(2),
Infolists\Components\Section::make('角色信息')
->schema([
Infolists\Components\TextEntry::make('roles.name')
->label('已分配角色')
->badge()
->color(fn (string $state): string => match ($state) {
'super-admin' => 'danger',
'admin' => 'warning',
'user' => 'success',
default => 'gray',
})
->formatStateUsing(fn (string $state): string => match ($state) {
'super-admin' => '超级管理员',
'admin' => '管理员',
'user' => '普通用户',
default => $state,
})
->placeholder('未分配角色'),
]),
Infolists\Components\Section::make('分组信息')
->schema([
Infolists\Components\TextEntry::make('groups.name')
->label('所属分组')
->badge()
->placeholder('未加入任何分组'),
]),
Infolists\Components\Section::make('权限详情')
->description('显示用户拥有的所有权限(包括角色权限和直接权限)')
->schema([
Infolists\Components\TextEntry::make('all_permissions')
->label('所有权限')
->state(function ($record) {
// 获取所有权限(角色权限 + 直接权限)
$permissions = $record->getAllPermissions();
if ($permissions->isEmpty()) {
return '无权限';
}
// 按模块分组
$grouped = $permissions->groupBy(function ($permission) {
return explode('.', $permission->name)[0];
});
$moduleNames = [
'document' => '文档管理',
'sop' => 'SOP模板',
'terminal' => '终端管理',
'user' => '用户管理',
'role' => '角色管理',
'group' => '分组管理',
'system' => '系统设置',
'activity' => '操作日志',
];
$actionNames = [
'view' => '查看',
'create' => '创建',
'update' => '编辑',
'delete' => '删除',
'export' => '导出',
'import' => '导入',
'publish' => '发布',
'archive' => '归档',
'download' => '下载',
'sync' => '同步',
];
$result = [];
foreach ($grouped as $module => $perms) {
$moduleName = $moduleNames[$module] ?? $module;
$actions = $perms->map(function ($perm) use ($actionNames) {
$parts = explode('.', $perm->name);
$action = $parts[1] ?? '';
return $actionNames[$action] ?? $action;
})->join('、');
$result[] = "{$moduleName}{$actions}";
}
return implode("\n", $result);
})
->columnSpanFull()
->placeholder('无权限'),
Infolists\Components\TextEntry::make('direct_permissions')
->label('直接权限')
->state(function ($record) {
$permissions = $record->permissions;
if ($permissions->isEmpty()) {
return '无直接权限';
}
$actionNames = [
'view' => '查看',
'create' => '创建',
'update' => '编辑',
'delete' => '删除',
'export' => '导出',
'import' => '导入',
'publish' => '发布',
'archive' => '归档',
'download' => '下载',
'sync' => '同步',
];
return $permissions->map(function ($perm) use ($actionNames) {
$parts = explode('.', $perm->name);
$action = $parts[1] ?? '';
return $actionNames[$action] ?? $action;
})->join('、');
})
->badge()
->color('info')
->columnSpanFull()
->placeholder('无直接权限'),
]),
]);
}
}