admin/src/layout/components/userbar.vue

306 lines
6.4 KiB
Vue

<template>
<div class="user-bar">
<div class="panel-item hidden-sm-and-down" @click="searchVisible = true">
<el-badge :hidden="true">
<el-icon>
<el-icon-search/>
</el-icon>
</el-badge>
</div>
<div class="screen panel-item hidden-sm-and-down" @click="screen">
<el-badge :hidden="true">
<el-icon>
<el-icon-full-screen/>
</el-icon>
</el-badge>
</div>
<div class="tasks panel-item" @click="tasksVisible=true">
<el-badge :hidden="taskNum==0" :value="taskNum" class="badge" type="danger">
<el-icon>
<pi-icon-task/>
</el-icon>
</el-badge>
</div>
<div class="msg panel-item" @click="showMsg">
<el-badge :hidden="msgNum==0" :value="msgNum" class="badge" type="danger">
<el-icon>
<el-icon-chat-dot-round/>
</el-icon>
</el-badge>
<el-drawer title="站内信息" v-model="msg" :size="400" append-to-body destroy-on-close>
<message @closed="closeMsg"></message>
</el-drawer>
</div>
<el-dropdown class="user panel-item" trigger="click" @command="handleUser">
<div class="user-avatar">
<el-avatar :size="30" :src="avatar">{{ realnameF }}</el-avatar>
<label>{{ realname }}</label>
<el-icon class="el-icon--right">
<el-icon-arrow-down/>
</el-icon>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="uc">帐号信息</el-dropdown-item>
<el-dropdown-item command="clearCache">清除缓存</el-dropdown-item>
<el-dropdown-item divided command="outLogin">退出登录</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
<div class="setting panel-item hidden-sm-and-down" @click="settingDialog=true">
<el-icon>
<pi-icon-brush/>
</el-icon>
<el-drawer :title="t('system.pageLayout')" v-model="settingDialog" :size="400" append-to-body destroy-on-close>
<setting></setting>
</el-drawer>
</div>
</div>
<el-dialog v-model="searchVisible" :width="700" title="菜单搜索" class="drawerBG" center destroy-on-close>
<search @success="searchVisible=false"></search>
</el-dialog>
<el-drawer v-model="tasksVisible" :size="450" title="任务中心" destroy-on-close>
<tasks></tasks>
</el-drawer>
</template>
<script setup name="userbar">
import {ref, onMounted, getCurrentInstance} from "vue";
import search from './search.vue'
import message from './message.vue'
import setting from './setting.vue'
import tasks from './tasks.vue'
import websocket from "@/utils/websocket";
import {ElNotification} from 'element-plus';
import tools from "@/utils/tools.js";
import api from "@/api/index.js";
import {useRouter} from "vue-router";
import {useI18n} from "vue-i18n";
const {proxy} = getCurrentInstance()
const router = useRouter()
const {t} = useI18n()
let searchVisible = ref(false)
let msg = ref(false)
let msgNum = ref(0)
const tasksVisible = ref(false)
let taskNum = ref(0)
const settingDialog = ref(false)
const userInfo = tools.data.get("USER_INFO");
let realname = userInfo.realname;
let realnameF = realname.substring(0, 1);
let avatar = userInfo.avatar
// mounted
onMounted(() => {
initWebSocket()
loadData()
})
function initWebSocket() {
const ws = websocket.init();
ws.websocket.onmessage = messageHandle
ws.websocket.onclose = closeHandle
}
function messageHandle(message) {
if (message.data == "connection successful" || message.data == "pong") {
return;
}
const data = JSON.parse(message.data)
if (!data) {
return;
}
if (data.code == 200) {
ElNotification.success({
title: 'Success',
message: data['msg']
})
} else {
ElNotification.warning({
title: 'Warning',
message: data['msg']
})
}
if (data.type == "message") {
msgNum.value++
} else if (data.type == "task") {
taskNum.value++
}
return;
}
function closeHandle() {
setTimeout(function () {
initWebSocket()
}, 5000);
}
//个人信息
function handleUser(command) {
if (command === "uc") {
router.push({path: '/usercenter'});
}
if (command === "cmd") {
router.push({path: '/cmd'});
}
if (command === "clearCache") {
proxy.$confirm('清除缓存会将系统初始化,包括登录状态、主题、语言设置等,是否继续?', '提示', {
type: 'info',
}).then(async () => {
const loading = proxy.$loading()
tools.data.clear()
const [res, err] = await tools.go(api.auth.logout())
if (!err) {
loading.close()
location.reload()
proxy.$message.success(res.msg)
router.replace({path: '/login'});
}
}).catch(() => {
});
}
if (command === "outLogin") {
proxy.$confirm('确认是否退出当前用户?', '提示', {
type: 'warning',
confirmButtonText: t("system.logout"),
confirmButtonClass: 'el-button--danger'
}).then(async () => {
const [res, err] = await tools.go(api.auth.logout())
if (!err) {
proxy.$message.success(res.msg)
router.replace({path: '/login'});
}
}).catch(() => {
});
}
}
//全屏
function screen() {
tools.screen(document.documentElement)
}
//显示短消息
function showMsg() {
msg.value = true
}
function closeMsg(num) {
if (num > -1) {
msgNum.value = num
}
msg.value = false
}
async function loadData() {
// let res = await this.$API.home.message.newCount()
// this.msgNum = res.data.count
}
</script>
<style scoped>
.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 {
font-size: 16px;
}
.user-bar .panel-item:hover {
background: rgba(0, 0, 0, 0.1);
}
.user-bar .user-avatar {
height: 49px;
display: flex;
align-items: center;
}
.user-bar .user-avatar label {
display: inline-block;
margin-left: 5px;
font-size: 12px;
cursor: pointer;
}
.user-bar .store-name {
height: 49px;
display: flex;
align-items: center;
}
.user-bar .store-name label {
display: inline-block;
margin-left: 5px;
font-size: 12px;
cursor: pointer;
}
.msg-list li {
border-top: 1px solid #eee;
}
.msg-list li a {
display: flex;
padding: 20px;
}
.msg-list li a:hover {
background: #ecf5ff;
}
.msg-list__icon {
width: 40px;
margin-right: 15px;
}
.msg-list__main {
flex: 1;
}
.msg-list__main h2 {
font-size: 15px;
font-weight: normal;
color: #333;
}
.msg-list__main p {
font-size: 12px;
color: #999;
line-height: 1.8;
margin-top: 5px;
}
.msg-list__time {
width: 100px;
text-align: right;
color: #999;
}
.dark .msg-list__main h2 {
color: #d0d0d0;
}
.dark .msg-list li {
border-top: 1px solid #363636;
}
.dark .msg-list li a:hover {
background: #383838;
}
</style>