整体流程示意图:
- 输入电话号码,点击发送验证码
- 后台接收请求将电话号码和随机生成的验证码保存RabbitMQ和Redis中
- RabbitMQ真实发送短信验证码
- 输入验证码点击注册按钮
- 后台接收请求,判断验证码是否正确,正确将数据保存mysql返回注册成功,不正确返回注册失败
代码地址:
链接:https://pan.baidu.com/s/1raBVa_FL0K1EcCtRhN6xEA
提取码:yyds
这两个模块中代码是新加的
- user-service1987模块
- 配置文件
- 控制器controller
- service层代码
- Dao持久层
- consumer-consumer1987模块
- 配置文件
- 短信的代码
- 消费RabbitMQ中的数据
- 启动器
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;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private StringRedisTemplate redisTemplate;
@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("验证码发送成功");
}
@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("注册失败");
}
@GetMapping("/selectAll")
public baseResult selectAll(){
List list = userService.selectAll();
return baseResult.ok("成功",list);
}
@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;
@Service
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
public List 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; @org.apache.ibatis.annotations.Mapper public interface UserDao extends Mapper{ @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;
@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;
@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;
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
@Bean
public Queue queue(){
return new Queue("sms.queue");
}
}



