Vue表单输入密码实现密码格式和强度验证提示框-demo

实现效果

实现过程

校验

//密码格式校验
const validateUppercase = (rule, value, callback) => {if (!/[A-Z]/.test(value)) {callback(new Error('密码必须包含至少一个大写字母'));} else {callback();}
};
const validateNumber = (rule, value, callback) => {if (!/\d/.test(value)) {callback(new Error('密码必须包含至少一个数字'));} else {callback();}
};
const validateSpecialCharacter = (rule, value, callback) => {if (!/[~`!@#$%^&*()_\-+={}[\]|;:,<>.?/]/.test(value)) {callback(new Error('密码必须包含至少一个特殊字符'));} else {callback();}
};

源代码 

<template><div class="registerform"><h1>注册账户</h1><div class="registerWarp"><el-formlabel-position="top"label-width="100px":model="form"ref="ruleFormRef":rules="rulesForm"hide-required-asteriskclass="register-form"><el-form-item label="邮箱" prop="email"><el-input v-model="form.email" placeholder="电子邮箱" /></el-form-item><el-form-item label="密码" prop="pwd"><el-inputv-model="form.pwd"type="password"show-passwordplaceholder="登录密码"@focus="showTooltip"@blur="hideTooltip"@input="handleInput"/><!-tips提示-><div class="pwdTips" v-show="isPwdShowTips"><p><imgv-show="!isCheck1"src="@/assets/images/register/check-0.svg"/><imgv-show="isCheck1"src="@/assets/images/register/check-1.svg"/><span>6-24个字符</span></p><p><imgv-show="!isCheck2"src="@/assets/images/register/check-0.svg"/><imgv-show="isCheck2"src="@/assets/images/register/check-1.svg"/><span>至少一个大写字母</span></p><p><imgv-show="!isCheck3"src="@/assets/images/register/check-0.svg"/><imgv-show="isCheck3"src="@/assets/images/register/check-1.svg"/><span>至少一个数字</span></p><p><imgv-show="!isCheck4"src="@/assets/images/register/check-0.svg"/><imgv-show="isCheck4"src="@/assets/images/register/check-1.svg"/><span>至少一个特殊字符</span></p><p>特殊字符支持:~`!@#$%^&amp;*()_-+={}[]|;:,&lt;&gt;.?/</p></div></el-form-item><el-form-item><template #label><div class="item-label"><span>填写邀请ID(选填)</span><img:class="{ active: isIdShow }"@click="isIdShow = !isIdShow"src="@/assets/images/register/right-jian.svg"/></div></template><el-inputv-show="isIdShow"v-model="form.parentShortId"placeholder="填写邀请用户ID"/></el-form-item><el-form-item><div class="form-bottom"><div class="promise">点击注册即表示同意<span>服务协议</span>和<span>隐私条款</span></div><divclass="submit-btn"type="primary"@click="submitForm(ruleFormRef)">注册</div><div class="switch-login">已有账户?<span @click="goPath('/login')">去登录</span></div></div></el-form-item></el-form></div></div>
</template><script setup>
import { ref, reactive, defineEmits, watch } from 'vue';
import { emailCodeSend } from '@/api/user';
import { EmailSceneTypeMap } from '@/views/Login/const.js';
import { debounce } from '@/utils';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
const router = useRouter();
const store = useStore();const goPath = (r) => {router.push({path: r});
};
const isIdShow = ref(false);
const ruleFormRef = ref(null);
const form = reactive({email: '',pwd: '',code: '',parentShortId: '',captcha: '123456'
});// 发送验证码
const getEmailCode = debounce(async (val) => {try {await store.dispatch('app/showLoading');let params = {scene: EmailSceneTypeMap['REGISTER'],email: val,captcha: '123456'};const { data } = await emailCodeSend(params);console.log(data);if (data.code == 'Success') {store.dispatch('app/showToast',{msg: '验证码已发送',type: 'success'},{ root: true });emits('stepRouter', { step: 2, form });return data.data.sec;}} catch (error) {console.log('getEmailCode-Error', error);} finally {await store.dispatch('app/hideLoading');}
}, 300);// 密码提示
const isPwdShowTips = ref(false);
const showTooltip = () => {console.log('showTooltip');isPwdShowTips.value = true;handleInput(form.pwd);
};const hideTooltip = () => {console.log('hideTooltip');isPwdShowTips.value = false;
};// 输入框校验
const isCheck1 = ref(false);
const isCheck2 = ref(false);
const isCheck3 = ref(false);
const isCheck4 = ref(false);
const handleInput = (value) => {console.log('handleInput');if (value.length < 6 || value.length > 24) {isCheck1.value = false;} else {isCheck1.value = true;}if (!/[A-Z]/.test(value)) {isCheck2.value = false;} else {isCheck2.value = true;}if (!/\d/.test(value)) {isCheck3.value = false;} else {isCheck3.value = true;}if (!/[~`!@#$%^&*()_\-+={}[\]|;:,<>.?/]/.test(value)) {isCheck4.value = false;} else {isCheck4.value = true;}
};//密码格式校验
const validateUppercase = (rule, value, callback) => {if (!/[A-Z]/.test(value)) {callback(new Error('密码必须包含至少一个大写字母'));} else {callback();}
};
const validateNumber = (rule, value, callback) => {if (!/\d/.test(value)) {callback(new Error('密码必须包含至少一个数字'));} else {callback();}
};
const validateSpecialCharacter = (rule, value, callback) => {if (!/[~`!@#$%^&*()_\-+={}[\]|;:,<>.?/]/.test(value)) {callback(new Error('密码必须包含至少一个特殊字符'));} else {callback();}
};
const rulesForm = reactive({email: [{ required: true, message: '请输入邮箱', trigger: 'blur' },{ type: 'email', message: '邮箱输入格式错误', trigger: 'blur' }],pwd: [{ required: true, message: '请输入密码', trigger: 'blur' },{ min: 6, max: 24, message: '密码长度为6-24个字符', trigger: 'blur' },{ validator: validateUppercase, trigger: 'blur' },{ validator: validateNumber, trigger: 'blur' },{ validator: validateSpecialCharacter, trigger: 'blur' }]
});const emits = defineEmits(['stepRouter']);const submitForm = (formEl) => {if (!formEl) return;formEl.validate((valid) => {if (valid) {console.log('submit!');getEmailCode(form.email);// emits('stepRouter', { step: 2, form });} else {console.log('error submit!');return false;}});
};
</script><style lang="less" scoped>
.registerform {h1 {color: #000;font-family: PingFang SC;font-size: 40px;font-style: normal;font-weight: 600;line-height: normal;margin-bottom: 40px;}.registerWarp {.register-form {
//提示.pwdTips {position: absolute;top: 51px;width: 480px;min-height: 210px;flex-shrink: 0;background-color: #fff;z-index: 1;border-radius: 5px;box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.15);padding: 20px;p {display: flex;align-items: center;color: #000;font-family: PingFang SC;font-size: 14px;font-weight: 400;padding-bottom: 10px;img {margin-right: 11px;}&:last-child {color: #909090;font-family: PingFang SC;font-size: 12px;font-weight: 500;padding-bottom: 0;}}}&.el-form {:deep(.el-form-item__label) {color: #000;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;line-height: normal;margin-bottom: 0;}.el-form-item {position: relative;margin-top: 20px;.form-bottom {.promise {color: #000;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;line-height: normal;span {color: #3183ff;}}.submit-btn {width: 480px;height: 48px;border-radius: 40px;background: #090909;color: #fff;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;line-height: normal;display: flex;justify-content: center;align-items: center;margin-top: 20px;margin-bottom: 30px;user-select: none;cursor: pointer;}.switch-login {color: #000;font-family: PingFang SC;font-size: 14px;font-style: normal;font-weight: 400;line-height: normal;text-align: center;span {color: #3183ff;cursor: pointer;}}}.item-label {display: flex;justify-content: space-between;img {width: 11px;height: 11px;transform: rotate(90deg);transition: transform 0.3s ease;cursor: pointer;&.active {transform: rotate(270deg);}}}.el-input {width: 480px;height: 40px;background: #ffffff;margin-top: 10px;border: 1px solid #ebebeb;border-radius: 4px;::placeholder {font-size: 14px;line-height: 20px;color: #c8c8c8;}}:deep(.el-input__inner) {color: #000;}}}}}
}
</style>

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

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

相关文章

【论文简介】个性化真实人像生成方法(2024.01.15发布,即将开源)

零样本身份保留生成方法&#xff1a;声称效果好于PhotoMaker&#xff08;即将开源&#xff09; 2401.InstantID: Zero-shot Identity-Preserving Generation in Seconds &#xff1a; 项目主页&#xff1a;https://instantid.github.io/ 一、简介 本文的主要内容是介绍了一种…

【驱动】I2C驱动分析(二)-驱动框架

I2C驱动框架简介 I2C 驱动属于总线-设备-驱动模型的&#xff0c;与I2C总线设备驱动模型相比&#xff0c;大体框架是一样&#xff0c;系统的整体框架如下所示。 最上层是应用层&#xff0c;在应用层用户可以直接用open read write对设备进行操作&#xff0c;往下是设备驱动层&a…

Jenkins的环境部署,(打包、发布、部署、自动化测试)

一、Tomcat环境安装 1.安装JDK&#xff08;Java环境&#xff09; JDK下载地址&#xff1a;Java Downloads | Oracle 安装好后在系统环境变量里配置环境变量&#xff1a; ①添加JAVA_HOME 变量名&#xff1a;JAVA_HOME变量值&#xff1a;C:\Program Files\Java\jdk1.8.0_18…

CSS笔记II

CSS第二天笔记 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 三大特性继承性层叠性优先级优先级-叠加计算规则 Emmet写法 背景属性背景图平铺方式位置缩放固定复合属性 显示模式转换显示模式 复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通…

LeetCode19:删除链表的倒数第N个结点

力扣题目链接 思路&#xff1a;由于本题有可能删除头结点&#xff0c;为保证删除头结点和其他结点的操作一致&#xff0c;因此首先创建一个虚拟头结点dummy。 其次&#xff0c;本题需要删除倒数第N个结点&#xff0c;由于单链表只有next指针&#xff0c;因此需要找到倒数第N1…

力扣精选算法100题——找到字符串中所有字母异位词(滑动窗口专题)

本题链接&#x1f449;找到字符串中所有字母异位词 第一步&#xff1a;了解题意 给定2个字符串s和p&#xff0c;找到s中所有p的变位词的字串&#xff0c;就是p是"abc",在s串中找到与p串相等的字串&#xff0c;可以位置不同&#xff0c;但是字母必须相同&#xff0c;比…

橘子学K8S04之重新认识Docker容器

我们之前分别从 Linux Namespace 的隔离能力、Linux Cgroups 的限制能力&#xff0c;以及基于 rootfs 的文件系统三个角度来理解了一下关于容器的核心实现原理。 这里一定注意说的是Linux环境&#xff0c;因为Linux Docker (namespaces cgroups rootfs) ! Docker on Mac (bas…

Mybatis面试题(一)

MyBatis 面试题 1、什么是 Mybatis&#xff1f; 1、Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程…

在PyCharm中创建Flask项目

在 PyCharm 中创建 Flask 项目的步骤如下&#xff1a; 打开 PyCharm&#xff0c;并选择 "Create New Project"&#xff08;新建项目&#xff09;。在弹出的窗口中&#xff0c;选择左侧的 "Python" 选项&#xff0c;然后选择右侧的 "Flask" 项目…

【开发实践】前端jQuery+gif图片实现载入界面

一、需求分析 载入界面&#xff08;Loading screen&#xff09;是指在计算机程序或电子游戏中&#xff0c;当用户启动应用程序或切换到新的场景时&#xff0c;显示在屏幕上的过渡界面。它的主要作用是向用户传达程序正在加载或准备就绪的信息&#xff0c;以及提供一种视觉上的反…

(C语言)冒泡排序

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数&#xff1b; void buble_sort(int arr[], int sz) {//初始化变量值&#xff1b;int i 0;//嵌套循环冒泡排序&#xff1b;//外层循环&…

基于SSM的在线宠物商城设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

react native Gradle的原国外地址、本地下载、国内阿里腾讯镜像三种下载配置

一、国外地址&#xff1a;&#xff08;初始项目默认&#xff09; 下载地址&#xff1a;https://services.gradle.org/distributions/ 文件地址见下图&#xff1a; 注意&#xff1a;这个地址下载十次就有九次是连接超时&#xff0c;建议换另外两种方法 二、下载到本地&#x…

查看pip及Python版本

Python环境正确安装之后&#xff0c;按“WinR”组合键打开“运行”对话框&#xff0c;输入“cmd”&#xff0c;如下图 打开命令提示符窗口后&#xff0c;输入以下命令查看Python及pip的版本。 pip -V 如果命令提示符窗口能够正确显示pip及Python版本&#xff0c;则说明Python…

Mybatis之关联

一、一对多关联 eg&#xff1a;一个用户对应多个订单 建表语句 CREATE TABLE t_customer (customer_id INT NOT NULL AUTO_INCREMENT, customer_name CHAR(100), PRIMARY KEY (customer_id) ); CREATE TABLE t_order ( order_id INT NOT NULL AUTO_INCREMENT, order_name C…

【备战蓝桥杯】吃奶酪问题 / 超硬核,文附template拓展知识!

蓝桥杯备赛 | 洛谷做题打卡day9 文章目录 蓝桥杯备赛 | 洛谷做题打卡day9再来了解一下状压dp**简介(Introduction)****描述(Description)** - 吃奶酪题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定提示 * template拓展知识我的一些话 【引入】今天…

python数字图像处理基础(十)——背景建模

目录 背景建模背景消除-帧差法混合高斯模型 背景建模 背景建模是计算机视觉和图像处理中的一项关键技术&#xff0c;用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中&#xff0c;背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模&#xff…

如何设置Windows 11的WSL系统用作备用桌面环境

如何设置Windows 11的WSL系统用作开发环境&#xff08;含Astrill设置&#xff09; 如何设置Windows 11的WSL系统用作备用桌面环境 引子&#xff1a; 2023年末&#xff0c;公司突然遭遇网络攻击&#xff0c;调整了防火墙设置&#xff0c;连接VPN用来飞X软件&#xff0c;与原来…

GoZero微服务个人探究之路(零)个人对微服务产生原因的思考,对前三篇的补充

为什么产生了微服务架构--必要性 这里我觉得看GoZero作者写的博文就可以有很好的体会 具体的&#xff0c;他画了这一张图&#xff08;以电商后台系统为例子&#xff09; 所以&#xff0c;我个人产生了如下思考 1.业务逻辑越来越复杂&#xff0c;层层嵌套&#xff0c;分解成微…