|
|
|
@ -4,13 +4,14 @@
|
|
|
|
|
<img :class="`${prefixCls}__header`" :src="getUserInfo.avatar" /> |
|
|
|
|
<span :class="`${prefixCls}__info hidden md:block`"> |
|
|
|
|
<span :class="`${prefixCls}__name `" class="truncate"> |
|
|
|
|
{{ getUserInfo.realName }} |
|
|
|
|
{{ getUserInfo.nickname }} |
|
|
|
|
</span> |
|
|
|
|
</span> |
|
|
|
|
</span> |
|
|
|
|
|
|
|
|
|
<template #overlay> |
|
|
|
|
<Menu @click="handleMenuClick"> |
|
|
|
|
<MenuItem key="profile" :text="t('layout.header.accountCenter')" icon="ion:person-outline" /> |
|
|
|
|
<MenuItem key="doc" :text="t('layout.header.dropdownItemDoc')" icon="ion:document-text-outline" v-if="getShowDoc" /> |
|
|
|
|
<MenuDivider v-if="getShowDoc" /> |
|
|
|
|
<MenuItem v-if="getUseLockPage" key="lock" :text="t('layout.header.tooltipLock')" icon="ion:lock-closed-outline" /> |
|
|
|
@ -20,43 +21,40 @@
|
|
|
|
|
</Dropdown> |
|
|
|
|
<LockAction @register="register" /> |
|
|
|
|
</template> |
|
|
|
|
<script lang="ts" setup name="UserDropdown"> |
|
|
|
|
// components |
|
|
|
|
import { Dropdown, Menu } from 'ant-design-vue' |
|
|
|
|
<script setup lang="ts" name="UserDropdown"> |
|
|
|
|
import { Dropdown, Menu, MenuDivider } from 'ant-design-vue' |
|
|
|
|
import type { MenuInfo } from 'ant-design-vue/lib/menu/src/interface' |
|
|
|
|
|
|
|
|
|
import { computed } from 'vue' |
|
|
|
|
|
|
|
|
|
import { DOC_URL } from '@/settings/siteSetting' |
|
|
|
|
|
|
|
|
|
import { useUserStore } from '@/store/modules/user' |
|
|
|
|
import { useHeaderSetting } from '@/hooks/setting/useHeaderSetting' |
|
|
|
|
import { useI18n } from '@/hooks/web/useI18n' |
|
|
|
|
import { useDesign } from '@/hooks/web/useDesign' |
|
|
|
|
import { useModal } from '@/components/Modal' |
|
|
|
|
|
|
|
|
|
import headerImg from '@/assets/images/header.jpg' |
|
|
|
|
import { propTypes } from '@/utils/propTypes' |
|
|
|
|
import { openWindow } from '@/utils' |
|
|
|
|
|
|
|
|
|
import { useGo } from '@/hooks/web/usePage' |
|
|
|
|
import { createAsyncComponent } from '@/utils/factory/createAsyncComponent' |
|
|
|
|
const go = useGo() |
|
|
|
|
|
|
|
|
|
type MenuEvent = 'profile' | 'logout' | 'doc' | 'lock' |
|
|
|
|
|
|
|
|
|
const MenuItem = createAsyncComponent(() => import('./DropMenuItem.vue')) |
|
|
|
|
const LockAction = createAsyncComponent(() => import('../lock/LockModal.vue')) |
|
|
|
|
const MenuDivider = Menu.Divider |
|
|
|
|
type MenuEvent = 'logout' | 'doc' | 'lock' |
|
|
|
|
|
|
|
|
|
defineProps({ |
|
|
|
|
theme: propTypes.oneOf(['dark', 'light']) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
const { prefixCls } = useDesign('header-user-dropdown') |
|
|
|
|
const { t } = useI18n() |
|
|
|
|
const { getShowDoc, getUseLockPage } = useHeaderSetting() |
|
|
|
|
const userStore = useUserStore() |
|
|
|
|
|
|
|
|
|
const getUserInfo = computed(() => { |
|
|
|
|
const { realName = '', avatar, desc } = userStore.getUserInfo || {} |
|
|
|
|
return { realName, avatar: avatar || headerImg, desc } |
|
|
|
|
const { nickname = '', avatar } = userStore.getUserInfo.user || {} |
|
|
|
|
return { nickname, avatar: avatar || headerImg } |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
const [register, { openModal }] = useModal() |
|
|
|
@ -75,8 +73,15 @@ function openDoc() {
|
|
|
|
|
openWindow(DOC_URL) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function openProfile() { |
|
|
|
|
go('/profile/index') |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function handleMenuClick(e: MenuInfo) { |
|
|
|
|
switch (e.key as MenuEvent) { |
|
|
|
|
case 'profile': |
|
|
|
|
openProfile() |
|
|
|
|
break |
|
|
|
|
case 'logout': |
|
|
|
|
handleLoginOut() |
|
|
|
|
break |
|
|
|
|