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

有谁知道网站优化怎么做网络推广营销技巧

有谁知道网站优化怎么做,网络推广营销技巧,色一把做最好的看片网站,凡客诚品还经营吗⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途 目录 写在前面 上文衔接 内容简介 功能分析 短信验证登录实现 1.创建交互对象 用户短信登录/注册DTO 创建用户登录VO…

 

⛰️个人主页:     蒾酒

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

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


目录

写在前面

上文衔接

内容简介

功能分析

短信验证登录实现

1.创建交互对象

用户短信登录/注册DTO

创建用户登录VO

2.创建自定义业务异常

创建验证码错误异常

创建用户被封禁异常

 创建用户注册失败异常

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

4.测试接口

调用短信验证码发送接口

调用短信验证登录接口

写在最后


写在前面

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

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

上文衔接

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

spring boot3登录开发-2(2短信验证码接口实现)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/136888851?spm=1001.2014.3001.5501

用户表设计如下:

create table user
(id           bigint auto_increment comment '主键'primary key,user_name    varchar(32)                            null comment '用户昵称',password     varchar(256)                           null comment '密码',user_account varchar(64)                            null comment '账号',user_role    varchar(256) 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 '性别',status       tinyint(1)   default 1                 not null comment '状态:1正常0禁用',phone        varchar(11)                            null comment '手机号'
)comment '用户表';

内容简介

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

功能分析

  • 手机号是新手机号则先注册,注册完执行登录
  • 已经注册过的手机号,直接执行登录

短信验证登录实现

1.创建交互对象

用户短信登录/注册DTO

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;/*** @author mijiupro*/
@Data
public class UserSmsLoginDTO {@NotBlank( message = "手机号不能为空")@Pattern(regexp = "^1[3456789]\\d{9}$", message = "手机号格式不正确")private String phone;//手机号@NotBlank( message = "验证码不能为空")private String captcha;//验证码
}

创建用户登录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.创建自定义业务异常

说白了就是登录代码可能会判断账号是否存在,密码是否正确,当账号不存在或密码错误需要返回对应提示信息,这种类似情况多了你的代码就会很多if-return,代码就会很难看;那么通过自定义异常去到异常处理的方法里面写对应返回提示以及其他逻辑,这样直接抛出对应异常AOP拦截到该异常走对应异常处理逻辑即可。(一句话概括就是:把处理特殊业务异常情况的代码逻辑抽取出来放到别的类里面写,可以使代码更加清晰和可维护)

创建验证码错误异常

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Getter;/*** @author mijiupro*/
@Getter
public class CaptchaErrorException extends RuntimeException {private final ResultEnum resultEnum;//返回提示信息枚举(code,message)public CaptchaErrorException(ResultEnum resultEnum) {this.resultEnum = resultEnum;}
}

创建用户被封禁异常

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Getter;/*** @author mijiupro*/
@Getter
public class AccountForbiddenException extends RuntimeException {private final ResultEnum resultEnum;public AccountForbiddenException(ResultEnum resultEnum) {this.resultEnum = resultEnum;}
}

 创建用户注册失败异常

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Getter;/*** @author mijiupro*/
@Getter
public class AccountRegisterFailException extends RuntimeException {private final ResultEnum resultEnum;//返回提示信息枚举(code,message)public AccountRegisterFailException(ResultEnum resultEnum) {this.resultEnum = resultEnum;}
}

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

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.UserLoginDTO;
import com.mijiu.commom.model.dto.UserSmsLoginDTO;
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;}@Overridepublic UserLoginVO SmsLogin(UserSmsLoginDTO userSmsLoginDTO) {// 校验验证码是否存在HashOperations<String, String, String> hashOps = stringRedisTemplate.opsForHash();String captcha = hashOps.get("login:sms:captcha:" + userSmsLoginDTO.getPhone(), "captcha");if (StringUtils.isEmpty(captcha)) {log.error("手机号 {} 的验证码不存在或已过期", userSmsLoginDTO.getPhone());throw new CaptchaErrorException(ResultEnum.USER_CAPTCHA_NOT_EXIST);}// 查询用户是否已注册User loginUser = new LambdaQueryChainWrapper<>(userMapper).eq(User::getPhone, userSmsLoginDTO.getPhone()).one();// 如果未注册则进行注册if (Objects.isNull(loginUser)) {loginUser = register(userSmsLoginDTO.getPhone());}// 校验验证码是否正确if (!userSmsLoginDTO.getCaptcha().equals(captcha)) {log.error("手机号 {} 的验证码错误", userSmsLoginDTO.getPhone());throw new CaptchaErrorException(ResultEnum.AUTH_CODE_ERROR);}//判断用户是否被禁用if (!loginUser.getStatus()) {throw new AccountForbiddenException(ResultEnum.USER_ACCOUNT_FORBIDDEN);}log.info("手机号 {} 用户登录成功", userSmsLoginDTO.getPhone());return UserLoginVO.builder().token(jwtUtils.generateToken(Map.of("userId", loginUser.getId()), "user")).userName(loginUser.getUserName()).build();}private User register(String phone) {User user = new User();user.setPhone(phone);user.setUserName(phone);user.setStatus(true);if (userMapper.insert(user) < 1) {log.error("手机号 {} 用户注册失败!", phone);throw new AccountRegisterFailException(ResultEnum.USER_REGISTER_FAIL);}log.info("手机号 {} 用户注册成功", phone);return user;}
}

4.测试接口

使用swagger3进行测试

Spring Boot3整合knife4j(swagger3)_springboot3 knife4j-CSDN博客文章浏览阅读2.3k次,点赞39次,收藏54次。Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com)作者的使用的spring boot 3.2.2为当前最新版,所以依赖导入最新的knife4j 4.4.0。3.1 增强模式 | Knife4j (xiaominfo.com)好一个spring boot项目且版本为3X,项目可正常启动。快速开始 | Knife4j (xiaominfo.com)接下来配置以下接口文档的作者等信息。@Tag注解:标记接口类别。_springboot3 knife4jhttps://blog.csdn.net/qq_62262918/article/details/135761392?spm=1001.2014.3001.5502

调用短信验证码发送接口

调用短信验证登录接口

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

写在最后

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

http://www.15wanjia.com/news/7635.html

相关文章:

  • 北京装修公司电话名单湘潭seo快速排名
  • 那里可以做PC28网站的semifinal
  • 乡村网络建设方案浙江seo博客
  • 成都微信微网站建设友情下载网站
  • linux建站和wordpress建站搜索引擎优化方法有哪些
  • 网站开发任职要求济南seo外包服务
  • 香港疫情最新消息今天长春网站seo公司
  • ebay网站做外贸优缺点贵港seo
  • 如何建个人网站教程四年级的简短新闻播报
  • 简单的网站后台管理系统培训学校管理制度大全
  • 企业h5网站建设电话营销外包公司
  • 如何做网站域名解析宁波网络营销公司
  • 网站开发法律百度快速优化软件排名
  • 公司网站建app超级软文
  • 做机网站网店搜索引擎优化的方法
  • 上海市网站建设公司58千度seo
  • 云南网站建设首选才力抚州seo排名
  • 做书评的网站整合营销包括哪些内容
  • 赌博网站做维护犯罪自媒体平台收益排行榜
  • 建设银行网站注册交换链接
  • 建筑工程网站导航河南seo优化
  • 济源网站维护友情链接吧
  • 软件开发公司网站模板seo服务公司怎么收费
  • 网站建设和管理专业好不好江西优化中心
  • 做一套品牌设计多少钱石家庄seo关键词
  • 做网站费谷歌seo关键词排名优化
  • 企业网站托管windows优化大师免费
  • 淘宝运营去哪里学郑州粒米seo顾问
  • 怎么做整人点不完的网站行业网站有哪些平台
  • 大型购物网站建设产品营销策划方案怎么做