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

news2024/12/24 20:45:50

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.coloradmin.cn/o/1821670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

易趋(EasyTrack)资深咨询顾问刘苗受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 易趋&#xff08;EasyTrack&#xff09;资深咨询顾问刘苗女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“企业级项目管理平台推动 IPD 数字化”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议…

【Nginx系列】分发算法

文章目录 一、分发算法介绍二、nginx集群默认算法三、nginx业务服务器状态四、nginx集群默认算法测试实验环境实验拓扑4.1、轮询算法4.2、基于权重4.3、基于ip_hash分发4.4、基于url的hash &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界…

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建 文章目录 STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建功能与作用典型工作流程 1. 硬件原理图介绍2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配…

Centos系统yum安装mysql数据库

安装之前需要将系统自带的mariadb-libs软件包删除。 检查是否存在mariadb-libs包。 yum list installed|grep mariadb-libs 删除mariadb-libs包 yum -y remove mariadb-libs 声明&#xff1a; 系统&#xff1a;CentOS-7-x86_64-DVD-2009 安装为最小化安装&#xff0c;没…

跟卖五种常用采集方式,关键词采集升级,更加让新手上手更快!

今天给大家分享一个跟卖选品软件&#xff0c;相信很多卖家都在为选品而苦恼&#xff0c;人工筛选一天也筛选不出几个能用的链接&#xff0c;不仅耗费时间精力&#xff0c;还提升不了选品效率&#xff0c;今天就分享一款实用的选品工具&#xff0c;它能够帮助我们节省选品时间&a…

计算机网络实验(15):基于Socket的网络编程(附JAVA源码.txt)

一、实验名称 UDP客户服务器即时通信程序 二、实验目的&#xff1a; 掌握基于SOCKET的网络编程方法。 基于JAVA语言&#xff0c;编写一个SOCKET的即时通信小程序 三、实验内容和要求 实验内容&#xff1a; 基于JAVA语言&#xff0c;编写一个SOCKET的即时通信小程序 实…

手把手教你构建和使用Redis Cluster去中心化集群

Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时&#xff0c;就可以采用Cluster架构达到负载均衡目的。官方文档:Scale with Redis Cluster | Docs 1.为什么要用redis-cluster集群&#xff1f; 1.首先Redis单实例主要有单点&#xff0c;容量有…

Spring Cloud Alibaba Nacos作为服务配置中心实践

Nacos官网文档&#xff1a;Nacos 融合 Spring Cloud&#xff0c;成为注册配置中心 【1】服务实例 ① pom依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </de…

使用 Azure AI Document Intelligence 创建智能文档处理

简介 借助 Azure AI 文档智能中的预生成模型&#xff0c;无需自行训练模型&#xff0c;即可从常见表单和文档中提取数据。 公司中&#xff0c;表单种类繁多&#xff0c;如发票、收据、调查表等。你可能想知道&#xff0c;从这些文档中提取姓名、地址、金额等信息需要多少工作…

数字化制造案例分享以及数字化制造能力评估(34页PPT)

资料介绍&#xff1a; 通过全面的数字化企业平台和智能制造技术的应用&#xff0c;制造型企业不仅提升了自身的竞争力&#xff0c;也为整个制造业的数字化转型提供了借鉴。同时&#xff0c;数字化制造能力的评估是企业实现数字化转型的关键环节&#xff0c;需要从技术变革、组…

Linux 并发与竞争基础知识学习

Linux 并发与竞争 并发与竞争 Linux 系统是个多任务操作系统&#xff0c;会存在多个任务同时访问同一片内存区域&#xff0c;这些任务可能会相互覆盖这段内存中的数据&#xff0c;造成内存数据混乱。针对这个问题必须要做处理&#xff0c;严重的话可能会导致系统崩溃。现在的…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

C语言入门系列:运算符及其优先级

文章目录 一&#xff0c;算术运算符二&#xff0c;自增运算符与自减运算符三&#xff0c;关系运算符四&#xff0c;逻辑运算符逻辑与&#xff08;&&&#xff09;逻辑或&#xff08;||&#xff09;逻辑非&#xff08;!&#xff09;最佳实践&#xff1a;行为单一原则 五&…

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…

【产品经理】订单处理2

本次讲解订单初始化成功到ERP系统过程中的后续环节。 一、根据客服备注更新订单信息 初始化订单过程中&#xff0c;若订单中的客服备注信息对订单进行更新&#xff0c;包括可能改收货信息、改商品、加赠品、指定快递等。 注意&#xff1a;更新订单的过程中要注意订单当前状…

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计的支持传输速率10Mbps的总线远程终端&#xff08;RT&#xff09;模块&#xff0c;采用SIP封装技术&#xff0c;支持LocalBus接口或UART通信访问&#xff0c;64K*16bits存储空间&#xff0c;灵活的RT数据存储&#xff0c;具…

Android Room数据库使用介绍

1.简介 Room是Google提供的Android架构组件之一&#xff0c;旨在简化数据库操作。它是SQLite的一个抽象层&#xff0c;提供了更易用和安全的API。 Room的总体架构: 2.Room数据库的基础概念 Entity Entity是Room中的数据表&#xff0c;每个Entity类对应一个SQLite表。 DAO …

有什么开放式耳机值得买?六点选购建议你要注意了

作为一名数码爱好者&#xff0c;专业的数码博主&#xff0c;我只想把好的产品介绍给大家&#xff0c;让大家避雷不好用的产品&#xff0c;最近&#xff0c;很多人私信我问我开放式的耳机怎么样&#xff1f;和别的耳机又有什么区别&#xff0c;我发现大家对于开放式耳机的了解少…

什么是计算机技术与软件(初级、中级、高级)考试(软考)?

一、软考是什么&#xff1f; 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;以下简称计算机软件资格考试&#xff09;是原中国计算机软件专业技术资格和水平考试&#xff08;简称软件考试&#xff09;的完善与发展。计算机软件资格考试是由国家人力…