当前位置: 首页 > news >正文

实现如何利用 Kafka 延时删除 用户邮箱的验证码(如何发送邮箱+源码) - 第一期

技术框架:

前端:vue3+axios

后端:springboot3+ jakarta.mail

简单流程:

1. 用户输入邮箱,点击 获取验证码

<div v-if="activeMethod === 'email'" class="form-group">            <input               v-model="email.number"               type="text"               placeholder="请输入邮箱"              class="form-input"            >            <div class="code-input-group">              <input                 v-model="email.code"                 type="text"                 placeholder="验证码"                class="form-input code-input"              >              <button class="send-code-btn" @click="sendCode">                {{ countdown > 0 ? `${countdown}s后重发` : '获取验证码' }}              </button>            </div>          </div>
const sendCode = () => {// 请求后端 邮箱接口  axios.get('http://127.0.0.1:8848/emailv3', {    params: {      to: email.value.number    }  }).then(res => {    console.log(res)    alert("验证码已发送,请留意邮箱")    // 存储uuid    localStorage.setItem('uuid',res.data)  })}

2. 后端接收前端发出的邮箱,先判断数据库中是否已经存在邮箱了,如果没有则随机生成a-zA-Z0-9的6位验证码并保存到数据库,然后通过邮件功能去发送用户的邮箱,并返回 uuid,并且存储到本地缓存中,作为临时邮箱验证码的依据

//  查询邮箱是否唯一    public boolean SelectMail(String mail) {        QueryWrapper<Users> queryWrapper = new QueryWrapper<>();        System.out.println("查询邮箱是否唯一"+mail);        queryWrapper.eq("user_mail", mail);        Users users = userMapper.selectOne(queryWrapper);        if (users != null) {            return true;        }        return false;    }
private static final String CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";private static final int CODE_LENGTH = 6;    // 创建随机 6 位 数字 字母 的验证码    public String generateCode() {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < CODE_LENGTH; i++) {            int index = (int) (Math.random() * CODE.length());            sb.append(CODE.charAt(index));        }        return sb.toString();    }    // 生成一个UUID作为验证码的唯一辅助标识符    public String generateUUID() {        return UUID.randomUUID().toString().replace("-", "").substring(0, 10);    }
// 发送邮箱时进行保存    public void saveQrCode( String code, String uuid) {        QrCodes qrCode = new QrCodes();        qrCode.setQrCode(null);        qrCode.setQrCode(code);        qrCode.setQrUuid(uuid);        int insert = qrCodeMapper.insert(qrCode);        if (insert > 0) {            System.out.println("存储成功");            System.out.println("验证码:" + code + ",UUID:" + uuid);        }    }

3. 用户去邮箱那边拿验证码

粘贴到登录界面的验证码框内

4. 点击登录的时候,就会获取 邮箱框,验证码,UUID,

axios.post('http://127.0.0.1:8848/loginbymail', {      email: email.value.number,      uuid: localStorage.getItem('uuid'),      code: email.value.code    })

5. 后端创建一个 模型请求类 来获取

import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;@Data@AllArgsConstructor@NoArgsConstructor@ToStringpublic class EmailLogin {    private String email;    private String uuid;    private String code;}

6.邮箱登录

// 用户利用邮箱登录    @PostMapping("loginbymail")    public String UserLoginByMail(@RequestBody EmailLogin emailLogin){        System.out.println("用户传来的数据"+emailLogin);        // 判断uuid是否正确        String uuid = emailLogin.getUuid();        String email = emailLogin.getEmail();        String code = emailLogin.getCode();        String temp = "验证失败,UUID或验证码错误";        if (!emailService.getQrCodeByUuidAndCode(code, uuid)){            // 验证失败,UUID或验证码错误            return temp;        }        // 验证成功,注册用户        return userService.EmailRegisterUser(email)?"注册成功":temp;    }

7.校验 uuid + code​​​​​​​

// 查询用户的 UUID+code    public boolean getQrCodeByUuidAndCode(String code, String uuid) {        QueryWrapper<QrCodes> qrCodeQueryWrapper = new QueryWrapper<>();        qrCodeQueryWrapper.eq("qr_uuid", uuid);        qrCodeQueryWrapper.eq("qr_code", code);        QrCodes qrCode = qrCodeMapper.selectOne(qrCodeQueryWrapper);        System.out.println("查询结果:" + qrCode.toString());        if (qrCode != null) {            return true;        }        return  false;    }

8.登录成功!

下篇介绍,这时候如何接入 kafka实现延时删除邮箱验证码+uuid

* Thanks you *

如果觉得文章内容不错,随手帮忙点个赞在看转发一下,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章。


*往期推荐 *

Docker小白入门教程一篇领你入门(CRUD全命令+无废话版+问题集)-第三期

Docker小白入门教程一篇领你入门(CRUD全命令+无废话版+问题集)

想要高效处理,那不妨看看 Python的 异步 Asyncio 保证效率翻多倍

银河麒麟 | ubuntu 安装国产达梦DM8数据库(安装+外网通+IDEA连接)

网络设备日志存储到指定的Kiwi-log服务器(图解+软件)

银河麒麟 | ubuntu 安装运用 docker 容器,实现容器化部署项目

银河麒麟 | ubuntu 安装zabbix监控设备信息(亲测包对)

国产操作系统-银河麒麟本地化部署Ollama国产开源的AI大模型Qwen3

Ubuntu |  安装 Zabbix 一篇就够了

Swagger | 手把手带你写自动生成接口文档的爽感(零基础亲测实用)

SpringBoot整合Openfeign接入Kimi Ai!!超简单,居然没多少行代码??(附加兜底教程)

SpringBoot接入Kimi实践记录轻松上手

Linux | 零基础Ubuntu搭建JDK

Maven | 站在初学者的角度配置与项目创建(新手必学会)

Spring Ai | 极简代码从零带你一起走进AI项目(中英)

Open Ai | 从零搭建属于你的Ai项目(中英结合)

MongoDB | 零基础学习与Springboot整合ODM实现增删改查(附源码)

Openfeign | 只传递城市代码,即可获取该地域实时的天气数据(免费的天气API)

Redis | 缓存技术对后端的重要性,你知道多少?

Mongodb | 基于Springboot开发综合社交网络应用的项目案例(中英)


感谢阅读 | 更多内容尽在公棕号 WMCode | CSDN@小Mie不吃饭

http://www.dtcms.com/a/265707.html

相关文章:

  • 前缀和算法详解
  • FASTAPI+VUE3平价商贸管理系统
  • React自学 基础一
  • 基于大语言模型进行Prompt优化
  • 深入解析 AAC AudioSpecificConfig 在 RTSP/RTMP 播放器中的核心作用
  • PDF的图片文字识别工具
  • Spring AI ETL Pipeline使用指南
  • Java中的volatile到底是什么来路
  • OpenCV CUDA模块设备层-----在 GPU上高效地执行两个uint类型值的最小值比较函数vmin2()
  • 《人生顶层设计》读书笔记6
  • 开源无广告面板mdserver-web:替代宝塔实现服务器轻松管理
  • 地下管线安全的智能监测先锋:智能标志桩图像监测装置解析​
  • 矩阵批量剪辑源码搭建定制化开发:支持OEM
  • 爬虫技术-获取浏览器身份认证信息(如 Cookie、Token、Session 等)
  • Python 中如何使用 Conda 管理版本和创建 Django 项目
  • 【Docker】如何设置 `wiredTigerCacheSizeGB` 和 `resources.limits.memory`
  • BenchmarkSQL 测试 PostgreSQL 时遇到 numeric field overflow 报错的原因与解决方案
  • 请求未达服务端?iOS端HTTPS链路异常的多工具抓包排查记录
  • 区块链真的会是未来吗?
  • TCP粘包、拆包、解决
  • 什么是协同归因和贡献归因
  • WhoDB:一款基于Web的免费AI数据库管理工具
  • 刷卡登入数据获取
  • 【ArcGISPro】基于Pro的Python环境进行Django简单开发Web
  • 两个PHY芯片之间,是如何连接进行通信的?
  • 并行科技MaaS平台支持文心4.5系列开源模型调用
  • MySQL主从延迟深度解析:现象、原因与实战解决方案
  • KMP(Kotlin Multiplatform)改造(Android/iOS)老项目
  • 舵轮时钟-STM32-28路PWM--ESP8266-NTP时间
  • Babylon.js 材质克隆与纹理共享:你可能遇到的问题及解决方案