SpringBoot项目 | 瑞吉外卖 | 短信发送验证码功能改为免费的邮箱发送验证码功能 | 代码实现

ops/2024/10/19 3:15:14/

0.前情提要

之前的po已经说了单独的邮箱验证码发送功能怎么实现:
https://blog.csdn.net/qq_61551948/article/details/142641495

这篇说下如何把该功能整合到瑞吉项目里面,也就是把原先项目里的短信发送验证码的功能改掉,改为邮箱发送验证码的功能。

当然首先得跟着教程从头到尾做到这块功能时才行,并且已经将数据模型User导入了进来,添加了UserController、UserService和UserServiceImpl,添加了Filter中一部分代码。

基于以上,实现本文的操作。 (当然不做这个项目参考一下也odkkkk)

1.后端代码实现

【和教程中所有代码都放在controller层不一样(看着很臃肿),我是具体实现细节就放在impl实现类里了】

1.1发送邮箱验证码的整体功能

controller层

java">/*** 发送邮箱验证码模拟短信验证码* @param user* @return*/
@PostMapping("sendEmail")
public R<String> sendEmail(@RequestBody User user) {return userService.sendEmail(user);
}

service层

java">R<String> sendEmail(User user);

serviceImpl层

java">@Resource
private JavaMailSender javaMailSender;
//读取yml文件中username的值并赋值给from
@Value("${spring.mail.username}")
private String from;
// 用于存储验证码,键为邮箱,值为验证码 【也可以用session保存试试】
private Map<String, String> verificationCodeMap = new HashMap<>();@Override
public R<String> sendEmail(User user) {if(user.getPhone() != null){// 构建一个邮件对象SimpleMailMessage message = new SimpleMailMessage();// 设置邮件发送者message.setFrom(from);// 设置邮件接收者message.setTo(user.getPhone());// 设置邮件的主题message.setSubject("登录验证码");// 设置邮件的正文Random random = new Random();StringBuilder code = new StringBuilder();for (int i = 0; i < 6; i++) {int r = random.nextInt(10);code.append(r);}String text = "您的验证码为:" + code;// 存储验证码log.info("验证码:{}",text);verificationCodeMap.put(user.getPhone(), code.toString());// 设置邮件的正文message.setText(text);// 发送邮件try {javaMailSender.send(message);return R.success("发送成功!");} catch (MailException e) {e.printStackTrace();}return R.error("发送失败");}return R.error("邮箱为空!");
}

1.2接收并校验验证码整体功能

controller层

java">/*** 登录功能* @param user* @return*/
@PostMapping("login")
public R<String> verifyCode(@RequestBody Map user, HttpSession session) {return userService.login(user,session);
}

service层

java">R<String> login(Map user, HttpSession session);

serviceImpl层

java">//判断验证码是否正确+判断是否注册过,没注册需要在登录时自动注册
@Override
public R<String> login(Map user, HttpSession session) { //Map存的值是Object类型,需要toString一下// 获取已存储的验证码String storedCode = verificationCodeMap.get(user.get("phone").toString());// 检查验证码是否存在&&检查用户输入的验证码是否正确if (storedCode != null && storedCode.equals(user.get("code").toString())) {//验证成功//判断该用户是否存在,如果不存在的话,顺便注册LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(User::getPhone,user.get("phone").toString());User user1 = this.getOne(queryWrapper);if(user1 == null){ //用户不存在,需要注册user1 = new User();user1.setPhone(user.get("phone").toString());user1.setStatus(1);this.save(user1);}session.setAttribute("user",user1.getId()); //在session中存入user的id(让过滤器放行)// 清除验证码以防止重复使用verificationCodeMap.remove(user.get("phone"));return R.success("验证成功");} else {return R.error("验证失败,验证码不正确");}
}

2.部分前端代码修改

打开下图所示的login.html文件
在这里插入图片描述

60行左右,原先用来判断手机号的正则表达式改为判断qq邮箱的正则表达式
在这里插入图片描述

java">const regex = /^[1-9][0-9]{4,10}@qq\.com$/;

再打开下图所示的文件
在这里插入图片描述

修改原文件的发送邮箱验证码的接口url以及登录的接口url,改为自己刚才实现的方法的接口url。
在这里插入图片描述

3.结果展示

发送验证码
在这里插入图片描述

收到验证码
在这里插入图片描述
输入错误验证码
在这里插入图片描述

输入正确验证码之后进入页面
在这里插入图片描述

撒花!!!!


http://www.ppmy.cn/ops/119909.html

相关文章

【JAVA源码授权】

悯农二首 代码混淆加密 Class 文件许可证管理数字签名API 调用限制防止反编译使用私有库法律保护动态授权 其一 春种一粒粟&#xff0c;秋收万颗子。 四海无闲田&#xff0c;农夫犹饿死。 其二 锄禾日当午&#xff0c;汗滴禾下土。 谁知盘中餐&#xff0c;粒粒皆辛苦 代码混淆 …

【迁移学习入门之域适应的背景、理论与方法】进一步理解迁移学习啦?

【迁移学习入门之域适应的背景、理论与方法】进一步理解迁移学习啦? 【迁移学习入门之域适应的背景、理论与方法】进一步理解迁移学习啦? 文章目录 【迁移学习入门之域适应的背景、理论与方法】进一步理解迁移学习啦?1. 背景介绍2. 理论基础2.1 分布差异(Domain Shift)2.…

MacOS配置python环境

下载 Python 前往网站下载对应芯片和python版本的 installer。 配置环境变量 sudo vim ~/.bash_profile添加一下内容&#xff0c;注意修改文件名。 export PATH"/Library/Frameworks/Python.framework/Versions/3.11/bin:${PATH}" alias python"/Library/Fr…

如何改善网站的核心网络生命力

首先我们需要明确&#xff0c;没有什么办法可以100%确保解决某个问题&#xff0c;本文只列举了一些可以用于改善的问题解决方案&#xff0c;在实际维护中&#xff0c;您可能需要从更多的角度来不断优化您的站点。 此外&#xff0c;核心网页指标&#xff08;Core Web Vitals&…

tauri程序加载本地图片或者文件在前端页面展示

要想在前端页面中展示本地文件或者文件夹&#xff0c;需要使用convertfilesrc这个api&#xff0c;可以非常方便的展示内容&#xff0c;官方文档&#xff1a;tauri | Tauri Apps convertFileSrc甚至位于invoke之前&#xff0c;但我却一直没有注意到它&#xff0c;一方面是因为&…

ThreadLocal原理解析及面试

基本使用 讲原理之前&#xff0c;我简单写个demo小程序说说怎么使用 public class TestThreadLocal {public static void main(String[] args) throws InterruptedException {ThreadLocal<String> tl new ThreadLocal();/**主线程设置了一个值*/tl.set("SSSSSs&…

测试用例的举例

1. 基于测试公式设计测试用例 通过功能&#xff0c;性能&#xff0c;安全性&#xff0c;界面&#xff0c;安全性&#xff0c;易用&#xff0c;兼容对于一个水杯进行测试用例的设计&#xff1b; 对于一个软件的测试用例设计&#xff1a; 功能&#xff1a;软件本质上能够用来干什…

OIDC6-OIDC 授权流程类型

OpenID Connect&#xff08;OIDC&#xff09;支持三种主要的授权流程&#xff08;Authorization Flow&#xff09;&#xff0c;分别是授权码流程&#xff08;Authorization Code Flow&#xff09;、隐式流程&#xff08;Implicit Flow&#xff09;和混合流程&#xff08;Hybrid…