You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

464 lines
14 KiB

<template>
<div class="header">
<a class="logo" @click="toIndex">
<img src="@/assets/img/logo.png" alt="">
</a>
<div class="inner">
<div style="height: 64px;"></div>
<navbar ref="nav" @hideSetting="hideSetting"></navbar>
<div class="action" v-if="token">
<img v-if="showSetting" class="icon m-r-20" src="../../assets/img/setting.png" alt="" @click="toManager">
<el-dropdown class="user-wrap" @command="userCommand">
<div class="user">
<el-avatar :size="40" :src="avatar"></el-avatar>
<span class="username">{{userName}}</span>
</div>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="person" v-if="!isCustomer">个人资料</el-dropdown-item>
<template v-else>
<el-dropdown-item command="resetPw">修改密码</el-dropdown-item>
<el-dropdown-item command="myDownload">我的下载</el-dropdown-item>
</template>
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<div class="login" v-else-if="!isLogin" @click="toLogin">
<img src="@/assets/img/user.png" alt="">
<span>登录</span>
</div>
</div>
<el-dialog title="修改密码" :visible.sync="passwordVisible" :close-on-click-modal="false" :append-to-body="true" @close="closePassword" width="30%">
<el-form ref="passwordForm" label-width="82px">
<el-form-item label="原密码">
<el-input type="password" v-model="passwordForm.password" placeholder="请输入原密码"></el-input>
</el-form-item>
<el-form-item label="新密码">
<el-input type="password" v-model="passwordForm.newPassword" placeholder="请输入新密码" @keyup.enter.native="editPassword"></el-input>
</el-form-item>
<el-form-item label="确认新密码">
<el-input type="password" v-model="passwordForm.reNewPassword" placeholder="请确认新密码" @keyup.enter.native="editPassword"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="passwordVisible = false">取 消</el-button>
<el-button size="small" type="primary" @click="editPassword">确 定</el-button>
</span>
</el-dialog>
<div class="log-mask" v-if="logVisible"></div>
<div class="log-dia" v-if="logVisible">
<img class="bg1" src="@/assets/img/log-bg.png" alt="">
<img class="bg2" src="@/assets/img/log-bg1.png" alt="">
<p class="log-title">更新日志</p>
<div class="log-wrap">
<div class="logs">
<div class="item" v-for="(item, i) in list" :key="i" v-show="!i || (i && logAll)">
<h6>{{ item.versionName }}</h6>
<img v-if="item.coverUrl" :src="item.coverUrl" alt="" class="cover">
<ul class="detail">
<li v-for="(item, i) in item.logContents" :key="i">
<p class="name"><img :src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')" alt=""> {{ funcList.find(e => e.id === item.type).name }}</p>
<div class="val">
<p v-for="(item, i) in item.content" :key="i">{{ i + 1 }}{{ item }}</p>
</div>
</li>
</ul>
</div>
</div>
<div class="more-wrap">
<p>更多功能介绍点击 <span class="more" @click="logAll = !logAll">了解更多</span></p>
<el-button class="know" type="primary" size="small" @click="logVisible = false">知道了</el-button>
</div>
</div>
</div>
</div>
</template>
<script>
import navbar from '../navbar'
import { mapState, mapMutations, mapActions } from 'vuex'
import Setting from '@/setting'
import util from '@/libs/util'
export default {
data() {
return {
token: util.local.get(Setting.tokenKey),
isLogin: this.$route.path == '/login',
customer: this.$route.query.customer,
showSetting: true,
id: '',
schoolName: '',
passwordVisible: false,
passwordForm: {
password: '',
newPassword: '',
reNewPassword: ''
},
logVisible: false,
list: [],
logAll: false,
funcList: [
{
id: 0,
name: '新功能',
icon: 'func'
},
{
id: 1,
name: '修复',
icon: 'bug'
},
{
id: 2,
name: '优化',
icon: 'optimize'
}
]
};
},
components: { navbar },
computed: {
...mapState('user', [
'avatar', 'schoolId', 'isCustomer', 'userName', 'logView'
]),
...mapState('auth', [
'routes'
])
},
mounted() {
// 如果是客户,则存到store里去,因为客户是没有用户信息的,上面要根据这个值来判断显示与否
if (this.customer) {
let customer = atob(decodeURI(this.customer)) == 'false' ? false : true
this.setCustomer(customer)
}
// 如果是管理员,并且已经进入到了后台,那么就要把进入后台的图标给隐藏
let mg = this.$route.query.mg
if (mg && atob(decodeURI(mg)) === 'true') {
this.showSetting = false
const userName = this.$route.query.userName
userName && this.setInfo({
userName
})
}
this.logView || this.getLogStatus() // logView为false才需要查询接口
// 如果登录了,并且非客户,才调用用户信息的接口。客户是没有用户信息的,但是能进入后台(如果有权限菜单)
setTimeout(() => {
this.token && !this.isCustomer && this.getUserInfo()
}, 1000)
},
methods: {
...mapMutations('user', [
'SET_LOG'
]),
...mapActions('user', [
'setInfo', 'logout', 'setManager', 'setCustomer'
]),
// 获取日志列表
getLog() {
this.$get(`${this.api.platformLogList}?platformId=${Setting.platformId}&port=1&versionName=`).then(({ logList }) => {
logList.map((e, i) => {
e.logContents.map(n => {
n.content = n.content.split('\n')
})
})
this.list = logList
}).catch(res => {})
},
// 获取日志状态
getLogStatus() {
this.token && this.$get(this.api.logNotification, {
platformId: Setting.platformId
}).then(({ notification }) => {
this.SET_LOG() // 把查看日志状态设置为true
if (notification) {
this.logVisible = true // 返回true,则显示日志弹框
this.getLog()
}
}).catch(res => {})
},
// 获取个人信息
getUserInfo() {
this.$get(this.api.userInfo).then(res => {
let userInfo = res.userInfo ? res.userInfo : {}
let userAccount = res.userAccount
this.id = userAccount.id
this.schoolName = res.schoolName
this.setInfo({
avatar: userInfo.userAvatars,
userName: userInfo.userName
})
// 如果没有用户名,说明是客户,那就从客户接口里去取
userInfo.userName || this.$get(this.api.isClient).then(res => {
res.customerName && this.setInfo({userName: res.customerName})
}).catch(res => {})
}).catch(err => { })
},
hideSetting() {
this.showSetting = false
},
toIndex() {
// 如果是在首页,直接刷新页面,否则,跳转到首页,并且重置进入后台的图标
if (this.$route.path === '/index/list') {
location.reload()
} else {
this.$refs.nav.toIndex()
this.showSetting = true
}
},
toLogin() {
window.open(this.$router.resolve('/login').href)
},
// 跳转到管理员后台
toManager() {
let routes = this.routes
if (routes.length) {
let route = this.$router.resolve({
path: this.routes[0].name,
query: {
mg: btoa(true), // 后台的标识
schoolId: btoa(this.schoolId),
customer: btoa(this.isCustomer), // 客户标识
userName: this.userName
}
})
window.open(route.href) // 后台要打开新标签页
} else {
// 如果接口返回的后台角色权限为空,则表示没有给该角色开放任何模块权限,直接提示用户未开放
util.warningMsg('该角色未开放模块,请联系管理员')
}
},
userCommand(command) {
if (command == 'person') {
this.$router.push('/setting/person').catch(err => { })
} else if (command == 'resetPw') {
this.showPassword()
} else if (command == 'myDownload') {
this.$router.push('/setting/download').catch(err => { })
} else {
this.logout()
}
},
showPassword() {
this.passwordVisible = true
},
editPassword() {
if (!this.passwordForm.password) return util.warningMsg('请输入原密码')
if (!this.passwordForm.newPassword) return util.warningMsg('请输入新密码')
if (!this.passwordForm.reNewPassword) return util.warningMsg('请确认新密码')
if (this.passwordForm.newPassword.length < 6 || this.passwordForm.reNewPassword.length < 6) return util.warningMsg('请输入6位数以上的密码')
if (this.passwordForm.newPassword !== this.passwordForm.reNewPassword) return util.warningMsg('输入的新密码不一致,请重新确认')
if (this.passwordForm.password === this.passwordForm.newPassword) return util.warningMsg('原密码跟新密码不能一致')
let data = this.passwordForm
data.accountId = this.id
this.$post(this.api.examinePassword, data).then(res => {
util.successMsg('修改成功')
this.passwordVisible = false
}).catch(err => { })
},
closePassword() {
this.passwordForm = {
password: '',
newPassword: '',
reNewPassword: ''
}
},
},
};
</script>
<style lang="scss" scoped>
$height: 64px;
.header{
z-index: 10;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: $height;
background-color: #fff;
box-shadow: 0px 0px 6px 0px rgba(178, 178, 178, 0.32);
.inner{
display: flex;
justify-content: space-between;
align-items: center;
min-width: $min-width;
padding: 0 80px 0 10px;
margin: 0 auto;
}
.logo{
position: absolute;
top: 0;
left: 80px;
font-size: 28px;
color: #568DF2;
line-height: $height;
cursor: pointer;
}
.search{
z-index: 2;
position: absolute;
top: 0;
left: 70%;
transform: translate(-50%);
display: flex;
justify-content: space-between;
align-items: center;
width: 300px;
height: $height;
padding: 7px 20px;
margin: 0 auto;
background-color: #fff;
input{
width: 195px;
margin-left: 10px;
font-size: 14px;
color: #333;
background-color: transparent;
border: 0;
&::-webkit-input-placeholder{color: #999}
&::-moz-placeholder{color: #999}
&:-moz-placeholder{color: #999}
&:focus{
outline: none;
}
}
.remove{
cursor: pointer;
}
.search-icon{
width: 18px;
}
}
.action{
display: inline-flex;
align-items: center;
.icon{
cursor: pointer;
}
.user-wrap {
display: inline-flex;
align-items: center;
.user{
display: inline-flex;
align-items: center;
cursor: pointer;
.username{
margin-left: 10px;
color: #000;
font-size: 16px;
}
}
}
}
.login{
display: inline-flex;
align-items: center;
cursor: pointer;
&:hover{
opacity: .9;
}
span{
margin-left: 5px;
color: #666;
font-size: 14px;
}
}
}
.log-mask {
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: rgba(0, 0, 0, .4);
}
/deep/.log-dia {
position: absolute;
top: calc((100vh - 500px) / 2);
left: 50%;
width: 500px;
transform: translateX(-50%);
background-color: #fff;
border-radius: 6px;
.bg1 {
width: 100%;
height: 200px;
}
.bg2 {
position: absolute;
top: -150px;
left: 0;
max-width: 100%;
}
.log-title {
position: absolute;
top: 90px;
left: 130px;
font-size: 40px;
color: #fff;
font-weight: 600;
}
.log-wrap {
padding-bottom: 30px;
}
.logs {
max-height: 300px;
padding: 0 60px;
margin: 30px 0;
overflow: auto;
}
h6 {
margin-bottom: 15px;
font-size: 18px;
color: #333;
line-height: 1;
}
.more-wrap {
padding: 0 60px;
font-size: 14px;
color: #333;
}
.more {
font-size: 14px;
color: $main-color;
cursor: pointer;
&:hover {
opacity: .9;
}
}
.know {
margin-top: 15px;
}
.cover {
max-width: 400px;
margin: 10px 0 20px;
}
.detail {
li {
margin-bottom: 20px;
}
.name {
display: flex;
align-items: center;
margin-bottom: 5px;
font-size: 14px;
img {
width: 20px;
margin-right: 8px;
}
}
.val {
font-size: 15px;
line-height: 1.8;
white-space: pre-wrap;
p {
position: relative;
color: #505050;
}
}
}
}
</style>