抽象版忘记密码模板0.1版本

背景:用户密码忘了,无法登录,怎么办!急!急!急!

前置工作——Srpingboot3-maven项目,核心框架如下

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.3</version><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.32</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

与数据库连接的实体类

@Data
//user用户实体类
public class userEntity {private int id;private String username;//用户private String password;//密码private String nickname;//昵称private String email;//邮箱private String userPic;//头像private LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间
}

响应内容实体类

@Data
//json格式实体类
public class Result<T> {private Integer code;//0成功,1失败private boolean success;private T message;public Result(Integer code, boolean success, T message) {this.code = code;this.success = success;this.message = message;}public static <T> Result<T> success(){return new Result<>(0,true,null);}public static <T> Result<T> success(T data){return new Result<>(0,true,data);}public static <T> Result<T> error(T message){return new Result<>(1,false,message);}
}
spring:datasource:url: jdbc:mysql://localhost:3306/表?useUnicode=true&characterEncoding=utf-8username: 数据库用户password: 密码driver-class-name: com.mysql.cj.jdbc.Driver
#  邮箱
#  smtp服务器主机
#  端口号
#  邮箱登录账号
#  邮箱授权码mail:host: smtp.163.comport: 25username: 自己的邮箱password: 这个密码之前的文章有
#  redis
#  数据库
#  主机
#  端口号data:redis:database: 0host: 127.0.0.1port: 6379server:port: 1027

http://t.csdnimg.cn/vLlKW邮箱授权码教程

第一种方法:麻烦热心的管理员手动查看用户密码

第二种方法:实行一个可重复使用的函数,用来处理用户密码忘记的情况

这两种方法,我们都去尝试一下

第一种方法:

第一步:打开咱们的数据库可视化工具!(选择自己习惯的可视化工具)

第二步:新建查询

第三步:实现查询功能的SQL语句

第四步:万能的回车键!

一图流:

总流程:

我们通过一图流,和流程图可以了解到

这是一个十分简单重复的行为,你甚至不可能找出多余的流程

其次还有局限性,那就是用户都有记密码的习惯用户量较少

java,c++,js,go,他们都具有一个统一的特性:顾客就是上帝,钱是解决问题的副产品

不管是什么语言,想要获利的首要因素就是用户需求!

用户有找回密码的需求,那么我们想获利就要实现他的需求,一个可以,两个可以,人一多,人只有24小时,总不可能24小时全程做这个吧!当然可以,短期可以,长期呢?

不是我死,就是用户死!

这还是不考虑加密的理论情况,如果是加密,数据库存的加密密码,那只能把用户刀了!

第二种方法:实行一个可重复使用的函数,用来处理用户密码忘记的情况

将采用三层架构来完成该功能,什么是三层架构,如图

观看提示,顺序为由左到右

http://t.csdnimg.cn/ovaxn邮箱发送

有些网页会通过一个与之前密码相同的操作(目前不涉及)

从上面的流程,我们可以知道需要的参数

第一个是账号,第二个是邮箱,第三个验证码,第四个密码,第五个session(里面没有啊,其实这个是发送验证码里的)

controller类

//密码找回@PostMapping("recovery")public Result<String> updateUser(@RequestParam("username") String username,@RequestParam("email") String email,@RequestParam("code") String code,@RequestParam("password") String password,HttpSession session){return Result.success("修改成功!");}

server业务接口


public interface userService{//发送emailString sendValidateEmail(String email,String session);//注册用户String addValidateUser(String username,String password,String email,String code,String session);//密码找回String recoveryPassword(String username,String email,String code,String password,String session);
}

impl实现业务层

@Service
public class userServiceImpl implements userService {@Overridepublic String recoveryPassword(String username, String email, String code, String password, String session) {return null;}
}

mapper层

@Mapper
public interface userMapping {//获取数据@Select("select * from romachen.user where username = #{message} OR email = #{message}")userEntity userByAdmitOREmail(String message);//注册@Insert("insert into romachen.user (username, password, email, create_time, update_time) values (#{username},#{password},#{email},now(),now())")int addUser(String username,String password,String email);//更新密码@Update("update romachen.user set password = #{password} ,update_time = now() where username = #{username}")int upDatePassword(String password,String username);
}

基本内容已经完成,我们从控制类开始写

控制是不包含业务逻辑的,只需要完成简单的真假判断即可

    @ResourceuserService service;//密码找回@PostMapping("recovery")public Result<String> updateUser(@RequestParam("username") String username,@RequestParam("email") String email,@RequestParam("code") String code,@RequestParam("password") String password,HttpSession session){if (service.recoveryPassword(username, email, code, password, session.getId()) != null) {return Result.success("修改成功!");}return Result.error("修改失败");}

那么开始写业务层:

@Overridepublic String recoveryPassword(String username, String email, String code, String password, String session) {//对应我们发送邮件存入redis的keyString key = "email:" + session + ":" + email;//使用映射,查看数据库中对应的usernameuserEntity userEntity = mapping.userByAdmitOREmail(username);if (userEntity == null){return "该账号不存在,请您重新输入账号";}//账号为真,那么我们把账号对应的email与用户输入的email进行一个判断if (Objects.equals(userEntity.getEmail(),email)){//判断为真,我们将判断redis是否具有key,if (Boolean.TRUE.equals(template.hasKey(key))){//获取redis中的keyString s = template.opsForValue().get(key);//将key与用户输入的code判断if (Objects.equals(s,code)){String encode = new BCryptPasswordEncoder().encode(password);if (mapping.upDatePassword(encode, username)>0)return null;}else {//验证码错误return "验证码错误,请重试";}}else {//没有keyreturn "请发送邮箱";}} else {//数据库对应的邮箱与用户输入的不同return "邮箱错误,请重新输入邮箱";}return "内部问题,请联系管理员";}

然后我们的控制为了更好的配合实现层,进行一个优化

//密码找回
@PostMapping("/recovery")
public Result<String> updateUser(@RequestParam("username") String username,@RequestParam("email") String email,@RequestParam("code") String code,@RequestParam("password") String password,HttpSession session){String s = service.recoveryPassword(username, email, code, password, session.getId());if (s == null) {return Result.success("修改成功!");}return Result.error(s);
}

接口完成了,测试一下

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

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

相关文章

Redis核心数据结构之字典(二)

字典 解决键冲突 当有两个或以上数量的键被分配到了一个哈希表数组的同一个索引上面&#xff0c;我们称这些键发生了冲突(collision)。 Redis的哈希表使用链地址法(separate chaining)来解决键冲突&#xff0c;每个哈希表节点都有一个next指针&#xff0c;多个哈希表节点可以…

数据库原理实验课(1)

目录 实验内容 安装头歌中的相关内容 具体过程 完结撒花~ 我也是第一次接触oracle的相关软件和操作&#xff0c;所以是一次傻瓜式教学记录 实验内容 安装头歌中的相关内容 具体过程 这是我在百度网盘中下载解压出来的oracle文件夹内的全部内容&#xff08;可能有因为安装完…

CodeSys通过C函数接口调用Qt

建议先查看之前的文章【CodeSys中调用C语言写的动态库】&#xff0c;了解如何创建一个能够被codesys调用的动态库。 假如想要在函数中使用Qt或者第三方库&#xff08;比如opencv等&#xff09;&#xff0c;可以在其自动生成的makefile文件中设置好相应的参数。 比如我这里就是…

2024037期传足14场胜负前瞻

2024037期售止时间为3月9日&#xff08;周六&#xff09;20点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率4场&#xff0c;1.5-2.0赔率5场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等。以下为基础盘前瞻&#xff0c;大家可根据自身…

力扣刷题Days13-101对称二叉树(js)

目录 1,题目 2&#xff0c;代码 2.1递归思想 2.2队列--迭代思想 3&#xff0c;学习与总结 1,题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 2&#xff0c;代码 2.1递归思想 return dfs(left.left, right.right) && dfs(left.right, right.l…

【力扣每日一题】力扣232用栈实现队列

题目来源 力扣232用栈实现队列 题目概述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的…

IDS入侵检测知识整理及lDS入侵检查表

【IDS入侵检测知识整理及lDS入侵检查表】 1. 网络入侵检测IDS概念 2. IDS分类 3. IDS的工作原理 4. IDS在网络中的部署 5. 入侵检查表 项目建设全套资料获取通道&#xff1a;软件开发全套资料_数字中台建设指南-CSDN博客

echarts中toolbox 中文乱码问题

问题描述 本地引用的echarts源文件&#xff0c;页面其他部分编码显示正常&#xff0c;唯独toolbox鼠标悬停在上面时提示信息显示乱码。 如图所示&#xff1a; 尝试过的方法 使用sublime text 3&#xff0c;notepad&#xff0c;记事本更改文件编码为utf-8引入时&#xff0c;在sc…

办公电脑换成MacBookPro半年之后……

小白是从2008年开始接触电脑的&#xff0c;当时朋友给我注册的第一个QQ账号是2008年4月。 从此&#xff0c;小白一直认为电脑全部都是Windows系统。直到上大学那年&#xff0c;看到了外教老师的MacBookPro…… 折腾电脑的开始居然是起源于诺基亚手机&#xff0c;给半智能S40的…

程序员有哪些证书值得考?

证书可以作为第三方机构对于程序员特定技能或知识掌握程度的认可&#xff0c;在求职市场上&#xff0c;一些公司尤其是大型企事业单位或者政府项目可能更看重证书作为衡量应聘者专业能力的标准之一。备考证书的过程&#xff0c;也可以促使程序员系统地学习和巩固相关知识&#…

力扣hot100:438.找到字符串中所有字母异位词(滑动窗口)

26个字符&#xff0c;我复制怎么了&#xff1f;26个字符我比较个数怎么了&#xff1f; 顶多时间复杂度*26 本题用固定窗口大小的滑动窗口每次比较包含26个元素的数组次数&#xff0c;最容易写。 动态窗口大小哈希表存数值&#xff08;双指针差值&#xff09;难想难写。 一、动态…

微服务定时执行任务

需要的注解 Configuration //1.主要用于标记配置类&#xff0c;兼备Component的效果。 EnableScheduling // 2.开启定时任务 Scheduled(fixedRate 3000000) 定时 30分钟 package com.czxy.conllonter;import com.baomidou.mybatisplus.core.conditions.query.QueryWrap…

基于模拟退火算法(SA)的TSP(Python实现)

本篇文章是博主在最化优学习、人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在最优化算…

计算机基础专升本笔记-汇总笔记(四)常用英文单词及缩写

计算机基础专升本笔记-汇总笔记&#xff08;四&#xff09;常用英文单词及缩写 一、信息技术与计算机文化 单词/缩写词含义ENIAC第一台数字电子计算机&#xff08;1946&#xff09;EDSAC第一台存储程序工作原理的二进制计算机PC个人计算机CAD计算机辅助设计CAM计算机辅助制造…

希腊证券交易所ATHEX计划在Sui上部署融资功能

希腊证券交易所ATHEX计划将其电子订单簿构建&#xff08;Electronic Book Building &#xff0c;EBB&#xff09;功能部署到Sui上&#xff0c;他们是第一个与区块链公司合作开发此技术的证券交易所。其背后的雅典交易所集团Athens Exchange Group将与Sui的开发公司Mysten Labs合…

题目 1892: 蓝桥杯-P0102

题目描述: 用户输入三个字符&#xff0c;每个字符取值范围是0-9&#xff0c;A-F。然后程序会把这三个字符转化为相应的十六进制整数&#xff0c;并分别以十六进制&#xff0c;十进制&#xff0c;八进制输出&#xff0c;十六进制表示成3位&#xff0c;八进制表示成4位&#xff…

一键转发朋友圈!微信快速营销推广必备法宝!

在这个“得私域者得天下”的互联网时代&#xff0c;如何能够在微信上进行快速、高效的营销推广成为了摆在许多人面前的一道难题。 幸运的是&#xff0c;随着微信管理系统的出现&#xff0c;一键转发朋友圈的快速营销推广法宝已经变得触手可及。 首先&#xff0c;微信管理系统…

音视频开发基本概念

基本概念 码率&#xff08;Bitrate&#xff09;&#xff1a;码率是指单位时间内传输或处理的数据量&#xff0c;通常以每秒的比特数&#xff08;bps&#xff09;来表示。对于音频和视频&#xff0c;更高的码率通常意味着更高的音视频质量&#xff0c;但也会占用更多的带宽或存储…

QT 解决在线安装版本下载速度(以国内镜像启动安装器的方式)

关于Fiddler输入steam的教程&#xff0c;本人试过&#xff0c;无效略过… 正确方式 具体操作方法&#xff1a; 1.方式一、未安装过QT 下载好安装器之后&#xff0c;在安装器&#xff08;qt-unified-windows-x64-4.6.0-online.exe&#xff09;的文件夹中空白处&#xff0c;按…

pandas日常使用大全

第一部分 数据统计 import numpy as np import pandas as pd 1、创建DataFrame对象 生成50行5列【20,1000&#xff09;之间的随机整数 datanp.random.randint(20,1000,[20,5]) indexrange(1,21) columns[中国,美国,英国,德国,法国] dfpd.DataFrame(datadata,indexindex,col…