diff --git a/user-service/src/main/java/org/example/shop/config/RabbitConfig.java b/user-service/src/main/java/org/example/shop/config/RabbitConfig.java index 81daa48..09d83d4 100644 --- a/user-service/src/main/java/org/example/shop/config/RabbitConfig.java +++ b/user-service/src/main/java/org/example/shop/config/RabbitConfig.java @@ -6,7 +6,8 @@ import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; - +// 主要是产生响应的消息队列及交换机 +// 并且将两者绑定器来。 @Configuration public class RabbitConfig { /** diff --git a/user-service/src/main/java/org/example/shop/config/RabbitMQConfig.java b/user-service/src/main/java/org/example/shop/config/RabbitMQConfig.java index 94bffa7..5a9f2de 100644 --- a/user-service/src/main/java/org/example/shop/config/RabbitMQConfig.java +++ b/user-service/src/main/java/org/example/shop/config/RabbitMQConfig.java @@ -1,7 +1,7 @@ package org.example.shop.config; public class RabbitMQConfig { - public static final String RABBITMQ_DEFAULT_TOPIC = "default_message_topic"; - public static final String RABBITMQ_DEFAULT_DIRECT_EXCHANGE = "default_message_exchange"; - public static final String RABBITMQ_DEFAULT_DIRECT_ROUTING = "default_message_routing"; + public static final String RABBITMQ_DEFAULT_TOPIC = "send_email_topic"; + public static final String RABBITMQ_DEFAULT_DIRECT_EXCHANGE = "send_email_exchange"; + public static final String RABBITMQ_DEFAULT_DIRECT_ROUTING = "send_email_routing"; } diff --git a/user-service/src/main/java/org/example/shop/consumer/RabbitMessageConsumer.java b/user-service/src/main/java/org/example/shop/consumer/RabbitMessageConsumer.java index b09ddeb..67c0884 100644 --- a/user-service/src/main/java/org/example/shop/consumer/RabbitMessageConsumer.java +++ b/user-service/src/main/java/org/example/shop/consumer/RabbitMessageConsumer.java @@ -2,19 +2,28 @@ package org.example.shop.consumer; import lombok.extern.slf4j.Slf4j; import org.example.shop.config.RabbitMQConfig; +import org.example.shop.service.MailService; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Map; -@Component -@RabbitListener(queues = RabbitMQConfig.RABBITMQ_DEFAULT_TOPIC) +@Component // 1.让spring管理类 +@RabbitListener(queues = RabbitMQConfig.RABBITMQ_DEFAULT_TOPIC) // 2.设置要订阅的主题 @Slf4j public class RabbitMessageConsumer { - // 绑定处理 + @Resource + private MailService mailService; + + // 3.绑定处理 队列中的消息来了后 的处理方法 + // 注意: 方法的参数 发送的数据类型和此处的参数类型要一致 @RabbitHandler - public void process(Map map) { + public void process(Map map) { log.info("获取到一条消息:" + map.toString()); + // 需要发送验证邮件 + boolean b = mailService.sendVerifyEmail(map.get("email"), map.get("token")); + log.info("发送验证邮件成功了?" + b); } } diff --git a/user-service/src/main/java/org/example/shop/controller/UserController.java b/user-service/src/main/java/org/example/shop/controller/UserController.java index ed3e6ef..db2ad1d 100644 --- a/user-service/src/main/java/org/example/shop/controller/UserController.java +++ b/user-service/src/main/java/org/example/shop/controller/UserController.java @@ -98,12 +98,27 @@ public class UserController { UserInfo userInfo = new UserInfo(); userInfo.setUsername(userReg.getUsername()).setPassword(userReg.getPassword()); userInfo.setStatus(1); - userInfo = userService.save(userInfo); + try{ + userInfo = userService.save(userInfo); + }catch (Exception e){ + e.printStackTrace(); + return res.setCode(1).setMessage(e.getMessage()); + } if (null != userInfo) { userInfo.setPassword(null); } + // 需要发送验证码 ? +// 发送需求到消息队列中 +// 实际token应该随机生成 并且保存到redis或者数据库中 用于下一步的验证 + mailService.sendVerifyEmailMessage(userReg.getUsername(), "xxakjdafjefiuebiuadifareg"); return res.setCode(0).setData(userInfo); } + @RequestMapping("/verify") + public String verify(String token) { + // 原则 应该查询redis或者数据库值类的 判断token是否正确 + // 已经更新用户的状态 + return "success," + token; + } } diff --git a/user-service/src/main/java/org/example/shop/service/MailService.java b/user-service/src/main/java/org/example/shop/service/MailService.java index 2befe7f..02b2200 100644 --- a/user-service/src/main/java/org/example/shop/service/MailService.java +++ b/user-service/src/main/java/org/example/shop/service/MailService.java @@ -1,5 +1,19 @@ package org.example.shop.service; public interface MailService { - boolean sendVerifyCode(String to,String code); + boolean sendVerifyCode(String to, String code); + + /** + * 给指定邮箱发送一个验证链接 + * @param to 邮箱 + * @param token 验证的token + */ + boolean sendVerifyEmail(String to, String token); + + /** + * 将发送邮件的消息发送队列中 + * @param to + * @param token + */ + void sendVerifyEmailMessage(String to,String token); } diff --git a/user-service/src/main/java/org/example/shop/service/impl/MailServiceImpl.java b/user-service/src/main/java/org/example/shop/service/impl/MailServiceImpl.java index 9bce275..96daa45 100644 --- a/user-service/src/main/java/org/example/shop/service/impl/MailServiceImpl.java +++ b/user-service/src/main/java/org/example/shop/service/impl/MailServiceImpl.java @@ -1,6 +1,11 @@ package org.example.shop.service.impl; +import org.example.shop.config.RabbitMQConfig; import org.example.shop.service.MailService; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; +import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.MailException; @@ -8,17 +13,26 @@ import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + @Service public class MailServiceImpl implements MailService { private JavaMailSender javaMailSender; @Value("${spring.mail.from}") private String from; + @Value("${server.port}") + private int port; @Autowired public void setJavaMailSender(JavaMailSender javaMailSender) { this.javaMailSender = javaMailSender; } + @Resource + private RabbitTemplate rabbitTemplate; + @Override public boolean sendVerifyCode(String to, String code) { SimpleMailMessage message = new SimpleMailMessage(); @@ -35,4 +49,46 @@ public class MailServiceImpl implements MailService { } return false; } + + @Override + public boolean sendVerifyEmail(String to, String token) { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(from);//谁发的 + message.setTo(to); //谁要接收 + message.setSubject("验证邮箱 - 如果不是你的操作请忽略");//邮件标题 + message.setText("请点击下面的链接验证您的邮箱\n" + + "http://localhost:" + port + "/user/verify?token=" + token);//邮件内容 + try { + // 发送邮件 + javaMailSender.send(message); + return true; + } catch (MailException e) { + e.printStackTrace(); + } + return false; + } + + public void sendVerifyEmailMessage(String to, String token) { + // 发送的数据 + Map data = new HashMap<>(); + data.put("email", to); + data.put("token", token); + int delay = 10000; + // 发送 + rabbitTemplate.convertAndSend( + RabbitMQConfig.RABBITMQ_DEFAULT_DIRECT_EXCHANGE, // 消息发送给谁 + RabbitMQConfig.RABBITMQ_DEFAULT_DIRECT_ROUTING, // 消息通过哪个路由发送 + data); + } + + private MessagePostProcessor getDelay(int delay) { + return new MessagePostProcessor() { + @Override + public Message postProcessMessage(Message message) throws AmqpException { + //给消息设置延迟毫秒值 + message.getMessageProperties().setExpiration(String.valueOf(delay)); + return message; + } + }; + } } diff --git a/user-service/src/main/resources/application.yaml b/user-service/src/main/resources/application.yaml index e71af0a..399d545 100644 --- a/user-service/src/main/resources/application.yaml +++ b/user-service/src/main/resources/application.yaml @@ -8,6 +8,7 @@ spring: driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true + # 消息队列的配置 rabbitmq: host: 127.0.0.1 port: 5672 @@ -17,7 +18,7 @@ spring: database: 1 host: localhost port: 6379 -# 配置邮件发送信息 + # 配置邮件发送信息 mail: # 填写邮箱供应的SMTP地址 # smtp.yandex.com diff --git a/user-service/src/test/java/org/example/shop/TestEmailSend.java b/user-service/src/test/java/org/example/shop/TestEmailSend.java index 5d14a95..6aaefda 100644 --- a/user-service/src/test/java/org/example/shop/TestEmailSend.java +++ b/user-service/src/test/java/org/example/shop/TestEmailSend.java @@ -8,9 +8,13 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.Assert; +import javax.annotation.Resource; + @SpringBootTest @RunWith(SpringRunner.class) public class TestEmailSend { + + private MailService mailService; @Autowired @@ -21,6 +25,13 @@ public class TestEmailSend { @Test public void testSend() { boolean b = mailService.sendVerifyCode("yaclty@qq.com", "123323"); - Assert.isTrue(b,"发送邮件失败"); + Assert.isTrue(b, "发送邮件失败"); } + + @Test + public void testSendQueue() { + mailService.sendVerifyEmail("yaclty@qq.com", "123323"); + } + + } diff --git a/web/src/pages/b.vue b/web/src/pages/b.vue index bf181ee..be76b44 100644 --- a/web/src/pages/b.vue +++ b/web/src/pages/b.vue @@ -1,10 +1,53 @@