¶Ô±ÈÐÂÎļþ |
| | |
| | | <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 |
| | | },) |
| | | .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> |