471615499@qq.com a3f2edf6a9 加入修改单位密码功能;
加入登录背景图;
修改部分细节
2024-10-30 20:37:38 +08:00

182 lines
5.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class='account-settings-info-view'>
<a-row :gutter='16'>
<a-col :md='24' :lg='16'>
<a-form @submit='handleSubmit' :form='form' layout='vertical'>
<a-form-item>
<a-input-password placeholder='旧密码'
v-decorator="['password', {rules: [{ required: true, message: '请选录入旧密码' }]}]" />
</a-form-item>
<a-popover
placement='rightTop'
:trigger="['focus']"
:getPopupContainer='(trigger) => trigger.parentElement'
v-model='state.passwordLevelChecked'>
<template slot='content'>
<div :style="{ width: '240px' }">
<div :class="['user-register', passwordLevelClass]">强度<span>{{ passwordLevelName }}</span></div>
<a-progress :percent='state.percent' :showInfo='false' :strokeColor=' passwordLevelColor ' />
<div style='margin-top: 10px;'>
<span>请至少输入 6 个字符请不要使用容易被猜到的密码</span>
</div>
</div>
</template>
<a-form-item>
<a-input-password
@click='handlePasswordInputClick'
placeholder='新密码至少6位密码区分大小写'
v-decorator="['newPassword', {rules: [{ required: true, message: '新密码至少6位密码区分大小写'}, { validator: this.handlePasswordLevel }], validateTrigger: ['change', 'blur']}]"
></a-input-password>
</a-form-item>
</a-popover>
<a-form-item>
<a-input-password
placeholder='重复新密码'
v-decorator="['rePassword', {rules: [{ required: true, message: '新密码至少6位密码区分大小写' }, { validator: this.handlePasswordCheck }], validateTrigger: ['change', 'blur']}]"
></a-input-password>
</a-form-item>
<a-form-item>
<a-button htmlType='submit' type='primary'>修改密码</a-button>
</a-form-item>
</a-form>
</a-col>
</a-row>
</div>
</template>
<script>
import { updataPassword } from '@/api/system'
import { checkPermission } from '@/utils/permissions'
const levelNames = {
0: '低',
1: '低',
2: '中',
3: '强'
}
const levelClass = {
0: 'error',
1: 'error',
2: 'warning',
3: 'success'
}
const levelColor = {
0: '#ff0000',
1: '#ff0000',
2: '#ff7e05',
3: '#52c41a'
}
export default {
data() {
return {
state: {
passwordLevel: 0,
passwordLevelChecked: false,
percent: 10
},
form: this.$form.createForm(this),
changePwd: checkPermission('system:profile:password')
}
},
mounted() {
if (!this.changePwd) {
this.$router.push({ path: '/account/settings/depPwd' })
}
},
computed: {
passwordLevelClass() {
return levelClass[this.state.passwordLevel]
},
passwordLevelName() {
return levelNames[this.state.passwordLevel]
},
passwordLevelColor() {
return levelColor[this.state.passwordLevel]
}
},
methods: {
handlePasswordLevel(rule, value, callback) {
let level = 0
// 判断这个字符串中有没有数字
if (/[0-9]/.test(value)) {
level++
}
// 判断字符串中有没有字母
if (/[a-zA-Z]/.test(value)) {
level++
}
// 判断字符串中有没有特殊符号
if (/[^0-9a-zA-Z_]/.test(value)) {
level++
}
this.state.passwordLevel = level
this.state.percent = level * 30
if (level >= 2) {
if (level >= 3) {
this.state.percent = 100
}
callback()
} else {
if (level === 0) {
this.state.percent = 10
}
callback(new Error('密码强度不够'))
}
},
handlePasswordCheck(rule, value, callback) {
const password = this.form.getFieldValue('newPassword')
if (value === undefined) {
callback(new Error('请输入密码'))
}
if (value && password && value.trim() !== password.trim()) {
callback(new Error('两次密码不一致'))
}
callback()
},
handlePasswordInputClick() {
if (!this.isMobile) {
this.state.passwordLevelChecked = true
return
}
this.state.passwordLevelChecked = false
},
// handler
handleSubmit(e) {
e.preventDefault()
this.form.validateFields((err, values) => {
if (!err) {
// eslint-disable-next-line no-console
console.log('Received values of form: ', values)
updataPassword(values).then(res => {
if (res.code === 0) {
this.$message.success('保存成功')
this.$emit('ok')
this.visible = false
} else {
this.$message.error(res.msg)
}
}).catch(() => {
this.$message.error('系统错误,请稍后再试')
}).finally(() => {
this.confirmLoading = false
})
}
})
},
watch: {
'state.passwordLevel'(val) {
console.log(val)
}
}
}
}
</script>
<style scoped>
</style>