一.技术及思路

二.案例编写

  • 配置环境:使用docker新建redis,mysql,rabbitmq的容器

  • MySQL:
  • 启动docker服务
  • systemctl start docker
  • 查看docker服务状态
  • systemctl status docker
  • 查看目录
  • 进入mysql目录下,然后新创建一个容器,熟悉一下docker部署MySQL
  • cd root/mysql/
  • 方式1
  • docker run -id -p 3306:3306 \
    --name=c_mysql2 \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    mysql:5.7
    

  • 方式2
  •  docker run --name=c_mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • 查看容器运行状态
  • docker ps -a
  • 启动c_mysql容器
  • docker start c_mysql
  • 到这一步的时候,出错了,新的MySQL容器和旧的MySQL容器都启动不了了,而且后来将新的容器删除之后,旧的容器依旧启动不了,也不知道啥情况(前面是用第一种方式创建,不行就请教了老师,改成了第二种方式)
  • 然后到用Navicat连接诶数据库
  • 然后现在开始创建项目,配置环境

  • 自动创建springboot项目,导入依赖
  •   <!--整合mybatis-plus--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--加密组件,apache--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.3</version></dependency><!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--jwt--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><!--AMQP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
  • 然后,根据我们的需要,我们现在需要在这个父项目当中,创建两个子模块(注意要创建maven项目,因为springboot项目本身就已经继承了一个父类,那么就会导致我们无法再继承刚刚我们创建的父项目)
  • 在这两个模块当中,一个用来实现发送短消息,登录注册这三个功能,另一个用来实现收验证码的功能
  • 新建模块1:Pubreg,手写启动类,加入核心配置文件,里面增加mq的配置
  • package com.pro;import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
    @MapperScan(value = "com.pro.mapper")
    public class PubRegApp {public static void main(String[] args) {SpringApplication.run(PubRegApp.class,args);}
    }
    
  • #mq
    spring.rabbitmq.host=192.168.8.171
    #通信端口
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=rabbit
    spring.rabbitmq.password=rabbit
    spring.rabbitmq.virtual-host=/
    
  • package com.pro.config;import org.springframework.amqp.core.Queue;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;//标识了下面这个注解,就代表是配置类:相当于以前的applicationContext.xml文件
    @Configuration
    public class PubConfig {@Beanpublic Queue queue(){return new Queue("yzmQueue");}
    }
    
  • 然后在这个模块里面开始写我们的发送验证码和登录业务
    • 思路:业务层,我们需要根据前端传过来的用户名随机生成验证码,将用户名和密码存进reids,并且发送到yzmQueue队列中
    • package com.pro.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
      import com.baomidou.mybatisplus.extension.api.R;
      import com.pro.domain.User;
      import com.pro.mapper.UserMapper;
      import org.springframework.amqp.rabbit.core.RabbitTemplate;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.data.redis.core.RedisTemplate;
      import org.springframework.stereotype.Service;import java.time.Duration;
      import java.util.HashMap;
      import java.util.Map;
      import java.util.Random;@Service
      public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送验证码* @param username*/@Overridepublic void proYzm(String username) {Random random = new Random();int yzm = random.nextInt(9000)+1000;//生成一个1000到10000之间的四位数验证码//用用户名做键,验证码做值,存进Redis,并设置一分钟的存活时间String YZM = String.valueOf(yzm);redisTemplate.opsForValue().set(username,YZM, Duration.ofSeconds(120));//将yzmQueue作为队列名,验证码和手机号的作为消息发送到消息队列当中,前提是我们已经写了配置类,创建了这个队列Map<Object,Object> map = new HashMap();map.put("username",username);map.put("yzm",yzm);rabbitTemplate.convertAndSend("yzmQueue",map);}/*** 验证是否已经发送过验证码* @param username* @return*/public String checkYzm(String username){String redisData = (String) redisTemplate.opsForValue().get(username);return redisData;}@Overridepublic String checkLogin(String username,String yzm) {String redisYzm = (String) redisTemplate.opsForValue().get(username);QueryWrapper queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);//如果用户不存在,注册并判断是否登录成功if(user == null){if(yzm.equals(redisYzm)){User user1 = new User();user1.setUsername(username);userMapper.insert(user1);return "尊贵的"+username+"用户,您已注册并登录成功!";}else {return "验证码错误或已过期!";}}else {//用户存在,直接判断是否可以登录if(redisYzm.equals(yzm)){return "尊贵的"+username+"用户,欢迎回来!";}else {return "验证码错误或已过期!";}}}
      }
      
      package com.pro.controller;import com.pro.service.UserService;
      import com.pro.util.R;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;@RestController
      public class UserController {@Autowiredprivate UserService userService;/*** 发验证码* @param username* @return*/@PostMapping("/proYzm")public R proYzm (String username){String checkYzm = userService.checkYzm(username);if(checkYzm == null){userService.proYzm(username);return new R(200,"验证码发送成功!");}return new R(300,"请两分钟之后再发验证码!");}/*** 登录判断* @param username* @param yzm* @return*/@PostMapping("/checkLogin")public String checkLogin(String username,String yzm){String s = userService.checkLogin(username, yzm);return s;}
      }
      
    • 效果:
    • Redis里面可以看到信息只能存活我们设置的60秒
  • 测试好发送验证码,我们现在来写接收验证码

  • 首先建一个模块conReg,手写启动类,加入核心配置文件,里面增加mq的配置
  • 写一个监听类来监听队列当中的验证码消息,模拟接收验证码
  • package com.pro.listener;import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.stereotype.Component;import java.util.Map;@Component
    public class SpringRabbitListener {/*  @RabbitListener(queues = "java")public void listenerQueue(String msg){System.out.println("消费者接受到了消息:"+msg);}*/@RabbitListener(queues = "yzmQueue")public void listenerWorkQueue1(Map map)throws Exception{System.out.println("【验证密码】您的验证码为:"+map.get("yzm")+"。尊敬的"+map.get("username")+"客户,以上验证密码2分钟内有效,请勿泄露或转发他人。【湖北移动 移动认证】");}}
    
  • 然后如果是已注册用户,登录会显示欢迎回来

  • 验证码错误或者过期,就会提示验证码过期或错误,这里我没有设置具体是用户名错误还是验证码错误了。

  • 遇到的问题
    • 数据库ID没有设自动递增,插入user的时候,用null去调用get方法
  • 后续需要改进:加入token,未登录不能操作,前端页面实现。

手机号发验证码实现用户注册登录相关推荐

  1. C语言用户注册登录管理系统_JavaFX+SpringBoot+验证码功能的小型薪酬管理系统

    2020.07.22更新 1 概述 1.1 简介 一个简单的小型薪酬管理系统,前端JavaFX+后端Spring Boot,功能倒没多少,主要精力放在了UI和前端的一些逻辑上面,后端其实做得很简单. ...

  2. 微信小程序---实现手机号发送验证码登录

    1.前端页面wxml <!--pages/logins/logins.wxml--> <view class="container"><view cl ...

  3. 【认证服务】验证码、社交登录、分布式session、单点登录

    [认证服务]验证码.社交登录.分布式session.单点登录 目录 [认证服务]验证码.社交登录.分布式session.单点登录 认证服务 一.gulimall-auth-server 二.验证码注册 ...

  4. 2018最新版 手机号、验证码正则表达式 jq + 小程序

    HTML: <!-- 表单 --> <input class="weui-input" id="tel" type="tel&quo ...

  5. mysql查询使用qq邮箱注册_Spring Boot实现qq邮箱验证码注册和登录验证功能

    1.登录注册思路 这是一个使用spring boot做的一个qq邮箱注册和登录的项目. 没写前端页面,使用postman测试.有截图详细. 1.1.思路 注册:通过输入的邮箱发送验证码,检验前端传来的 ...

  6. 社交项目实战第一天(短信验证码实现用户登录)

    项目实战 <社交项目> 1.功能介绍 一乐交友是一个陌生人的在线交友平台,在该平台中可以搜索附近的人,查看好友动态,平台还会通过大数据计算进行智能推荐,通过智能推荐可以找到更加匹配的好友, ...

  7. 手机短信验证码一键注册登录功能开发 1

    1. 首先根据业务分析, 先要在前端填写我们的手机号, 发送短信验证码给我们的用户 对于我们后端来说, 发送验证码就是我们要开发的接口, 手机号就是我们传入的参数,然后就可以编写相应的代码了 @Api ...

  8. Java开发:实现用户注册登录的功能

    一.前言 在Java开发过程中,实现用户的注册功能是最基本的,用户通过手机号或者邮箱作为注册账号也是非常常见的操作方式,不管是通过手机号注册或者邮箱注册,原理都差不多,那么本文就来分享一下在Java开 ...

  9. 手机短信验证码一键注册登录功能开发 2

    1. 上一篇我们开发好了 短信验证码的发送功能, 接下来开发 我们的 一键登录注册功能 2. 有前端的视图我们可以看到, 传入的参数为手机号和验证码,我们用BO对其进行统一的封装,同时使用valid ...

最新文章

  1. C++ boost库安装
  2. 人工智能助力北京冬奥会
  3. C# 中奇妙的函数–6. 五个序列聚合运算(Sum, Average, Min, Max,Aggregate)
  4. tableau必知必会之妙用 Lookup 函数同时跨行跨列取数
  5. html万年历闹钟怎么取消,万年历如何取消整点报时,他上面有四个键,分...
  6. 使用a标签调用手机系统的一些小技巧(打电话、发短信)
  7. java实现人脸识别源码【含测试效果图】——实体类(Users)
  8. k8s secret使用_Java Secret:使用枚举构建状态机
  9. 【转】ArcGIS Server安装
  10. Vsftp在Ubuntu的安装与配置
  11. sybase_isql命令
  12. 简述TCP/IP参考模型
  13. 漏洞扫描工具AppScan下载网盘
  14. 2021全球Top 1000计算机科学家h指数发布,中国53人上榜!Bengio总榜第二,韩家炜居华人首位...
  15. FPGA实战篇——【2】按键控制LED灯闪烁
  16. 推荐系统多场景联合建模经验
  17. 关于配置tft液晶屏时,屏幕不显示遇到的问题
  18. 输入一个字符串,逆序并输出
  19. trinity运行原理及常见报错(二)
  20. 2022-2028全球小型建筑设备行业调研及趋势分析报告

热门文章

  1. 【报告分享】2020年中国新白领消费行为研究报告-艾瑞咨询(附下载)
  2. 写在2020年的伊始
  3. o.e.p.c.mqttv3.internal.ClientState - 445: Timed out as no activity
  4. 网络投票平台方案微信里做投票的小程序网络投票工具
  5. org.eclipse.ui.part.FileEditorInput cannot be cast to com.genuitec.eclipse.code.ui.welcome.editors.C
  6. 合肥计算机职业技术学校,合肥科技职业技术学校官网
  7. win7网络中能看到计算机但无法连接,为什么win7电脑的网络连接正常,但是却无法打开网页?...
  8. schedule setting for build periodically in hudson
  9. 冲杀职场的10只魔戒
  10. 开发问题记录(这部分还是比较零碎)