RoleController.php 4.2 KB

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