<template>
|
<div>
|
<!-- 右侧用户登录图标 -->
|
<div class="user-logininfo">
|
<div class="user-logininfo-icon">
|
<!-- 折叠 -->
|
<i @click="clickFold" class="el-icon-s-fold"></i>
|
<!-- 标签列表 -->
|
<div class="tag-list-container" @wheel.prevent="handleWheel">
|
<div class="tag-list" v-for="tag in tagList" :key="tag.name">
|
<div @click="goTag(tag)" :class="{ 'activeTag': tag.path === $route.path }">
|
{{ tag.meta.title }}
|
</div>
|
<i @click="closeTag(tag)" v-if="tagList.length > 1" class="el-icon-close"></i>
|
</div>
|
</div>
|
</div>
|
<div class="user-info">
|
<img src="@/assets/public/photo.png" />
|
<div class="user-info-text">欢迎您,admin</div>
|
<div class="user-info-line"></div>
|
<div @click="outLogin" class="user-info-out">
|
<img src="@/assets/public/logOut.png" />
|
<div class="user-info-out-text">退出登录</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import { mapState } from 'vuex'
|
export default {
|
data() {
|
return {
|
userInfo: '',
|
scrollTimer: null,
|
scrollAmount: 0
|
}
|
},
|
computed: {
|
...mapState(['tagList', 'isFold'])
|
},
|
mounted() {
|
// 获取用户信息
|
this.getUserInfo()
|
},
|
methods: {
|
// 点击折叠按钮
|
clickFold() {
|
this.$store.commit('SET_ISFOLD', !this.isFold)
|
},
|
// 获取用户信息
|
getUserInfo() {
|
this.userInfo = JSON.parse(sessionStorage.getItem('userInfo'))
|
},
|
// 退出登录
|
outLogin() {
|
sessionStorage.clear()
|
this.$router.replace({ path: "/" });
|
},
|
// 关闭标签
|
closeTag(tag) {
|
this.$store.commit('SET_TAGLIST', this.tagList.filter(item => item.path !== tag.path))
|
// 判断是否是当前标签
|
if (tag.path === this.$route.path) {
|
// if (this.tagList.length > 1) {
|
this.$router.push(this.tagList[this.tagList.length - 1].path)
|
// } else {
|
// // this.$router.push('/welcome')
|
// }
|
}
|
},
|
// 跳转标签
|
goTag(tag) {
|
this.$router.push({
|
path: tag.path,
|
query: tag.query
|
})
|
},
|
handleWheel(e) {
|
if (this.scrollTimer) {
|
this.scrollAmount += e.deltaY;
|
return;
|
}
|
|
const container = e.currentTarget;
|
this.scrollAmount = e.deltaY;
|
|
const scroll = () => {
|
container.scrollLeft += this.scrollAmount * 1.2; // 增加滚动速度
|
this.scrollAmount = 0;
|
this.scrollTimer = null;
|
};
|
|
this.scrollTimer = setTimeout(scroll, 8); // 减少延迟时间
|
}
|
},
|
}
|
</script>
|
|
<style lang="less" scoped>
|
// 右侧用户头像
|
.user-logininfo {
|
height: 100%;
|
padding-left: 32px;
|
padding-right: 20px;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
overflow: hidden;
|
|
.user-logininfo-icon {
|
margin-right: 30px;
|
flex: 1;
|
display: flex;
|
align-items: center;
|
min-width: 0;
|
overflow: hidden;
|
|
i:first-child {
|
margin-right: 21px;
|
}
|
|
i {
|
cursor: pointer;
|
}
|
|
.tag-list-container {
|
display: flex;
|
align-items: center;
|
overflow-x: auto;
|
flex: 1;
|
min-width: 0;
|
scroll-behavior: auto; // 移除平滑滚动,提高性能
|
-webkit-overflow-scrolling: touch;
|
|
.tag-list {
|
flex-shrink: 0;
|
display: flex;
|
align-items: center;
|
cursor: pointer;
|
font-weight: 400;
|
font-size: 18px;
|
color: rgba(0, 0, 0, .6);
|
margin-right: 40px;
|
|
div:hover {
|
font-weight: bold;
|
color: #049C9A;
|
}
|
|
i {
|
margin-left: 10px;
|
|
&:hover {
|
color: #049C9A;
|
}
|
}
|
}
|
|
.activeTag {
|
font-weight: bold;
|
color: #049C9A;
|
}
|
}
|
|
}
|
|
.user-info {
|
flex-shrink: 0;
|
display: flex;
|
align-items: center;
|
|
img {
|
width: 26px;
|
height: 26px;
|
border-radius: 50%;
|
}
|
|
.user-info-text {
|
margin-left: 16px;
|
font-size: 14px;
|
color: #303133;
|
font-weight: 400;
|
}
|
|
.user-info-line {
|
width: 1px;
|
height: 12px;
|
background-color: #979797;
|
margin: 0 20px;
|
}
|
|
.user-info-out {
|
display: flex;
|
align-items: center;
|
padding: 0 11px;
|
border-radius: 12px;
|
position: relative;
|
background: transparent;
|
cursor: pointer;
|
|
&::before {
|
content: '';
|
position: absolute;
|
top: 0;
|
left: 0;
|
right: 0;
|
bottom: 0;
|
border-radius: 12px;
|
padding: 1px;
|
background: linear-gradient(180deg, rgba(10, 203, 202, 1), rgba(4, 156, 154, 1));
|
-webkit-mask:
|
linear-gradient(#fff 0 0) content-box,
|
linear-gradient(#fff 0 0);
|
-webkit-mask-composite: xor;
|
mask-composite: exclude;
|
}
|
|
.user-info-out-text {
|
font-weight: 400;
|
font-size: 14px;
|
color: #049C9A;
|
line-height: 21px;
|
position: relative;
|
z-index: 1;
|
}
|
|
img {
|
width: 14px;
|
height: 14px;
|
margin-right: 7px;
|
position: relative;
|
z-index: 1;
|
}
|
}
|
}
|
}
|
</style>
|