Jelajahi Sumber

邮箱验证码

chao 4 tahun lalu
induk
melakukan
731512f3ac

+ 5 - 0
pom.xml

@@ -92,6 +92,11 @@
             <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
             <version>2.1.0</version>
         </dependency>
+        <!--邮箱发送-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
         <!-- jwt -->
         <dependency>
             <groupId>com.auth0</groupId>

+ 37 - 0
src/main/java/com/caimei365/user/controller/BaseApi.java

@@ -1,7 +1,9 @@
 package com.caimei365.user.controller;
 
 import com.caimei365.user.model.ResponseJson;
+import com.caimei365.user.model.dto.PasswordDto;
 import com.caimei365.user.service.BaseService;
+import com.caimei365.user.utils.ValidateUtil;
 import io.swagger.annotations.*;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
@@ -101,4 +103,39 @@ public class BaseApi {
     public ResponseJson getBindSmsCode(String mobile, String bindMobile, Integer userId, Integer platformType, Integer isCheckCaptcha, String imgCode, String token) {
         return baseService.getBindSmsCode(mobile, bindMobile, userId, platformType, isCheckCaptcha, imgCode, token);
     }
+
+
+    /**
+     * 获取邮箱验证码
+     *
+     * @param email  邮箱
+     * @param status 1:绑定邮箱,2邮箱注册,3邮箱找回秘密
+     */
+    @ApiOperation("获取邮箱验证码(旧:/user/mailbox)")
+    @ApiImplicitParams({
+        @ApiImplicitParam(required = true, name = "email", value = "邮箱"),
+        @ApiImplicitParam(required = true, name = "status", value = "1:绑定邮箱,2邮箱注册,3邮箱找回秘密")
+    })
+    @GetMapping("/mailbox")
+    public ResponseJson sendMail(String email, Integer status) {
+        return baseService.getEmailCode(email, status);
+    }
+
+    /**
+     * 修改密码(找回密码)
+     *
+     * @param passwordDto {
+     *                           mobileOrEmail 手机号或邮箱
+     *                           smsCode       短信验证码(旧:activationCode)
+     *                           password      密码
+     *                           confirmPwd    确认密码
+     *                           status        1:手机号找回,2:邮箱找回
+     * }
+     */
+    @ApiOperation("修改密码(旧:/user/findCompanyPwd)")
+    @PostMapping("/password/update")
+    public ResponseJson updatePassword(PasswordDto passwordDto) {
+        return baseService.updatePassword(passwordDto);
+    }
+
 }

+ 6 - 2
src/main/java/com/caimei365/user/mapper/BaseMapper.java

@@ -92,11 +92,15 @@ public interface BaseMapper {
      * @return
      */
     String getUserNameByUserId(Integer userId);
-
     /**
      * 获取采美售后电话
      * @return
      */
     String getAfterSalesPhone();
-
+    /**
+     * 根据用户Id修改密码
+     * @param password 密码
+     * @param userId   用户Id
+     */
+    void updatePasswordByUserId(String password, Integer userId);
 }

+ 49 - 0
src/main/java/com/caimei365/user/model/dto/PasswordDto.java

@@ -0,0 +1,49 @@
+package com.caimei365.user.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/15
+ */
+@ApiModel("修改密码")
+@Data
+public class PasswordDto implements Serializable {
+    /**
+     * 手机号或邮箱
+     */
+    @NotNull
+    @ApiModelProperty("手机号或邮箱")
+    private String mobileOrEmail;
+    /**
+     * 密码
+     */
+    @NotNull
+    @ApiModelProperty("密码")
+    private String password;
+    /**
+     * 用户确认密码
+     */
+    @NotNull
+    @ApiModelProperty("用户确认密码(旧:confirmPwd)")
+    private String passWordConfirm;
+    /**
+     * 短信验证码
+     */
+    @NotNull
+    @ApiModelProperty("短信验证码(旧:activationCode)")
+    private String smsCode;
+    /**
+     * 1:手机号找回,2:邮箱找回
+     */
+    @ApiModelProperty("1:手机号找回,2:邮箱找回")
+    private Integer status;
+
+}

+ 23 - 0
src/main/java/com/caimei365/user/service/BaseService.java

@@ -1,6 +1,7 @@
 package com.caimei365.user.service;
 
 import com.caimei365.user.model.ResponseJson;
+import com.caimei365.user.model.dto.PasswordDto;
 
 import java.util.Map;
 
@@ -54,4 +55,26 @@ public interface BaseService {
      * @param token            图片验证码token
      */
     ResponseJson getBindSmsCode(String mobile, String bindMobile, Integer userId, Integer platformType, Integer isCheckCaptcha, String imgCode, String token);
+
+    /**
+     * 获取邮箱验证码
+     *
+     * @param email  邮箱
+     * @param status 1:绑定邮箱,2邮箱注册,3邮箱找回秘密
+     */
+    ResponseJson getEmailCode(String email, Integer status);
+
+    /**
+     * 修改密码(找回密码)
+     *
+     * @param passwordDto {
+     *                           mobileOrEmail 手机号或邮箱
+     *                           smsCode       短信验证码(旧:activationCode)
+     *                           password      密码
+     *                           confirmPwd    确认密码
+     *                           status        1:手机号找回,2:邮箱找回
+     * }
+     */
+    ResponseJson updatePassword(PasswordDto passwordDto);
+
 }

+ 125 - 21
src/main/java/com/caimei365/user/service/impl/BaseServiceImpl.java

@@ -3,11 +3,9 @@ package com.caimei365.user.service.impl;
 import com.caimei365.user.mapper.BaseMapper;
 import com.caimei365.user.model.ResponseJson;
 import com.caimei365.user.components.RedisService;
+import com.caimei365.user.model.dto.PasswordDto;
 import com.caimei365.user.service.BaseService;
-import com.caimei365.user.utils.AliyunSmsUtil;
-import com.caimei365.user.utils.CodeUtil;
-import com.caimei365.user.utils.ImageCaptchaUtil;
-import com.caimei365.user.utils.ValidateUtil;
+import com.caimei365.user.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
@@ -107,15 +105,6 @@ public class BaseServiceImpl implements BaseService {
         // 验证手机号
         String result = ValidateUtil.validateMobile(mobile);
         if (result != null) {return ResponseJson.error(result);}
-        if (StringUtils.isNotBlank(profile)) {
-            // 开发 和 测试环境 固定短信验证码 666666
-            if("dev".equals(profile) || "beta".equals(profile)){
-                redisService.set("code:"+mobile, "666666", 1800L);
-                String codeType = activateCodeType == 1 ? "找回密码" : (activateCodeType == 2 ? "注册机构" : "注册供应商");
-                log.info(codeType + ",发送到:" + mobile + "的短信验证码("+ profile +")为: 666666");
-                return ResponseJson.success("发送验证码成功");
-            }
-        }
         // 检查图片验证码
         if (null == isCheckCaptcha || 0 == isCheckCaptcha){
             Boolean checkFlag = checkCaptchaImage(token, imgCode, platformType);
@@ -126,6 +115,10 @@ public class BaseServiceImpl implements BaseService {
         boolean sendFlag = false;
         // 生成六位验证码
         String randomCode = CodeUtil.generateCodeInt(6);
+        if ("dev".equals(profile) || "beta".equals(profile)){
+            // 开发 和 测试环境 固定短信验证码 666666
+            randomCode = "666666";
+        }
         // 根据手机号查询用户Id
         Integer userId = baseMapper.getUserIdByMobile(mobile);
         if (1 == activateCodeType) {
@@ -173,14 +166,6 @@ public class BaseServiceImpl implements BaseService {
         // 验证手机号
         String result = ValidateUtil.validateMobile(mobile);
         if (result != null) {return ResponseJson.error(result);}
-        if (StringUtils.isNotBlank(profile)) {
-            // 开发 和 测试环境 固定短信验证码 666666
-            if("dev".equals(profile) || "beta".equals(profile)){
-                redisService.set("code:"+mobile, "666666", 1800L);
-                log.info("绑定账号,发送到:" + mobile + "的短信验证码("+ profile +")为: 666666");
-                return ResponseJson.success("发送验证码成功");
-            }
-        }
         // 检查图片验证码
         if (null == isCheckCaptcha || 0 == isCheckCaptcha){
             Boolean checkFlag = checkCaptchaImage(token, imgCode, platformType);
@@ -215,6 +200,10 @@ public class BaseServiceImpl implements BaseService {
         }
         // 生成六位验证码
         String randomCode = CodeUtil.generateCodeInt(6);
+        if ("dev".equals(profile) || "beta".equals(profile)){
+            // 开发 和 测试环境 固定短信验证码 666666
+            randomCode = "666666";
+        }
         String userName = baseMapper.getUserNameByUserId(userId);
         // 欢迎成为${name}的运营人员,您的邀请码为${code}。
         boolean smsFlag = AliyunSmsUtil.sendSms(mobile, 11, "{name:"+ userName +",code:"+ randomCode +"}");
@@ -231,4 +220,119 @@ public class BaseServiceImpl implements BaseService {
         }
     }
 
+    /**
+     * 获取邮箱验证码
+     *
+     * @param email  邮箱
+     * @param status 1:绑定邮箱,2邮箱注册,3邮箱找回秘密
+     */
+    @Override
+    public ResponseJson getEmailCode(String email, Integer status) {
+        // 验证邮箱
+        if (!ValidateUtil.validateEmail(email)) {
+            return ResponseJson.error("邮箱格式不正确");
+        }
+        Integer dbUserId = baseMapper.getUserIdByEmail(email);
+        try {
+            // 生成六位验证码
+            String randomCode = CodeUtil.generateCodeInt(6);
+            if ("dev".equals(profile) || "beta".equals(profile)){
+                // 开发 和 测试环境 固定短信验证码 666666
+                randomCode = "666666";
+            }
+            String html = EmailUtil.setMailCode(status, randomCode);
+            String subject = "";
+            // status 1:绑定邮箱,2邮箱注册,3邮箱找回秘密
+            if (status == 1) {
+                if (dbUserId != null) {
+                    return ResponseJson.error("该邮箱已被使用");
+                }
+                subject = "采美365网邮箱绑定验证邮件";
+            } else if (status == 2) {
+                if (dbUserId != null) {
+                    return ResponseJson.error("该邮箱已被使用");
+                }
+                subject = "采美365网注册验证邮件";
+            } else if (status == 3) {
+                if (dbUserId == null) {
+                    return ResponseJson.error("该邮箱尚未注册");
+                }
+                subject = "采美365网修改密码验证邮件";
+            }
+            EmailUtil.sendMail(email, subject, html);
+            redisService.set("code:"+email, randomCode, 1800L);
+            log.info( "subject,发送到:" + email + "的验证码为: " + randomCode);
+        } catch (Exception e) {
+            return ResponseJson.error("发送验证码失败");
+        }
+        return ResponseJson.success("发送验证码成功", "");
+    }
+
+    /**
+     * 修改密码(找回密码)
+     *
+     * @param passwordDto {
+     *                    mobileOrEmail 手机号或邮箱
+     *                    smsCode       短信验证码(旧:activationCode)
+     *                    password      密码
+     *                    confirmPwd    确认密码
+     *                    status        1:手机号找回,2:邮箱找回
+     *                    }
+     */
+    @Override
+    public ResponseJson updatePassword(PasswordDto passwordDto) {
+        String mobileOrEmail = passwordDto.getMobileOrEmail();
+        String smsCode = passwordDto.getSmsCode();
+        String passWord = passwordDto.getPassword();
+        String confirmPwd = passwordDto.getPassWordConfirm();
+        Integer status = passwordDto.getStatus();
+        if (status == 1) {
+            // 验证手机号
+            String result = ValidateUtil.validateMobile(mobileOrEmail);
+            if (result != null) {return ResponseJson.error(result);}
+        } else {
+            // 验证邮箱
+            if (!ValidateUtil.validateEmail(mobileOrEmail)) {
+                return ResponseJson.error("邮箱格式不正确");
+            }
+        }
+        if (StringUtils.isEmpty(smsCode)) {
+            return ResponseJson.error("请输入验证码");
+        }
+        String redisSmsCode = (String) redisService.get("code:" + mobileOrEmail);
+        // 开发 和 测试环境 固定短信验证码 666666
+        if ("dev".equals(profile) || "beta".equals(profile)){
+            redisSmsCode = (null != redisSmsCode && !"null".equals(redisSmsCode) ? redisSmsCode : "666666");
+        }
+        if (!smsCode.equals(redisSmsCode)) {
+            return ResponseJson.error("验证码错误");
+        }
+        // 查找用户表是否存在
+        Integer dbUserId;
+        if (status == 1) {
+            dbUserId = baseMapper.getUserIdByMobile(mobileOrEmail);
+            if (dbUserId == null) {
+                return ResponseJson.error("该手机号尚未注册");
+            }
+        } else {
+            dbUserId = baseMapper.getUserIdByEmail(mobileOrEmail);
+            if (dbUserId == null) {
+                return ResponseJson.error("该邮箱尚未注册");
+            }
+        }
+        if (StringUtils.isEmpty(passWord)) {
+            return ResponseJson.error("请输入新密码");
+        }
+        if (StringUtils.isEmpty(confirmPwd)) {
+            return ResponseJson.error("请确认密码");
+        }
+        if (!passWord.equals(confirmPwd)) {
+            return ResponseJson.error("两次输入的密码不一致");
+        }
+        // 设置密码
+        String dbPassword = Md5Util.md5(passWord);
+        baseMapper.updatePasswordByUserId(dbPassword, dbUserId);
+        return ResponseJson.success("密码修改成功", "");
+    }
+
 }

+ 126 - 0
src/main/java/com/caimei365/user/utils/EmailUtil.java

@@ -0,0 +1,126 @@
+package com.caimei365.user.utils;
+
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.mail.javamail.MimeMessageHelper;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import java.io.UnsupportedEncodingException;
+import java.util.Properties;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/4/15
+ */
+public class EmailUtil {
+
+    private static final String HOST = "mail.caimei365.com";
+    private static final Integer PORT = 465;
+    private static final String USERNAME = "cmmp@caimei365.com";
+    private static final String PASSWORD = "cmmp_abc_789";
+    private static final String emailForm = "cmmp@caimei365.com";
+    private static final String timeout = "80000";
+    private static final String personal = "caimei365";
+    private static JavaMailSenderImpl mailSender = createMailSender();
+
+    /**
+     * 邮件发送器
+     *
+     * @return 配置好的工具
+     */
+    private static JavaMailSenderImpl createMailSender() {
+        JavaMailSenderImpl sender = new JavaMailSenderImpl();
+        sender.setHost(HOST);
+        sender.setPort(PORT);
+        sender.setUsername(USERNAME);
+        sender.setPassword(PASSWORD);
+        sender.setDefaultEncoding("Utf-8");
+        Properties p = new Properties();
+        p.setProperty("mail.smtp.timeout", timeout);
+        p.setProperty("mail.smtp.auth", "true");
+        p.setProperty("mail.smtp.ssl.enable", "true");
+        p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+        sender.setJavaMailProperties(p);
+        return sender;
+    }
+
+    /**
+     * 发送邮件
+     *
+     * @param to      接受人
+     * @param subject 主题
+     * @param html    发送内容
+     * @throws UnsupportedEncodingException 异常
+     */
+    public static void sendMail(String to, String subject, String html) throws UnsupportedEncodingException, MessagingException {
+        MimeMessage mimeMessage = mailSender.createMimeMessage();
+        // 设置utf-8或GBK编码,否则邮件会有乱码
+        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
+        messageHelper.setFrom(emailForm, personal);
+        messageHelper.setTo(to);
+        messageHelper.setSubject(subject);
+        messageHelper.setText(html, true);
+        mailSender.send(mimeMessage);
+    }
+
+    /**
+     * 设置邮件验证码内容
+     * @param status 1:绑定邮箱,2邮箱注册,3邮箱找回秘密
+     * @param code   邮箱验证码
+     * @return
+     */
+    public static String setMailCode(Integer status, String code){
+        String html = "<!DOCTYPE html>\n" +
+                        "<html lang=\"en\">\n" +
+                        "<head>\n" +
+                        "  <meta charset=\"UTF-8\">\n" +
+                        "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
+                        "  <title>Document</title>\n" +
+                        "</head>\n" +
+                        "<body>\n" +
+                        "  <h1 style=\"text-align: left;\">采美365网</h1>\n" +
+                        "  <p>您好,</p>\n";
+        if (status == 1) {
+           html +=  "  <P>您正在绑定邮箱。</P>\n" +
+                    "  <P>您的邮箱验证码为:<b>" + code + "</b>,请把该验证码填入绑定邮箱页面,进行邮箱绑定。</P>\n";
+        } else if (status == 2) {
+           html +=  "  <P>感谢您注册采美365网。</P>\n" +
+                    "  <P>您的邮箱验证码为:<b>" + code + "</b>,请把该验证码填入注册页面,然后继续注册流程。</P>\n";
+        } else if (status == 3) {
+           html +=  "  <p>您好,</p>\n" +
+                    "  <P>您正在修改密码。</P>\n" +
+                    "  <P>您的邮箱验证码为:<b>" + code + "</b>,请把该验证码填入修改密码页面,然后继续修改密码流程。</P>\n";
+        } else {
+            html += "  <P>您的邮箱验证码为:<b>" + code + "</b></P>\n";
+        }
+        html += "<P>注意:验证码有效期为30分钟!</P>\n" +
+                "  <h1 style=\"text-align: right;\">采美365网团队</h1>\n" +
+                "  <p style=\"text-align: right;\">客服热线:0755-22907771</p>\n" +
+                "</body>\n" +
+                "</html>";
+        return html;
+    }
+
+//    public static void main(String[] args) throws UnsupportedEncodingException, MessagingException {
+//        EmailUtil m = new EmailUtil();
+//        m.sendMail("plf0916@163.com", "用户商品价格库价格低于成本价或应付供应商", "<!DOCTYPE html>\n" +
+//                "<html lang=\"en\">\n" +
+//                "<head>\n" +
+//                "  <meta charset=\"UTF-8\">\n" +
+//                "  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
+//                "  <title>Document</title>\n" +
+//                "</head>\n" +
+//                "<body>\n" +
+//                "  <h1 style=\"text-align: left;\">采美365网</h1>\n" +
+//                "  <p>您好:</p>\n" +
+//                "  <P>您正在绑定邮箱</P>\n" +
+//                "  <P>您的邮箱验证码为:<b>4585</b>,请把该验证码填入绑定邮箱页面,进行邮箱绑定</P>\n" +
+//                "  <P>注意:验证码有效期为30分钟!</P>\n" +
+//                "  <h1 style=\"text-align: right;\">采美365网团队</h1>\n" +
+//                "  <p style=\"text-align: right;\">0755-22907771</p>\n" +
+//                "</body>\n" +
+//                "</html>");
+//    }
+}

+ 4 - 0
src/main/resources/mapper/BaseMapper.xml

@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei365.user.mapper.BaseMapper">
+    <update id="updatePasswordByUserId">
+        update user set password = #{password}
+        where userID = #{userId}
+    </update>
     <select id="getUserIdByEmail" resultType="java.lang.Integer">
         select userID from user
         where email = #{email} and userIdentity in (1,2,3,4)