Vue 邮箱登录界面

功能

模拟了纯前端的邮箱登录逻辑
还没有连接后端的发送邮件的服务
后续计划,再做一个邮箱、密码登录的界面
然后把这两个一块连接上后端

技术介绍

主要介绍绘制图形人机验证乃个
使用的是canvas,在源码里就有

界面控制主要就是用 表格、表单(其实表单都没怎么用到)、v-if、文本输入框和按钮。

效果图

在这里插入图片描述

在这里插入图片描述

代码

Auth.vue

<template><div><form @submit.prevent="handleSubmit"><table><!-- 邮箱输入框 --><tr v-show="!showEmailVerification"><td><label for="email">邮箱</label></td><td colspan="2"><input type="email" id="email" v-model="formData.email" placeholder="请输入邮箱" required></td></tr><!-- 人机校验 --><tr v-show="!showEmailVerification"><td><button type="button" @click="refreshCaptcha"><canvas ref="myCanvas" width="90" height="25"></canvas></button></td><td><input type="text" id="captcha" v-model="userInputCaptchaText" placeholder="请输入验证码" required></td></tr><tr v-show="!showEmailVerification"><td></td><td><button type="button" @click="sendEmail">人机验证</button></td></tr><!-- 邮箱认证 --><tr v-show="showEmailVerification"><td><label for="emailVerificationCode">验证码</label></td><td colspan="2"><input type="text" id="emailVerificationCode" v-model="formData.emailVerificationCode" placeholder="请输入邮箱验证码" required></td></tr><tr v-show="showEmailVerification"><td></td><td colspan="2"><button type="button" @click="verifyEmailVerificationCode">提交验证码</button></td></tr><!-- 消息通知栏 --><tr><td colspan="2">{{ message }}</td></tr></table></form></div>
</template><script setup>
import { onMounted } from 'vue';
import useFormValidation from './formValidation';const {formData,userInputCaptchaText,showEmailVerification,message,refreshCaptcha,sendEmail,verifyEmailVerificationCode,
} = useFormValidation();// Initialize captcha on component mount
onMounted(refreshCaptcha);function handleSubmit() {// 可以在这里添加表单提交逻辑
}
</script><style scoped>
table, th, td {border: 1px solid black;border-collapse: collapse;
}
</style>

captcha.js

export function drawCaptcha(ctx, width, height) {// 填充背景色ctx.fillStyle = '#f2f2f2';ctx.fillRect(0, 0, width, height);// 设置字符集const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789';const charCount = 4; // 验证码字符数let captchaText = '';// 随机生成验证码文本for (let i = 0; i < charCount; i++) {captchaText += chars.charAt(Math.floor(Math.random() * chars.length));}// 设置字体样式ctx.font = '24px Arial';ctx.fillStyle = '#333';ctx.textBaseline = 'middle';// 绘制字符for (let i = 0; i < captchaText.length; i++) {const x =  i * 24;const y = height / 2;const angle = (Math.random() - 0.5) * 0.6; // 随机旋转角度ctx.save();ctx.translate(x, y);ctx.rotate(angle);ctx.fillText(captchaText.charAt(i), 0, 0);ctx.restore();}// 添加干扰线条for (let i = 0; i < 10; i++) {ctx.strokeStyle = getRandomColor();ctx.beginPath();ctx.moveTo(Math.random() * width, Math.random() * height);ctx.lineTo(Math.random() * width, Math.random() * height);ctx.stroke();}// 添加噪点for (let i = 0; i < 50; i++) {ctx.fillStyle = getRandomColor();ctx.beginPath();ctx.arc(Math.random() * width, Math.random() * height, 1, 0, Math.PI * 2);ctx.fill();}return captchaText;
}function getRandomColor() {const r = Math.floor(Math.random() * 256);const g = Math.floor(Math.random() * 256);const b = Math.floor(Math.random() * 256);return `rgb(${r},${g},${b})`;
}

formValidation.js

import { ref } from 'vue';
import { drawCaptcha } from './captcha';
import axios from 'axios';export default function useFormValidation() {const formData = ref({email: '',emailVerificationCode: ''});const userInputCaptchaText = ref('');let captchaText = '';const isValid = ref(false);const showEmailVerification = ref(false);const loginSuccess = ref(false);const message = ref('');function refreshCaptcha() {const canvas = document.querySelector('canvas');const ctx = canvas.getContext('2d');captchaText = drawCaptcha(ctx, canvas.width, canvas.height);}function sendEmail() {if (!isValidEmail(formData.value.email)) {message.value = '请输入有效的邮箱地址';return;}if (isValidCaptcha(userInputCaptchaText.value, captchaText)) {isValid.value = true;showEmailVerification.value = true;message.value = '请查收邮箱验证码';// 发送邮件验证码的逻辑可以放在这里sendVerificationCode(formData.value.email);} else {message.value = '验证码错误,请重新输入';refreshCaptcha();userInputCaptchaText.value = '';isValid.value = false;showEmailVerification.value = false;}}const sendVerificationCode = async (email) => {try {const response = await axios.post('http://localhost:8080/api/register', { email }, {headers: {'Content-Type': 'application/json'}});console.log('Verification code sent successfully:', response.data);} catch (error) {console.error('Error sending verification code:', error);}};// 校验邮箱验证码function verifyEmailVerificationCode() {if (isValidEmailVerificationCode(formData.value.emailVerificationCode)) {loginSuccess.value = true;message.value = '邮箱验证码校验通过,登录成功!';} else {message.value = '邮箱验证码错误,请重新输入';}}const isValidEmailVerificationCode = async (code) => {console.log(code);try {const response = await axios.post('http://localhost:8080/api/checkEmail', { code }, {headers: {'Content-Type': 'application/json'}});console.log('Verification code check result:', response.data);return response.data;} catch (error) {console.error('Error checking verification code:', error);message.value = '校验邮箱验证码时发生错误';return false;}}return {formData,userInputCaptchaText,isValid,showEmailVerification,loginSuccess,message,refreshCaptcha,sendEmail,verifyEmailVerificationCode};
}function isValidEmail(email) {const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;return emailRegex.test(email);
}function isValidCaptcha(inputCaptcha, generatedCaptcha) {return inputCaptcha.toLowerCase() === generatedCaptcha.toLowerCase();
}

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

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

相关文章

大量设备如何集中远程运维?用好向日葵的这几个功能很重要

当企业的业务不断发展&#xff0c;不同系统、不同用途的IT设备数量也会不断上升&#xff0c;面对不断扩张的设备规模&#xff0c;IT运维的压力自然也会陡然上升。 面对这种情况&#xff0c;传统的线下运维方式已经不再合适&#xff0c;我们需要引入一个专业的&#xff0c;可以…

SRC实战:无中生有的接口和参数

今天分享的这个漏洞怎么说呢&#xff0c;虽然也是个高危&#xff0c;但是其实挺简单的&#xff0c;一个很eazy的越权&#xff0c;但是我觉得多多少少还是有点意思吧。 0x00 这是一个移动端的应用程序&#xff0c;前面比较常规&#xff0c;模拟器 BP&#xff0c;跑了一下所有…

赋能心理大模型,景联文科技推出高质量心理大模型数据库

生成式大模型作为当前发展势头最为强劲的人工智能前沿技术&#xff0c;其在临床心理学领域中的创新应用已成为社会关注和医学聚焦的热点之一。 心理大模型在落地应用过程中可能面临的痛点主要包括以下几个方面&#xff1a; 数据隐私与安全&#xff1a;确保敏感的个人信息在模型…

【Java11】变量的初始化和内存中的运行机制

成员变量的初始化和内存中的运行机制 系统加载类或创建类的实例时&#xff0c;系统自动为成员变量分配内存空间&#xff0c;然后自动为成员变量指定初始值。 class Person {public String name; // 实例变量public static int eyeNum; // 类变量 }var p1 Person(); var p2 …

2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析

2024年亚太中文赛数学建模竞赛B题 洪水灾害的数据分析与预测详细思路解析 解题方法&#xff1a; 首先就是对数据进行数据的预处理包括缺失值和异常值处理&#xff0c;之后就是分析哪些指标与洪水的发生有着密切的关联&#xff0c;可以使用相关性分析&#xff08;建议使用斯皮尔…

什么是OSPFv2 ?

什么是OSPF ? 开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff09;是IETF组织开发的一个基于链路状态的内部网关协议&#xff08;Interior Gateway Protocol&#xff09;。 目前针对IPv4协议使用的是OSPF Version 2&#xff08;RFC2328&#xff09;&a…

YOLO V7项目使用

YOLO V7项目使用 根据官方论文中提供的项目地址&#xff1a;使用git clone将项目下载到本地。 https://github.com/WongKinYiu/yolov7 git clone https://github.com/WongKinYiu/yolov7 使用pycharm打开项目&#xff0c;根据官方提供的requirement.txt文件下载项目启动所需要的…

Java实习手册(小白也看得懂)

秃狼说 距离俺发布的学习路线已经六个月了&#xff0c;那我给小伙伴的学习周期是四五个月左右&#xff0c;我相信大多的小伙伴已经学习的差不多了。正好赶上暑期实习的阶段&#xff0c;在暑期找到实习就成为暑期的头等大事。 实习经验在校招的起到决定性的作用&#xff0c;所…

Spring Security基本源码解析(超精细版)

一、基本源码解析 1.1 UsernamePasswordAuthenticationFilter 用户名称和密码的过滤器 浏览器发送用户名称和密码 ----》 经过过滤器「UsernamePasswordAuthenticationFitler」 1.2 UsernamePasswordAuthenticationFilter核心方法 重写父类「AbstractAuthenticationProcessing…

2.4章节python中字符串类型

在Python中&#xff0c;字符串&#xff08;String&#xff09;是一种基本的数据类型&#xff0c;用于表示文本信息。字符串可以包含字母、数字、标点符号或任何Unicode字符。Python中的字符串是不可变的&#xff0c;这意味着一旦创建了字符串&#xff0c;就不能更改字符串中的字…

Build a Large Language Model (From Scratch)附录D(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

Windows 下载安装ffmpeg

下载地址 https://ffmpeg.org/download.html 测试 管理员方式打开控制台&#xff0c;输入ffmpeg测试 配置环境变量

让你的 Rabbids Rockstar人物化身加入欢乐行列!

让你的 Rabbids Rockstar 人物化身加入欢乐行列&#xff01; https://www.youtube.com/watch?vwLBd20BxbS8 当这些调皮的小兔子以狂野的装扮、超棒的吉他弹奏和搞笑滑稽的动作登上舞台中央时&#xff0c;你将感受到它们异想天开的魅力。通过人物化身释放你内心的摇滚明星魅力&…

【收藏级神丹】Liae384_刘亦菲_直播可用,平衡度最高的原创神丹,独家珍稀资源

Liae384_刘亦菲_DFL神丹&#xff1a;点击下载 此丹较重&#xff0c;小卡可以使用但不能训练&#xff0c;实测复训适合24G卡8G、12G、16G卡下载练好的专丹直接使用即可384的Liae对各类杂论视频兼容比较好&#xff0c;高参也能容忍高分辨率的DST复用方式: 非必要不用删除AB&…

Go源码--channel源码解读

简介 channel顾名思义就是channel的意思&#xff0c;主要用来在协程之间传递数据&#xff0c;所以是并发安全的。其实现原理&#xff0c;其实就是一个共享内存再加上锁&#xff0c;底层阻塞机制使用的是GMP模型。可见 GMP模型就是那个道&#xff0c;道生一,一生二,二生三,三生…

【Mathematica14.0】快速从下载安装到使用

目录 1.简介 2.下载安装 下载 安装 3.一小时掌握mathematica使用 单元模式 内置函数 符号表达式 迭代器 赋值 通配符及查找替换 函数定义 匿名函数&#xff08;拉姆达表达式&#xff09; 函数映射 函数式与运算符 函数自定义选项 图形可视化 交互式界面 数值…

Rocky Linux 9.4基于官方源码制作openssh 9.8p1二进制rpm包 —— 筑梦之路

2024年7月1日&#xff0c;openssh 9.8版本发布&#xff0c;主要修复了CVE-2024-6387安全漏洞。 由于centos 7的生命周期在6月30日终止&#xff0c;因此需要逐步替换到Rocky Linux&#xff0c;后续会有更多分享关于Rocky Linux的文章。 环境说明 1. 操作系统版本 cat /etc/o…

【论文阅读】-- Strscope:不规则测量的时间序列数据的多尺度可视化

Stroscope: Multi-Scale Visualization of Irregularly Measured Time-Series Data 摘要1 引言2相关工作2.1&#xff08;大型&#xff09;时间序列数据可视化2.2 事件序列数据可视化2.3 评价 3问题分析3.1 数据集3.2 场景——现状3.3 设计流程3.4 设计原理 4 涟漪图&#xff1a…

使用中国大陆镜像源安装最新版的 docker Deamon

在一个智算项目交付过程中&#xff0c;出现了新建集群中的全部 docker server V19 进程消失、仅剩 docker server 的 unix-socket 存活的现象。 为了验证是否是BD产品研发提供的产品deploy语句缺陷&#xff0c;需要在本地环境上部署一个简单的 docker Deamon 环境。尴尬的是&a…

针对某客户报表系统数据库跑批慢进行性能分析及优化

某客户报表系统数据库跑批时间过长&#xff0c;超出源主库较多&#xff0c;故对其进行了分析调优&#xff0c;目前状态如下&#xff1a; 1、业务连接的rac的scanip&#xff0c;因为负载均衡将跑批的连接连接到了多个计算节点导致节点间通讯成本较高&#xff0c;故速率缓慢&…