find($userId); if (!$user) { return collect(); } // 合并:角色资源 + 用户直接资源 $all = collect(); foreach ($user->roles as $role) { $all = $all->merge($role->resources); } $all = $all->merge($user->resources); $unique = $all->unique('id')->values(); Cache::set($cacheKey, $unique, 3600); return $unique; } /** * 构建目录/菜单树,并给每个菜单节点挂载权限列表和打开方式 */ public static function getMenuTree(int $userId): array { $resources = self::getUserResources($userId); $menus = $resources ->filter(fn($r) => in_array($r->type, ['directory','menu'])) ->values(); return self::buildTree($menus, $resources); } protected static function buildTree($nodes, $allResources, int $parentId = 0): array { $tree = []; foreach ($nodes as $node) { if ($node->parent_id !== $parentId) continue; // 子节点 $children = self::buildTree($nodes, $allResources, $node->id); // 本级权限列表 $authList = $allResources ->filter(fn($r) => $r->type === 'permission' && $r->parent_id === $node->id) ->map(fn($r) => [ 'id' => $r->id, 'title' => $r->name, 'auth_mark' => $r->code, ])->values()->all(); $tree[] = [ 'id' => $node->id, 'name' => $node->name, 'path' => $node->url, 'meta' => [ 'title' => $node->name, 'icon' => $node->icon, 'keepAlive' => true, 'authList' => $authList, // 新增打开方式字段 'openType' => $node->open_type, // 'internal' | 'external' | 'iframe' ], 'children' => $children, ]; } return $tree; } /** * 获取用户所有权限 code(仅 type=permission) */ public static function getPermissionCodes(int $userId): array { return self::getUserResources($userId) ->filter(fn($res) => $res->type === 'permission') ->pluck('code') ->unique() ->values() ->all(); } /** 清除缓存(角色/资源变更时调用) */ public static function clearCache(int $userId): void { Cache::delete(self::cacheKey($userId)); } public function login(array $data): array { $loginType = $data['login_type'] ?? 'upwd'; $logic = new AuthLogic(); return match ($loginType) { 'feishu' => $logic->feishuLogin($data), 'qrcode' => $logic->qrCodeLogin($data), default => $logic->uPwdLogin($data), }; } /** * 用户注册 * * @param array $data * @return User */ public function register(array $data): User { return (new AuthLogic())->register($data); } public function verifyToken(string $token): array { return (new AuthLogic())->verifyToken($token); } public function refreshToken(string $refreshToken): array { return (new AuthLogic())->refreshToken($refreshToken); } public function logout(?string $token) { (new AuthLogic())->logout($token); } public function blockToken(string $token) { (new AuthLogic())->blockToken($token); } }