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
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> |