diff --git a/ui/src/layout/LayoutHeader.vue b/ui/src/layout/LayoutHeader.vue index 865562e6826..bd273201b2f 100644 --- a/ui/src/layout/LayoutHeader.vue +++ b/ui/src/layout/LayoutHeader.vue @@ -52,10 +52,13 @@ const canReturnWorkspace = computed(() => isWorkspaceManager.value || isOrdinary function switchMode() { if (isWorkspace(props.mode)) { + const workspaceId = getWorkspaceId() + if (workspaceId) localStorage.setItem('workspaceId', workspaceId) router.push({ name: 'system-home' }) return } - const workspaceId = user.userInfo?.workspace_list?.[0]?.id || 'default' + // 缓存的工作空间仅用于从系统管理返回工作空间。 + const workspaceId = localStorage.getItem('workspaceId') || user.userInfo?.workspace_list?.[0]?.id || 'default' router.push({ name: 'workspace-home', params: { workspaceId } }) } @@ -78,11 +81,12 @@ function switchMode() { 升级 + 系统管理 - + 返回工作空间 diff --git a/ui/src/router/ROUTE_README.md b/ui/src/router/ROUTE_README.md index a9ae21821dd..34b464510af 100644 --- a/ui/src/router/ROUTE_README.md +++ b/ui/src/router/ROUTE_README.md @@ -19,7 +19,10 @@ Workspace 使用 `AppLayout`,左侧导航根据 `scope: 'workspace'` 对应路由的 `children` 自动生成。 Workspace 根地址为 `/admin/workspace/:workspaceId`。`workspaceId` 只以当前路由参数为准。应用根 -地址、登录成功和从 System 返回 Workspace 时统一进入 `/admin/workspace/default`;若当前用户 +地址和登录成功时进入 `/admin/workspace/default`。顶部 `LayoutHeader` 切换到 System 时将当前 +工作空间 ID 保存到 localStorage 的 `workspaceId`;仅在该组件返回 Workspace 时读取缓存, +无缓存时使用用户首个工作空间或 `default`。退出登录时由 Admin `clearToken()` 清除缓存。 +其他位置不得读取该缓存,工作空间上下文仍以路由参数为准。若当前用户 只属于 `workspace_list` 中的部分工作空间且目标 `workspaceId` 不在其中,路由守卫会自动重定向到 其首个可访问工作空间(仅对携带 `workspaceId` 参数的工作空间路由生效)。父路由的 `scope` 会合并到匹配的子路由 `meta` 中。 diff --git a/ui/src/stores/admin/auth.ts b/ui/src/stores/admin/auth.ts index ab8e490fd4f..86b7c1fc58a 100644 --- a/ui/src/stores/admin/auth.ts +++ b/ui/src/stores/admin/auth.ts @@ -90,6 +90,7 @@ export const useAuthStore = defineStore('auth', { clearToken() { this.token = '' localStorage.removeItem(TOKEN_STORAGE_KEY) + localStorage.removeItem('workspaceId') useUserStore().clearCurrentUser() }, },