记录一个复杂密码前端校验思路(可用)

记录一个复杂密码校验思路

要求密码长度,n个大写、n个特殊字符、n个数字

在这里插入图片描述

适用:ElementUI 、NaiveUI

本质:组件配置 + 正则

ElementUI

ElementUI、NaiveUI 组件思路差不多

interface PwdRule {
	passwordNLength: number,
	passwordNSymbol: number,
	passwordNLetter: number,
	passwordNNum: number,
}
const pwdRule = ref<PwdRule>()

const rules = ref({
    oldPassword: [{required: true, message: "旧密码不能为空", trigger: "blur"}],
    newPassword: [{required: true, message: "新密码不能为空", trigger: "blur"}, {
      validator: validateNewPass,
      trigger: "blur"
    }],
    confirmPassword: [{required: true, message: "确认密码不能为空", trigger: "blur"}, {
      required: true,
      validator: equalToPassword,
      trigger: "blur"
    }]
  });
const validateNewPass = (rule, value, callback) => {
  let minLength = userStore.passwordRules.passwordNLength
  let minSpecialChars = userStore.passwordRules.passwordNSymbol
  let minUppercaseChars = userStore.passwordRules.passwordNLetter
  let minNum= userStore.passwordRules.passwordNNum

  if (value.length < minLength) {
    callback(new Error(`密码长度不低于${minLength}个字符。`));
  }
  // 检查特殊字符数量
  let specialChars = value.replace(/[a-zA-Z0-9]/g, '');
  if (specialChars.length < minSpecialChars) {
    callback(new Error(`设置为至少包含${minSpecialChars}个特殊字符`));
  }
  // 检查大写字母数量
  let uppercaseChars = value.replace(/[^A-Z]/g, '');
  if (uppercaseChars.length < minUppercaseChars) {
    callback(new Error(`设置为至少包含${minUppercaseChars}个大写字母`));
  }
  if (isAtLeastMinNumDigits(value, minNum) == false) {
    callback(new Error(`设置为至少包含${minNum}个数字`));
  }
  callback();
}

function isAtLeastMinNumDigits(password, minNum) {
  // 匹配字符串中的数字
  const regex = /\d/g;
  const digits = password.match(regex);

  // 计算字符串中数字的个数
  const numDigits = digits ? digits.length : 0;

  // 如果字符串中数字的个数大于等于 ${minNum},则返回 `true`
  return numDigits >= minNum;
}

使用

<n-form
  ref="formRef" :model="model"
  :rules="rules">
	<n-form-item label="密码" path="password" class="mt-[20px]">
	  <n-input
	      v-model:value="model.password"
	      type="password"
	      show-password-on="click"
	      placeholder="密码">
	  </n-input>
	</n-form-item>
</n-form>

<div>
  <n-button type="primary" class="submit_btn" @click="submitForm">
    提交
  </n-button>
</div>

ajax请求

  function submitForm() {
    formRef.value?.validate((errors) => {
      if (!errors) {
        submitRegisteerApi(model.value).then((res) => {
          message.success('注册成功,前往登录!')
          router.push('/account/login')
        }).catch((err) => {
          message.error(err.msg)
        })
      }
    })
  }

NaiveUI

NaiveUI 和饿了么ui很相似。差别就是 new Error

const rules = {
    username: [
      {required: true, message: '必填项',trigger: ['input', 'blur']},
      {message: '手机号格式错误', pattern: /^[1][3,4,5,6,7,8,9][0-9]{9}$/, trigger: ['input', 'blur']},
    ],
    password: [
      {
        required: true,
        validator(rule: FormItemRule, value: string) {
          const minLength = pwdRule.value?.passwordNLength
          const minSpecialChars = pwdRule.value?.passwordNSymbol
          const minUppercaseChars = pwdRule.value?.passwordNLetter
          const minNum= pwdRule.value?.passwordNNum
          if (!value) {
            return new Error('必填项')
          }

          if (value.length < minLength) {
             return new Error(`密码长度不低于${minLength}个字符。`);
          }
          // 检查特殊字符数量
          let specialChars = value.replace(/[a-zA-Z0-9]/g, '');
          if (specialChars.length < minSpecialChars) {
           return new Error(`设置为至少包含${minSpecialChars}个特殊字符`);
          }


          // 检查大写字母数量
          let uppercaseChars = value.replace(/[^A-Z]/g, '');
          if (uppercaseChars.length < minUppercaseChars) {
            return new Error(`设置为至少包含${minUppercaseChars}个大写字母`);
          }
          if (isAtLeastMinNumDigits(value, minNum) == false) {
            return new Error(`设置为至少包含${minNum}个数字`);
          }

          return true
        },

      },
    ],
    messageCode: [
      {required: true, message: '必填项',trigger: ['input', 'blur']},
    ],
  }

function isAtLeastMinNumDigits(password, minNum) {
  // 匹配字符串中的数字
  const regex = /\d/g;
  const digits = password.match(regex);

  // 计算字符串中数字的个数
  const numDigits = digits ? digits.length : 0;

  // 如果字符串中数字的个数大于等于 ${minNum},则返回 `true`
  return numDigits >= minNum;
}

总结

  • 记录了ElemetUI表单验证的一些使用模板
  • 记录了密码规则的正则校验
  • 是否有存在重大Bug自行甄别、若需要更复杂可以自行扩展
  • 应该可以简化代码,自行研究
  • 为啥要记录,因为不想重复造轮子,每个人多多少少都会实现,普通程序员效率才是王道
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值