|
|
|
@ -2,37 +2,27 @@
|
|
|
|
|
import { ElMessageBox } from 'element-plus' |
|
|
|
|
|
|
|
|
|
import avatarImg from '@/assets/imgs/avatar.gif' |
|
|
|
|
import { useDesign } from '@/hooks/web/useDesign' |
|
|
|
|
import { useTagsViewStore } from '@/store/modules/tagsView' |
|
|
|
|
import { useUserStore } from '@/store/modules/user' |
|
|
|
|
import LockDialog from './components/LockDialog.vue' |
|
|
|
|
import LockPage from './components/LockPage.vue' |
|
|
|
|
import { useLockStore } from '@/store/modules/lock' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
defineOptions({ name: 'UserInfo' }) |
|
|
|
|
|
|
|
|
|
const { t } = useI18n() |
|
|
|
|
|
|
|
|
|
const { push, replace } = useRouter() |
|
|
|
|
const { replace } = useRouter() |
|
|
|
|
|
|
|
|
|
const userStore = useUserStore() |
|
|
|
|
|
|
|
|
|
const tagsViewStore = useTagsViewStore() |
|
|
|
|
|
|
|
|
|
const { getPrefixCls } = useDesign() |
|
|
|
|
|
|
|
|
|
const prefixCls = getPrefixCls('user-info') |
|
|
|
|
|
|
|
|
|
const avatar = computed(() => userStore.user.avatar || avatarImg) |
|
|
|
|
const realName = computed(() => userStore.user.realName ?? '管理员') |
|
|
|
|
const deptName = computed(() => userStore.user.deptName ?? '管理员') |
|
|
|
|
// 锁定屏幕 |
|
|
|
|
const lockStore = useLockStore() |
|
|
|
|
const getIsLock = computed(() => lockStore.getLockInfo?.isLock ?? false) |
|
|
|
|
const dialogVisible = ref<boolean>(false) |
|
|
|
|
const lockScreen = () => { |
|
|
|
|
dialogVisible.value = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const loginOut = async () => { |
|
|
|
|
try { |
|
|
|
@ -46,51 +36,20 @@ const loginOut = async () => {
|
|
|
|
|
replace('/login?redirect=/index') |
|
|
|
|
} catch {} |
|
|
|
|
} |
|
|
|
|
const toProfile = async () => { |
|
|
|
|
push('/user/profile') |
|
|
|
|
} |
|
|
|
|
const toDocument = () => { |
|
|
|
|
window.open('https://doc.iocoder.cn/') |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
</script> |
|
|
|
|
|
|
|
|
|
<template> |
|
|
|
|
<ElDropdown class="block" :class="prefixCls" trigger="click"> |
|
|
|
|
<div class="flex items-center gap-4px"> |
|
|
|
|
<ElAvatar :src="avatar" alt="" :size="32" class="rounded-[50%]" /> |
|
|
|
|
<span class="text-14px color-#303133 font-500 line-height-22px"> |
|
|
|
|
{{ realName }} | {{ deptName }} |
|
|
|
|
</span> |
|
|
|
|
</div> |
|
|
|
|
<template #dropdown> |
|
|
|
|
<ElDropdownMenu> |
|
|
|
|
<ElDropdownItem> |
|
|
|
|
<Icon icon="ep:tools" /> |
|
|
|
|
<div @click="toProfile">{{ t('common.profile') }}</div> |
|
|
|
|
</ElDropdownItem> |
|
|
|
|
<ElDropdownItem> |
|
|
|
|
<Icon icon="ep:menu" /> |
|
|
|
|
<div @click="toDocument">{{ t('common.document') }}</div> |
|
|
|
|
</ElDropdownItem> |
|
|
|
|
<ElDropdownItem divided> |
|
|
|
|
<Icon icon="ep:lock" /> |
|
|
|
|
<div @click="lockScreen">{{ t('lock.lockScreen') }}</div> |
|
|
|
|
</ElDropdownItem> |
|
|
|
|
<ElDropdownItem divided @click="loginOut"> |
|
|
|
|
<Icon icon="ep:switch-button" /> |
|
|
|
|
<div>{{ t('common.loginOut') }}</div> |
|
|
|
|
</ElDropdownItem> |
|
|
|
|
</ElDropdownMenu> |
|
|
|
|
</template> |
|
|
|
|
</ElDropdown> |
|
|
|
|
|
|
|
|
|
<LockDialog v-if="dialogVisible" v-model="dialogVisible" /> |
|
|
|
|
|
|
|
|
|
<teleport to="body"> |
|
|
|
|
<transition name="fade-bottom" mode="out-in"> |
|
|
|
|
<LockPage v-if="getIsLock" /> |
|
|
|
|
</transition> |
|
|
|
|
</teleport> |
|
|
|
|
<div class="flex items-center gap-8px"> |
|
|
|
|
<ElAvatar :src="avatar" alt="" :size="32" class="rounded-[50%]" /> |
|
|
|
|
<span class="text-14px color-#303133 font-500 line-height-22px"> |
|
|
|
|
{{ realName }} | {{ deptName }} |
|
|
|
|
</span> |
|
|
|
|
<div @click="loginOut" class="hover:color-[var(--el-color-primary)] translate-y-1px"> |
|
|
|
|
<Icon icon="ep:switch-button" :size="20"/> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<style scoped lang="scss"> |
|
|
|
|