|  |  |  | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | rules: { | 
|---|
|  |  |  | password: [ | 
|---|
|  |  |  | { required: true, message: '请输入密码' } | 
|---|
|  |  |  | { required: true, message: '请输入密码', trigger: 'blur' }, | 
|---|
|  |  |  | { validator: this.validatePassword, trigger: 'blur' } | 
|---|
|  |  |  | ] | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | 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() // 验证通过 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 打开窗口 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param user 目标用户 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | open (user) { | 
|---|
|  |  |  | this.user = user | 
|---|
|  |  |  | this.visible = true | 
|---|
|  |  |  | 
|---|
|  |  |  | this.$refs.form.resetFields() | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 确认重置密码 | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 确认重置密码 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | confirm () { | 
|---|
|  |  |  | if (this.isWorking) { | 
|---|
|  |  |  | return | 
|---|