From 81dca23c275d3bd111a07d925f8bf6cf0c22dd2a Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 25 Apr 2023 11:06:36 +0800
Subject: [PATCH] 短信验证码发送优化,添加手机号码校验

---
 /dev/null                                                                                                               |   15 -----
 skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/feign/UserClient.java             |    8 ++
 skjcmanager/skjcmanager-service-api/skjcmanager-user-api/src/main/java/cn/gistack/system/user/feign/IUserClient.java    |   13 ++++
 skjcmanager/skjcmanager-service/skjcmanager-sm/pom.xml                                                                  |    5 +
 skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/IUserService.java         |    8 ++
 skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/impl/UserServiceImpl.java |   10 +++
 skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java                       |    5 -
 skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java            |   74 +++++++++++++++++++-----
 8 files changed, 104 insertions(+), 34 deletions(-)

diff --git a/skjcmanager/skjcmanager-service-api/skjcmanager-user-api/src/main/java/cn/gistack/system/user/feign/IUserClient.java b/skjcmanager/skjcmanager-service-api/skjcmanager-user-api/src/main/java/cn/gistack/system/user/feign/IUserClient.java
index 43947e6..c00458d 100644
--- a/skjcmanager/skjcmanager-service-api/skjcmanager-user-api/src/main/java/cn/gistack/system/user/feign/IUserClient.java
+++ b/skjcmanager/skjcmanager-service-api/skjcmanager-user-api/src/main/java/cn/gistack/system/user/feign/IUserClient.java
@@ -27,6 +27,8 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 /**
  * User Feign接口类
  *
@@ -45,6 +47,7 @@
 	String USER_INFO_BY_TYPE = API_PREFIX + "/user-info-by-type";
 	String USER_INFO_BY_ID = API_PREFIX + "/user-info-by-id";
 	String USER_INFO_BY_ACCOUNT = API_PREFIX + "/user-info-by-account";
+	String USER_INFO_BY_PHONE = API_PREFIX + "/user-info-by-phone";
 	String USER_AUTH_INFO = API_PREFIX + "/user-auth-info";
 	String SAVE_USER = API_PREFIX + "/save-user";
 	String REMOVE_USER = API_PREFIX + "/remove-user";
@@ -83,6 +86,16 @@
 	 * 获取用户信息
 	 *
 	 * @param tenantId 租户ID
+	 * @param phone  手机号
+	 * @return
+	 */
+	@GetMapping(USER_INFO_BY_PHONE)
+	R<List<User>> userInfoByPhone(@RequestParam("tenantId") String tenantId, @RequestParam("phone") String phone);
+
+	/**
+	 * 获取用户信息
+	 *
+	 * @param tenantId 租户ID
 	 * @param account  账号
 	 * @param userType 用户平台
 	 * @return
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-sm/pom.xml b/skjcmanager/skjcmanager-service/skjcmanager-sm/pom.xml
index dcb42b2..bd503dd 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-sm/pom.xml
+++ b/skjcmanager/skjcmanager-service/skjcmanager-sm/pom.xml
@@ -47,6 +47,11 @@
             <version>3.0.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.gistack</groupId>
+            <artifactId>skjcmanager-user-api</artifactId>
+            <version>3.0.1.RELEASE</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/entity/User.java b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/entity/User.java
deleted file mode 100644
index 3826e7b..0000000
--- a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/intelligentCall/entity/User.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cn.gistack.sm.intelligentCall.entity;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class User implements Serializable {
-
-	private String name;
-
-	private String phone;
-
-	private String sex;
-}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java
index 5fc83a9..d28a4f1 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/controller/SmsController.java
@@ -5,12 +5,17 @@
 import cn.gistack.sm.sms.entity.SmsRecord;
 import cn.gistack.sm.sms.service.ISmsRecordService;
 import cn.gistack.sm.sms.util.SmsUtils;
+import cn.gistack.system.user.entity.User;
+import cn.gistack.system.user.feign.IUserClient;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.core.redis.cache.BladeRedis;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import static cn.gistack.common.cache.CacheNames.PHONE_KEY;
 
 /**
@@ -26,8 +31,9 @@
 
 	private final ISmsRecordService smsRecordService;
 
-
 	private final BladeRedis bladeRedis;
+
+	private final IUserClient userClient;
 
 	@GetMapping("/test")
 	public void setRedis(){
@@ -36,26 +42,64 @@
 
 	/**
 	 * 发送登录验证码
-	 * request 必须包含手机号(多个手机号以英文逗号分隔)
+	 * request 必须包含手机号
 	 * @param request
 	 * @return
 	 */
 	@PostMapping("/sendCode")
 	public R test(@RequestBody SMSSendRequest request){
-		//设置模板相关信息
-		String templateId = "2431012205498";
-		String randNumber = SmsUtils.getRandNumber();
-		String content = "您的登录验证码是" + randNumber + ",5分钟内有效,请勿泄漏,如非本人操作,请忽略此信息";
-		request.setMessageContent(content);
-		request.setTemplateId(templateId);
-		// 发送操作
-		String sendMsg = SmsUtils.sendMsg(request);
-		// 记录发送记录操作
-		saveSendRecord(request,sendMsg);
-		// 保存验证码到 redis
-		saveCodeForRedis(request.getUserNumber(),randNumber);
+		// 手机号码校验
+		if(validatePhone(request.getUserNumber())) {
+			//设置模板相关信息
+			String templateId = "2431012205498";
+			String randNumber = SmsUtils.getRandNumber();
+			String content = "您的登录验证码是" + randNumber + ",5分钟内有效,请勿泄漏,如非本人操作,请忽略此信息";
+			request.setMessageContent(content);
+			request.setTemplateId(templateId);
+			// 发送操作
+			String sendMsg = SmsUtils.sendMsg(request);
+			// 记录发送记录操作
+			saveSendRecord(request, sendMsg);
+			// 保存验证码到 redis
+			saveCodeForRedis(request.getUserNumber(), randNumber);
+			// 返回发送信息
+			return R.data(sendMsg);
+		}
 		// 返回发送信息
-		return R.data(sendMsg);
+		return R.fail(400,"该手机号不存在!");
+	}
+
+	/**
+	 * 校验手机号码正确性
+	 * @param userNumber
+	 * @return
+	 */
+	private boolean validatePhone(String userNumber) {
+		// 校验手机号码正确性
+		if (validator(userNumber)){
+			// 校验该账户是否已注册,通过手机号查询用户是否存在,tenantId 暂时写死,未登陆情况 tenantId 获取不到
+			R<List<User>> list = userClient.userInfoByPhone("000000", userNumber);
+			if (list.getData().size()>0){
+				return true;
+			}
+			return false;
+		}
+		return false;
+	}
+
+	/**
+	 * 校验手机号码
+	 */
+	public static boolean validator(String phone) {
+		String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
+		if (phone.length() != 11) {
+			return false;
+		} else {
+			Pattern p = Pattern.compile(regex);
+			Matcher m = p.matcher(phone);
+			boolean isMatch = m.matches();
+			return isMatch;
+		}
 	}
 
 	/**
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java
index 2e9de6d..38eb0a8 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-sm/src/main/java/cn/gistack/sm/sms/util/SmsUtils.java
@@ -61,16 +61,13 @@
 	 * @return
 	 */
 	public static String getRandNumber() {
-		// 计算token
-//		Date date = new Date();
-//		String dateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(date);
 		Random random = new Random();
 		//把随机生成的数字转成字符串
 		String str = String.valueOf(random.nextInt(9));
 		for (int i = 0; i < 5; i++) {
 			str += random.nextInt(9);
 		}
-		return String.valueOf(System.currentTimeMillis()) + str;
+		return str;
 	}
 
 	/**
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/feign/UserClient.java b/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/feign/UserClient.java
index 60c5c3e..d5a1501 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/feign/UserClient.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/feign/UserClient.java
@@ -31,6 +31,8 @@
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * 用户服务Feign实现类
  *
@@ -62,6 +64,12 @@
 	}
 
 	@Override
+	@GetMapping(USER_INFO_BY_PHONE)
+	public R<List<User>> userInfoByPhone(String tenantId, String phone) {
+		return R.data(service.userInfoByPhone(tenantId, phone));
+	}
+
+	@Override
 	@GetMapping(USER_INFO_BY_TYPE)
 	public R<UserInfo> userInfo(String tenantId, String account, String userType) {
 		return R.data(service.userInfo(tenantId, account, UserEnum.of(userType)));
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/IUserService.java b/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/IUserService.java
index 5b0bede..aa94f68 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/IUserService.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/IUserService.java
@@ -207,4 +207,12 @@
 	UserVO platformDetail(User user);
 
     List<User> customizeGetList(UserVO user);
+
+	/**
+	 * 根据手机号码查询用户信息
+	 * @param tenantId
+	 * @param phone
+	 * @return
+	 */
+	List<User> userInfoByPhone(String tenantId, String phone);
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/impl/UserServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/impl/UserServiceImpl.java
index 8d5523a..4d3de6c 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/impl/UserServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-user/src/main/java/cn/gistack/system/user/service/impl/UserServiceImpl.java
@@ -435,4 +435,14 @@
 		return baseMapper.customizeGetList(user);
 	}
 
+	/**
+	 * 根据手机号码查询用户信息
+	 * @param tenantId
+	 * @param phone
+	 * @return
+	 */
+	@Override
+	public List<User> userInfoByPhone(String tenantId, String phone) {
+		return list(Wrappers.<User>query().lambda().eq(User::getTenantId, tenantId).eq(User::getPhone, phone).eq(User::getIsDeleted, BladeConstant.DB_NOT_DELETED));
+	}
 }

--
Gitblit v1.9.3