From ff024af5b52ca1b7407424c09ad57a3692faa9c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?cls=5F=E5=AE=81=E6=B3=A2=E6=9C=AC=E6=9C=BA?= <908705107@qq.com> Date: Thu, 11 Jun 2026 20:10:19 +0800 Subject: [PATCH] feat: restore original admin shell quality --- web/apps/web-ele/src/layouts/basic.vue | 8 +- web/apps/web-ele/src/preferences.ts | 7 +- web/apps/web-ele/src/router/guard.ts | 25 +++-- web/apps/web-ele/src/router/light-menu.ts | 55 +++++++++++ .../@core/preferences/src/preferences.ts | 7 ++ .../layouts/src/basic/header/header.vue | 94 +++++++++++++++++-- .../effects/layouts/src/basic/layout.vue | 31 +++++- .../layouts/src/basic/tabbar/tabbar.vue | 4 +- 8 files changed, 211 insertions(+), 20 deletions(-) diff --git a/web/apps/web-ele/src/layouts/basic.vue b/web/apps/web-ele/src/layouts/basic.vue index 3b9daa9..16f0c98 100644 --- a/web/apps/web-ele/src/layouts/basic.vue +++ b/web/apps/web-ele/src/layouts/basic.vue @@ -27,6 +27,9 @@ const UserDropdown = defineAsyncComponent(() => (module) => module.UserDropdown, ), ); +const LockScreen = defineAsyncComponent(() => + import('@vben/layouts/es/lock-screen').then((module) => module.LockScreen), +); const NotificationPopup = defineAsyncComponent( () => import('#/components/notification/NotificationPopup.vue'), ); @@ -227,7 +230,7 @@ watch( diff --git a/web/apps/web-ele/src/preferences.ts b/web/apps/web-ele/src/preferences.ts index f85eb34..6558acc 100644 --- a/web/apps/web-ele/src/preferences.ts +++ b/web/apps/web-ele/src/preferences.ts @@ -20,11 +20,11 @@ export const overridesPreferences = defineOverridesPreferences({ layout: 'header-sidebar-nav', }, shortcutKeys: { - enable: false, + enable: true, globalLockScreen: false, globalLogout: true, globalPreferences: false, - globalSearch: false, + globalSearch: true, }, theme: { mode: 'light', @@ -46,6 +46,9 @@ export const overridesPreferences = defineOverridesPreferences({ fit: 'contain', source: Logo, }, + tabbar: { + persist: false, + }, widget: { fullscreen: true, globalSearch: true, diff --git a/web/apps/web-ele/src/router/guard.ts b/web/apps/web-ele/src/router/guard.ts index 34f2f17..0a2aa2e 100644 --- a/web/apps/web-ele/src/router/guard.ts +++ b/web/apps/web-ele/src/router/guard.ts @@ -12,6 +12,16 @@ import { useAppContextStore } from '#/store/app-context'; import { normalizeHomePath } from '#/utils/legacy-home'; import { generateAccess } from './access'; +import { isLightTabRoute } from './light-menu'; + +function filterLightTabHistory(history: T) { + const tabs = Array.isArray(history.tabs) ? history.tabs : []; + return { + ...history, + cachedTabs: [], + tabs: tabs.filter((tab) => isLightTabRoute(tab as any)), + }; +} /** * 通用守卫配置 @@ -39,10 +49,10 @@ function setupCommonGuard(router: Router) { // 保存当前应用的 tab 历史到内存 const currentAppKey = currentAppCode || 'main'; - tabHistoryByApp.set(currentAppKey, { + tabHistoryByApp.set(currentAppKey, filterLightTabHistory({ tabs: [...tabbarStore.tabs], cachedTabs: new Set(tabbarStore.cachedTabs), - }); + })); // 从 sessionStorage 加载新应用的 tab 历史 const storageKey = `vben-admin-tabs-${appKey}`; @@ -51,8 +61,9 @@ function setupCommonGuard(router: Router) { if (savedHistory) { try { const parsed = JSON.parse(savedHistory); - tabbarStore.tabs = parsed.tabs || []; - tabbarStore.cachedTabs = new Set(parsed.cachedTabs || []); + const lightHistory = filterLightTabHistory(parsed); + tabbarStore.tabs = lightHistory.tabs || []; + tabbarStore.cachedTabs = new Set(lightHistory.cachedTabs || []); } catch (error) { console.error('Failed to parse tab history:', error); tabbarStore.tabs = []; @@ -87,10 +98,12 @@ function setupCommonGuard(router: Router) { const storageKey = `vben-admin-tabs-${appKey}`; const tabbarStore = useTabbarStore(); - const tabHistory = { + const tabHistory = filterLightTabHistory({ tabs: tabbarStore.tabs, cachedTabs: [...tabbarStore.cachedTabs], - }; + }); + tabbarStore.tabs = tabHistory.tabs as any; + tabbarStore.cachedTabs = new Set(tabHistory.cachedTabs as string[]); sessionStorage.setItem(storageKey, JSON.stringify(tabHistory)); // 关闭页面加载进度条 diff --git a/web/apps/web-ele/src/router/light-menu.ts b/web/apps/web-ele/src/router/light-menu.ts index a951218..a0e6f7e 100644 --- a/web/apps/web-ele/src/router/light-menu.ts +++ b/web/apps/web-ele/src/router/light-menu.ts @@ -31,10 +31,65 @@ export const LIGHT_MENU_NAMES = new Set([ 'userSettings', ]); +const LIGHT_ROUTE_PATH_PREFIXES = [ + '/account-settings', + '/ai-platform/agent', + '/ai-platform/knowledge', + '/ai-platform/model', + '/ai-platform/workflow', + '/ai-platform/workflow-runs', + '/announcement', + '/codex', + '/dept', + '/dict', + '/file-manager', + '/login-log', + '/menu', + '/message', + '/page-render/main_home', + '/permission', + '/post', + '/role', + '/server-monitor', + '/system-config', + '/ui-config', + '/user', +]; + export function isLightMenuName(name?: string) { return !name || LIGHT_MENU_NAMES.has(name); } +function normalizePath(path?: string) { + if (!path) return ''; + return path.split('?')[0]?.replace(/\/$/, '') || ''; +} + +export function isLightTabRoute(route: { + fullPath?: string; + matched?: Array<{ name?: unknown; path?: string }>; + name?: unknown; + path?: string; +}) { + if (typeof route.name === 'string' && LIGHT_MENU_NAMES.has(route.name)) { + return true; + } + + if ( + route.matched?.some( + (item) => + typeof item.name === 'string' && LIGHT_MENU_NAMES.has(item.name), + ) + ) { + return true; + } + + const path = normalizePath(route.fullPath || route.path); + return LIGHT_ROUTE_PATH_PREFIXES.some( + (prefix) => path === prefix || path.startsWith(`${prefix}/`), + ); +} + export function filterLightMenuTree< T extends { children?: T[]; name?: string }, >(routes: T[]): T[] { diff --git a/web/packages/@core/preferences/src/preferences.ts b/web/packages/@core/preferences/src/preferences.ts index 6db9e2f..ad61da9 100644 --- a/web/packages/@core/preferences/src/preferences.ts +++ b/web/packages/@core/preferences/src/preferences.ts @@ -111,6 +111,13 @@ class PreferenceManager { mergedPreference.widget, ); } + if (overrides?.tabbar) { + mergedPreference.tabbar = merge( + {}, + overrides.tabbar, + mergedPreference.tabbar, + ); + } if (overrides?.logo?.source) { mergedPreference.logo.source = overrides.logo.source; } diff --git a/web/packages/effects/layouts/src/basic/header/header.vue b/web/packages/effects/layouts/src/basic/header/header.vue index 4f5c6d9..bfb35f6 100644 --- a/web/packages/effects/layouts/src/basic/header/header.vue +++ b/web/packages/effects/layouts/src/basic/header/header.vue @@ -1,11 +1,20 @@