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/ 一、简介 本文的主要内容是介绍了一种…

代码训练营第36天|● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;代码随想录的个人空间-代码随想录个人主页-哔哩哔哩视频 (bilibili.com) LeetCode 435. 无重叠区间 题目链接&#xff1a;435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 代码如下&#…

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

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

多线程编程——线程的属性

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 如果只是学习简单的多线程编程&#xff0c;本文内容可以暂时忽略。在利用pthread_create() 函数创建线程时&#xff0c;第二个参数设置为NULL即可。 一、引入 通过阅读前面章节&…

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…

前端开发 2: CSS

在前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;是一种用于描述网页样式的语言。它控制着网页的布局、颜色、字体等外观效果。在本篇博客中&#xff0c;我将为你介绍 CSS 的基础知识和常用技巧&#xff0c;帮助你更好地掌握前端开发中的样式设计。 CSS 基础知…

CSS笔记II

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

长虹智能电视C1100i、C1080i系列、3D51V50等 ZPM41AiJ机芯 刷机方法,及刷机数据

适用机芯&#xff1a;ZPM41AiJ 适用型号&#xff1a; 3D51C1100i、3D51C1080i、3D51V50 刷机方法&#xff1a; 1、将文件下载到电脑&#xff0c;解压后有3个文件&#xff0c;3个文件放到U盘的根目录。U盘必须使用FAT32格式&#xff1b; 2、将U盘接入电视的USB接口&#…

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;比…

笨蛋学设计模式结构型模式-外观模式【10】

结构型模式-外观模式 7.4外观模式:arrow_up::arrow_up::arrow_up:7.4.1概念7.4.2场景7.4.3优势 / 劣势7.4.4外观模式可分为7.4.5外观模式7.4.6实战7.4.6.1题目描述7.4.6.2输入描述7.4.6.3输出描述7.4.6.4实战 7.4.7总结外观模式 7.4外观模式⬆️⬆️⬆️ 7.4.1概念 ​ 外观模…

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

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

JAVA开发工作笔记

Android开发 1、解决notifyDataSetChanged()刷新数据的时候&#xff0c;edittext的焦点就会自动消失 第一步&#xff1a;在adapter中复写此方法 Override public long getItemId(int position) { return position; }第二步&#xff1a;在创建Adapter的时候设置setHasStabl…

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;以及提供一种视觉上的反…

科技的成就(五十五)

519、Machine Learning "1959 年 7 月&#xff0c;塞缪尔首创 Machine Learning 一词。塞缪尔在“Some Studies in Machine Learning Using theGame of Checkers”一文中给 Machine Learning 下了个非正式定义&#xff1a;没有明确编程指令的情况下&#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;//外层循环&…

VPS与母机

VPS技术是将一台服务器分割成多个虚拟专享服务器的优质服务。实现VPS的技术分为容器技术&#xff0c;和虚拟化技术。在容器或虚 拟机中&#xff0c;每个VPS都可选配独立公网IP地址、独立操作系统、实现不同VPS间磁盘空间、内存、CPU资源、进程和系统配置的 隔离&#xff0c;为用…

HBase学习三:集群部署

集群启停顺序:启动Hadoop—>启动HBase—>关闭HBase—>关闭Hadoop 1 环境准备 1.0 环境前期准备 参考基础环境配置 1.1 机器准备 hostnameipvm1ip1vm2ip2vm3ip31.2 机器分配 hdfs的集群搭建可以参考 hdfs集群搭建 hdfs集群机器分配 NameNodeDataNodeJournalNode…