login($request); return self::success($res); } public function getPermissionInfo() { $permissionInfo = ['user' => null, 'roles' => ['common'], 'permissions' => [], 'menus' => []]; // 1.1 获得用户信息 $user = User::query()->find(Auth::id()); if (!$user || $user['status'] !== 0) return self::success($permissionInfo); $permissionInfo['user'] = $user->only(['id', 'nickname', 'avatar']); // 1.2 获得角色列表 $roles = $user->roles()->where('status', 0)->get(); if (empty($roles)) return self::success($permissionInfo); $permissionInfo['roles'] = [...$permissionInfo['roles'], ...$roles->pluck('code')->toArray()]; // 1.3 获得菜单列表 $menus = Role::getMenus($roles->pluck('id')->all()); if ($menus->isEmpty()) return self::success($permissionInfo); $permissionInfo['menus'] = self::buildMenuTree($menus->toArray()); // 权限标识信息 $permissions = $user->getAllPermissions()->whereIn('pivot.role_id', $roles->pluck('id'))->pluck('name'); $permissionInfo['permissions'] = $permissions; return self::success($permissionInfo); } protected static function buildMenuTree(array $menuList) { $menuList = collect($menuList)->filter(fn($item) => $item->type !== MenuType::BUTTON); // 排序,保证菜单的有序性 $menuList = $menuList->sortBy('sort'); // 构建菜单树 $menuMap = collect([]); $menuList->map(function ($value) use (&$menuMap) { $menuMap[$value->id] = [ "id" => $value->id, "parentId" => $value->parent_id, "name" => $value->name, "path" => $value->path, "component" => $value->component, "componentName" => $value->component_name, "icon" => $value->icon, "visible" => !!$value->visible, "keepAlive" => !!$value->keep_alive, "alwaysShow" => !!$value->always_show, "children" => null ]; }); $menuMap->filter(fn($node) => $node['parentId'] !== 0)->each(function ($childNode) use (&$menuMap) { // 获得父节点 $isExistKey = $menuMap->has($childNode['parentId']); if (!$isExistKey) { // LoggerFactory.getLogger(getClass()).error("[buildRouterTree][resource({}) 找不到父资源({})]", // childNode.getId(), childNode.getParentId()); return; } $parentNode = $menuMap[$childNode['parentId']]; // 将自己添加到父节点中 if (!isset($parentNode['children'])) $parentNode['children'] = []; $parentNode['children'][] = $childNode; $menuMap[$childNode['parentId']] = $parentNode; $menuMap->forget($childNode['id']); }); // 获得到所有的根节点 return array_values($menuMap->all()); } }