整体流程示意图:
- 输入电话号码,点击发送验证码
- 后台接收请求将电话号码和随机生成的验证码保存RabbitMQ和Redis中
- RabbitMQ真实发送短信验证码
- 输入验证码点击注册按钮
- 后台接收请求,判断验证码是否正确,正确将数据保存mysql返回注册成功,不正确返回注册失败
代码地址:
链接:https://pan.baidu.com/s/1raBVa_FL0K1EcCtRhN6xEA
提取码:yyds
这两个模块中代码是新加的
后端代码
user-service1987模块
配置文件
bootstrap.yml
spring:
#配置mysql地址
datasource:
url: jdbc:mysql://localhost:3306/tb_user?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#配置RabbitMQ地址
rabbitmq:
host: 192.168.88.130 # rabbitMQ的ip地址
port: 5672 # 端口
username: root
password: 123456
virtual-host: /
listener:
simple:
prefetch: 1
#配置Redis的地址
redis:
database: 0
host: localhost
port: 6379
jedis:
pool:
max-wait: -1
max-idle: 8
max-active: 8
min-idle: 0
application:
name: userservice
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yaml
server:
port: 9000
mybatis:
type-aliases-package: com.czxy.brand.domain
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
控制器controller
import cn.itcast.domain.User;
import cn.itcast.util.RandomNumberUtils;
import cn.itcast.vo.BaseResult;
import com.czxy.user.service.UserService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @ClassName UserController
* @Description TODO
* @Author Administrator
* @date 2021-11-24 16:27
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 点击发送验证码按钮
* @param phone
* @return
*/
@GetMapping("sendSms")
public BaseResult register(String phone){
String queueName = "sms.queue";
//生成6位数的验证码
String code = RandomNumberUtils.code();//自己写的工具类随机生成6位随机数
//组装数据
String message = phone + ":" + code;
//将电话号码和验证码保存到RabbitMQ中
rabbitTemplate.convertAndSend(queueName,message);
//将电话号码和验证码保存到redis中
redisTemplate.opsForValue().set(phone,code,1, TimeUnit.MINUTES);
return BaseResult.ok("验证码发送成功");
}
/**
* 点击注册按钮将数据保存mysql
* @param user
* @return
*/
@PostMapping("/register")
public BaseResult insertUser(@RequestBody User user){
//获取redis中的验证码
String redisCode = redisTemplate.opsForValue().get(user.getMobile());
if (redisCode==null){
return BaseResult.error("注册失败");
}
if (redisCode.equals(user.getCode())){
user.setNickname(user.getUsername());
Boolean flag = userService.insertUser(user);
if (flag){
return BaseResult.ok("添加成功");
}else{
return BaseResult.error("添加失败");
}
}
return BaseResult.error("注册失败");
}
/**
* 查询所有
* @return
*/
@GetMapping("/selectAll")
public BaseResult selectAll(){
List<User> list = userService.selectAll();
return BaseResult.ok("成功",list);
}
/**
* 根据id查询数据
* @param id
* @return
*/
@GetMapping("/selectById/{id}")
public User findByIdUser(@PathVariable("id") Integer id){
User user = userService.findByIdUser(id);
return user;
}
}
service层代码
import cn.itcast.domain.User;
import com.czxy.user.dao.UserDao;
import com.czxy.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @ClassName UserServiceImpl
* @Description TODO
* @Author Administrator
* @date 2021-11-24 16:28
*/
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List<User> selectAll() {
return userDao.selectAll();
}
@Override
public User findByIdUser(Integer id) {
return userDao.selectByPrimaryKey(id);
}
@Override
public Boolean insertUser(User user) {
return userDao.insertUser(user);
}
}
Dao持久层
import cn.itcast.domain.User;
import org.apache.ibatis.annotations.Insert;
import tk.mybatis.mapper.common.Mapper;
/**
* @ClassName UserDao
* @Description TODO
* @Author Administrator
* @date 2021-11-24 16:28
*/
@org.apache.ibatis.annotations.Mapper
public interface UserDao extends Mapper<User> {
@Insert("insert into `t_user`(id,username,nickname,password,mobile) values(null,#{username},#{nickname},#{password},#{mobile})")
Boolean insertUser(User user);
}
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
/**
* @ClassName UserApplication
* @Description TODO
* @Author Administrator
* @date 2021-11-24 16:46
*/
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
@Bean
public Queue queue(){
return new Queue("sms.queue");
}
}
consumer-consumer1987模块
配置文件
application.yml
server:
port: 20000
spring:
rabbitmq:
host: 192.168.88.130 # rabbitMQ的ip地址
port: 5672 # 端口
username: root
password: 123456
virtual-host: /
短信的代码
发送短信的代码在阿里云上有发送短信的接口直接可以拷贝
消费RabbitMQ中的数据
import com.czxy.utils.SendSmsUtil;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.time.LocalTime;
/**
* @ClassName SpringRabbitConsumer
* @Description TODO
* @Author Administrator
* @date 2021-12-03 15:15
*/
@Component
public class SpringRabbitConsumer {
@RabbitListener(queues = "sms.queue")
public void listenWorkQueue(String msg) throws InterruptedException {
String[] msgs = msg.split(":");
SendSmsUtil.send(msgs[0], msgs[1]);
System.out.println("消费者接收到消息:【" + msgs[0] + ":" + msgs[1] + "】" + LocalTime.now());
}
}
启动器
import org.springframework.amqp.core.Queue;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
/**
* @ClassName ConsumerApplication
* @Description TODO
* @Author Administrator
* @date 2021-12-03 15:06
*/
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean
public Queue queue(){
return new Queue("sms.queue");
}
}