spring boot3登录开发-邮箱登录/注册接口实现

 

⛰️个人主页:     蒾酒

🔥系列专栏:《spring boot实战》

🌊山高路远,行路漫漫,终有归途


目录

写在前面

上文衔接

内容简介 

 功能分析

所需依赖

邮箱验证登录/注册实现

1.创建交互对象 

2.登录注册业务逻辑实现 


最近发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。

    点击跳转到学习网站

写在前面

本文介绍了springboot开发后端服务中,邮箱验证码登录/注册功能的设计与实现,坚持看完相信对你有帮助。

同时欢迎订阅springboot系列专栏,持续分享spring boot的使用经验。

上文衔接

本文衔接上文,可以看一下:

spring boot3登录开发-邮件验证码接口实现-CSDN博客

用户表设计如下:

create table user
(
    id             bigint auto_increment comment '主键'
        primary key,
    user_name      varchar(32)                            null comment '用户昵称',
    password       varchar(255)                           null comment '密码',
    account        varchar(64)                            null comment '账号',
    user_role      varchar(252) default 'user'            null comment '用户角色:user / admin',
    avatar         varchar(1024)                          null comment '头像',
    create_time    datetime     default (now())           null comment '创建时间',
    update_time    datetime     default CURRENT_TIMESTAMP null comment '更新时间',
    is_delete      tinyint(1)   default 0                 null comment '逻辑删除:1删除/0存在',
    gender         tinyint(1)                             null comment '性别',
    user_signature varchar(255)                           null comment '个性签名',
    status         tinyint(1)   default 1                 not null comment '状态:1正常0禁用',
    phone          varchar(11)                            null comment '手机号',
    email          varchar(100)                           null comment '邮箱'
)
    comment '用户表';

内容简介 

上文我们已经实现了邮件验证码的发送接口,本文我们来实现这个邮箱验证登录/注册逻辑。

 功能分析

  • 邮箱未注册过则先注册,注册完执行登录
  • 已经注册过的邮箱,直接执行登录

所需依赖

redis

Spring Boot3整合Redis_springboot3整合redis-CSDN博客

邮箱验证登录/注册实现

1.创建交互对象 

用户登录/注册DTO:

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

/**
 * @author mijiupro
 */
@Data
public class UserEmailLoginDTO {
    @NotBlank(message = "邮箱不能为空")
    @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", message = "邮箱格式不正确")
    private String email;

    @NotBlank( message = "验证码不能为空")
    private String captcha;

}

这里用Lombok的@Data来生成getter和setter。

这里用spring boot参数验证组件来检验参数格式:

spring boot3参数校验基本用法_springboot3使用校验类注解-CSDN博客

 用户登录VO:

import lombok.Builder;
import lombok.Data;

import java.io.Serializable;


/**
 * @author mijiupro
 */
@Data
@Builder
public class UserLoginVO implements Serializable {
    private String token;//令牌
    private String userName;//用户名
    private String avatar;//头像
}

2.登录注册业务逻辑实现 

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.mijiu.commom.enumerate.ResultEnum;
import com.mijiu.commom.exception.*;
import com.mijiu.commom.model.dto.UserEmailLoginDTO;
import com.mijiu.commom.model.vo.UserLoginVO;
import com.mijiu.commom.util.JwtUtils;
import com.mijiu.entity.User;
import com.mijiu.mapper.UserMapper;
import com.mijiu.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;


import java.util.Map;
import java.util.Objects;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author 蒾酒
 * @since 2024-02-03
 */
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    private final UserMapper userMapper;
    private final JwtUtils jwtUtils;
    private final StringRedisTemplate stringRedisTemplate;

    public UserServiceImpl(UserMapper userMapper, JwtUtils jwtUtils, StringRedisTemplate stringRedisTemplate) {
        this.userMapper = userMapper;
        this.jwtUtils = jwtUtils;
        this.stringRedisTemplate = stringRedisTemplate;
    }
    
    @Override
    public UserLoginVO emailLogin(UserEmailLoginDTO userEmailLoginDTO) {
        // 校验验证码是否存在
        HashOperations<String, String, String> hashOps = stringRedisTemplate.opsForHash();
        String captcha = hashOps.get("login:email:captcha:" + userEmailLoginDTO.getEmail(), "captcha");

        if (StringUtils.isEmpty(captcha)) {
            log.error("手机号 {} 的验证码不存在或已过期", userEmailLoginDTO.getEmail());
            throw new CaptchaErrorException(ResultEnum.USER_CAPTCHA_NOT_EXIST);
        }

        // 查询用户是否已注册
        User loginUser = new LambdaQueryChainWrapper<>(userMapper).eq(User::getPhone, userEmailLoginDTO.getEmail()).one();

        // 如果未注册则进行注册
        if (Objects.isNull(loginUser)) {
            loginUser = registerByEmail(userEmailLoginDTO.getEmail());
        }

        // 校验验证码是否正确
        if (!userEmailLoginDTO.getCaptcha().equals(captcha)) {
            log.error("邮箱号 {} 的验证码错误", userEmailLoginDTO.getEmail());
            throw new CaptchaErrorException(ResultEnum.AUTH_CODE_ERROR);
        }
        //判断用户是否被禁用
        if (!loginUser.getStatus()) {
            throw new AccountForbiddenException(ResultEnum.USER_ACCOUNT_FORBIDDEN);
        }
        log.info("手机号 {} 用户登录成功",userEmailLoginDTO.getEmail());

        return UserLoginVO.builder()
                .token(jwtUtils.generateToken(Map.of("userId", loginUser.getId()), "user"))
                .userName(loginUser.getUserName())
                .build();
    }

    
    // 用户邮箱注册
    private User registerByEmail(String email) {
        User user = new User();
        user.setEmail(email);
        user.setUserName(email);
        user.setStatus(true);
        if (userMapper.insert(user) < 1) {
            log.error("邮箱 {} 用户注册失败!", email);
            throw new AccountRegisterFailException(ResultEnum.USER_REGISTER_FAIL);
        }

        log.info("邮箱 {} 用户注册成功", email);

        return user;
    }
}

4.测试接口

使用swagger3进行测试

 Spring Boot3整合knife4j(swagger3)_springboot3 knife4j-CSDN博客

调用邮箱验证码发送接口 

 

调用邮箱验证登录接口

 第一次登录所以也就自动注册成功了。

 

写在最后

springboot实现邮箱验证登录注册到这里就结束了,本文介绍了一种通用的邮箱验证登录实现方式,代码逻辑清晰。任何问题评论区或私信讨论,欢迎指正。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教学类-12-11】20240612通义万相-动物图片连连看(A4一页3套)

背景需求&#xff1a; 前期用midjounery下载了一些动物头饰图片 【教学类-36-02】20230625动物头饰制作1.0&#xff08;midjounery动物简笔画四图&#xff09;一页一种动物_英语头饰动物的制作图片-CSDN博客文章浏览阅读471次。【教学类-36-02】20230625动物头饰制作1.0&…

万界星空科技SMT行业MES系统功能

在现代制造业中&#xff0c;SMT智能车间MES系统是一种全自动化的生产管理系统&#xff0c;用于监控和控制整个SMT生产流程。它通过监控SMT设备的运行状态、实时追踪生产数据&#xff0c;并与其他系统进行实时数据交换&#xff0c;以提高生产效率、降低生产成本。MES系统采用先进…

基于电压矢量变换的锁相环simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于电压矢量变换的锁相环simulink建模与仿真&#xff0c;这个模型的基本构架如下所示&#xff1a; 2.系统仿真结果 由图中锁相结果可以看出&#xff0c;利用新型锁相环技术在…

基于构件开发模型-系统架构师(八)

1、把应用程序中应用最频繁的那部分核心程序作为评价计算机性能的标准程序&#xff0c;称为&#xff08;&#xff09;程序。 A仿真测试 B核心测试 C基准测试 D标准测试 解析&#xff1a; 系统测试最核心的部分内容&#xff0c;基准测试。 2、运用信息技术进行知识的挖掘和…

Go使用https

一、服务端 1. 生成私钥和证书 安装OpenSSL windows安装OpenSSL生成CA证书创建证书 以上两个步骤&#xff0c;参考&#xff1a;Go http2 和 h2c 2. 代码 package mainimport ("log""net/http""time""golang.org/x/net/http2" )co…

笔记 | 软件工程06-2:软件设计-软件体系结构设计

1 软件体系结构的概念 1.1 软件体系结构的设计元素 1.2 不同的抽象层次 1.3 软件体系结构的不同视图 1.3.1 软件体系结构的逻辑视图&#xff1a;包图 1.3.2 软件体系结构的逻辑视图&#xff1a;构件图 1.3.3 软件体系结构的开发视图 1.3.4 软件体系结构的部署视图 1.3.4.1 描述…

【docker】compose 使用 .env 文件

在 Docker Compose 中&#xff0c;你可以使用 .env 文件来定义环境变量&#xff0c;这些变量可以在 docker-compose.yml 文件中被引用。这允许你轻松地管理配置&#xff0c;而不需要硬编码值到你的 Compose 文件中。 以下是如何在 Docker Compose 中使用 .env 文件的步骤&…

【DevOps】 什么是容器 - 一种全新的软件部署方式

目录 引言 一、什么是容器 二、容器的工作原理 三、容器的主要特性 四、容器技术带来的变革 五、容器技术的主要应用场景 六、容器技术的主要挑战 七、容器技术的发展趋势 引言 在过去的几十年里,软件行业经历了飞速的发展。从最初的大型机时代,到后来的个人电脑时代,…

Java面试题--JVM大厂篇之掌握JVM性能优化:选择合适的垃圾回收器

掌握JVM性能优化&#xff1a;选择合适的垃圾回收器 引言: ​  在Java开发中&#xff0c;性能优化往往是提高应用稳定性和用户体验的关键所在。而垃圾回收器的选择和优化&#xff0c;是JVM性能调优的核心环节。如何在众多垃圾回收器中选出适合自己应用需求的那一个&#xff1…

AXI Quad SPI IP核配置详解

AXI Quad SPI IP核&#xff08;Quad Serial Peripheral Interface&#xff09;是一个提供串行接口连接SPI从设备的解决方案&#xff0c;它支持Standard&#xff08;单线路&#xff09;、Dual&#xff08;双线路&#xff09;、Quad&#xff08;四线路&#xff09;模式&#xff0…

luogu-P10570 [JRKSJ R8] 网球

题目传送门&#xff1a; [JRKSJ R8] 网球 - 洛谷https://www.luogu.com.cn/problem/P10570 解题思路 数学问题&#xff0c;暴力这个范围会超时。 首先&#xff0c;找出这两个数的最大公因数&#xff0c;将这两个数分别除以最大公因数&#xff0c;则这两个数互质&#xff0c;判…

启明智显工业级HMI芯片Model3功耗特性分享

前言&#xff1a; 【启明智显】专注于HMI&#xff08;人机交互&#xff09;及AIoT&#xff08;人工智能物联网&#xff09;产品和解决方案的提供商&#xff0c;我们深知彩屏显示方案在现代物联网应用中的重要性。为此&#xff0c;我们一直致力于为客户提供彩屏显示方案相关的技…

2024年6月11日 (周二) 叶子游戏新闻

万能嗅探: 实测 网页打开 某视频号、某音、某红薯、某站&#xff0c;可以做到无水印的视频和封面下载功能哦&#xff0c;具体玩法大家自行发挥吧。 WPS免登录一键修改器: 去除烦人的登录且能正常使用 日本一首部游戏《拼图世界》上架Steam 30年PS名作日本游戏厂商日本一的首部品…

【库】nprogress 顶部进度条

yarn add nprogress router文件 前置路由添加启动 后置路由添加关闭 router.beforeEach((to, from, next) > { NProgress.start() next() }) router.afterEach(() > { NProgress.done() }) App.vue 文件 引入样式 <script setup> import "nprogress/npro…

C#客户端

控件 打开链接 Socket socket; // 打开连接 private void button1_Click(object sender, EventArgs e) {button1.Enabled false;button2.Enabled true;//1 创建socket客户端对象socket new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 2…

r语言数据分析案例25-基于向量自回归模型的标准普尔 500 指数长期预测与机制分析

一、背景介绍 2007 年的全球经济危机深刻改变了世界经济格局&#xff0c;引发了一系列连锁反应&#xff0c;波及各大洲。经济增长停滞不前&#xff0c;甚至在某些情况下出现负增长&#xff0c;给出口导向型发展中国家带来了不确定性。实体经济受到的冲击尤为严重&#xff0c;生…

springboot与flowable(3):启动、审批、各个Service服务

一、启动流程 流程定义与实例的关系类似于Java的类与对象&#xff0c;通过定义的id创建流程实例&#xff0c;编写测试代码&#xff1a; package org.example.flowabledemo2;import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInst…

【渗透测试】|dvwa命令注入乱码问题

法一&#xff1a; 解决方法如下&#xff1a; 1、按住winr&#xff0c;在运行框中输入cmd弹出命令行&#xff0c;在命令行中输入“control intl.cpl” 2、这个命令是使用control命令行工具来打开"区域和语言设置"对话框 3、选中对话框中的管理选项卡 4、可以看到这里…

智能照明雷达传感器成品,办公室、学校人体传感器开启空间感知新篇章,灯光、空调联动

在科技飞速发展的今天&#xff0c;智能化已成为我们生活中不可或缺的一部分。从智能手机到智能家居&#xff0c;智能技术正逐渐渗透到我们生活的每一个角落。 雷达传感器成品正以其独特的技术优势和广泛的应用场景&#xff0c;创新着智能化生活的新潮流。 飞睿智能雷达传感器…

7.数据集处理库Hugging Face Datasets

数据集处理库Hugging Face Datasets Datasets 首先解决数据来源问题 使用 Datasets 下载开源数据集 Datasets.load_dataset 实现原理简介 构造 DatasetBuilder 类的主要配置 BuilderConfig 如果您想向数据集添加额外的属性,例如类别标签。有两种方法来填充BuilderConfig类或其…