From cf6fc7033a1076aff068c353e75eb7487196ae6e Mon Sep 17 00:00:00 2001 From: mzl92 Date: Fri, 25 Jul 2025 18:10:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=BB=91=E5=AE=9A=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/controller/UserController.php | 3 +- app/common/logic/AuthLogic.php | 43 +++++++++++++++++++++++- app/common/logic/PermLogic.php | 14 +++++--- app/common/service/AuthService.php | 2 +- app/common/service/PermService.php | 12 +++---- app/common/service/UserService.php | 6 ++-- 6 files changed, 63 insertions(+), 17 deletions(-) diff --git a/app/common/controller/UserController.php b/app/common/controller/UserController.php index 2a22145..d725166 100644 --- a/app/common/controller/UserController.php +++ b/app/common/controller/UserController.php @@ -15,7 +15,8 @@ class UserController extends BaseController { try { $uid = $request->user->uid; - $result = (new UserService())->getUserInfo($uid); + $systemCode = $request->system_code; + $result = (new UserService())->getUserInfo($uid, $systemCode); return $this->success($result, '获取用户信息'); } catch (\Throwable $e) { return $this->error($e->getMessage()); diff --git a/app/common/logic/AuthLogic.php b/app/common/logic/AuthLogic.php index ccdbf16..e6022f3 100644 --- a/app/common/logic/AuthLogic.php +++ b/app/common/logic/AuthLogic.php @@ -4,6 +4,7 @@ namespace app\common\logic; use app\common\model\Corp; use app\common\model\CorpFeishuApp; +use app\common\model\Resource; use app\common\model\UserTokenLog; use app\common\model\Systems; use app\common\model\User; @@ -140,6 +141,7 @@ class AuthLogic $payload = $this->buildJwtPayload($user, $system); $token = $this->generateAccessToken($payload); $refreshToken = $this->generateRefreshToken($user->id, $data['system_code']); + $homeUrl = $this->getHome($system->id); // 记录 token 到 Redis 和 MySQL $this->recordUserToken($user->id, $token, $data['system_code']); @@ -150,7 +152,8 @@ class AuthLogic 'expires_in' => config('jwt.jwt_expiration'), 'system_code' => $data['system_code'], 'corp_abbr' => $data['corp_abbr'], - 'login_type' => $data['login_type'] + 'login_type' => $data['login_type'], + 'home_url' => $homeUrl, // 'payload' => $payload, ]; } @@ -500,4 +503,42 @@ class AuthLogic Redis::del("user_token_meta:{$token}"); UserTokenLog::where('token', $token)->update(['is_valid'=>0]); } + + + public function getHome($systemId) + { + $info = Resource::where('system_id', $systemId) + ->where('is_home', 1) + ->first(); + + if (!$info) { + return '/dashboard/console'; + } + + // 递归拼接 URL + $url = $this->buildParentUrl($info); + + return $url ?: '/dashboard/console'; + } + + /** + * 递归构建父级 URL + * @param Resource $resource + * @return string + */ + protected function buildParentUrl(Resource $resource) + { + $url = $resource->url ?? ''; + + // 如果存在父级,则递归拼接 + if ($resource->parent_id != 0) { + $parent = Resource::find($resource->parent_id); + if ($parent) { + $parentUrl = $this->buildParentUrl($parent); + $url = $parentUrl . ($url ? '/' . ltrim($url, '/') : ''); + } + } + + return $url; + } } \ No newline at end of file diff --git a/app/common/logic/PermLogic.php b/app/common/logic/PermLogic.php index 0977a4f..fbd5218 100644 --- a/app/common/logic/PermLogic.php +++ b/app/common/logic/PermLogic.php @@ -4,14 +4,17 @@ namespace app\common\logic; use app\common\model\User; use app\common\model\Resource; +use app\common\model\Systems; class PermLogic { /** * 获取用户所有资源(合并角色+直接分配),并加入公共菜单,排序按sort字段 */ - public function getUserResources(int $userId) + public function getUserResources(int $userId, string $systemCode) { + $system = Systems::where('code', $systemCode)->first(); + // 获取用户及其关联角色资源和直接分配的资源 $user = User::with(['roles.resources', 'resources'])->find($userId); @@ -24,9 +27,10 @@ class PermLogic // 合并角色资源,排除不需要权限认证的资源 foreach ($user->roles as $role) { $all = $all->merge( - $role->resources->filter(function ($resource) { + $role->resources->filter(function ($resource) use($system) { + // var_dump($resource->toArray()); // 只保留需要权限认证的资源(或公共资源) - return !$resource->no_auth; + return !$resource->no_auth && $system->id == $resource->system_id; }) ); } @@ -269,9 +273,9 @@ class PermLogic /** * 获取用户所有权限code */ - public function getPermissionCodes(int $userId): array + public function getPermissionCodes(int $userId, string $systemCode): array { - $resources = $this->getUserResources($userId); + $resources = $this->getUserResources($userId, $systemCode); return $resources ->filter(fn($res) => $res->type === 'permission') ->pluck('code') diff --git a/app/common/service/AuthService.php b/app/common/service/AuthService.php index aa8f4eb..149e966 100644 --- a/app/common/service/AuthService.php +++ b/app/common/service/AuthService.php @@ -31,7 +31,7 @@ class AuthService return match ($loginType) { 'feishu' => $logic->feishuLogin($data), - 'qrcode' => $logic->qrCodeLogin($data), + // 'qrcode' => $logic->qrCodeLogin($data), default => $logic->uPwdLogin($data), }; } diff --git a/app/common/service/PermService.php b/app/common/service/PermService.php index 8f8770c..06c7535 100644 --- a/app/common/service/PermService.php +++ b/app/common/service/PermService.php @@ -23,7 +23,7 @@ class PermService /** * 获取用户所有资源(合并角色+直接分配),结果缓存 */ - public function getUserResources(int $userId) + public function getUserResources(int $userId, string $systemCode) { $cacheKey = self::cacheKey($userId); $cached = Cache::get($cacheKey); @@ -31,7 +31,7 @@ class PermService return $cached; } // 调用 Logic 层获取资源 - $resources = $this->logic->getUserResources($userId); + $resources = $this->logic->getUserResources($userId, $systemCode); // 缓存结果 Cache::set($cacheKey, $resources, 3600); return $resources; @@ -40,19 +40,19 @@ class PermService /** * 构建目录/菜单树,节点包含权限与打开方式 */ - public function getMenuTree(int $userId): array + public function getMenuTree(int $userId, string $systemCode): array { // 调用 Logic 层处理菜单构建 - $resources = $this->getUserResources($userId); + $resources = $this->getUserResources($userId, $systemCode); return $this->logic->buildTree($resources); } /** * 获取用户所有权限code */ - public function getPermissionCodes(int $userId): array + public function getPermissionCodes(int $userId, string $systemCode): array { - return $this->logic->getPermissionCodes($userId); + return $this->logic->getPermissionCodes($userId, $systemCode); } /** diff --git a/app/common/service/UserService.php b/app/common/service/UserService.php index 25de588..69fb2f4 100644 --- a/app/common/service/UserService.php +++ b/app/common/service/UserService.php @@ -22,12 +22,12 @@ class UserService /** * 获取用户信息(包括菜单和权限) */ - public function getUserInfo(int $uid) + public function getUserInfo(int $uid, string $systemCode) { $user = $this->logic->userInfo($uid); $permService = new PermService(); - $menuTree = $permService->getMenuTree($uid); - $permissionCodes = $permService->getPermissionCodes($uid); + $menuTree = $permService->getMenuTree($uid, $systemCode); + $permissionCodes = $permService->getPermissionCodes($uid, $systemCode); return [ 'user' => [ 'id' => $user->id,