| ¶Ô±ÈÐÂÎļþ | 
|  |  |  | 
|---|
|  |  |  | <template> | 
|---|
|  |  |  | <div class="main-header"> | 
|---|
|  |  |  | <div class="header"> | 
|---|
|  |  |  | <h2> | 
|---|
|  |  |  | <i class="el-icon-s-unfold" v-if="menuData.collapse" @click="switchCollapseMenu(null)"></i> | 
|---|
|  |  |  | <i class="el-icon-s-fold" v-else @click="switchCollapseMenu(null)"></i> | 
|---|
|  |  |  | {{title}} | 
|---|
|  |  |  | </h2> | 
|---|
|  |  |  | <div class="user"> | 
|---|
|  |  |  | <el-dropdown trigger="click"> | 
|---|
|  |  |  | <span class="el-dropdown-link" style="color: white"> | 
|---|
|  |  |  | <img v-if="userInfo != null" :src="userInfo.avatar == null ? '@/assets/avatar/man.png' : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i> | 
|---|
|  |  |  | </span> | 
|---|
|  |  |  | <el-dropdown-menu slot="dropdown"> | 
|---|
|  |  |  | <el-dropdown-item @click.native="changePwd">ä¿®æ¹å¯ç </el-dropdown-item> | 
|---|
|  |  |  | <el-dropdown-item @click.native="logout">éåºç»å½</el-dropdown-item> | 
|---|
|  |  |  | </el-dropdown-menu> | 
|---|
|  |  |  | </el-dropdown> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <!-- ä¿®æ¹å¯ç  --> | 
|---|
|  |  |  | <GlobalWindow | 
|---|
|  |  |  | title="ä¿®æ¹å¯ç " | 
|---|
|  |  |  | :visible.sync="visible.changePwd" | 
|---|
|  |  |  | @confirm="confirmChangePwd" | 
|---|
|  |  |  | @close="visible.changePwd = false" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules"> | 
|---|
|  |  |  | <el-form-item label="åå§å¯ç " prop="oldPwd" required> | 
|---|
|  |  |  | <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="请è¾å
¥åå§å¯ç " maxlength="30" show-password></el-input> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item label="æ°å¯ç " prop="newPwd" required> | 
|---|
|  |  |  | <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请è¾å
¥æ°å¯ç " maxlength="30" show-password></el-input> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item label="确认æ°å¯ç " prop="confirmPwd" required> | 
|---|
|  |  |  | <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="è¯·åæ¬¡è¾å
¥æ°å¯ç " maxlength="30" show-password></el-input> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | </el-form> | 
|---|
|  |  |  | </GlobalWindow> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <script> | 
|---|
|  |  |  | import { mapState, mapMutations } from 'vuex' | 
|---|
|  |  |  | import GlobalWindow from './GlobalWindow' | 
|---|
|  |  |  | import { logout, updatePwd } from '@/api/system/common' | 
|---|
|  |  |  |  | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | name: 'Header', | 
|---|
|  |  |  | components: { GlobalWindow }, | 
|---|
|  |  |  | data () { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | visible: { | 
|---|
|  |  |  | // ä¿®æ¹å¯ç  | 
|---|
|  |  |  | changePwd: false | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | isWorking: { | 
|---|
|  |  |  | // ä¿®æ¹å¯ç  | 
|---|
|  |  |  | changePwd: false | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // ç¨æ·å | 
|---|
|  |  |  | username: '', | 
|---|
|  |  |  | // ä¿®æ¹å¯ç å¼¹æ¡ | 
|---|
|  |  |  | changePwdData: { | 
|---|
|  |  |  | form: { | 
|---|
|  |  |  | oldPwd: '', | 
|---|
|  |  |  | newPwd: '', | 
|---|
|  |  |  | confirmPwd: '' | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | rules: { | 
|---|
|  |  |  | oldPwd: [ | 
|---|
|  |  |  | { required: true, message: '请è¾å
¥åå§å¯ç ' } | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | newPwd: [ | 
|---|
|  |  |  | { required: true, message: '请è¾å
¥å¯ç ', trigger: 'blur' }, | 
|---|
|  |  |  | { validator: this.validatePassword, trigger: 'blur' }, | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | confirmPwd: [ | 
|---|
|  |  |  | { required: true, message: 'è¯·åæ¬¡è¾å
¥æ°å¯ç ' } | 
|---|
|  |  |  | ] | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | computed: { | 
|---|
|  |  |  | ...mapState(['menuData', 'userInfo']), | 
|---|
|  |  |  | title () { | 
|---|
|  |  |  | return this.$route.meta.title | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | filters: { | 
|---|
|  |  |  | // å±ç¤ºåç§° | 
|---|
|  |  |  | displayName (userInfo) { | 
|---|
|  |  |  | if (userInfo == null) { | 
|---|
|  |  |  | return '' | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (userInfo.realname != null && userInfo.realname.trim().length > 0) { | 
|---|
|  |  |  | return userInfo.realname | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return userInfo.username | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | ...mapMutations(['setUserInfo', 'switchCollapseMenu']), | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * ä¿®æ¹å¯ç ï¼ç¹å»ä¿®æ¹å¯ç æ¶è§¦åï¼ | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | changePwd () { | 
|---|
|  |  |  | this.visible.changePwd = true | 
|---|
|  |  |  | this.$nextTick(() => { | 
|---|
|  |  |  | this.$refs.changePwdDataForm.resetFields() | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | validatePassword(rule, value, callback) { | 
|---|
|  |  |  | if (!value) { | 
|---|
|  |  |  | callback(new Error('请è¾å
¥å¯ç ')) | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | const lengthValid = /^.{6,20}$/.test(value) | 
|---|
|  |  |  | const hasLetter = /[a-zA-Z]/.test(value) | 
|---|
|  |  |  | const hasNumber = /[0-9]/.test(value) | 
|---|
|  |  |  | const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!lengthValid) { | 
|---|
|  |  |  | callback(new Error('å¯ç é¿åº¦é为6å°20个å符')) | 
|---|
|  |  |  | } else if (typesCount < 2) { | 
|---|
|  |  |  | callback(new Error('å¯ç éå
å«åæ¯ãæ°ååç¹æ®å符ä¸çè³å°ä¸¤ç§')) | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | callback() // éªè¯éè¿ | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * ç¡®å®ä¿®æ¹å¯ç  | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | confirmChangePwd () { | 
|---|
|  |  |  | if (this.isWorking.changePwd) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.$refs.changePwdDataForm.validate((valid) => { | 
|---|
|  |  |  | if (!valid) { | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // éªè¯ä¸¤æ¬¡å¯ç è¾å
¥æ¯å¦ä¸è´ | 
|---|
|  |  |  | if (this.changePwdData.form.newPwd !== this.changePwdData.form.confirmPwd) { | 
|---|
|  |  |  | this.$tip.warning('两次å¯ç è¾å
¥ä¸ä¸è´') | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // æ§è¡ä¿®æ¹ | 
|---|
|  |  |  | this.isWorking.changePwd = true | 
|---|
|  |  |  | updatePwd({ | 
|---|
|  |  |  | oldPwd: this.changePwdData.form.oldPwd, | 
|---|
|  |  |  | newPwd: this.changePwdData.form.newPwd | 
|---|
|  |  |  | },true) | 
|---|
|  |  |  | .then(() => { | 
|---|
|  |  |  | this.visible.changePwd = false | 
|---|
|  |  |  | setTimeout(() => { | 
|---|
|  |  |  | this.$dialog.attentionConfirm('å¯ç ä¿®æ¹æåï¼è¯·éæ°ç»å½', null, 'éæ°ç»å½').then(() => { | 
|---|
|  |  |  | this.logout() | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, 300) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(e => { | 
|---|
|  |  |  | this.$tip.apiFailed(e) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .finally(() => { | 
|---|
|  |  |  | this.isWorking.changePwd = false | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * éåºç»å½ | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | logout () { | 
|---|
|  |  |  | logout() | 
|---|
|  |  |  | .then(() => { | 
|---|
|  |  |  | this.setUserInfo(null) | 
|---|
|  |  |  | this.$cache.twoFA.removePassword() | 
|---|
|  |  |  | this.$router.push({ name: 'login' }) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(e => { | 
|---|
|  |  |  | this.$tip.apiFailed(e) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </script> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <style scoped lang="scss"> | 
|---|
|  |  |  | @import "@/assets/style/variables.scss"; | 
|---|
|  |  |  | .header { | 
|---|
|  |  |  | overflow: hidden; | 
|---|
|  |  |  | padding: 0 25px; | 
|---|
|  |  |  | background: #0c6ce3; | 
|---|
|  |  |  | height: 100%; | 
|---|
|  |  |  | display: flex; | 
|---|
|  |  |  | h2 { | 
|---|
|  |  |  | width: 50%; | 
|---|
|  |  |  | flex-shrink: 0; | 
|---|
|  |  |  | line-height: $header-height; | 
|---|
|  |  |  | font-size: 19px; | 
|---|
|  |  |  | font-weight: 600; | 
|---|
|  |  |  | color: white; | 
|---|
|  |  |  | display: inline; | 
|---|
|  |  |  | & > i { | 
|---|
|  |  |  | font-size: 20px; | 
|---|
|  |  |  | margin-right: 12px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .user { | 
|---|
|  |  |  | width: 50%; | 
|---|
|  |  |  | flex-shrink: 0; | 
|---|
|  |  |  | color: white; | 
|---|
|  |  |  | text-align: right; | 
|---|
|  |  |  | .el-dropdown { | 
|---|
|  |  |  | top: 2px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | img { | 
|---|
|  |  |  | width: 32px; | 
|---|
|  |  |  | position: relative; | 
|---|
|  |  |  | top: 10px; | 
|---|
|  |  |  | margin-right: 10px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // ä¸æèåæ¡ | 
|---|
|  |  |  | .el-dropdown-menu { | 
|---|
|  |  |  | width: 140px; | 
|---|
|  |  |  | .el-dropdown-menu__item:hover { | 
|---|
|  |  |  | background: #E3EDFB; | 
|---|
|  |  |  | color: $primary-color; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </style> | 
|---|