使用邮箱发送验证码前端完成登录

前言

在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。

接口

 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int  count { get; set; }public string msg { get; set; }public object Data { get; set; }}
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Model;
using System.IO;namespace TestSystem.Controllers
{[Route("api/[controller]/[action]")][ApiController]public class UserController : ControllerBase{[HttpPost]public ApiResp email(string username,string email){var resp = new ApiResp();if (username == "admin")//模拟数据库读取 UserName是唯一属性{EmaliSend e = new EmaliSend();string str = e.emailsendone(email);resp.Data = str;resp.Success = true;return resp;}resp.Success = false;return resp;}}
}

前端

前端使用是layui样式+Vue写的功能。
在这里插入图片描述

引入Vue

记得把<div id = "app"></div>把前端样式包含

	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<div class="layui-form-item" v-if="vercodeVisible"><div class="layui-form-item"><label class="layadmin-user-login-icon layui-icon layui-icon-email"for="LAY-user-login-email"></label><input type="text" name="email" v-model="email" placeholder="请输入邮箱" autocomplete="off"class="layui-input"></div><div class="layui-row"><div class="layui-col-xs7"><label class="layadmin-user-login-icon layui-icon layui-icon-vercode"for="LAY-user-login-vercode"></label><input type="text" name="vercode" id="LAY-user-login-vercode" lay-verify="required"v-model="emalistr" placeholder="验证码" class="layui-input"></div><div class="layui-col-xs5"><div style="margin-left: 10px;"><button type="button" class="layui-btn layui-btn-primary layui-btn-fluid"@click="EmailSend" id="emailButton">获取验证码</button></div></div></div></div>	<div class="layui-form-item"><button class="layui-btn layui-btn-fluid" v-if="vercodeVisible" lay-submitlay-filter="LAY-user-login-submit" @click="loginEmail">验证码登录</button>		</div>

Vue写调用发送邮箱api

<script>// 提前引入layui并初始化layer模块layui.use('layer', function() {var layer = layui.layer;new Vue({el: '#app',data: {username: 'admin',email: 'xx@163.com', //邮箱emalistr: '', //邮箱验证码remalistr: '', //缓存邮箱验证码},mounted() {},methods: {EmailSend() {const button = document.getElementById('emailButton'); // 获取按钮元素const originalText = button.innerText; // 原始按钮文本const username = this.username;const email = this.email;// 邮箱格式验证正则表达式const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;if (!emailRegex.test(email)) {layer.msg('请输入正确的邮箱地址', {time: 1000,icon: 5,shade: [0.5, '#000'],shadeClose: true});return; // 邮箱格式不正确,停止执行发送邮件操作}const headers = new Headers();headers.append('Content-Type', 'application/json');const body = JSON.stringify({username,email});button.disabled = true; // 禁用按钮let countDown = 60; // 倒计时时间const timer = setInterval(() => {if (countDown >= 1) {button.innerText = `${countDown}秒后可重发`; // 更新按钮文本countDown--;} else {clearInterval(timer);button.innerText = originalText; // 还原按钮文本button.disabled = false; // 启用按钮}}, 1000);fetch('https://localhost:44301/api/Login/EmaliSendLogin', {method: 'POST',headers: headers,body: body}).then(response => response.json()).then(data => {if (data.success) {layer.msg('发送成功', {time: 500,icon: 6,shade: [0.5, '#000'],shadeClose: true,end: function() {console.log("验证码" + data.data);localStorage.setItem('remalistr', data.data);}});} else {layer.msg('发送失败', {time: 1000,icon: 5,shade: [0.5, '#000'],shadeClose: true});}}).catch(error => {console.log(error);layer.msg('发送失败,请检查网络连接', {time: 1000,icon: 5,shade: [0.5, '#000'],shadeClose: true});});},loginEmail() {const username = this.username;const email = this.email;const emalistr = this.emalistr;const remalistr = localStorage.getItem('remalistr');const vercode = this.vercode;const operator = this.operator;const headers = new Headers();headers.append('Content-Type', 'application/json');const body = JSON.stringify({username,email,});fetch('https://localhost:44301/api/Login/LoginEmail', {method: 'POST',headers: headers,body: body}).then(response => response.json()).then(data => {if (data.success && localStorage.getItem('remalistr') === this.emalistr && this.vercode == this.rvercode) {layer.msg('登录成功', {time: 1000,icon: 6,shade: [0.5, '#000'],shadeClose: true,end: function() {console.log(data.data);localStorage.setItem('data', JSON.stringify(data.data));location.href = '../';}});} else {layer.msg('登录失败', {time: 1000,icon: 5,shade: [0.5, '#000'],shadeClose: true});}}).catch(error => {console.log(error);});},}});});</script>

结果

在这里插入图片描述
右侧那验证码是缓存中的验证码,一般是看不见的。

主要逻辑

前端调用后端发送验证码的方法,传入username和邮箱。username是唯一,在数据库不可重复。
后端返回JSON格式给前端,前端解析返回的验证码以及其他用户信息可以进行验证码的读取,然后用户收到邮箱发来的验证码可以进行登录,进行用户输入的验证码和浏览器缓存的验证码进行比对然后登录成功。
还可以添加进行验证码的过期策略以及添加多种验证登录。

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

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

相关文章

元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata

大家好&#xff0c;我是独孤风。元数据管理平台层出不穷&#xff0c;但目前主流的还是Atlas、Datahub、Openmetadata三家&#xff0c;那么我们该如何选择呢&#xff1f; 本文就带大家对比一下,这三个平台优势劣势。要了解元数据管理平台&#xff0c;先要从架构说起。 正文共&am…

【北邮国院大四上】Business Technology Strategy 企业技术战略

北邮国院电商大四在读&#xff0c;本笔记仅为PPT内容的整理与翻译&#xff0c;并不代表本课程的考纲及重点&#xff0c;仅为本人复习时方便阅读与思考之作。 写在前面 大家好&#xff0c;欢迎来到大学期间的最后一门课程&#xff0c;本门课程是中方课&#xff0c;所以很庆幸的…

【Apollo】阿波罗使用占位符 #{} 的异常分析

文章目录 1. 前言2. 复现3. 分析3.1 Value 注解3.2 根因 4. 后记5. 参考资料 1. 前言 出于线上 hotfix 报文请求模板的考虑&#xff0c;新增一个阿波罗配置&#xff0c;取值形如&#xff1a; 发布配置一段时间后&#xff0c;刚好需要重启服务&#xff0c;最终造成服务宕机&a…

在Ubuntu22.04上安装WordPress

WordPress是当今最简单、最强大的博客和网站建设工具。据统计全球大约有40% 以上网站是使用WordPress&#xff0c;这是个巨大的数字也侧面证明了WordPress的强大和普遍性。因此&#xff0c;如果你正在寻找一款高效、实用、可靠的CMS工具来构建网站&#xff0c;那么WordPress无疑…

关于HAL库外部中断的开关流程

通过HAL库配置好外部中断后&#xff0c;会生成如下代码&#xff1a; static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_…

self-attention(上)李宏毅

B站视频链接 word embedding https//www.youtube.com/watch?vX7PH3NuYW0Q self-attention处理整个sequence&#xff0c;FC专注处理某一个位置的资讯&#xff0c;self-attention和FC可以交替使用。 transformer架构 self-attention的简单理解 a1-a4可能是input也可以作为中…

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。

JS手写apply,call,bind函数

本篇文章咱们来手写简易版的apply&#xff0c;call&#xff0c;bind函数。 实现思路 首先咱们需要思考下这三个函数放到哪里比较合适&#xff0c;因为这三个函数是被函数对象调用的&#xff0c;并且每个函数都可以调用&#xff0c;所以不难想到有一个位置非常合适&#xff0c;…

springboot第47集:【思维导图】面向对象,关键字,标识符,变量,数组的使用...

关键字&#xff1a;class,public,static,void等&#xff0c;特点是全部关键字都是小写字母。 image.png image.png 凡是自己起的名字可以叫标识符 image.png image.png image.png image.png 整数类型的使用 image.png image.png image.png 浮点类型 image.png image.png 字符类…

用队列实现栈oj题——225

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;LeetCode刷题|数据结构|Linux 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 题目要求&#xff1a;实现 MyStack 类&#xff1a;注意&#xff1a;示例&#xff1a;解释&#xff1a;提示&#xff1a; 解题核心数据结构的定义…

ASP.NET Core基础之图片文件(二)-WebApi图片文件上传到文件夹

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…

Python点云处理(二十一)基于Gradient Boosting的点云分类算法

目录 0 简述1 Gradient Boosting2 点云特征向量构建3 用Gradient Boosting进行分类4 代码实现5 结果展示0 简述 点云分类是计算机视觉领域中的一个重要任务,其主要目标是将三维空间中的点云数据划分为不同的类别。点云是由大量的三维点组成的数据集,通常由激光雷达或结构光等…

uniapp 微信小程序跳转外部链接

一、背景&#xff1a; 开发小程序时&#xff0c;跳转到内部路径通常会使用&#xff1a;uni.navigateTo&#xff0c;uni.redirectTo&#xff0c;uni.reLaunch&#xff0c;uni.switchTab等方法&#xff0c;可以跳转到pages.json中已经注册的页面 uni.navigateTo(OBJECT) | uni-…

编程天赋和努力哪个更重要?

编程天赋和努力在编程中都非常重要&#xff0c;但它们的侧重点不同。 编程天赋通常指的是与生俱来的、在逻辑思维、抽象思维、创造力等方面的能力&#xff0c;这些能力可以帮助程序员更快地理解问题、更高效地设计和实现解决方案。天赋的确可以帮助程序员更容易地入门和更快地掌…

[通俗易懂]c语言中指针变量和数值之间的关系

一、指针变量的定义 在C语言中&#xff0c;指针变量是一种特殊类型的变量&#xff0c;它存储的是另一个变量的内存地址。指针变量可以用来间接访问和操作内存中的其他变量。指针变量的定义如下&#xff1a; 数据类型 *指针变量名&#xff1b;其中&#xff0c;数据类型可以是任…

联邦学习中聚合算法可能怎样创新,智慧农业结合什么数学理论或知名理论实现创新并发表文章

目录 联邦学习中聚合算法可能怎样创新 智慧农业结合什么数学理论或知名理论实现创新并发表文章

什么是集合

在数学中&#xff0c;集合是由一些确定的对象组成的整体。这些对象称为集合的元素&#xff0c; 在Java中&#xff0c;集合&#xff08;Collection&#xff09;是一种用来存储和操作一组对象的容器。Java提供了多个集合类和接口&#xff0c;位于java.util包中&#xff0c;用于处…

深度解析基于模糊数学的C均值聚类算法

深度解析基于模糊数学的C均值聚类算法 模糊C均值聚类 (FCM)聚类步骤&#xff1a;FCM Python代码&#xff1a; 模糊C均值聚类 (FCM) 在数据挖掘和聚类分析领域&#xff0c;C均值聚类是一种广泛应用的方法。模糊C均值聚类&#xff08;FCM&#xff09;是C均值聚类的自然升级版。相…

学习笔记——C++中数据的输入 cin

作用&#xff1a;用于从键盘中获取数据 关键字&#xff1a;cin 语法&#xff1a;cin>>变量 类型&#xff1a;C中数据的输入主要包含&#xff1a;整形&#xff08;int&#xff09;浮点型&#xff08;float&#xff0c;double float&#xff09;&#xff0c;字符型&…

1.2 ARCHITECTURE OF A MODERN GPU

图1.2显示了典型的支持CUDA的GPU架构的高级视图。它被组织成一系列高线程的流式多处理器&#xff08;SM&#xff09;。在图中1.2&#xff0c;两个SM构成一个 block。然而&#xff0c;构建块中的SM数量可能因代而异。此外&#xff0c;在图中&#xff0c;每个SM都有多个共享控制逻…