diff --git a/src/components/DynamicMenu.vue b/src/components/DynamicMenu.vue new file mode 100644 index 0000000..a7b74c0 --- /dev/null +++ b/src/components/DynamicMenu.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/pages/admin/AdminLayout.vue b/src/pages/admin/AdminLayout.vue index 9cd49ab..2c1f50b 100644 --- a/src/pages/admin/AdminLayout.vue +++ b/src/pages/admin/AdminLayout.vue @@ -2,10 +2,12 @@ import { computed, onBeforeUnmount, onMounted, ref } from 'vue' import { RouterLink, RouterView, useRouter } from 'vue-router' import { apiFetch } from '../../lib/api' -import { clearAuth, getToken, getUser, setUser } from '../../lib/auth' +import { clearAuth, getToken } from '../../lib/auth' +import { useUserStore } from '../../stores/user' +import DynamicMenu from '../../components/DynamicMenu.vue' const router = useRouter() -const user = ref(getUser()) +const userStore = useUserStore() const menuOpen = ref(false) const showUserModal = ref(false) const showPasswordModal = ref(false) @@ -16,34 +18,20 @@ const passwordError = ref('') const passwordLoading = ref(false) const menuRoot = ref(null) -const avatarText = computed(() => { - const name = user.value?.userName || '用户' - const t = String(name).trim() - return t ? t.slice(0, 1).toUpperCase() : 'U' -}) +const avatarText = computed(() => userStore.userAvatarText) async function logout() { try { await apiFetch('/api/logout', { method: 'POST' }) } catch { } finally { - clearAuth() + userStore.logout() } router.push('/') } async function loadMe() { - if (!getToken()) return - try { - const res = await apiFetch('/api/me') - if (res?.user) { - user.value = res.user - setUser(res.user) - } - } catch { - clearAuth() - router.push('/login') - } + await userStore.loadUser() } function closeMenu() { @@ -127,12 +115,7 @@ onBeforeUnmount(() => { - +
@@ -142,7 +125,7 @@ onBeforeUnmount(() => {