(1) 密码长度要求8-20位,且至少包含大小写字符、数字和特殊字符中的3种或以上,字符区分大小写(特殊字符包括:!"#$%&'()*+,-.<=>?@[]^_`{|}~);
const reg =/^(?=.*[a-z])(?=.*[A-Z])(?=.*[1-9])(?=.*[\W]).{8,20}$/;
(2) 不能包含“password”、“admin” 及其变体(例如含大小写的passWord);
export const checkrReg = (str) => {
var flag = true;
const strSub = str.toLocaleUpperCase();
const text = strSub.indexOf("ADMIN");
const textPass = strSub.indexOf("PASSWORD");
if (text !== -1) {
const a = str.substring(text, text + 5);
if (a === 'admin' || a === 'ADMIN') {
flag = false;
}
for (var i in a) {
if (a[i] !== a[i].toUpperCase()) {
flag = false;
}
}
} else if (textPass !== -1) {
const b = str.substring(textPass, textPass + 8);
if (b === 'password' || b === 'PASSWORD') {
flag = false;
}
for (var i in b) {
if (b[i] !== b[i].toUpperCase()) {
flag = false;
}
}
}
return flag;
}
(3) 不能包含大于或等于3个或以上的连续相邻字母或数字(例如:abc、DEFG、123)
export const checkRepeat = (str) => {
var arr = str.split('');
var flag = true;
for (var i = 1; i < arr.length-1; i++) {
var firstIndex = arr[i-1].charCodeAt();
var secondIndex = arr[i].charCodeAt();
var thirdIndex = arr[i+1].charCodeAt();
thirdIndex - secondIndex == 1;
secondIndex - firstIndex==1;
if((thirdIndex - secondIndex == 1)&&(secondIndex - firstIndex==1)){
flag = false;
}
}
return flag;
}
(4) 不能包含2位及以上连续重复型字母或数字(例如:ABAB、1212)
const reg2 = /([a-zA-Z0-9])((?!\1)[a-zA-Z0-9])(?!\2)\1\2/g;
(5) 不能包含连续3位及以上重复型字母或数字(例如:aaa、BBBB、111)
const reg1 = /(\w)*(\w)\2{2}(\w)*/g;
(6) 不能包含用户名后3位。
const userName = this.ruleForm.loginKey.substr(-3, 3);
const userPassword = value.indexOf(userName);
<!-- 修改密码 -->
<el-dialog
:visible.sync="visible"
v-if="visible"
:close-on-click-modal="false"
:close-on-press-escape="false"
:show-close="false"
title="修改密码"
class="pwd"
width="450px">
<el-form ref="formValidate" class="changeForm" :model="formValidate" :rules="ruleValidate">
<el-form-item label="旧密码" prop="oldPwd">
<el-input v-model="formValidate.oldPwd" class="changeInput" clearable type="password" placeholder="请输入原密码" show-password></el-input>
<i class="el-icon-check" v-if="changeOldFlag == 1" color="#35B449"/>
<i class="el-icon-close" v-else-if="changeOldFlag == 2" color="#f00"/>
</el-form-item>
<el-form-item label="新密码" prop="newPwd">
<el-input v-model="formValidate.newPwd" class="changeInput" clearable type="password" placeholder="8~20个字符,区分大小,必须包含数字和字母" show-password></el-input>
<i class="el-icon-check" v-if="changeFlag == 1" color="#35B449"/>
<i class="el-icon-close" v-else-if="changeFlag == 2" color="#f00"/>
</el-form-item>
<el-form-item label="重复密码" prop="confirmNewPwd">
<el-input v-model="formValidate.confirmNewPwd" class="changeInput" clearable type="password" placeholder="请再次输入密码,必须和新密码一致" show-password></el-input>
<i class="el-icon-check" v-if="changeAgainFlag == 1" color="#35B449"/>
<i class="el-icon-close" v-else-if="changeAgainFlag == 2" color="#f00"/>
</el-form-item>
<el-form-item class="changeBtnbox">
<el-button type="primary" @click.native="handerPwdSubmit" style="position: relative">提交修改</el-button>
<img style="position: absolute;right: 25px;top: 5px;cursor: pointer" src="../assets/images/what.png" width="20" height="20" alt="" @click="showReg()">
</el-form-item>
</el-form>
</el-dialog>
const pwdOldCheck = (rule, value, callback) => {
if (value.length < 1) {
this.changeOldFlag = 2;
callback(new Error('旧密码不能为空!'));
} else if (value !== this.ruleForm.password) {
this.changeOldFlag = 2;
callback(new Error('旧密码不正确!'));
} else {
this.changeOldFlag = 1;
callback();
}
};
const pwdCheck = async (rule, value, callback) => {
const userName = this.ruleForm.loginKey.substr(-3, 3);
const userPassword = value.indexOf(userName);
const reg = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)(?![a-zA-Z0-9]+$)(?![a-zA-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9\W_!@#$%^&*`~()-+=]+$)(?![0-9A-Z\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,20}$/;
// const reg1 = /(?!.*(?<re1>[a-zA-Z0-9])\k<re1>{2})(?<!.*(?<re2>[a-zA-Z0-9])\k<re2>{2})/;
const reg1 = /(\w)*(\w)\2{2}(\w)*/g;
const reg2 = /([a-zA-Z0-9])((?!\1)[a-zA-Z0-9])(?!\2)\1\2/g;
if (value.length < 8) {
this.changeFlag = 2;
callback(new Error('密码不能少于8位!'));
} else if (value.length > 20) {
this.changeFlag = 2;
callback(new Error('密码最长不能超过20位!'));
} else if (!reg.test(value)) {
this.changeFlag = 2;
callback(new Error('密码输入有误,请检查格式是否正确!'));
} else if (reg1.test(value)) {
this.changeFlag = 2;
callback(new Error('不能包含连续3位及以上重复型字母或数字(例如:aaa、BBBB、111)'));
} else if (checkRepeat(value) === false) {
this.changeFlag = 2;
callback(new Error('不能包含大于或等于3个或以上的连续相邻字母或数字(例如:abc、DEFG、123)'));
} else if (userPassword !== -1) {
this.changeFlag = 2;
callback(new Error('不能包含用户名后3位。'));
} else if (reg2.test(value)) {
this.changeFlag = 2;
callback(new Error('不能包含2位及以上连续重复型字母或数字(例如:ABAB、abcabc、1212)'));
} else if (checkrReg(value) === false) {
this.changeFlag = 2;
callback(new Error('不能包含password,admin及其变体(例如含大小写的passWord)'));
} else {
this.changeFlag = 1;
callback();
}
};
const pwdAgainCheck = async (rule, value, callback) => {
if (value.length < 1) {
this.changeAgainFlag = 2;
callback(new Error('重复密码不能为空!'));
} else if (this.formValidate.newPwd !== this.formValidate.confirmNewPwd) {
this.changeAgainFlag = 2;
callback(new Error('两次输入密码不一致!'));
} else {
this.changeAgainFlag = 1;
callback();
}
};
changeFlag: 0,
changeAgainFlag: 0,
changeOldFlag: 0,
formValidate: {
oldPwd: '',
newPwd: '',
confirmNewPwd: '',
},
ruleValidate: {
oldPwd: [
{ required: true, validator: pwdOldCheck, trigger: 'blur' },
],
newPwd: [
{ required: true, validator: pwdCheck, trigger: 'blur' },
],
confirmNewPwd: [
{ required: true, validator: pwdAgainCheck, trigger: 'blur' },
],
},