AuthController.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. /**
  3. * @Name
  4. * @Description
  5. * @Author 刘学玺
  6. * @Date 2024/8/23 10:15
  7. */
  8. namespace App\Http\Controllers\Backend\Server\System;
  9. use App\Enums\System\MenuType;
  10. use App\Exceptions\ApiException;
  11. use App\Http\Controllers\Controller;
  12. use App\Http\Requests\Backend\Server\System\AuthRequest;
  13. use App\Http\Services\Backend\Server\System\AuthService;
  14. use App\Models\System\Menu;
  15. use App\Models\System\Role;
  16. use App\Models\System\User;
  17. use Illuminate\Http\JsonResponse;
  18. use Illuminate\Support\Arr;
  19. use Illuminate\Support\Facades\Auth;
  20. use Illuminate\Support\Str;
  21. use function PHPUnit\Framework\isEmpty;
  22. class AuthController extends Controller
  23. {
  24. /**
  25. * @throws ApiException
  26. */
  27. public function login(AuthRequest $request): JsonResponse
  28. {
  29. // 处理首页逻辑
  30. $res = (new AuthService())->login($request);
  31. return self::success($res);
  32. }
  33. public function getPermissionInfo()
  34. {
  35. $permissionInfo = ['user' => null, 'roles' => ['common'], 'permissions' => [], 'menus' => []];
  36. // 1.1 获得用户信息
  37. $user = User::query()->find(Auth::id());
  38. if (!$user || $user['status'] !== 0) return self::success($permissionInfo);
  39. $permissionInfo['user'] = $user->only(['id', 'nickname', 'avatar']);
  40. // 1.2 获得角色列表
  41. $roles = $user->roles()->where('status', 0)->get();
  42. if (empty($roles)) return self::success($permissionInfo);
  43. $permissionInfo['roles'] = [...$permissionInfo['roles'], ...$roles->pluck('code')->toArray()];
  44. // 1.3 获得菜单列表
  45. $menus = Role::getMenus($roles->pluck('id')->all());
  46. if ($menus->isEmpty()) return self::success($permissionInfo);
  47. $permissionInfo['menus'] = self::buildMenuTree($menus->toArray());
  48. // 权限标识信息
  49. $permissions = $user->getAllPermissions()->whereIn('pivot.role_id', $roles->pluck('id'))->pluck('name');
  50. $permissionInfo['permissions'] = $permissions;
  51. return self::success($permissionInfo);
  52. }
  53. protected static function buildMenuTree(array $menuList)
  54. {
  55. $menuList = collect($menuList)->filter(fn($item) => $item->type !== MenuType::BUTTON);
  56. // 排序,保证菜单的有序性
  57. $menuList = $menuList->sortBy('sort');
  58. // 构建菜单树
  59. $menuMap = collect([]);
  60. $menuList->map(function ($value) use (&$menuMap) {
  61. $menuMap[$value->id] = [
  62. "id" => $value->id,
  63. "parentId" => $value->parent_id,
  64. "name" => $value->name,
  65. "path" => $value->path,
  66. "component" => $value->component,
  67. "componentName" => $value->component_name,
  68. "icon" => $value->icon,
  69. "visible" => !!$value->visible,
  70. "keepAlive" => !!$value->keep_alive,
  71. "alwaysShow" => !!$value->always_show,
  72. "children" => null
  73. ];
  74. });
  75. $menuMap->filter(fn($node) => $node['parentId'] !== 0)->each(function ($childNode) use (&$menuMap) {
  76. // 获得父节点
  77. $isExistKey = $menuMap->has($childNode['parentId']);
  78. if (!$isExistKey) {
  79. // LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]",
  80. // childNode.getId(), childNode.getParentId());
  81. return;
  82. }
  83. $parentNode = $menuMap[$childNode['parentId']];
  84. // 将自己添加到父节点中
  85. if (!isset($parentNode['children'])) $parentNode['children'] = [];
  86. $parentNode['children'][] = $childNode;
  87. $menuMap[$childNode['parentId']] = $parentNode;
  88. $menuMap->forget($childNode['id']);
  89. });
  90. // 获得到所有的根节点
  91. return array_values($menuMap->all());
  92. }
  93. }