Browse Source

短信登录、绑定运营人员

huangzhiguo 2 năm trước cách đây
mục cha
commit
7714c18b53

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

@@ -138,6 +138,24 @@ public class BaseApi {
         return baseService.getEmailCode(email, status);
         return baseService.getEmailCode(email, status);
     }
     }
 
 
+    /**
+     * 获取登录验证码
+     * @param mobile 输入手机号
+     * @return
+     */
+    @ApiOperation("获取登录验证码")
+    @GetMapping("/login/code")
+    public ResponseJson loginSmsCode(String mobile) { return baseService.getLoginCode(mobile);}
+
+    /**
+     * 获取绑定运营人员验证码
+     * @param mobile 输入手机号
+     * @return
+     */
+    @ApiOperation("获取绑定运营人员验证码")
+    @GetMapping("/operate/code")
+    public ResponseJson operateSmsCode(String mobile) { return baseService.operateSmsCode(mobile);}
+
     /**
     /**
      * 修改密码(找回密码)
      * 修改密码(找回密码)
      *
      *

+ 21 - 0
src/main/java/com/caimei365/user/controller/LoginApi.java

@@ -50,6 +50,21 @@ public class LoginApi {
         return loginService.passwordLogin(loginPasswordDto);
         return loginService.passwordLogin(loginPasswordDto);
     }
     }
 
 
+    /**
+     *
+     * @param loginCodeDto {
+     *                      mobile   手机号
+     *                      code     短信验证码
+     *                     }
+     * @return
+     * @throws ParseException
+     */
+    @ApiOperation("登录(手机号,验证码)")
+    @PostMapping("/codeLogin")
+    public ResponseJson<UserLoginVo> codeLogin(LoginCodeDto loginCodeDto) throws ParseException {
+        return loginService.codeLogin(loginCodeDto);
+    }
+
     /**
     /**
      * 协销登录(手机号,密码)
      * 协销登录(手机号,密码)
      * <p>
      * <p>
@@ -343,4 +358,10 @@ public class LoginApi {
     }
     }
 
 
 
 
+    @ApiOperation("绑定运营人员")
+    @PostMapping("/verification")
+    public ResponseJson<String> operateVerification(LoginCodeDto loginCodeDto) {
+        return loginService.operateVerification(loginCodeDto);
+    }
+
 }
 }

+ 28 - 0
src/main/java/com/caimei365/user/model/dto/LoginCodeDto.java

@@ -0,0 +1,28 @@
+package com.caimei365.user.model.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2022/12/16
+ */
+@Data
+public class LoginCodeDto implements Serializable {
+
+    /**
+     * 手机号
+     */
+    @NotNull
+    private String mobile;
+
+    /**
+     * 短信验证码
+     */
+    @NotNull
+    private String code;
+}

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

@@ -67,6 +67,20 @@ public interface BaseService {
      */
      */
     ResponseJson getEmailCode(String email, Integer status);
     ResponseJson getEmailCode(String email, Integer status);
 
 
+    /**
+     * 获取登录验证码
+     * @param mobile 输入手机号
+     * @return
+     */
+    ResponseJson getLoginCode(String mobile);
+
+    /**
+     * 获取绑定运营人员验证码
+     * @param mobile
+     * @return
+     */
+    ResponseJson operateSmsCode(String mobile);
+
     /**
     /**
      * 修改密码(找回密码)
      * 修改密码(找回密码)
      *
      *

+ 21 - 0
src/main/java/com/caimei365/user/service/LoginService.java

@@ -2,6 +2,7 @@ package com.caimei365.user.service;
 
 
 import com.caimei365.user.model.ResponseJson;
 import com.caimei365.user.model.ResponseJson;
 import com.caimei365.user.model.dto.AuthBindDto;
 import com.caimei365.user.model.dto.AuthBindDto;
+import com.caimei365.user.model.dto.LoginCodeDto;
 import com.caimei365.user.model.dto.LoginPasswordDto;
 import com.caimei365.user.model.dto.LoginPasswordDto;
 import com.caimei365.user.model.dto.ScanBindDto;
 import com.caimei365.user.model.dto.ScanBindDto;
 import com.caimei365.user.model.vo.MessageCenter;
 import com.caimei365.user.model.vo.MessageCenter;
@@ -33,6 +34,16 @@ public interface LoginService {
      */
      */
     ResponseJson<UserLoginVo> passwordLogin(LoginPasswordDto loginPasswordDto) throws ParseException;
     ResponseJson<UserLoginVo> passwordLogin(LoginPasswordDto loginPasswordDto) throws ParseException;
 
 
+    /**
+     *
+     * @param loginCodeDto {
+     *                          mobile   手机号
+     *                          code     短信验证码
+     *                     }
+     * @return
+     * @throws ParseException
+     */
+    ResponseJson<UserLoginVo> codeLogin(LoginCodeDto loginCodeDto) throws ParseException;
     /**
     /**
      * 微信授权登录(小程序)
      * 微信授权登录(小程序)
      *
      *
@@ -144,4 +155,14 @@ public interface LoginService {
      * @return OperationPo
      * @return OperationPo
      */
      */
     ResponseJson<UserLoginVo> operationBindWeChat(AuthBindDto authBindDto);
     ResponseJson<UserLoginVo> operationBindWeChat(AuthBindDto authBindDto);
+
+    /**
+     * 绑定运营人员短信验证
+     * @param loginCodeDto{
+     *                      mobile   手机号
+     *                      code     短信验证码
+     *                     }
+     * @return
+     */
+    ResponseJson<String> operateVerification(LoginCodeDto loginCodeDto);
 }
 }

+ 76 - 0
src/main/java/com/caimei365/user/service/impl/BaseServiceImpl.java

@@ -335,6 +335,82 @@ public class BaseServiceImpl implements BaseService {
         return ResponseJson.success("发送验证码成功", "");
         return ResponseJson.success("发送验证码成功", "");
     }
     }
 
 
+    /**
+     * 获取登录验证码
+     *
+     * @param mobile 输入手机号
+     * @return
+     */
+    @Override
+    public ResponseJson getLoginCode(String mobile) {
+        // 验证手机号
+        String result = ValidateUtil.validateMobile(mobile);
+        if (result != null) {
+            return ResponseJson.error(result);
+        }
+        Integer dbUserId = null;
+        // 根据手机号查询用户Id
+        dbUserId = baseMapper.getUserIdByMobile(mobile);
+        if (dbUserId == null) {
+            ResponseJson.error("该手机号尚未注册");
+        }
+        // 生成6位数验证码
+        String randomCode = CodeUtil.getRandomCharAndNumr(6);
+        // 开发环境下短信验证码固定为 666666
+        boolean isCode = "dev".equals(profile);
+        if (isCode) {
+            randomCode = "666666";
+        }
+        // 您正在操作登录采美商城,验证码:{6},请在5分钟内完成验证。如非本人操作,请忽略本短信。
+        String content = "您正在操作登录采美商城,验证码:"+ randomCode +",请在5分钟内完成验证。如非本人操作,请忽略本短信。";
+        boolean smsFlag = isCode || remoteCallService.remoteSendSms(0,1,mobile,content);
+        if (!smsFlag) {
+            // 短信发送失败重试一次
+            smsFlag = remoteCallService.remoteSendSms(0,1,mobile,content);
+        }
+        if (smsFlag) {
+            redisService.set("code:"+ mobile, randomCode,300L);
+            log.info("登录短信,发送到"+ mobile + "的验证码为:"+ randomCode);
+            return ResponseJson.success("发送验证码成功");
+        } else {
+            return ResponseJson.error("发送验证码失败,请稍后再试");
+        }
+    }
+
+    /**
+     * 获取绑定运营人员验证码
+     *
+     * @param mobile
+     * @return
+     */
+    @Override
+    public ResponseJson operateSmsCode(String mobile) {
+        // 验证手机号
+        String result = ValidateUtil.validateMobile(mobile);
+        if (result != null) {
+            return ResponseJson.error(result);
+        }
+        // 生成6位数验证码
+        String randomCode = CodeUtil.getRandomCharAndNumr(6);
+        boolean isCode = "dev".equals(profile);
+        if (isCode) {
+            randomCode = "666666";
+        }
+        // 您正在操作绑定运营人员,验证码:{6},请在5分钟内完成验证。如非本人操作,请忽略本短信。
+        String content = "您正在操作绑定运营人员,验证码:"+ randomCode+",请在5分钟内完成验证。如非本人操作,请忽略本短信。";
+        boolean smsFlag = isCode || remoteCallService.remoteSendSms(0,1,mobile,content);
+        if (!smsFlag) {
+            smsFlag = remoteCallService.remoteSendSms(0,1,mobile,content);
+        }
+        if (smsFlag) {
+            redisService.set("code:"+mobile,randomCode,300L);
+            log.info("绑定运营人员,发送到:"+mobile+"验证码为:"+randomCode);
+            return ResponseJson.success("发送验证码成功");
+        } else {
+            return ResponseJson.error("发送验证码失败,请稍后再试");
+        }
+    }
+
     /**
     /**
      * 修改密码(找回密码)
      * 修改密码(找回密码)
      *
      *

+ 105 - 4
src/main/java/com/caimei365/user/service/impl/LoginServiceImpl.java

@@ -7,10 +7,7 @@ import com.caimei365.user.components.RedisService;
 import com.caimei365.user.components.WeChatService;
 import com.caimei365.user.components.WeChatService;
 import com.caimei365.user.mapper.*;
 import com.caimei365.user.mapper.*;
 import com.caimei365.user.model.ResponseJson;
 import com.caimei365.user.model.ResponseJson;
-import com.caimei365.user.model.dto.AuthBindDto;
-import com.caimei365.user.model.dto.LoginPasswordDto;
-import com.caimei365.user.model.dto.ScanBindDto;
-import com.caimei365.user.model.dto.SuperVipDto;
+import com.caimei365.user.model.dto.*;
 import com.caimei365.user.model.po.OperationPo;
 import com.caimei365.user.model.po.OperationPo;
 import com.caimei365.user.model.po.SuperVipPo;
 import com.caimei365.user.model.po.SuperVipPo;
 import com.caimei365.user.model.vo.*;
 import com.caimei365.user.model.vo.*;
@@ -19,6 +16,7 @@ import com.caimei365.user.service.RemoteCallService;
 import com.caimei365.user.utils.JwtUtil;
 import com.caimei365.user.utils.JwtUtil;
 import com.caimei365.user.utils.MathUtil;
 import com.caimei365.user.utils.MathUtil;
 import com.caimei365.user.utils.Md5Util;
 import com.caimei365.user.utils.Md5Util;
+import com.caimei365.user.utils.ValidateUtil;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.github.pagehelper.PageInfo;
 import lombok.SneakyThrows;
 import lombok.SneakyThrows;
@@ -28,6 +26,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.ParseException;
@@ -150,6 +149,61 @@ public class LoginServiceImpl implements LoginService {
         return ResponseJson.error("账户名与密码不匹配,请重新输入", null);
         return ResponseJson.error("账户名与密码不匹配,请重新输入", null);
     }
     }
 
 
+    /**
+     * @param loginCodeDto {
+     *                      mobile   手机号
+     *                      code     短信验证码
+     *                     }
+     * @return
+     * @throws ParseException
+     */
+    @Override
+    public ResponseJson<UserLoginVo> codeLogin(LoginCodeDto loginCodeDto) throws ParseException {
+        if (ObjectUtils.isEmpty(loginCodeDto.getMobile())) {
+            return ResponseJson.error("请填写手机号",null);
+        }
+        if (ObjectUtils.isEmpty(loginCodeDto.getCode())) {
+            return ResponseJson.error("请输入短信验证码",null);
+        }
+        String mobile = loginCodeDto.getMobile();
+        String code = loginCodeDto.getCode();
+        String result = ValidateUtil.validateMobile(mobile);
+        if (result != null) {
+            return ResponseJson.error(result);
+        }
+        // 判断redis中是否存在
+        boolean exists = redisService.exists("code:" + mobile);
+        if (exists) {
+            // 查看验证码是否过期
+            long expireTime = redisService.getExpireTime("code:" + mobile);
+            if (expireTime < 0) {
+                return ResponseJson.error("验证码已过期,请重新获取验证码");
+            }
+            // 获取redis手机短信验证码
+            Object randomCode = redisService.get("code:"+mobile);
+
+            if (!ObjectUtils.isEmpty(randomCode)) {
+                if (code.equals(randomCode.toString())) {
+                    // 根据手机号获取用户信息
+                    UserLoginVo baseUser = loginMapper.getLoginUserByMobileOrEmail(mobile);
+                    if (baseUser.getUserIdentity() == 1) {
+                        // 协销登录
+                        return ResponseJson.success(baseUser);
+                    } else {
+                        // 返回登录校验结果
+                        return logonVerify(baseUser);
+                    }
+                } else {
+                    return ResponseJson.error("验证码不匹配,请重新输入");
+                }
+            } else {
+                return ResponseJson.error("验证码为空,请重新获取");
+            }
+        } else {
+            return ResponseJson.error("手机验证码不存在,请重新获取");
+        }
+    }
+
     /**
     /**
      * 微信授权登录(小程序)
      * 微信授权登录(小程序)
      *
      *
@@ -982,6 +1036,53 @@ public class LoginServiceImpl implements LoginService {
         return ResponseJson.success("绑定微信成功", user);
         return ResponseJson.success("绑定微信成功", user);
     }
     }
 
 
+    /**
+     * 绑定运营人员短信验证
+     *
+     * @param loginCodeDto {
+     *                     mobile   手机号
+     *                     code     短信验证码
+     *                     }
+     * @return
+     */
+    @Override
+    public ResponseJson<String> operateVerification(LoginCodeDto loginCodeDto) {
+        if (ObjectUtils.isEmpty(loginCodeDto.getMobile())) {
+            return ResponseJson.error("请输入手机号",null);
+        }
+        if (ObjectUtils.isEmpty(loginCodeDto.getCode())) {
+            return ResponseJson.error("请输入验证码",null);
+        }
+        String mobile = loginCodeDto.getMobile();
+        String code = loginCodeDto.getCode();
+        String result = ValidateUtil.validateMobile(mobile);
+        if (result != null) {
+            return ResponseJson.error(result);
+        }
+        // 判断redis中是否存在
+        boolean exists = redisService.exists("code:" + mobile);
+        if (exists) {
+            // 校验验证码是否过期
+            long expireTime = redisService.getExpireTime("code:" + mobile);
+            if (expireTime < 0) {
+                return ResponseJson.error("验证码已失效,请重新获取");
+            }
+            // 获取redis缓存验证码
+            Object randomCode = redisService.get("code:" + mobile);
+            if (!ObjectUtils.isEmpty(randomCode)) {
+                if (code.equals(randomCode.toString())) {
+                    return ResponseJson.success("验证码匹配成功");
+                } else {
+                    return ResponseJson.error("验证码不匹配,请重新输入");
+                }
+            } else {
+                return ResponseJson.error("验证码为空,请重新获取");
+            }
+        } else {
+            return ResponseJson.error("验证码不存在,请重新获取");
+        }
+    }
+
     /**
     /**
      * 根据userId查是否过期,返回dto对象,flag=0未买过,-1过期,1有效,endTime过期时间
      * 根据userId查是否过期,返回dto对象,flag=0未买过,-1过期,1有效,endTime过期时间
      */
      */