diff --git a/frontend/src/views/components/HomeAside/HomeAside.css b/frontend/src/views/components/HomeAside/HomeAside.css index c18b39f1..e25c6970 100644 --- a/frontend/src/views/components/HomeAside/HomeAside.css +++ b/frontend/src/views/components/HomeAside/HomeAside.css @@ -115,7 +115,7 @@ } .account-caption { - grid-column: 1 / -1; + grid-column: 1; color: var(--pm-text-secondary); font-size: 11px; line-height: 1.4; @@ -132,10 +132,42 @@ } .account-role { + justify-self: end; border-radius: 6px; font-size: 11px; } +.logout-btn { + display: inline-flex; + align-items: center; + justify-content: center; + justify-self: end; + width: 32px; + height: 32px; + padding: 0; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--pm-text-secondary); + font-size: 18px; + cursor: pointer; +} + +.logout-btn:hover:not(:disabled) { + background: var(--el-color-danger-light-9); + color: var(--el-color-danger); +} + +.logout-btn:focus-visible { + outline: 2px solid var(--pm-primary-color); + outline-offset: 2px; +} + +.logout-btn:disabled { + opacity: 0.5; + cursor: wait; +} + .settings-btn { display: flex; width: 100%; diff --git a/frontend/src/views/components/HomeAside/HomeAside.js b/frontend/src/views/components/HomeAside/HomeAside.js index 3aba9ed8..e2a56509 100644 --- a/frontend/src/views/components/HomeAside/HomeAside.js +++ b/frontend/src/views/components/HomeAside/HomeAside.js @@ -8,7 +8,8 @@ import lang from "../../../i18n/i18n"; import { http } from "@/utils/axios"; -import { Setting } from "@element-plus/icons-vue"; +import { Setting, SwitchButton } from "@element-plus/icons-vue"; +import { ElMessage } from "element-plus"; import { useGlobalStatusStore } from "../../../stores/useGlobalStatusStore"; @@ -25,6 +26,22 @@ export function usePage() { const currentAccount = computed(() => globalStatus.userInfos.account || '账号未加载'); const currentRole = computed(() => roleMeta(globalStatus.role)); + + const loggingOut = ref(false); + const logout = async () => { + if (loggingOut.value) return; + loggingOut.value = true; + try { + const result = await http.post('/api/v1/logout', {}); + if (result.errorNo !== 0) { + throw new Error(result.errorMsg || '注销失败,请重试'); + } + location.reload(); + } catch (error) { + ElMessage.error(error.message || '注销失败,请重试'); + loggingOut.value = false; + } + }; const router = useRouter(); @@ -89,6 +106,8 @@ export function usePage() { isLogin, currentAccount, currentRole, + loggingOut, + logout, router, data, searchQuery, @@ -100,5 +119,6 @@ export function usePage() { export { BrandLogo, - Setting + Setting, + SwitchButton } diff --git a/frontend/src/views/components/HomeAside/HomeAside.vue b/frontend/src/views/components/HomeAside/HomeAside.vue index 5e28d607..9b7ed374 100644 --- a/frontend/src/views/components/HomeAside/HomeAside.vue +++ b/frontend/src/views/components/HomeAside/HomeAside.vue @@ -32,6 +32,18 @@