259 lines
6.4 KiB
Vue
259 lines
6.4 KiB
Vue
<template>
|
||
<div class="navbar">
|
||
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
|
||
|
||
<breadcrumb v-if="!topNav" id="breadcrumb-container" class="breadcrumb-container" />
|
||
<top-nav v-if="topNav" id="topmenu-container" class="topmenu-container" />
|
||
|
||
<div v-if="licenseWarning" class="license-warning">
|
||
<i class="el-icon-warning-outline" />
|
||
系统授权将于 {{ licenseExpireText }} 后过期,请及时联系管理员续期
|
||
</div>
|
||
|
||
<div class="right-menu">
|
||
<template v-if="device!=='mobile'">
|
||
<search id="header-search" class="right-menu-item" />
|
||
|
||
|
||
<el-tooltip content="联系我们" effect="dark" placement="bottom">
|
||
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
|
||
</el-tooltip>
|
||
|
||
<screenfull id="screenfull" class="right-menu-item hover-effect" />
|
||
|
||
<el-tooltip content="布局大小" effect="dark" placement="bottom">
|
||
<size-select id="size-select" class="right-menu-item hover-effect" />
|
||
</el-tooltip>
|
||
|
||
</template>
|
||
|
||
<el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
|
||
<div class="avatar-wrapper">
|
||
<img :src="avatar" class="user-avatar">
|
||
<i class="el-icon-caret-bottom" />
|
||
</div>
|
||
<el-dropdown-menu slot="dropdown">
|
||
<router-link to="/user/profile">
|
||
<el-dropdown-item>个人中心</el-dropdown-item>
|
||
</router-link>
|
||
<el-dropdown-item @click.native="setting = true">
|
||
<span>布局设置</span>
|
||
</el-dropdown-item>
|
||
<el-dropdown-item divided @click.native="logout">
|
||
<span>退出登录</span>
|
||
</el-dropdown-item>
|
||
</el-dropdown-menu>
|
||
</el-dropdown>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { mapGetters } from 'vuex'
|
||
import Breadcrumb from '@/components/Breadcrumb'
|
||
import TopNav from '@/components/TopNav'
|
||
import Hamburger from '@/components/Hamburger'
|
||
import Screenfull from '@/components/Screenfull'
|
||
import SizeSelect from '@/components/SizeSelect'
|
||
import Search from '@/components/HeaderSearch'
|
||
import RuoYiGit from '@/components/RuoYi/Git'
|
||
import RuoYiDoc from '@/components/RuoYi/Doc'
|
||
import { getLicenseInfo } from '@/api/license'
|
||
|
||
export default {
|
||
components: {
|
||
Breadcrumb,
|
||
TopNav,
|
||
Hamburger,
|
||
Screenfull,
|
||
SizeSelect,
|
||
Search,
|
||
RuoYiGit,
|
||
RuoYiDoc
|
||
},
|
||
data() {
|
||
return {
|
||
licenseWarning: false,
|
||
licenseExpireText: '',
|
||
licenseTimer: null
|
||
}
|
||
},
|
||
computed: {
|
||
...mapGetters([
|
||
'sidebar',
|
||
'avatar',
|
||
'device'
|
||
]),
|
||
setting: {
|
||
get() {
|
||
return this.$store.state.settings.showSettings
|
||
},
|
||
set(val) {
|
||
this.$store.dispatch('settings/changeSetting', {
|
||
key: 'showSettings',
|
||
value: val
|
||
})
|
||
}
|
||
},
|
||
topNav: {
|
||
get() {
|
||
return this.$store.state.settings.topNav
|
||
}
|
||
}
|
||
},
|
||
mounted() {
|
||
this.checkLicenseExpire()
|
||
this.licenseTimer = setInterval(() => this.checkLicenseExpire(), 60 * 1000)
|
||
},
|
||
beforeDestroy() {
|
||
if (this.licenseTimer) {
|
||
clearInterval(this.licenseTimer)
|
||
}
|
||
},
|
||
methods: {
|
||
checkLicenseExpire() {
|
||
getLicenseInfo().then(res => {
|
||
if (res.code === 200 && res.data && res.data.expireTime) {
|
||
const expireTime = new Date(res.data.expireTime).getTime()
|
||
const now = Date.now()
|
||
const diffMs = expireTime - now
|
||
const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24))
|
||
if (diffMs > 0 && diffDays <= 30) {
|
||
this.licenseWarning = true
|
||
if (diffMs < 1000 * 60 * 60 * 24) {
|
||
const hours = Math.floor(diffMs / (1000 * 60 * 60))
|
||
const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60))
|
||
if (hours > 0) {
|
||
this.licenseExpireText = hours + ' 小时 ' + minutes + ' 分钟'
|
||
} else {
|
||
this.licenseExpireText = minutes + ' 分钟'
|
||
}
|
||
} else if (diffDays < 7) {
|
||
this.licenseExpireText = diffDays + ' 天'
|
||
} else {
|
||
this.licenseExpireText = Math.ceil(diffDays / 7) + ' 周'
|
||
}
|
||
}
|
||
}
|
||
}).catch(() => {})
|
||
},
|
||
toggleSideBar() {
|
||
this.$store.dispatch('app/toggleSideBar')
|
||
},
|
||
logout() {
|
||
this.$confirm('确定注销并退出系统吗?', '提示', {
|
||
confirmButtonText: '确定',
|
||
cancelButtonText: '取消',
|
||
type: 'warning'
|
||
}).then(() => {
|
||
this.$store.dispatch('LogOut').then(() => {
|
||
location.href = '/index'
|
||
})
|
||
}).catch(() => {})
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.navbar {
|
||
height: 50px;
|
||
overflow: hidden;
|
||
position: relative;
|
||
background: #fff;
|
||
box-shadow: 0 1px 4px rgba(0,21,41,.08);
|
||
|
||
.license-warning {
|
||
position: absolute;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
top: 0;
|
||
height: 50px;
|
||
line-height: 50px;
|
||
font-size: 13px;
|
||
color: #e6a23c;
|
||
font-weight: 500;
|
||
pointer-events: none;
|
||
i { margin-right: 4px; }
|
||
}
|
||
.hamburger-container {
|
||
line-height: 46px;
|
||
height: 100%;
|
||
float: left;
|
||
cursor: pointer;
|
||
transition: background .3s;
|
||
-webkit-tap-highlight-color:transparent;
|
||
|
||
&:hover {
|
||
background: rgba(0, 0, 0, .025)
|
||
}
|
||
}
|
||
|
||
.breadcrumb-container {
|
||
float: left;
|
||
}
|
||
|
||
.topmenu-container {
|
||
position: absolute;
|
||
left: 50px;
|
||
}
|
||
|
||
.errLog-container {
|
||
display: inline-block;
|
||
vertical-align: top;
|
||
}
|
||
|
||
.right-menu {
|
||
float: right;
|
||
height: 100%;
|
||
line-height: 50px;
|
||
|
||
&:focus {
|
||
outline: none;
|
||
}
|
||
|
||
.right-menu-item {
|
||
display: inline-block;
|
||
padding: 0 8px;
|
||
height: 100%;
|
||
font-size: 18px;
|
||
color: #5a5e66;
|
||
vertical-align: text-bottom;
|
||
|
||
&.hover-effect {
|
||
cursor: pointer;
|
||
transition: background .3s;
|
||
|
||
&:hover {
|
||
background: rgba(0, 0, 0, .025)
|
||
}
|
||
}
|
||
}
|
||
|
||
.avatar-container {
|
||
margin-right: 30px;
|
||
|
||
.avatar-wrapper {
|
||
margin-top: 5px;
|
||
position: relative;
|
||
|
||
.user-avatar {
|
||
cursor: pointer;
|
||
width: 40px;
|
||
height: 40px;
|
||
border-radius: 10px;
|
||
}
|
||
|
||
.el-icon-caret-bottom {
|
||
cursor: pointer;
|
||
position: absolute;
|
||
right: -20px;
|
||
top: 25px;
|
||
font-size: 12px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style>
|