240 lines
5.8 KiB
Vue

<template>
<div class="user-bar">
<div v-if="!ismobile" class="search panel-item hidden-sm-and-down" @click="handleSearchClick">
<search-outlined />
</div>
<div v-if="!ismobile" class="screen panel-item hidden-sm-and-down" @click="fullscreen">
<fullscreen-outlined />
</div>
<!--<devUserMessage />-->
<a-dropdown class="user panel-item">
<div class="user-avatar">
<a-avatar :src="userInfo.avatar" />
<label>{{ userName }}</label>
</div>
<template #overlay>
<a-menu>
<a-menu-item key="uc" @click="handleUser('uc')">
<UserOutlined style="margin-right: 8px" />
<span>个人中心</span>
</a-menu-item>
<a-menu-item key="clearCache" @click="handleUser('clearCache')">
<loading3-quarters-outlined style="margin-right: 8px" />
<span>清理缓存</span>
</a-menu-item>
<a-menu-divider />
<a-menu-item key="outLogin" @click="handleUser('outLogin')">
<export-outlined style="margin-right: 8px" />
<span>退出登录</span>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
<a-dropdown v-if="!ismobile" class="panel-item">
<global-outlined />
<template #overlay>
<a-menu :selected-keys="lang">
<a-menu-item key="zh-cn" @click="handleIn18('zh-cn')">
<span>简体中文</span>
</a-menu-item>
<a-menu-item key="en" @click="handleIn18('en')">
<span>English</span>
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
<div class="setting panel-item" @click="openSetting">
<layout-outlined />
</div>
</div>
<!-- 整体风格设置抽屉 -->
<a-drawer v-model:visible="settingDialog" :closable="false" width="300">
<setting></setting>
</a-drawer>
<!-- 搜索面板 -->
<a-modal
:visible="searchActive"
:closable="false"
:footer="null"
width="600px"
style="overflow: hidden"
destroyOnClose
dialogClass="searchModal"
:bodyStyle="{ maxHeight: '520px', overflow: 'auto', padding: '14px' }"
@cancel="searchPanelClose"
>
<panel-search ref="panelSearch" @close="searchPanelClose" />
</a-modal>
</template>
<script>
import { createVNode } from 'vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
import screenfull from 'screenfull'
import { message } from 'ant-design-vue'
import setting from './setting.vue'
import router from '@/router'
import tool from '@/utils/tool'
import loginApi from '@/api/auth/loginApi'
import devUserMessage from './message.vue'
import panelSearch from './panel-search/index.vue'
import mixinSearch from './mixins/search'
export default {
components: {
setting,
devUserMessage,
panelSearch
},
mixins: [mixinSearch],
data() {
return {
lang: [],
settingDialog: false,
userInfo: {},
userName: '',
userNameF: ''
}
},
computed: {
ismobile() {
return this.$store.state.global.ismobile
},
userInfoWatch() {
return this.$store.state.global.userInfo
}
},
watch: {
userInfoWatch(newVal, oldVal) {
this.userInfo = newVal
}
},
created() {
// 获取默认语言
this.lang = new Array(this.$TOOL.data.get('APP_LANG') || this.$CONFIG.LANG)
this.userInfo = this.$TOOL.data.get('USER_INFO')
this.userName = this.userInfo?.userName || ''
this.userNameF = this.userName.substring(0, 1)
},
methods: {
// 个人信息
handleUser(key) {
if (key === 'uc') {
router.push({ path: '/usercenter' })
}
if (key === 'clearCache') {
this.$confirm({
title: '提示',
content: '确认清理所有缓存?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: false,
okText: '确定',
cancelText: '取消',
onOk() {
message.loading('正在清理中...', 1)
tool.data.clear()
setTimeout(() => {
router.replace({ path: '/login' })
location.reload()
}, 100)
},
onCancel() {}
})
}
if (key === 'outLogin') {
this.$confirm({
title: '提示',
content: '确认退出当前用户?',
icon: createVNode(ExclamationCircleOutlined),
maskClosable: false,
onOk() {
// 取得缓存中的token
const token = tool.data.get('TOKEN')
const param = {
token: token
}
message.loading('退出中...', 1)
loginApi
.logout(param)
.then(() => {
// message.c
// 清理掉个人的一些信息
tool.data.remove('TOKEN')
tool.data.remove('USER_INFO')
tool.data.remove('MENU')
tool.data.remove('PERMISSIONS')
router.replace({ path: '/login' })
})
.catch(() => {
tool.data.clear()
router.replace({ path: '/login' })
location.reload()
})
},
onCancel() {}
})
}
},
// 设置多语言语种
handleIn18(key) {
this.lang = []
this.lang.push(key)
this.$i18n.locale = key
this.$TOOL.data.set('APP_LANG', key)
},
// 设置抽屉
openSetting() {
this.settingDialog = true
},
// 全屏
fullscreen() {
const element = document.documentElement
if (screenfull.isEnabled) {
screenfull.toggle(element)
}
},
// 搜索
fullSearch() {}
}
}
</script>
<style lang="less" scoped>
:deep(.ant-modal) {
top: 20px;
}
:deep(.ant-modal-content) {
border-radius: 10px;
}
.user-bar {
display: flex;
align-items: center;
height: 100%;
}
.user-bar .panel-item {
padding: 0 10px;
cursor: pointer;
height: 100%;
display: flex;
align-items: center;
}
.user-bar .panel-item i {
}
.user-bar .panel-item:hover {
background: var(--header-color-split);
}
.user-bar .user-avatar {
height: 49px;
display: flex;
align-items: center;
}
.user-bar .user-avatar label {
display: inline-block;
margin-left: 5px;
cursor: pointer;
}
.setting {
margin-right: 10px;
}
</style>