vue3和ant-design 实现前端多种验证密码规则,最全的前端验证密码规则

1、小眼睛可以显示/隐藏明文密码(无法用input type=password,用css样式实现切换明文)

2、输入长度统计(不是自带的,用div写的,然后定位到框内的)

3、每输入一个字符分别验证每一项规则,符合就变绿色,删掉符合字符就变红色

4、根据符合规则的长度,判断密码强弱

HTML:

<template>
  <div class="InitializesSystemKey">
   <div class="password-box">
    <div class="password-box-title">
      <span>初始化系统秘钥</span>
      <Button style="margin: 15px 0;" @click="clickReturn">返回</Button>
    </div>
    <div class="password-box-set">
      <div class="password-box-set-title">
        设置秘钥
      </div>
      <div class="password-box-set-con">
        <div class="password-box-set-con-text">
          <span>
            设置秘钥 
            <eye-outlined v-if="!isEye" @click="isEye = true" style="color: #0E56C0;"/>
            <eye-invisible-outlined v-if="isEye" @click="isEye = false" style="color: #0E56C0;" />
          </span>
          <span style="font-size: 14px;color: #88909B;">{{ text }}</span>
        </div>
        <div class="password-box-set-con-input">
          <a-textarea v-model:value="inputVal" type="password" :rows="4" placeholder="请输入" @change="changeInput" :maxlength="256" :minlength="8" :style="isEye ? { '-webkit-text-security': 'disc' } : {}" />
          <div class="counter">{{ charCount }}/256</div>
        </div>
        <!-- 验证规则显示 -->
        <div class="password-box-set-con-rule">
          <div>
            <check-outlined v-if="isLargeLetter" style="color: #3AA679;"/>
            <close-outlined v-if="!isLargeLetter" style="color: #E53A2F;"/>
            <span :class="isLargeLetter ? 'colorGreen' : 'colorRed'">包含大写字母</span>
          </div>
          <div>
            <check-outlined v-if="isSmallLetter" style="color: #3AA679;"/>
            <close-outlined v-if="!isSmallLetter" style="color: #E53A2F;"/>
            <span :class="isSmallLetter ? 'colorGreen' : 'colorRed'">包含小写字母</span>
          </div>
          <div>
            <check-outlined v-if="isNumber" style="color: #3AA679;"/>
            <close-outlined v-if="!isNumber" style="color: #E53A2F;"/>
            <span :class="isNumber ? 'colorGreen' : 'colorRed'">包含数字</span>
          </div>
          <div>
            <check-outlined v-if="isSpecSymbol" style="color: #3AA679;"/>
            <close-outlined v-if="!isSpecSymbol" style="color: #E53A2F;"/>
            <span :class="isSpecSymbol ? 'colorGreen' : 'colorRed'">包含特殊符号</span>
          </div>
          <div>
            <check-outlined v-if="isLength" style="color: #3AA679;"/>
            <close-outlined v-if="!isLength" style="color: #E53A2F;"/>
            <span :class="isLength ? 'colorGreen' : 'colorRed'">秘钥长度16-256位</span>
          </div>
        </div>
        <div class="password-box-set-con-progress">
          <div class="password-box-set-con-progress-left">
            <div style="margin-left: 15px;" class="password-box-set-con-progress-left-col">
              <p :style="numLength == 1 ? { 'background': '#F8584D' } : {}"></p>
              <caret-up-outlined />
              <span :style="numLength == 1 ? { 'color': '#F8584D' } : {}">弱</span>
            </div>
            <div class="password-box-set-con-progress-left-col">
              <p :style="numLength == 2 ? { 'background': '#FAB247' } : {}"></p>
              <caret-up-outlined />
              <span :style="numLength == 2 ? { 'color': '#FAB247' } : {}">中</span>
            </div>
            <div class="password-box-set-con-progress-left-col">
              <p :style="numLength >= 3 ? { 'background': '#3AA679' } : {}"></p>
              <caret-up-outlined />
              <span :style="numLength >= 3 ? { 'color': '#3AA679' } : {}">强</span>
            </div>
          </div>
          <div class="password-box-set-con-progress-btn">
            <Button @click="">提交秘钥</Button>
          </div>
        </div>
      </div>
    </div>
   </div>
  </div>
</template>

CSS:

.InitializesSystemKey {
  position: fixed;
  bottom: 0;
  top: 50px;
  right: 0;
  left: 0;
  z-index: 999;
  width: 100vw;
  height: calc(100vh-50px);
  background: #f8f8f9;
  .password-box{
    position: absolute;
    top: 10%;
    left: 50%;
    // transform: translate(-50%, -50%);
    margin-left: -450px;
    width: 900px;
    height: 500px;
    &-title{
      display: flex;
      flex-direction: row;
      justify-content: space-between;
      span{
        color: #D91313;
        font-size: 40px;
      }
    }
    &-set{
      background: #fff;
      border-radius: 10px;
      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
      &-title{
        padding: 10px;
        border-bottom: 1px solid #E5E6EB;
        font-size: 20px;
        font-weight: 600;
      }
      &-con{
        display: flex;
        flex-direction: column;
        &-text{
          display: flex;
          flex-direction: row;
          justify-content: space-between;
          padding: 15px 10px;
          span{
            font-size: 16px;
            color: #1D2128;
          }
        }
        &-input{
          padding: 0 10px;
          position: relative;
          border-radius: 10px;
          // 让计数在边框内
          .counter {
            position: absolute;
            bottom: 10px;
            right: 20px;
            padding: 0 5px;
          }
        }
        &-rule{
          display: flex;
          flex-direction: row;
          justify-content: flex-start;
          padding: 10px;
          gap: 15px;
          span{
            margin-left: 2px;
          }
          .colorGreen{
            color: #3AA679;
          }
          .colorRed{
            color: #E53A2F;
          }
        }
        &-progress{
          border-top: 1px solid #E5E6EB;
          padding: 15px 0 10px;
          display: flex;
          flex-direction: row;
          justify-content: space-between;
          &-left{
            padding: 15px 0 10px;
            display: flex;
            flex-direction: row;
            
            gap: 5px;
            &-col{
              display: flex;
              flex-direction: column;
              align-items: center;
              p{
                width: 100px;
                height: 8px;
                background: #E5E6EB;
                margin: 0;
              }
            }
          }
          &-btn{
            margin: 10px 25px 0 0;
          }
          
        }
      }
    }
   
  }
}

JS逻辑:

import { onMounted, ref,computed} from 'vue';
import Button from '@/views/salary/components/button.vue';
const text = ref("请输入16~256位秘钥,需包含大小写、数字、特殊字符(仅支持以下字符:()`!@#$%^&*_-+=|{}[]:;'<>,.?")
const isEye =ref(true);
const inputVal = ref('');
const numLength = computed(() => {
  return [isLargeLetter.value, isSmallLetter.value, isNumber.value, isSpecSymbol.value,isLength.value].filter(Boolean).length;
})
const charCount = computed(() => {
  return inputVal.value.length;
})

const isLargeLetter = ref(false);
const isSmallLetter = ref(false);
const isNumber = ref(false);
const isSpecSymbol = ref(false);
const isLength =ref(false);

// input改变
const changeInput = (event)=>{
  const specialChars = "()`!@#$%^&*_-+=|{}[]:;'<>,.?";
  const escapedSpecialChars = specialChars.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
  let key = event.target.value;
  if(!key){
    isLength.value = false;
    isLargeLetter.value = false;
    isSmallLetter.value = false;
    isNumber.value = false;
    isSpecSymbol.value = false;
  }
  // 长度
  if (key.length > 16 && key.length < 256) {
    isLength.value = true;
  }else{
    isLength.value = false;
  }
  // 数字
  if (/\d/.test(key)) {
    isNumber.value = true;
  }else{
    isNumber.value = false;
  }
  // 小写
  if (/[a-z]/.test(key)) {
    isSmallLetter.value = true;
  }else{
    isSmallLetter.value = false;
  }
  // 大写
  if (/[A-Z]/.test(key)) {
    isLargeLetter.value = true;
  }else{
    isLargeLetter.value = false;
  }
  // 特殊字符
  if (new RegExp(`[${escapedSpecialChars}]`).test(key)) {
    isSpecSymbol.value = true;
  }else{
    isSpecSymbol.value = false;
  }

}
const emits = defineEmits(['clickReturn'])
const clickReturn = ()=>{
  emits('close');
}
onMounted(() => {});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/707730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00&#xff0c;香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”&#xff0c;他通过P…

【React】Lodash---groupBy() 分组

例子 _.groupBy([6.1, 4.2, 6.3], Math.floor); // > { 4: [4.2], 6: [6.1, 6.3] }// The _.property iteratee shorthand. _.groupBy([one, two, three], length); // > { 3: [one, two], 5: [three] }思路分析 来源 定义一个名为groupBy的方法&#xff0c;通过扩展Ar…

同三维TT806-1 USB单路网络视频流/U盘采集卡

同三维TT806-1 USB单路网络视频流/U盘采集卡 (1路网络音视频信号或U盘直播推流器) 支持采集1路网络视频流或U盘音视频信号&#xff0c;USB输出到电脑 同时还可流推2个直播平台&#xff0c;可设置6组定时推流&#xff0c;有线网络 可录像到U盘&#xff0c;支持定时录像 一…

期末测试2--函数题---指针链表如何输出?

总结写代码时候遇到的问题 1.遍历指针链表 指针head在做for循环遍历的时候 for&#xff08;head, head!NULL;head&#xff09; head不能 for(head,head!NULL;headhead->next)-------正确的写法 int i; for(ihead;head!NULL;headhead->next) i 是 int 类型的&#x…

【思维导图工具】Xmind 2024安装教程+软件安装包下载

​XMind 2022是一款风靡全宇宙的思维导图和头脑暴炸软件&#xff0c;是全宇宙领先的“可视化思考”工具&#xff0c;每一个功能都能帮助你激发灵感、提高创造力。 XMind 2022为不同的使用场景提供多种可视化布局&#xff0c;让你的思维可以更清晰的结构化呈现&#xff0c;该软件…

【Linux】基础指令(一)

一、ls指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 常见选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含文件。 -d …

WinForm之TCP客户端通讯

目录 一 设计界面 二 后台代码 一 设计界面 二 后台代码 using System.Net.Sockets; using System.Text;namespace TCP网络客户端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpClient tcpClient new TcpClient();private void conne…

【STM32进阶笔记】GPIO端口

前段时间由于其他原因&#xff0c;专栏暂停更新了较长一段时间&#xff0c;现在恢复更新&#xff0c;争取继续为大家创造有价值的内容&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 在STM32速成笔记系列专栏中其实已经对GPIO的一些必要知识进行了介绍&#xf…

springboot项目中使用 @Lazy 注解懒加载解决循环依赖问题,以及 @Lazy 标注顺序

场景&#xff1a; Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name taskServiceImpl: Bean with name taskServiceImpl has been injected into other beans [groupServiceImpl] in its raw version as part…

Rust 实战丨绘制曼德博集

曼德博集 曼德博集其实是一个“没什么用”的发现。 曼德博集&#xff08;Mandelbrot Set&#xff09;是一种在复平面上形成独特且复杂图案的点的集合。这个集合是以数学家本华曼德博&#xff08;Benoit Mandelbrot&#xff09;的名字命名的&#xff0c;他在研究复杂结构和混沌…

C#|Maui|BootstrapBlazor|Bootstrap Blazor 组件库改模板 | Bootstrap Blazor 组件库改布局,该怎么改?

先copy一个项目下来&#xff1a;Bootstrap Blazor 组件库 一套基于 Bootstrap 和 Blazor 的企业级组件库 发现不是很满足我的需求&#xff0c;我要把右下角的admin移动到左边去&#xff0c;该怎么移动&#xff1f; 先改代码 点进去到Layout.razor 文档&#xff0c;改成如下&am…

CS5518芯片设计|替代GM8775设计方案|MIPI转LVDS芯片方案|DSI转LVDS芯片方案

CS5518支持常见的1920*1080分辨率的屏&#xff0c;支持视频格式为 FULL HD&#xff08;1920 x 1200&#xff09;。为MIPI DSI 转LVDS 双通道桥接芯片&#xff0c;实现将MIPI DSI信号转换为单/双通道 LVDS输出功能&#xff0c;MIPI 支持1/2/3/4 通道可选,支持 4Gbps 速率。LVDS …

探索新升级!在 ART-Pi Smart 体验 RT-Thread Smart v5.1.0

1.引言 RT-Thread Smart v5.1.0 已经正式发布。这一版本在内核和功能上做了大量的改进与增强。我们可以在ART-Pi Smart开发板尽情探索这一新版更完善更强大的RT-Thread Smart操作系统。ART-Pi Smart开发板搭载了米尔科技的i.MX6ULL核心板&#xff0c;硬件设计和制作由韦东山团队…

一文搞定Django学习

文章目录 一、Django项目1.安装django2.创建项目3.文件描述4.创建app5.测试 二、操作数据库1.安装mysqlclient2.setting.py文件中设置连接信息3.创建表操作&#xff08;1&#xff09;python manage.py makemigrations&#xff08;2&#xff09;python manage.py migrate 4.增删…

净化机应用领域广泛 美国是我国净化机主要出口国

净化机应用领域广泛 美国是我国净化机主要出口国 净化机&#xff0c;又称为空气清洁设备或空气清新机&#xff0c;是一种专门设计用于滤除或杀灭空气污染物、提升空气清洁度的装置。净化机具备高效的过滤功能&#xff0c;能够滤除空气中的悬浮微粒、细菌、病毒和花粉等污染物&a…

【Numpy】一文向您详细介绍 np.sqrt()

【Numpy】一文向您详细介绍 np.sqrt() 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff0c;曾…

WebSocket 详解--spring boot简单使用案例

一、什么是WebSocket WebSocket 是一种网络通信协议&#xff0c;专为在单个 TCP 连接上进行全双工通信而设计。WebSocket 允许客户端和服务器之间的消息能够实时双向传输。这与传统的 HTTP 请求-响应模式有很大的不同。 二、WebSocket 的关键特性 双向通信&#xff1a;WebSocke…

【Mars3d】config.json中的蓝色底图map.basemap = 2017代码实现

本身的地图效果&#xff1a; Mars3d的蓝色地图效果&#xff1a; 关键代码&#xff1a; basemaps: [{name: "高德电子",icon: "img/basemaps/gaode_vec.png",type: "gaode",layer: "vec",show: true,invertColor: true,filterColor: &q…

ARM32开发--IIC时钟案例

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求 开发流程 移植驱动 修改I2C实现 测试功能 总结 前言 在现代嵌入式系统开发中&#xff0c;移植外设驱动并测试其功能是一项常见的任务。本次学习的目标是掌握移植方法和测试方法&#xff0c;以实现对开…

电容式传感器的基本原理

电容式传感器由电容量可变的电容器和测量电路组成&#xff0c;其变量间的转换原理如图5—2所示。 图5—2电容式传感器变量间的转换关系 由电学可知&#xff0c;两个平行金属极板组成的电容器&#xff0c;如果不考虑其边缘效应&#xff0c;其电容为 Se——两个极板介质的介电常…