RoleController.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\Admin\RoleRequest;
  5. use Exception;
  6. use Illuminate\Contracts\View\View;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Http\RedirectResponse;
  9. use Log;
  10. use Spatie\Permission\Models\Permission;
  11. use Spatie\Permission\Models\Role;
  12. class RoleController extends Controller
  13. {
  14. public function index(): View
  15. {
  16. // 预加载角色权限,但只选择需要的字段
  17. $roles = Role::with('permissions:description,name')->paginate(15);
  18. // 预先处理权限描述,避免在 Blade 模板中重复处理
  19. $processedRoles = $roles->through(function ($role) {
  20. if ($role->name !== 'Super Admin') {
  21. // 提前获取权限描述集合,避免在模板中重复调用
  22. $role->permission_descriptions = $role->permissions->pluck('description');
  23. }
  24. return $role;
  25. });
  26. return view('admin.role.index', ['roles' => $processedRoles]);
  27. }
  28. public function store(RoleRequest $request): RedirectResponse
  29. {
  30. try {
  31. $role = Role::create($request->only(['name', 'description']));
  32. if ($role) {
  33. $permissions = $request->input('permissions') ?? [];
  34. if (! empty($permissions)) {
  35. $role->givePermissionTo($permissions);
  36. }
  37. return redirect()->route('admin.role.edit', $role)->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')]));
  38. }
  39. } catch (Exception $e) {
  40. Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('model.role.attribute')]).': '.$e->getMessage());
  41. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')]).', '.$e->getMessage());
  42. }
  43. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')]));
  44. }
  45. public function create(): View
  46. {
  47. return view('admin.role.info', ['permissions' => Permission::orderBy('name')->pluck('description', 'name')]);
  48. }
  49. public function edit(Role $role): View
  50. {
  51. $role->load('permissions:name');
  52. return view('admin.role.info', [
  53. 'role' => array_merge(
  54. $role->toArray(),
  55. ['permissions' => $role->permissions->pluck('name')->toArray()]
  56. ),
  57. 'permissions' => Permission::orderBy('name')->pluck('description', 'name'),
  58. ]);
  59. }
  60. public function update(RoleRequest $request, Role $role): RedirectResponse
  61. {
  62. if ($role->name === 'Super Admin') {
  63. return redirect()->back()->withInput()->withErrors(trans('admin.role.modify_admin_error'));
  64. }
  65. try {
  66. if ($role->update($request->only(['name', 'description']))) {
  67. $role->syncPermissions($request->input('permissions', []));
  68. return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')]));
  69. }
  70. } catch (Exception $e) {
  71. Log::error(trans('common.error_action_item', ['action' => trans('common.edit'), 'attribute' => trans('model.role.attribute')]).': '.$e->getMessage());
  72. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')]).', '.$e->getMessage());
  73. }
  74. return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')]));
  75. }
  76. public function destroy(Role $role): JsonResponse
  77. {
  78. try {
  79. if ($role->name === 'Super Admin') {
  80. return response()->json(['status' => 'fail', 'message' => trans('admin.role.modify_admin_error')]);
  81. }
  82. $role->delete();
  83. } catch (Exception $e) {
  84. Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.role.attribute')]).': '.$e->getMessage());
  85. return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]);
  86. }
  87. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]);
  88. }
  89. }