模块一:登录模块

模块一:登录模块

发送验证码

Controller层

    /*** 发送手机验证码*/@PostMapping("code")public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {return userService.sendCode(phone, session);}

Service接口

public interface IUserService extends IService<User> {Result sendCode(String phone, HttpSession session);
}

**Service接口实现类 **

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result sendCode(String phone, HttpSession session) {//1.校验手机号if (RegexUtils.isPhoneInvalid(phone)){//2.如果不符合,返回错误信息return Result.fail("手机号格式错误!");}//3.符合生成验证码String code = RandomUtil.randomNumbers(6);//4.保存到redis中	login:codestringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);//5.发送验证码log.debug("发送短信验证码成功,验证码:{}", code);//6.返回okreturn Result.ok();}

短信验证登录、注册

Controller层

/*** 登录功能* @param loginForm 登录参数,包含手机号、验证码;或者手机号、密码*/@PostMapping("/login")public Result login(@RequestBody LoginFormDTO loginForm, HttpSession session){return userService.login(loginForm, session);}

Service接口

public interface IUserService extends IService<User> {Result login(LoginFormDTO loginForm, HttpSession session);
}

Service接口实现类

@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic Result login(LoginFormDTO loginForm, HttpSession session) {//1.校验手机号String phone = loginForm.getPhone();if(RegexUtils.isPhoneInvalid(phone)){//2.如果不符合,返回错误信息return Result.fail("手机号格式错误!");}//3.从redis中获取验证码并且校验String cacheCode = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);String code = loginForm.getCode();if(cacheCode == null || !cacheCode.equals(code)){return Result.fail("验证码错误");}//3.一致,根据手机号查询用户  MyBatisPlus实现单表查询(要看一下)User user = query().eq("phone", phone).one();//4.判断用户是否存在if(user == null){user = createUserWithPhone(phone);}//5.判断用户是否存在if (user == null) {//6.创建用户保存session.setAttribute("user", user);}//7.1随机生成token作为登录令牌String token = UUID.randomUUID().toString(true);//7.2将User对象转为Hash存储UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),		//处理非String类型数据CopyOptions.create().setIgnoreNullValue(true).setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));//7.3存储String tokenKey = LOGIN_USER_KEY + token;stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);//设置token有效期stringRedisTemplate.expire(LOGIN_USER_KEY, LOGIN_USER_TTL, TimeUnit.MINUTES);return Result.ok(token);}private User createUserWithPhone(String phone) {User user = new User();user.setPhone(phone);user.setNickName(USER_NICK_NAME_PREFIX + RandomUtil.randomString(10));save(user);return user;}
}

拦截器

拦截器(2个)注册部分

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//登录拦截器registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/code","/user/login","/blog/hot","/shop/**","/shop-type/**","/upload/**","/voucher/**").order(1);//token刷新拦截器,设置为优先拦截registry.addInterceptor(new RefreshTokenInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);}
}

登录部分-拦截器

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.判断是否需要拦截(TreadLocal中是否有用户)if(UserHolder.getUser() == null){//没有,需要拦截,设置状态码response.setStatus(401);//拦截return false;}//有用户,则放行return true;}
}

刷新token-拦截器

public class RefreshTokenInterceptor implements HandlerInterceptor {/*** 注意此处只能使用构造函数的方式进行注入* LoginInterceptor类的对象是手动new出来的* spring创建的对象可以帮助依赖注入,自己手动创建的对象没人帮你依赖注入*/private StringRedisTemplate stringRedisTemplate;public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求头中的tokenString token = request.getHeader("authorization");if(StrUtil.isBlank(token)){return true;}//2.基于token获取redis中的用户String key = RedisConstants.LOGIN_USER_KEY + token;Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(key);//3.判断用户是否存在if (userMap.isEmpty()){return true;}//5.将查询到的hash数据转为UserDTO对象UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//6.存在,保存用户信息到TreadLocal中UserHolder.saveUser(userDTO);//7.刷新token有效期stringRedisTemplate.expire(key, RedisConstants.LOGIN_USER_TTL, TimeUnit.MINUTES);//8.放行return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {UserHolder.removeUser();}
}

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

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

相关文章

PBC密码库安装及使用教程

文章目录 1.PBC库介绍2.PBC库安装3.PBC库使用4.相关API4.1 配对的初始化和释放4.2 元素的初始化和释放4.3 元素的赋值4.4 哈希4.5 元素的常用运算4.6 元素的幂运算4.7 元素的比较4.8 从群中随机选取一个元素&#xff08;常用&#xff09;4.9 配对的运算4.10 小结 5.Some exampl…

游戏心理学Day17

游戏评选中的心理因素 心理学博士杰米马迪根提出了影响年度最佳游戏评选的五大心理因素&#xff0c;这对参赛者和评委都颇具意义 认知偏差 许多年度游戏评选&#xff0c;比如最佳叉叉类游戏&#xff0c;最后总会有两个竞争者打成平局&#xff0c;这是游戏评审过程就变成了一…

代码随想录算法训练营第39天|● 62.不同路径 ●63. 不同路径 II

不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路径。 2.确定递推公式 …

RocketMQ源码学习笔记:NameServer启动流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、NameServer启动流程2.1、总结2.2、NamesrvController2.2.1、主要职责2.2.2、关键的成员变量2.2.3、核心代码2.2.4、值得注意的点 1、Overview NameServer主要就做三件事 Nam…

vue3的基本使用方法

【 vue3实例 】 【 0 】对象、方法和属性 对象&#xff08;Object&#xff09;&#xff1a; 对象是编程中的一个数据结构&#xff0c;它可以包含多种数据类型&#xff0c;包括数字、字符串、布尔值、数组、其他对象等。对象通常由一系列属性和方法组成。在面向对象编程&…

超高清图像生成新SOTA!清华唐杰教授团队提出Inf-DiT:生成4096图像比UNet节省5倍内存。

清华大学唐杰教授团队最近在生成超高清图像方面的新工作&#xff1a;Inf-DiT&#xff0c;通过提出一种单向块注意力机制&#xff0c;能够在推理过程中自适应调整内存开销并处理全局依赖关系。基于此模块&#xff0c;该模型采用了 DiT 结构进行上采样&#xff0c;并开发了一种能…

高考专业抉择计算机专业热度不减,兴趣、实力与挑战并存。

作为一名即将步入大学校门的高考生&#xff0c;我对于计算机相关专业是否仍是热门选择感到困惑。在过去几年里&#xff0c;计算机科学与技术、人工智能、网络安全、软件工程等专业一直备受追捧&#xff0c;吸引了无数学生。然而&#xff0c;随着市场竞争加剧和市场饱和度提高&a…

一种革命性的速度检测算法

YOLO&#xff1a;一种革命性的速度检测算法 一、引言 在当今的计算机视觉领域&#xff0c;目标检测是一个至关重要的研究方向。传统的目标检测方法&#xff0c;如滑动窗口和区域建议网络&#xff08;Region Proposal Network, RPN&#xff09;&#xff0c;虽然取得了一定的成…

【Linux】进程_8

文章目录 五、进程10. 进程等待阻塞等待和非阻塞等待 11. 进程程序替换 未完待续 五、进程 10. 进程等待 上一篇我们知道了 wait 和 waitpid 函数都有一个 status 参数&#xff0c;这个参数是什么呢&#xff1f;这个参数其实就是进程的返回结果&#xff0c;当子进程结束的时候…

MySQL-----JOIN语句之内连接

在我们使用MySQL进行项目的开发过程中&#xff0c;仅仅对一张表进行操作是远远不够的&#xff0c;真正的应用中经常需要从多个数据表中读取数据。我们在使用的过程中&#xff0c;尝尝通过 SELECT, UPDATE 和 DELETE 语句配合使用 JOIN 来联合多表查询。 JOIN 分类 INNER JOIN…

adversarially有这个单词吗

“Adversarially” 是一个存在的单词&#xff0c;尤其在机器学习和计算机安全领域中常用。它的词根是“adversarial”&#xff0c;表示对抗的、敌对的。因此&#xff0c;“adversarially”意为“以对抗性方式”。 词义和用法 Adversarial: 形容词&#xff0c;表示对抗的&…

鸿蒙开发电话服务:【@ohos.telephony.data (蜂窝数据)】

蜂窝数据 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import data from ohos.telephony.data;data.getDefaultCellularDataSlotId getDefaultCellularDataSlotId(callback: Async…

【5.x】ELK日志分析、集群部署

ELK日志分析 一、ELK概述 1、ELK简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将ElasticSearch、Logstash和Kiabana三个开源工具配合使用&#xff0c;完成更强大的用户对日志的查询、排序、统计需求。 一个完整的集中式日志系统&#xff0c;需要包含以下几个主…

中国星网时空信息集团春招Offer面经

本文介绍2024届春招中&#xff0c;中国卫星网络集团有限公司下属中国时空信息集团有限公司中&#xff0c;业务助理岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国卫星网络集团有限公司下属中国时空信息集团有限公司中的业务助理岗位&#xff0c;所属部门为运营中心…

基于jeecgboot-vue3的Flowable流程-所有任务

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 这个部分主要讲所有任务的功能 1、主要列表界面如下&#xff1a; <template><div class"p-2"><!--查询区域--><div class"jeecg-basic-table-form-…

艾伦脑图谱(Allen Brain Atlas)

文章目录 一、艾伦研究所&#xff08;Allen Institute&#xff09;1.1、艾伦脑图谱&#xff08;Allen Brain Map&#xff09;1.1.1、艾伦&#xff08;小鼠大脑&#xff09;通用坐标框架&#xff08;Allen Mouse Brain Common Coordinate Framework&#xff0c;CCFv3&#xff09…

Elasticsearch-使用Logstash同步Mysql

1.安装logstash es服务器版本必须和logstash版本一致 7.9.2 在/usr/local/src/下新建logstash文件夹&#xff0c;解压 下载logstash后查看是否安装成功&#xff0c;在logstash的bin目录下输入指令&#xff1a; ./logstash -e input { stdin { } } output { stdout {} }2.my…

WHAT - React 学习系列(二)

目录 一、官方介绍二、框架具体对比1. Next.js(Pages Router)2. Remix3. Gatsby4. Expo&#xff08;用于原生应用&#xff09;5. Next.js(App Router)Next.js App Router主要特性与 Pages Router 的对比 具体使用示例创建 App Router 项目目录结构示例示例代码 总结 这一篇主要…

文生视频AI工具汇总推荐

目录 Runway Gen-2 Pictory Pika Sora by OpenAI Clipchamp Etna 百度智能云 阿里云视频智能 完整使用报告 在当前的AI技术领域&#xff0c;视频生成工具的发展迅速&#xff0c;为用户提供了从文本到视频的多样化生成方式。以下是一些值得推荐的文生视频AI工具&#x…

NAND闪存市场彻底复苏

在全球内存市场逐渐走出阴霾、迎来复苏曙光之际&#xff0c;日本存储巨头铠侠&#xff08;Kioxia&#xff09;凭借敏锐的市场洞察力和及时的战略调整&#xff0c;成功实现了从生产紧缩到全面复苏的华丽转身。这一转变不仅彰显了企业在逆境中的生存智慧&#xff0c;也为全球半导…