AuthController.php 4.4 KB

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