fix(权限): 修复权限编辑时的自动勾选显示问题

问题:
- 使用 Tabs 组件时,每个 Tab 中的 CheckboxList 都使用相同的字段名 'permissions'
- 导致字段冲突,无法正确加载和保存已有权限

解决方案:
- 为每个模块使用唯一的字段名(permissions_document, permissions_user 等)
- 添加 afterStateHydrated 钩子,在编辑时自动加载该模块的已有权限
- 添加隐藏字段 all_permissions 收集所有模块的权限
- 在 mutateFormDataBeforeSave/mutateFormDataBeforeCreate 中处理权限数据
- 在 afterSave/afterCreate 中使用 syncPermissions 同步权限到数据库

改进:
- RoleResource: 编辑角色时,每个模块的权限会自动勾选显示
- UserResource: 编辑用户时,直接权限会自动勾选显示
- 保存时正确收集所有模块的权限并同步到数据库
- super-admin 角色的权限字段保持禁用状态

现在编辑角色或用户时,已有的权限会正确显示为勾选状态
This commit is contained in:
2026-03-11 10:25:43 +08:00
parent 788101d21f
commit 3e7083d7c1
6 changed files with 178 additions and 6 deletions

View File

@@ -87,9 +87,8 @@ class RoleResource extends Resource
$tabs[] = Forms\Components\Tabs\Tab::make($config['name'])
->icon($config['icon'])
->schema([
Forms\Components\CheckboxList::make('permissions')
Forms\Components\CheckboxList::make("permissions_{$module}")
->label('')
->relationship('permissions', 'name')
->options($options)
->columns(2)
->bulkToggleable()
@@ -98,7 +97,18 @@ class RoleResource extends Resource
$record?->name === 'super-admin'
? 'super-admin 角色拥有所有权限,不可修改'
: '选择该模块的权限'
),
)
->afterStateHydrated(function ($component, $state, ?Role $record) use ($module) {
if ($record) {
// 获取该角色在当前模块的权限
$modulePermissions = $record->permissions()
->where('name', 'like', "{$module}.%")
->pluck('name')
->toArray();
$component->state($modulePermissions);
}
})
->dehydrated(false), // 不直接保存,在下面统一处理
]);
}
@@ -137,6 +147,24 @@ class RoleResource extends Resource
Forms\Components\Section::make('权限配置')
->schema([
Forms\Components\Hidden::make('all_permissions')
->afterStateHydrated(function ($component, ?Role $record) {
if ($record) {
$component->state($record->permissions->pluck('name')->toArray());
}
})
->dehydrateStateUsing(function ($state, $get) {
// 收集所有模块的权限
$allPermissions = [];
$modules = ['document', 'system-setting', 'activity-log', 'terminal', 'sop-template', 'group', 'user', 'role'];
foreach ($modules as $module) {
$modulePermissions = $get("permissions_{$module}") ?? [];
$allPermissions = array_merge($allPermissions, $modulePermissions);
}
return $allPermissions;
}),
Forms\Components\Tabs::make('权限分组')
->tabs(self::getPermissionTabs())
->columnSpanFull(),