RoleController.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\Role\CreateOrUpdateRequest;
  5. use App\Http\Resources\API\MenuResource;
  6. use App\Http\Resources\API\RoleResource;
  7. use App\Http\Resources\API\RoleSimpleResource;
  8. use App\Models\Menu;
  9. use App\Models\Role;
  10. use Illuminate\Http\Request;
  11. class RoleController extends Controller
  12. {
  13. /**
  14. * Display a listing of the resource.
  15. */
  16. public function index(Request $request)
  17. {
  18. $roles = Role::query()->filter($request->all())->get();
  19. return RoleResource::collection($roles);
  20. }
  21. /**
  22. * Display a listing of the resource.
  23. */
  24. public function publicSearch(Request $request)
  25. {
  26. $roles = Role::query()->filter($request->all())->get();
  27. return RoleSimpleResource::collection($roles);
  28. }
  29. /**
  30. * Store a newly created resource in storage.
  31. */
  32. public function store(CreateOrUpdateRequest $request)
  33. {
  34. Role::create([
  35. ...$request->only(['name', 'description']),
  36. 'guard_name' => 'api',
  37. ]);
  38. return $this->created();
  39. }
  40. /**
  41. * Display the specified resource.
  42. */
  43. public function show(string $id)
  44. {
  45. //
  46. $role=Role::query()->findOrFail($id);
  47. return new RoleResource($role);
  48. }
  49. /**
  50. * Update the specified resource in storage.
  51. */
  52. public function update(CreateOrUpdateRequest $request, string $id)
  53. {
  54. $role = Role::query()->findOrFail($id);
  55. $role->update($request->only([
  56. 'name', 'description'
  57. ]));
  58. return $this->noContent();
  59. }
  60. /**
  61. * Remove the specified resource from storage.
  62. */
  63. public function destroy(string $id)
  64. {
  65. Role::destroy($id);
  66. return $this->noContent();
  67. }
  68. public function permissions(string $id)
  69. {
  70. $role = Role::query()->findOrFail($id);
  71. return $this->success([
  72. 'data' => $role->permissions?->pluck('name'),
  73. ]);
  74. }
  75. public function assignPermissions(string $id, Request $request)
  76. {
  77. $role = Role::query()->findOrFail($id);
  78. $role->syncPermissions($request->input('permissions', []));
  79. return $this->noContent();
  80. }
  81. public function menus(string $id)
  82. {
  83. $role = Role::query()->findOrFail($id);
  84. $menus = Menu::query()->where("group", \request("group", "web"))
  85. ->get();
  86. $rolePermission=$role->permissions->pluck('name')->toArray();
  87. $flattenedPaths = [];
  88. foreach ($menus as $index=> $menu) {
  89. if(in_array($menu->permission,$rolePermission)){
  90. $individualPaths = explode(',', $menu->path);
  91. $flattenedPaths = array_merge($flattenedPaths, $individualPaths);
  92. }
  93. }
  94. $roleHasMenu=Menu::query()->whereIn('id',$flattenedPaths)->get();
  95. return MenuResource::collection($roleHasMenu);
  96. }
  97. public function assignMenusPermissions(string $id, Request $request)
  98. {
  99. $role = Role::query()->findOrFail($id);
  100. //获取菜单所有权限
  101. $menusPermission=Menu::query()->where("group", \request("group", "web"))->pluck('permission')->toArray();
  102. //通过获取用户拥有的菜单权限
  103. $roleMenusPermissions=$role->permissions->filter(function ($permission) use ($menusPermission) {
  104. return in_array($permission->name, $menusPermission);
  105. })->pluck('name')->toArray();
  106. $permissions=$request->input('permissions');
  107. // 找出需要新增的权限
  108. $extraPermissions = array_diff($permissions, $roleMenusPermissions);
  109. if(!empty($extraPermissions)&&count($extraPermissions)!=0){
  110. foreach ($extraPermissions as $extraPermission){
  111. $role->givePermissionTo($extraPermission);
  112. }
  113. }
  114. // 找出需要剔除的权限
  115. $missingPermissions = array_diff($roleMenusPermissions, $permissions);
  116. if(!empty($missingPermissions)&&count($missingPermissions)!=0){
  117. foreach ($missingPermissions as $missingPermission){
  118. $role->revokePermissionTo($missingPermission);
  119. }
  120. }
  121. return $this->noContent();
  122. }
  123. }