From 8415a1ce281e67771384c67d7b7028dfdbf630a2 Mon Sep 17 00:00:00 2001 From: Yuki Guo Date: Sat, 10 Oct 2026 17:50:05 +0800 Subject: [PATCH] refactor: refactor user info (#14021) --- frontend/src/lang/modules/en.ts | 2 + frontend/src/lang/modules/es-es.ts | 2 + frontend/src/lang/modules/fa.ts | 2 + frontend/src/lang/modules/ja.ts | 2 + frontend/src/lang/modules/ko.ts | 2 + frontend/src/lang/modules/lo.ts | 2 + frontend/src/lang/modules/ms.ts | 2 + frontend/src/lang/modules/pt-br.ts | 2 + frontend/src/lang/modules/ru.ts | 2 + frontend/src/lang/modules/tr.ts | 2 + frontend/src/lang/modules/zh-Hant.ts | 2 + frontend/src/lang/modules/zh.ts | 2 + .../Sidebar/components/Collapse.vue | 22 ++-- .../src/layout/components/Sidebar/index.vue | 119 +++++++++++++++++- 14 files changed, 150 insertions(+), 15 deletions(-) diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 96c4581db..7150fdb77 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -570,6 +570,8 @@ const message = { cancelKeepAlive: 'Stop keeping page session', }, header: { + userCenter: 'User Center', + exitSystem: 'Log Out', logout: 'Logout', }, database: { diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index a673c5274..ab56115b8 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -570,6 +570,8 @@ const message = { cancelKeepAlive: 'Dejar de mantener la sesión de la página', }, header: { + userCenter: 'Centro de usuario', + exitSystem: 'Cerrar sesión', logout: 'Cerrar sesión', }, database: { diff --git a/frontend/src/lang/modules/fa.ts b/frontend/src/lang/modules/fa.ts index a6d9f0e48..21b6b02c0 100644 --- a/frontend/src/lang/modules/fa.ts +++ b/frontend/src/lang/modules/fa.ts @@ -565,6 +565,8 @@ const message = { cancelKeepAlive: 'لغو حفظ نشست صفحه', }, header: { + userCenter: 'مرکز کاربری', + exitSystem: 'خروج از سیستم', logout: 'خروج', }, database: { diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index a9d47b343..7b762169d 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -568,6 +568,8 @@ const message = { cancelKeepAlive: 'ページセッションの保持を解除', }, header: { + userCenter: 'ユーザーセンター', + exitSystem: 'ログアウト', logout: 'ログアウト', }, database: { diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index e7762c67b..df29a257b 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -562,6 +562,8 @@ const message = { cancelKeepAlive: '페이지 세션 유지 해제', }, header: { + userCenter: '사용자 센터', + exitSystem: '로그아웃', logout: '로그아웃', }, database: { diff --git a/frontend/src/lang/modules/lo.ts b/frontend/src/lang/modules/lo.ts index ac594cdd1..18531a70d 100644 --- a/frontend/src/lang/modules/lo.ts +++ b/frontend/src/lang/modules/lo.ts @@ -563,6 +563,8 @@ const message = { cancelKeepAlive: 'ຍົກເລີກການຮັກສາເຊັດຊັນໜ້າ', }, header: { + userCenter: 'ສູນຜູ້ໃຊ້', + exitSystem: 'ອອກຈາກລະບົບ', logout: 'ອອກຈາກລະບົບ', }, database: { diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 8464ce80e..5826c02b8 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -575,6 +575,8 @@ const message = { cancelKeepAlive: 'Hentikan pengekalan sesi halaman', }, header: { + userCenter: 'Pusat Pengguna', + exitSystem: 'Log keluar', logout: 'Log keluar', }, database: { diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index bcb92971f..4788d4ae2 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -568,6 +568,8 @@ const message = { cancelKeepAlive: 'Parar de manter a sessão da página', }, header: { + userCenter: 'Central do usuário', + exitSystem: 'Sair', logout: 'Logout', }, database: { diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 1ed17e69d..0d39c78ec 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -566,6 +566,8 @@ const message = { cancelKeepAlive: 'Не сохранять сеанс страницы', }, header: { + userCenter: 'Центр пользователя', + exitSystem: 'Выйти из системы', logout: 'Выход', }, database: { diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index eb8e6adc9..0a8d112f2 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -570,6 +570,8 @@ const message = { cancelKeepAlive: 'Sayfa oturumunu korumayı bırak', }, header: { + userCenter: 'Kullanıcı Merkezi', + exitSystem: 'Çıkış yap', logout: 'Çıkış', }, database: { diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index aa55e07de..217de952e 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -548,6 +548,8 @@ const message = { cancelKeepAlive: '取消保持頁面工作階段', }, header: { + userCenter: '使用者中心', + exitSystem: '登出系統', logout: '登出', }, database: { diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index baa728eb0..181bada3a 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -552,6 +552,8 @@ const message = { cancelKeepAlive: '取消保持页面会话', }, header: { + userCenter: '用户中心', + exitSystem: '退出系统', logout: '退出登录', }, database: { diff --git a/frontend/src/layout/components/Sidebar/components/Collapse.vue b/frontend/src/layout/components/Sidebar/components/Collapse.vue index e228fb586..453dddaf7 100644 --- a/frontend/src/layout/components/Sidebar/components/Collapse.vue +++ b/frontend/src/layout/components/Sidebar/components/Collapse.vue @@ -2,7 +2,7 @@
- -
{ checkTask(); }); @@ -272,6 +261,7 @@ const openNodeDashboard = () => { }; const logout = () => { + popoverVisible.value = false; ElMessageBox.confirm(i18n.global.t('commons.msg.sureLogOut'), i18n.global.t('commons.msg.infoTitle'), { confirmButtonText: i18n.global.t('commons.button.confirm'), cancelButtonText: i18n.global.t('commons.button.cancel'), @@ -297,13 +287,17 @@ const loadCurrentUser = async (currentNode?: string) => { const authInfo = await syncAuthInfo(currentNode); if (authInfo) { currentUser.value = authInfo; + emit('userChange', authInfo); } }; const changeUserInfo = () => { + popoverVisible.value = false; loadCurrentUser(); userInfoRef.value?.openDrawer(); }; +defineExpose({ openUserInfo: changeUserInfo, logout }); + onMounted(() => { loadNodes(); checkTask(); @@ -318,7 +312,7 @@ onMounted(() => { display: flex; align-items: center; box-sizing: border-box; - border-top: 1px solid var(--panel-footer-border); + border-bottom: 1px solid var(--panel-footer-border); height: 48px; .icon { margin-left: 25px; diff --git a/frontend/src/layout/components/Sidebar/index.vue b/frontend/src/layout/components/Sidebar/index.vue index c5049d9e6..5d3ebefd6 100644 --- a/frontend/src/layout/components/Sidebar/index.vue +++ b/frontend/src/layout/components/Sidebar/index.vue @@ -10,6 +10,14 @@ + - + + + + @@ -40,12 +81,24 @@ import { getSettingBaseInfo } from '@/api/modules/setting'; import PrimaryMenu from '@/assets/images/menu-bg.svg?component'; import { hasPermissionMetaAccess, hasRouteRoleAccess } from '@/utils/rbac'; import { useGlobalStore } from '@/composables/useGlobalStore'; +import type { Login } from '@/api/interface/auth'; const route = useRoute(); const router = useRouter(); const menuStore = MenuStore(); const { currentNode, isAdmin, menuAccordion, permissions } = useGlobalStore(); const version = ref(); +const nodeSelectorRef = ref>(); +const currentUser = ref(); +const userMenuVisible = ref(false); + +const handleUserCommand = (command: string) => { + if (command === 'userCenter') { + nodeSelectorRef.value?.openUserInfo(); + } else if (command === 'logout') { + nodeSelectorRef.value?.logout(); + } +}; const activeMenu = computed(() => { const { meta, path } = route; @@ -324,8 +377,14 @@ watch( height: 100%; background: var(--panel-menu-bg-color) no-repeat top; + .logo, + .node-selector { + flex-shrink: 0; + } + .el-scrollbar { flex: 1; + min-height: 0; .el-menu { overflow: auto; overflow-x: hidden; @@ -337,4 +396,62 @@ watch( .ico { height: 20px !important; } + +.user-dropdown { + flex-shrink: 0; + width: 100%; +} + +.user-menu { + min-width: 160px; + + :deep(.el-dropdown-menu__item) { + gap: 8px; + padding: 10px 16px; + } + + .user-menu-icon { + flex-shrink: 0; + font-size: 8px; + } +} + +.user-entry { + display: flex; + align-items: center; + gap: 7px; + flex-shrink: 0; + position: relative; + width: 100%; + height: 48px; + padding: 0 25px; + border: 0; + border-top: 1px solid var(--panel-footer-border); + background: transparent; + color: var(--panel-main-bg-color-1); + font-family: inherit; + font-size: var(--el-font-size-base); + line-height: 1.5; + text-align: left; + cursor: pointer; + + .icon { + flex-shrink: 0; + font-size: 8px; + } + + .user-name { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &:hover, + &:focus-visible, + &.is-active { + color: var(--el-color-primary); + background: var(--el-menu-item-bg-color); + } +}