用户微服务-用户注册 发送短信验证码

1 需求分析

注册账号,用手机号注册,填写后发送短信验证码,
填写短信验证码正确方可注册成功。

2 实现思路

1)用户微服务生成6位的短信验证码,存入redis (以code_手机号为key),再发送给rabbitmq .
2)短信微服务从rabbitmq中提取消息,调用阿里云通信api发送短信
3)用户注册,从redis提取验证码,与用户在界面上填写的验证码进行比较,只有填写正确才能注册。

3 发送短信验证码

实现思路: 在用户服务编写API ,生成手机验证码,存入Redis并发送到RabbitMQ

(1)rabbitmq中新增队列sms ,用于存储发送的短信

在这里插入图片描述

(2)changgou_service_user的pom.xml引入依赖

  <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId></dependency>

(3)修改changgou_service_user的application.yml,在spring节点下添加配置

server:port: 9008
spring:application:name: userdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.200.128:3306/changgou_user?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: adminmain:allow-bean-definition-overriding: true #当遇到同样名字的时候,是否允许覆盖注册redis:host: 192.168.200.128rabbitmq:host: 192.168.200.128
eureka:client:service-url:defaultZone: http://127.0.0.1:6868/eurekainstance:prefer-ip-address: true
feign:hystrix:enabled: trueclient:config:default:   #配置全局的feign的调用超时时间  如果 有指定的服务配置 默认的配置不会生效connectTimeout: 60000 # 指定的是 消费者 连接服务提供者的连接超时时间 是否能连接  单位是毫秒readTimeout: 20000  # 指定的是调用服务提供者的 服务 的超时时间()  单位是毫秒
#hystrix 配置
hystrix:command:default:execution:timeout:#如果enabled设置为false,则请求超时交给ribbon控制enabled: trueisolation:strategy: SEMAPHOREthread:# 熔断器超时时间,默认:1000/毫秒timeoutInMilliseconds: 20000

(4)在UserService中新增方法定义

在这里插入图片描述

 /*** 发送短信验证码* @param mobile*/public void sendSms(String mobile);/*** 增加* @param user* @param code*/public void register(User user,String code);

(5)UserServiceImpl方法实现

实现逻辑:
1)生成六位随机数验证码
2)以手机号作为key,存入redis
3)将手机号与验证码发送到MQ

   @Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 1)生成六位随机数验证码* 2)以手机号作为key,存入redis* 3)将手机号与验证码发送到MQ* @param mobile*/@Overridepublic void sendSms(String mobile) {//  * 1)生成六位随机数验证码String code = RandomStringUtils.randomNumeric(6);System.out.println("==================code:======="+code);//  * 2)以手机号作为key,存入redisredisTemplate.boundValueOps("Code_"+mobile).set(code,12, TimeUnit.HOURS);//  * 3)将手机号与验证码发送到MQMap info = new HashMap();info.put("mobile",mobile);info.put("code",code);rabbitTemplate.convertAndSend("","sms", JSON.toJSONString(info));}/***1)校验redis中是否存在验证码,用户输入验证码是否与redis中是否一致* 2)根据用户名查询用户,如果不为null,则该用户已注册* 3)填充用户信息并保存* @param user* @param code*/@Overridepublic void register(User user, String code) {//1)校验redis中是否存在验证码,用户输入验证码是否与redis中是否一致String redisCode =(String)redisTemplate.boundValueOps("Code_"+user.getPhone()).get();System.out.println("===========redisCode:"+redisCode);//2. 参数校验:redis中的code是否过期,用户输入的验证与redis中的验证码是否一致,当前用户是否已经注册过if (StringUtils.isEmpty(redisCode)){throw new RuntimeException("当前验证码已过期");}if (!redisCode.equals(code)){throw new RuntimeException("输入的验证码有误");}if (StringUtils.isEmpty(user.getUsername())){user.setUsername(user.getPhone());}//* 2)根据用户名查询用户,如果不为null,则该用户已注册User searchUser = new User();searchUser.setUsername(user.getUsername());if (userMapper.selectCount(searchUser)>0){//该用户已经注册过throw  new RuntimeException("当前用户已经注册过");}//3.填充用户的信息user.setCreated(new Date());user.setUpdated(new Date());user.setPoints(0);//积分初始值为0user.setStatus("1");//状态1user.setIsEmailCheck("0");//邮箱认证user.setIsMobileCheck("1");//手机认证String password = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());//密码加密user.setPassword(password);//4.保存用户信息userMapper.insertSelective(user);}

(6)UserController增加方法

 /*** 发送短信* @param mobile* @return*/@RequestMapping("/send_sms")public Result  sendSms(@RequestParam("mobile")   String mobile){userService.sendSms(mobile);return new Result(true,StatusCode.OK,"发送短信成功");}/*** 注册* @param user* @param code* @return*/@PostMapping("/register")public Result register(@RequestBody User user,@RequestParam("code") String code){userService.register(user,code);return new Result(true,StatusCode.OK,"用户注册成功");}

(7)测试

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

jdk 流合并_JDK 12,合并的收集器和命名的挑战

jdk 流合并看来可能是一种新的方法&#xff0c;将可在java.util.streams.Collectors类JDK 12即会&#xff0c;根据新方法的提出了基于Javadoc的文档&#xff0c;“返回一个收藏家是将输入的元素两个规定的收藏家并将其结果与指定的合并功能合并。” 目前 &#xff0c;此新Colle…

MySQL配置变量log-bin,重启数据库服务失败

在配置文件 /etc/my.cnf 添加变量 log-bin&#xff1a; log-bin/var/lib/mysql/mybinlog/mysql-bin重启数据库服务报错&#xff1a; [roothtlwk0001host lib]# systemctl start mysqld.service Job for mysqld.service failed because the control process exited with error…

javafx 调用java_Java,JavaFX的流畅设计风格滑块

javafx 调用javaJMetro的Java&#xff0c;JavaFX主题版本刚刚提高到4.2版。 此版本为Slider控件带来了新样式。 除此之外&#xff0c;您现在还可以看到一个弹出窗口&#xff0c;向您显示滑块的当前值。 新滑块样式 以下是旧的JMetro Slider样式&#xff1a; 滑块OLD JMetro灯…

WebService入门介绍

参考文献&#xff1a; https://blog.csdn.net/cs_hnu_scw/article/details/80181762 创建服务器webService package com.william.TestWebService; import javax.jws.WebService; import javax.xml.ws.Endpoint;WebService public class MyFirstWebService {/*** 定义webservi…

手游建筑美术资源_建筑商和机械手

手游建筑美术资源下面是命名的OOP方法&#xff0c;这我想在我的代码遵循一个简单的原则&#xff1a;这是一个动词 &#xff0c;如果它操纵 &#xff0c;这是一个名词 &#xff0c;如果它的基础之上 。 而已。 两者之间什么都没有。 诸如saveFile()或getTitle()不适合使用&#…

MySQL二进制日志文件的用法_数据恢复

文章目录开启二进制日志功能关闭/打开二进制日志记录刷新二进制日志文件查看二进制日志文件的存储位置利用二进制日志文件恢复数据的本质二进制日志提取/导出到脚本文件中查看当前二进制日志的最后一个位置查看二进制日志文件的内容执行 SQL 脚本文件以恢复数据二进制日志分析指…

启动weblogic需要账号密码问题

<Server is Running in Production Mode and Native Library(terminalio) to read the password securely from commandline is not found.> 解决方法 在weblogic路径下创建 \weblogic11\user_projects\domains\base_domain\servers\AdminServer\security 目录下创建bo…

mysqlbinlog: [ERROR] unknown variable ‘default-character-set=utf8mb4‘

错误提示&#xff1a; [roothtlwk0001host ~]# mysqlbinlog /var/lib/mysql/mybinlog/mysql-bin.000004 mysqlbinlog: [ERROR] unknown variable default-character-setutf8mb4原因&#xff1a; mysqlbinlog 这个工具无法识别 binlog 中的配置中的 default-character-setutf8m…

Mybatis一对一结果映射

目录结构 创建数据库相应的表 一个账户对应一个用户 accout CREATE TABLE account (aid int(11) NOT NULL AUTO_INCREMENT,accountname varchar(20) DEFAULT NULL,money float(10,2) DEFAULT NULL,userId int(11) DEFAULT NULL,PRIMARY KEY (aid),KEY userId (userId),CONSTR…

lambda表达式java_Lambda表达式Java教程

lambda表达式java在本文中&#xff0c;我们提供了全面的Lambda Expressions Java教程。 1. Lambda Expressions Java教程–简介 Lambda表达式被认为是Java 8中引入的最好的功能之一。Lambda表达式被认为是Java进入函数式编程世界的第一步 。 可以将其视为无需类即可创建的函数…

MySQL命令之mysqlhotcopy -- 热备份

文章目录命令介绍命令格式安装 mysqlhotcopy常用选项命令介绍 mysqlhotcopy 只是简单的缓存写入和文件复制的过程&#xff0c;其使用 LOCK TABLES、FLUSH TABLES 和 CP 来进行快速备份,占用资源和备份速度比 mysqldump 快很多很多。特别适合大的数据库&#xff0c;但需要注意的…

trackby_使用trackBy启动流程

trackby仍然沿用我的Corda Services趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引发的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠以前的职位&a…

SQL查询语句的排序

order by column1 asc, column2 desc -- 按column1升序排序&#xff0c;若column1值相同&#xff0c;则按column1降序排序asc&#xff0c;ascend 的缩写&#xff0c;表示正序&#xff0c;即升序&#xff0c;从小到大&#xff0c;可以省略&#xff0c;默认的 desc&#xff0c;de…

SpringBoot创建项目入门案例

目录结构 一、创建SpringBoot项目 1.创建骨架名称 2.给项目命名 3.配置pom.xml文件 4.MySql的驱动包 5.自动生成的pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xs…

apache spark_Apache Spark Job的剖析

apache sparkApache Spark是通用的大规模数据处理框架。 了解spark如何执行作业对于获取大部分作业非常重要。 关于Spark评估范式的简要介绍&#xff1a;Spark使用的是惰性评估范式&#xff0c;在该范式中&#xff0c;Spark应用程序在驱动程序调用“ Action”之前不会执行任何…

MySQL常用权限的解释

文章目录全局管理权限数据库/数据表/数据列权限特别的权限全局管理权限 FILE: 在MySQL服务器上读写文件。 PROCESS: 显示或杀死属于其它用户的服务线程。 RELOAD: 重载访问控制表&#xff0c;刷新日志等。 SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限 ALTER: 修改已…

No identifier specified for entity没有为实体指定标识符

异常 ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘userController’: Injection of resour…

aws jenkins_Jenkins在AWS上(第1部分)

aws jenkins这是我对PEAT UK播客的逐字记录&#xff1a; 你好&#xff0c;再一次到另一个热点。 我叫Peter Pilgrim。 我曾经是DevOps专家&#xff0c;欢迎观看另一集。 这是11 Jenkins n AWS的第一部分&#xff0c;我是一名平台工程师&#xff0c;并且是Java Champion。 在…

SELECT ... FOR UPDATE_手动加行级排他锁_行级写锁_行级独占锁

文章目录介绍加锁情况分析明确指定主键&#xff0c;并且数据真实存在&#xff0c;锁定行明确指定主键&#xff0c;但数据不存在&#xff0c;不加锁主键不明确&#xff0c;锁定整个表无主键&#xff0c;锁定整个表应用场景介绍 1.FOR UPDATE 加的锁是一种行级排他锁&#xff0c…

广义表

广义表(广义表也称为列表&#xff0c;是线性表的一种推广&#xff0c;也是数据元素的有序序列) 一、基础 1.如何设定链表结点?广义表中的数据元素可能为单元素(原子)或子表&#xff0c;由此需要两种结点:一种是表结点&#xff0c;用以表示广义表;一种是单元素结点&#xff0c;…