Ver Fonte

feat: 限制验证码成功发送后的时间间隔为10分钟

Ritchie há 1 ano atrás
pai
commit
d343c04859

+ 30 - 9
src/main/java/com/szwl/controller/TMessageCodeController.java

@@ -14,11 +14,13 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang.StringUtils;
 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.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -40,22 +42,42 @@ public class TMessageCodeController {
     @Autowired
     TMessageCodeService tMessageCodeService;
 
+    @ApiOperation(value = "获取上次发送验证码的时间")
+    @GetMapping("/getLastSendTime")
+    public ResponseModel<?> getLastSendTime(String phoneOrEmail) {
+        if (StringUtils.isEmpty(phoneOrEmail)) {
+            return R.fail(ResponseCodesEnum.A0100, "手机号或邮箱为空!");
+        }
+        // 查询该 手机号/邮箱 最后一次发送验证码的时间
+        Date lastSendTime = tMessageCodeService.getLastSendTime(phoneOrEmail);
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        String format = sdf.format(lastSendTime);
+//        return R.ok(format);
+        return R.ok(lastSendTime); // 返回时间戳
+    }
+
     @ApiOperation(value = "发送注册验证码")
     @PostMapping("/sentRegisterCode")
     public ResponseModel<?> sentRegisterCode(String ifForeign, String phoneOrEmail) {
+        if (StringUtils.isEmpty(phoneOrEmail)) {
+            // 说明参数为空
+            return R.fail(ResponseCodesEnum.A0100, "手机号或邮箱为空!");
+        }
+        // 查询该 手机号/邮箱 最后一次发送验证码的时间
+        Date lastSendTime = tMessageCodeService.getLastSendTime(phoneOrEmail);
+        long lastTime = lastSendTime.getTime();
+        long currentTime = new Date().getTime();
+        if (currentTime - lastTime < 10 * 60 * 1000) {
+            return R.fail("请勿频繁发送,10分钟后再试");
+        }
         // 如果是国内
         if (ifForeign.equals("0")) {
-            if (StringUtils.isEmpty(phoneOrEmail)) {
-                // 说明参数为空
-                return R.fail(ResponseCodesEnum.A0100, "手机号或邮箱为空!");
-            }
             // 定义国内手机号和邮箱的正则表达式
             String phoneReg = "^1[3-9]\\d{9}$";
             String emailReg = "^[a-zA-Z0-9_-]+([a-zA-Z0-9_.-]*[a-zA-Z0-9])*@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
 
             // 判断 phoneOrEmail 是手机号还是邮箱
             if (Pattern.matches(phoneReg, phoneOrEmail)) {
-                System.out.println("这是一个手机号");
                 //检测是否已有手机号注册
                 LambdaQueryWrapper<TAdmin> query = Wrappers.lambdaQuery();
                 query.eq(TAdmin::getPhone, phoneOrEmail);
@@ -67,7 +89,6 @@ public class TMessageCodeController {
                 String result = tMessageCodeService.sentMessage("0", phoneOrEmail);
                 return R.ok(result);
             } else if (Pattern.matches(emailReg, phoneOrEmail)) {
-                System.out.println("这是一个邮箱地址");
                 // 检测是否已有邮箱注册
                 LambdaQueryWrapper<TAdmin> query = Wrappers.lambdaQuery();
                 query.eq(TAdmin::getEmail, phoneOrEmail);
@@ -84,9 +105,9 @@ public class TMessageCodeController {
             }
         } else {
             // 海外
-            if (StringUtils.isEmpty(phoneOrEmail)) {
-                return R.fail(ResponseCodesEnum.A0100, "邮箱为空!");
-            }
+//            if (StringUtils.isEmpty(phoneOrEmail)) {
+//                return R.fail(ResponseCodesEnum.A0100, "邮箱为空!");
+//            }
             //检测是否已有邮箱注册
             LambdaQueryWrapper<TAdmin> query = Wrappers.lambdaQuery();
             query.eq(TAdmin::getEmail, phoneOrEmail);

+ 5 - 0
src/main/java/com/szwl/mapper/TMessageCodeMapper.java

@@ -3,6 +3,9 @@ package com.szwl.mapper;
 import com.szwl.model.entity.TMessageCode;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Date;
 
 /**
  * <p>
@@ -15,4 +18,6 @@ import org.springframework.stereotype.Component;
 @Component
 public interface TMessageCodeMapper extends BaseMapper<TMessageCode> {
 
+    Date getLastSendTimeByEmailOrPhone(@RequestParam String phoneOrEmail);
+
 }

+ 7 - 0
src/main/java/com/szwl/mapper/xml/TMessageCodeMapper.xml

@@ -20,4 +20,11 @@
         id, create_date, modify_date, admin_id, phone, code, type, status, note
     </sql>
 
+    <!-- 获取指定邮箱或手机号的最近一次发送验证码时间 -->
+    <select id="getLastSendTimeByEmailOrPhone" resultType="java.util.Date">
+        SELECT
+            MAX(create_date)
+        FROM t_message_code
+        WHERE phone = #{phoneOrEmail}
+    </select>
 </mapper>

+ 0 - 1
src/main/java/com/szwl/model/utils/YunPianSms.java

@@ -99,7 +99,6 @@ public final class YunPianSms {
      * @return json格式字符串
      * @throws IOException
      */
-
     public static String sendSms(String apikey, String text, String mobile) throws IOException {
         Map<String, String> params = new HashMap<String, String>();
         params.put("apikey", apikey);

+ 4 - 0
src/main/java/com/szwl/service/TMessageCodeService.java

@@ -3,6 +3,8 @@ package com.szwl.service;
 import com.szwl.model.entity.TMessageCode;
 import com.szwl.service.base.MyIService;
 
+import java.util.Date;
+
 /**
  * <p>
  * 短信验证码 服务类
@@ -21,4 +23,6 @@ public interface TMessageCodeService extends MyIService<TMessageCode> {
      * 发送邮箱验证码
      * */
     String sentEmail(String type, String email);
+
+    Date getLastSendTime(String phoneOrEmail);
 }

+ 12 - 1
src/main/java/com/szwl/service/impl/TMessageCodeServiceImpl.java

@@ -8,6 +8,7 @@ import com.szwl.model.utils.YunPianSms;
 import com.szwl.service.TMessageCodeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.commons.lang.StringUtils;
+import org.elasticsearch.cluster.routing.RerouteService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -78,8 +79,18 @@ public class TMessageCodeServiceImpl extends ServiceImpl<TMessageCodeMapper, TMe
         tMessageCode.setCreateDate(new Date());
         tMessageCode.setStatus("0");
         tMessageCodeMapper.insert(tMessageCode);
-        return "success";
+        return "发送成功Success";
     }
+
+    @Override
+    public Date getLastSendTime(String phoneOrEmail) {
+        if (StringUtils.isEmpty(phoneOrEmail)) {
+            return null;
+        }
+        Date lastSendTime = tMessageCodeMapper.getLastSendTimeByEmailOrPhone(phoneOrEmail);
+        return lastSendTime != null ? lastSendTime : new Date(0);
+    }
+
     //邮件标题
     private String getSubject(String type) {
         String subject = "";

+ 1 - 1
src/test/java/com/szwl/AutoGeneratorTests.java

@@ -39,7 +39,7 @@ class AutoGeneratorTests {
 		//配置数据源
 		DataSourceConfig dataSourceConfig = new DataSourceConfig();
 		dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver")
-				.setUrl("jdbc:mysql://rm-wz995mu26a1479kz0so.mysql.rds.aliyuncs.com:3306/szwl")
+				.setUrl("jdbc:mysql://rm-wz995mu26a1479kz0so.mysql.rds.aliyuncs.com:3306/szwl-test")
 				.setUsername("root").setPassword("sunzee@020");
 
 		//策略配置