<template> <el-header class="app-header"> <h3>{{ title }}</h3> <!-- 报警列表 --> <el-dropdown class="alarm" placement="top"> <div class="dropdown-wrapper"> <i class="el-icon-warning" style="font-size: 24px;" :class="`${alarmList.length ? 'alarm-icon' : ''}`"></i> </div> <el-dropdown-menu slot="dropdown" class="user-dropdown"> <el-dropdown-item v-if="!alarmList.length"> <div>暂无报警信息</div> </el-dropdown-item> <template v-else> <el-dropdown-item v-for="item in alarmList" :key="item.id"> <div @click="alarmDetail">设备{{ item.devcode }} || {{ item.alarmMessage }} || {{ item.alarmTime }}</div> </el-dropdown-item> </template> </el-dropdown-menu> </el-dropdown> <!--子系统选项--> <el-dropdown v-if="showChangeSys" class="systemSelect" size="medium" @command="handleCommand"> <span class="el-dropdown-link">{{ currentSystem.name }}<i class="el-icon-arrow-down el-icon--right" /> </span> <el-dropdown-menu slot="dropdown"> <el-dropdown-item v-for="system in systems" :key="system.id" :command="system"> {{ system.name }} </el-dropdown-item> </el-dropdown-menu> </el-dropdown> <el-dropdown class="dropdown-container"> <div class="dropdown-wrapper"> <span style="line-height:50px;">欢迎您,{{ name }}</span> <!--<img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar">--> <!-- <i class="el-icon-arrow-down" />--> </div> <el-dropdown-menu slot="dropdown" class="user-dropdown"> <!-- <el-dropdown-item v-if="!baseConfig.singleSys">--> <!-- <span style="display:block;" @click="backToIndex">回首页</span>--> <!-- </el-dropdown-item>--> <!-- <el-dropdown-item :divided="!baseConfig.singleSys">--> <!-- <span style="display:block;" @click="resetPwd">修改密码</span>--> <!-- </el-dropdown-item>--> <el-dropdown-item divided> <span style="display:block;" @click="logout">注销</span> </el-dropdown-item> </el-dropdown-menu> </el-dropdown> <reset-pwd v-show="showSetPwd" ref="retPwd" /> <alarm-dialog ref="alarmRef" /> </el-header> </template> <script> import { mapGetters } from 'vuex' import ResetPwd from '@/views/system/user/resetPwd' import alarmDialog from '../../components/alarmDialog.vue' import { getAlarmList } from '@/api/alarm/alarm' export default { name: 'AppHeader', components: { ResetPwd, alarmDialog }, data() { return { title: this.baseConfig.title, // 标题 showChangeSys: !this.baseConfig.singleSys, // 是否显示切换系统菜单 name: this.$store.getters.name, // 用户姓名 showSetPwd: false, // 是否显示修改密码按钮 alarmList: [] //报警列表 } }, computed: { ...mapGetters([ 'sidebar', 'avatar', 'currentSystem', 'systems', 'alarmInfo' ]) }, created() { this.fetchAlarmList() if (!this.baseConfig.singleSys) { this.getSystems() } }, mounted() { document.addEventListener('visibilitychange', this.handleTabVisibilityChange) this.initWebSocket() // this.$refs.alarmRef.initDialog({ // message: '浓度超限', // type: 'alarm', // deviceNo: '3C2023010008', // value: '110.0', // }) setInterval(() => { this.fetchAlarmList() }, 1000 * 30) }, methods: { initWebSocket() { // 当用户id时在加载websocket if (this.$store.getters.id) { console.log('初始化websocket') const that = this this.$store.dispatch('initWebSocket', that) } }, toggleSideBar() { this.$store.dispatch('ToggleSideBar') }, logout() { this.$store.dispatch('LogOut').then(() => { this.$router.push({ path: '/login' }) // location.reload() // 为了重新实例化vue-router对象 避免bug }) }, resetPwd() { this.showSetPwd = true this.$refs.retPwd.initDialog(true) }, backToIndex() { const url = this.baseConfig.mainPage window.location.href = url }, // 切换子系统 handleCommand(command) { console.log('切换子系统:' + command.name) const params1 = `?token=${this.$store.getters.token}` const params = `?sys=${command.name}&url=${command.url}&code=${command.code}&token=${this.$store.getters.token}` // 判断系统是不是http的,如果是则打开新窗口 if (command.url.indexOf('http') > -1) { // 取token if (this.baseConfig.sameWindow) { window.location.href = command.url + params1 } else { window.open(command.url + params1, '_blank') } } else { // 取token if (this.baseConfig.sameWindow) { window.location.href = this.baseConfig.mainPage + command.url + params } else { window.open(this.baseConfig.mainPage + command.url + params, '_blank') } } }, // 获取子系统 getSystems() { this.$store.dispatch('GetSystems').then(() => { console.log('获取子系统列表成功-appHeader') }) }, fetchAlarmList() { getAlarmList({ offset: 1, limit: 99, status: '1' }).then((res) => { // console.log(res.data) this.alarmList = res.data.rows }) }, alarmDetail() { this.$router.push({ path: '/alarmNow' }) }, handleTabVisibilityChange() { if (document.visibilityState === 'visible') { console.log('页面被切回来,appheader') // 执行当Tab回到前台时的逻辑 } else if (document.visibilityState === 'hidden') { console.log('页面被切走,appheader') } } }, watch: { alarmInfo: { handler(newVal) { if (newVal.type === 'alarm') { this.$refs.alarmRef.initDialog(newVal) this.fetchAlarmList() } console.log(newVal, '报警消息') }, deep: true } } } </script> <style rel="stylesheet/scss" lang="scss" scoped> h3 { margin-left: 24px; display: inline-block; float: left; } .alarm { height: 56px; display: inline-block; // float: right; z-index: 500; position: fixed; // margin-left: 60px; // top: 5px; color: #fff; font-size: 16px; right: 180px; line-height: 70px; .dropdown-wrapper { &:hover { cursor: pointer; } } } .alarm-icon { color: #F56C6C; } .dropdown-container { /*height: 50px;*/ display: inline-block; float: right; z-index: 500; position: fixed; top: 0px; right: 35px; .dropdown-wrapper { cursor: pointer; margin-top: 5px; position: relative; line-height: initial; .user-avatar { width: 40px; height: 40px; border-radius: 10px; } .el-icon-caret-bottom { font-size: 12px; } } } .systemSelect { height: 56px; display: inline-block; float: left; z-index: 500; position: fixed; margin-left: 60px; top: 5px; color: #fff; line-height: 56px; } </style>