<template>
|
<div class="navbar">
|
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
|
|
<breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
|
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
|
|
<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-git id="ruoyi-git" class="right-menu-item hover-effect" />
|
</el-tooltip>
|
|
<el-tooltip content="文档地址" effect="dark" placement="bottom">
|
<ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
|
</el-tooltip>
|
-->
|
<el-tooltip effect="dark" placement="bottom">
|
<h1 class="right-menu-item hover-effect" style="text-align: center;display:
|
block;line-height: 50px;">{{greeting}}</h1>
|
</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="ximg" 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'
|
|
export default {
|
components: {
|
Breadcrumb,
|
TopNav,
|
Hamburger,
|
Screenfull,
|
SizeSelect,
|
Search,
|
RuoYiGit,
|
RuoYiDoc
|
},
|
data() {
|
return {
|
xm: {"张":"zhang.png","李":"li.png"},
|
greeting: "",
|
ximg: "",
|
};
|
},
|
|
mounted() {
|
this.setGreeting();
|
},
|
|
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
|
}
|
}
|
},
|
methods: {
|
getLastName(fullname)
|
{
|
let hyphenated = ['欧阳', '太史', '端木', '上官', '司马', '东方', '独孤', '南宫', '万俟', '闻人',
|
'夏侯', '诸葛', '尉迟', '公羊', '赫连', '澹台', '皇甫', '宗政', '濮阳', '公冶',
|
'太叔', '申屠', '公孙', '慕容', '仲孙', '钟离', '长孙', '宇文', '城池', '司徒',
|
'鲜于', '司空', '汝嫣', '闾丘', '子车', '亓官', '司寇', '巫马', '公西', '颛孙',
|
'壤驷', '公良', '漆雕', '乐正', '宰父', '谷梁', '拓跋', '夹谷', '轩辕', '令狐',
|
'段干', '百里', '呼延', '东郭', '南门', '羊舌', '微生', '公户', '公玉', '公仪',
|
'梁丘', '公仲', '公上', '公门', '公山', '公坚', '左丘', '公伯', '西门', '公祖',
|
'第五', '公乘', '贯丘', '公皙', '南荣', '东里', '东宫', '仲长', '子书', '子桑',
|
'即墨', '达奚', '褚师'];
|
let hyset = new Set(hyphenated);
|
let vLength = fullname.length;
|
// 前为姓,后为名
|
let lastname = '', firstname = '';
|
if (vLength > 2){
|
var preTwoWords = fullname.substr(0, 2);
|
// 取命名的前两个字,看是否在复姓库中
|
if (hyset.has(preTwoWords)){
|
lastname = preTwoWords;
|
firstname = fullname.substr(2);
|
}else{
|
lastname = fullname.substr(0, 1);
|
firstname = fullname.substr(1);
|
}
|
}else if (vLength === 2){
|
// 全名只有两个字时,以前一个为姓,后一下为名
|
lastname = fullname.substr(0, 1);
|
firstname = fullname.substr(1);
|
}else{
|
lastname = fullname;
|
}
|
return lastname;
|
},
|
setGreeting() {
|
const currentTime = new Date();
|
const currentHour = currentTime.getHours();
|
let name = this.$store.state.user.name
|
let lnm = this.getLastName(name)
|
if(this.xm[lnm]!=null)
|
this.ximg = require("@/assets/images/"+this.xm[lnm])
|
else
|
this.ximg = require("@/assets/images/login_logo.png")
|
if (currentHour < 12) {
|
this.greeting = "早上好,"+name;
|
} else if (currentHour < 14) {
|
this.greeting = "中午好,"+name;
|
} else if (currentHour < 18) {
|
this.greeting = "下午好,"+name;
|
} else {
|
this.greeting = "晚上好,"+name;
|
}
|
},
|
toggleSideBar() {
|
this.$store.dispatch('app/toggleSideBar')
|
},
|
|
async 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);
|
|
.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>
|