Files
income_payments_client/src/components/tools/UserPassword.vue
T

217 lines
6.2 KiB
Vue

<template>
<a-modal
:title="title"
:width="modalWidth"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleOk"
@cancel="handleCancel"
cancelText="关闭"
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
@paste.native.capture.prevent="handleOperate"
autocomplete="new-password"
label="旧密码">
<a-input-password type="password" placeholder="请输入旧密码" :maxLength='30' v-decorator="[ 'oldpassword', validatorRules.oldpassword]"/>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="新密码">
<a-input-password
type="password"
placeholder="请输入新密码"
@paste.native.capture.prevent="handleOperate"
autocomplete="new-password"
:maxLength='30'
v-decorator="[ 'password', validatorRules.password]"/>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="确认新密码">
<a-input-password
type="password"
@blur="handleConfirmBlur"
placeholder="请确认新密码"
@paste.native.capture.prevent="handleOperate"
autocomplete="new-password"
:maxLength='30'
v-decorator="[ 'confirmpassword', validatorRules.confirmpassword]"/>
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import { putAction } from '@/api/manage'
import { getRSAPublicKey } from '@api/login'
import { JSEncrypt } from 'jsencrypt'
import { passwordReg } from '../../utils/validate'
export default {
name: 'UserPassword',
data() {
return {
title: '修改密码',
modalWidth: 800,
visible: false,
confirmLoading: false,
validatorRules: {
oldpassword: {
rules: [{
required: true, message: '请输入旧密码'
}]
},
password: {
rules: [
{ required: true, message: '请输入新密码' },
{
//原正则,3种组合时不会提示 /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,}$/
pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,30}$/,
message: '密码由8位及以上数字、大小写字母和特殊符号组成!'
},
{ validator: this.validateToNextPassword }
],
validateTrigger: 'blur'
},
confirmpassword: {
rules: [{
required: true, message: '请确认新密码',
}, {
validator: this.handlePasswordCheck,
}],
// rules: [
// { required: true, message: '请确认新密码!' },
// {
// pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,./]).{8,30}$/,
// message: '密码由8位及以上数字、大小写字母和特殊符号组成!'
// },
// { validator: this.handlePasswordCheck }
// ],
validateTrigger: 'blur'
}
},
confirmDirty: false,
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
},
form: this.$form.createForm(this),
url: 'sys/user/updatePassword',
username: '',
rsaPublicKey: '' // 公钥
}
},
methods: {
show(uname) {
if (!uname) {
this.$message.warning('当前系统无登录用户!')
return
} else {
this.username = uname
this.getPublicKey()
this.form.resetFields()
this.visible = true
}
},
getPublicKey() {
getRSAPublicKey().then(res => {
this.rsaPublicKey = res.result
})
},
handleCancel() {
this.close()
},
close() {
this.$emit('close')
this.visible = false
this.disableSubmit = false
this.selectedRole = []
},
handleOk() {
const that = this
// 触发表单验证
this.form.validateFields((err, values) => {
if (!err) {
that.confirmLoading = true
let params = {}
params.username = this.username
params.rsaPublicKey = this.rsaPublicKey
let encrypt = new JSEncrypt()
encrypt.setPublicKey(params.rsaPublicKey)
params.oldpassword = encrypt.encrypt(values.oldpassword)
params.password = encrypt.encrypt(values.password)
params.confirmpassword = encrypt.encrypt(values.confirmpassword)
console.log('修改密码提交数据', params)
putAction(this.url, params).then((res) => {
if (res.success) {
console.log(res)
that.$message.success(res.message)
that.close()
} else {
that.$message.warning(res.message)
}
}).finally(() => {
that.confirmLoading = false
})
}
})
},
validateToNextPassword(rule, value, callback) {
const form = this.form
if (value && this.confirmDirty) {
form.validateFields(['confirm'], { force: true })
}
callback()
},
handlePasswordCheck(rule, value, callback) {
let password = this.form.getFieldValue('password')
if (value && password && value.trim() !== password.trim()) {
callback(new Error('两次密码不一致'))
}
if (value && !passwordReg(value)) {
callback('密码由8位及以上数字、大小写字母和特殊符号组成')
}
callback()
},
compareToFirstPassword(rule, value, callback) {
const form = this.form
if (value && value !== form.getFieldValue('password')) {
callback('两次密码不一致')
} else {
callback()
}
},
handleConfirmBlur(e) {
const value = e.target.value
this.confirmDirty = this.confirmDirty || !!value
},
// 密码禁止粘贴
handleOperate() {
return false
}
}
}
</script>
<style scoped>
</style>