182 lines
5.2 KiB
Vue
Raw Normal View History

2024-01-23 17:05:40 +08:00
<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'>
2024-01-23 17:05:40 +08:00
<a-form-item>
<a-input-password placeholder='旧密码'
v-decorator="['password', {rules: [{ required: true, message: '请选录入旧密码' }]}]" />
2024-01-23 17:05:40 +08:00
</a-form-item>
<a-popover
placement='rightTop'
2024-01-23 17:05:40 +08:00
:trigger="['focus']"
:getPopupContainer='(trigger) => trigger.parentElement'
v-model='state.passwordLevelChecked'>
<template slot='content'>
<div :style="{ width: '240px' }">
2024-01-23 17:05:40 +08:00
<div :class="['user-register', passwordLevelClass]">强度<span>{{ passwordLevelName }}</span></div>
<a-progress :percent='state.percent' :showInfo='false' :strokeColor=' passwordLevelColor ' />
<div style='margin-top: 10px;'>
2024-01-23 17:05:40 +08:00
<span>请至少输入 6 个字符请不要使用容易被猜到的密码</span>
</div>
</div>
</template>
<a-form-item>
<a-input-password
@click='handlePasswordInputClick'
placeholder='新密码至少6位密码区分大小写'
2024-01-23 17:05:40 +08:00
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='重复新密码'
2024-01-23 17:05:40 +08:00
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>
2024-01-23 17:05:40 +08:00
</a-form-item>
</a-form>
</a-col>
</a-row>
</div>
</template>
<script>
import { updataPassword } from '@/api/system'
import { checkPermission } from '@/utils/permissions'
2024-01-23 17:05:40 +08:00
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() {
2024-01-23 17:05:40 +08:00
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' })
2024-01-23 17:05:40 +08:00
}
},
computed: {
passwordLevelClass() {
2024-01-23 17:05:40 +08:00
return levelClass[this.state.passwordLevel]
},
passwordLevelName() {
2024-01-23 17:05:40 +08:00
return levelNames[this.state.passwordLevel]
},
passwordLevelColor() {
2024-01-23 17:05:40 +08:00
return levelColor[this.state.passwordLevel]
}
},
methods: {
handlePasswordLevel(rule, value, callback) {
2024-01-23 17:05:40 +08:00
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) {
2024-01-23 17:05:40 +08:00
const password = this.form.getFieldValue('newPassword')
if (value === undefined) {
callback(new Error('请输入密码'))
}
if (value && password && value.trim() !== password.trim()) {
callback(new Error('两次密码不一致'))
}
callback()
},
handlePasswordInputClick() {
2024-01-23 17:05:40 +08:00
if (!this.isMobile) {
this.state.passwordLevelChecked = true
return
}
this.state.passwordLevelChecked = false
},
// handler
handleSubmit(e) {
2024-01-23 17:05:40 +08:00
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) {
2024-01-23 17:05:40 +08:00
console.log(val)
}
}
}
}
</script>
<style scoped>
</style>