Pārlūkot izejas kodu

feat:"增加手机邮箱验证码登录功能"

soobin 2 nedēļas atpakaļ
vecāks
revīzija
7df111c928

+ 2 - 0
src/main/java/com/szwl/constant/ConfigConsts.java

@@ -19,6 +19,8 @@ public class ConfigConsts {
      */
     public static final Integer TOKEN_EXPIRE_MINUTE = 120;
 
+    public static final Integer TOKEN_EXPIRE_SECOND = 180;
+
     public static final String QINIU_CLOUD_ACCESS_KEY = "flO9jklPVdvOclCy2RoPOmuC0oQJkbtb3tc3EF8i";
 
     public static final String QINIU_CLOUD_SECRET_KEY = "E0bvORbOLL9dLes_1qlyIaoQDA9xQSR_8ksxb44W";

+ 116 - 0
src/main/java/com/szwl/controller/TAdminController.java

@@ -1510,5 +1510,121 @@ public class TAdminController {
         return R.fail(ResponseCodesEnum.R0007);
     }
 
+    @ApiOperation(value = "发送登录验证码")
+    @PostMapping("/sentLoginCode")
+    public ResponseModel<?> sentLoginCode(@RequestBody LoginParam param) {
+        String phoneOrEmail = param.getPhoneOrEmail();
+        String hostName = param.getHostName();
+        // 定义国内手机号和邮箱的正则表达式
+        String phoneReg = "^1[3-9]\\d{9}$";
+        String emailReg = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
+
+        // 判断 phoneOrEmail 是手机号还是邮箱
+        if (Pattern.matches(phoneReg, phoneOrEmail)) {
+            //检测是否已有手机号注册
+            LambdaQueryWrapper<TAdmin> query = Wrappers.lambdaQuery();
+            query.eq(TAdmin::getPhone, phoneOrEmail);
+            TAdmin admin = tAdminService.getOne(query);
+            if (admin == null) {
+                // 说明手机未注册
+                return R.fail(ResponseCodesEnum.R0010);
+            }
+            // 判断是为申泽用户还是七云用户
+            String companyType = admin.getCompanyType();
+            String sZ = "Sunzee";
+            String sC = "Sevencloud";
+
+            // 如果不为管理员
+            if (admin.getType() >= 1) {
+                if (sZ.equals(hostName)) {
+                    // 如果companyType不为空,且不等于“0”
+                    if (StringUtils.isNotEmpty(companyType) && !companyType.equals("0")) {
+                        return R.fail(ResponseCodesEnum.R0010);
+                    }
+                }
+                if (sC.equals(hostName)) {
+                    // 如果companyType为空,或者不等于“1”
+                    if (StringUtils.isEmpty(companyType) || !(companyType.equals("1"))) {
+                        return R.fail(ResponseCodesEnum.R0010);
+                    }
+                }
+            }
+            //国内发送短信
+            String result = tMessageCodeService.sentLoginMessage(phoneOrEmail, admin.getCompanyType());
+            return R.ok(result);
+        } else if (Pattern.matches(emailReg, phoneOrEmail)) {
+            //检测是否已有邮箱注册
+            LambdaQueryWrapper<TAdmin> query = Wrappers.lambdaQuery();
+            query.eq(TAdmin::getEmail, phoneOrEmail);
+            TAdmin admin = tAdminService.getOne(query);
+            if (admin == null) {
+                // 邮箱未注册
+                return R.fail(ResponseCodesEnum.R0011);
+            }
+            // 判断是为申泽用户还是七云用户
+            String companyType = admin.getCompanyType();
+            String sZ = "Sunzee";
+            String sC = "Sevencloud";
+
+            // 如果不为管理员
+            if (admin.getType() >= 1) {
+                if (sZ.equals(hostName)) {
+                    // 如果companyType不为空,且不等于“0”
+                    if (StringUtils.isNotEmpty(companyType) && !companyType.equals("0")) {
+                        return R.fail(ResponseCodesEnum.R0011);
+                    }
+                }
+                if (sC.equals(hostName)) {
+                    // 如果companyType为空,或者不等于“1”
+                    if (StringUtils.isEmpty(companyType) || !(companyType.equals("1"))) {
+                        return R.fail(ResponseCodesEnum.R0011);
+                    }
+                }
+            }
+            // 发邮件
+            String result = tMessageCodeService.sentLoginEmail(phoneOrEmail, hostName);
+            return R.ok(result);
+        }
+        return R.fail(ResponseCodesEnum.R0004);
+    }
+
+    @ApiOperation(value = "验证码登录")
+    @PostMapping("/loginByCode")
+    public ResponseModel<?> loginByCode(@RequestBody LoginParam param, HttpServletRequest request) {
+        String phoneOrEmail = param.getPhoneOrEmail();
+        String code = param.getCode();
+
+        String loginCode = tokenManager.getLoginCode(phoneOrEmail);
+        if (loginCode != null && loginCode.equals(code)) {
+            tokenManager.deleteLoginCode(phoneOrEmail);
+            LambdaQueryWrapper<TAdmin> query = Wrappers.lambdaQuery();
+            query.eq(TAdmin::getPhone, phoneOrEmail).or().eq(TAdmin::getEmail, phoneOrEmail);
+            TAdmin admin = tAdminService.getOne(query);
+            // 添加系统id
+            if (StringUtils.isEmpty(admin.getManagerId())) {
+                String managerId = AdminUtils.encrypt(false, admin.getId());
+                admin.setManagerId(managerId);
+            }
+            // 设置登录时间
+            admin.setLoginDate(new Date());
+            // 登录IP
+            String ipAddress;
+            // 获取通过代理服务器传递的真实IP地址
+            String xForwardedForHeader = request.getHeader("X-Forwarded-For");
+            if (xForwardedForHeader == null) {
+                ipAddress = request.getRemoteAddr();
+            } else {
+                // 多次反向代理后会有多个IP值,第一个IP才是真实IP
+                String[] ips = xForwardedForHeader.split(",");
+                ipAddress = ips[0].trim();
+            }
+            admin.setLoginIp(ipAddress);
+            tAdminService.updateById(admin);
+            UserDetailBO userDetailBO = tAdminService.getUserDetailBO(admin);
+            return R.ok(userDetailBO);
+        }
+        return R.fail(ResponseCodesEnum.R0007);
+    }
+
 }
 

+ 24 - 0
src/main/java/com/szwl/manager/TokenManager.java

@@ -85,6 +85,30 @@ public class TokenManager {
     }
 
     /**
+     * 保存登录验证码
+     *
+     */
+    public void saveLoginCode(String phoneOrEmail, String code) {
+        redisTemplate.opsForValue().set(phoneOrEmail, code, ConfigConsts.TOKEN_EXPIRE_SECOND, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 获取登录验证码
+     *
+     */
+    public String getLoginCode(String phoneOrEmail) {
+        return redisTemplate.opsForValue().get(phoneOrEmail);
+    }
+
+    /**
+     * 删除登录验证码
+     * @param phoneOrEmail
+     */
+    public void deleteLoginCode(String phoneOrEmail) {
+        redisTemplate.delete(phoneOrEmail);
+    }
+
+    /**
      * 保存用户信息
      *
      * @param token

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

@@ -40,4 +40,20 @@ public interface TMessageCodeService extends MyIService<TMessageCode> {
     Date getLastSendTime(String phoneOrEmail);
 
     String sendEmailPortalmcc(String type, String email);
+
+    /**
+     * 登录发送短信验证码
+     * @param phoneOrEmail
+     * @param companyType
+     * @return
+     */
+    String sentLoginMessage(String phoneOrEmail, String companyType);
+
+    /**
+     * 登录发送邮箱验证码
+     * @param phoneOrEmail
+     * @param hostName
+     * @return
+     */
+    String sentLoginEmail(String phoneOrEmail, String hostName);
 }

+ 37 - 0
src/main/java/com/szwl/service/impl/TMessageCodeServiceImpl.java

@@ -1,6 +1,7 @@
 package com.szwl.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.szwl.manager.TokenManager;
 import com.szwl.model.entity.TMessageCode;
 import com.szwl.mapper.TMessageCodeMapper;
 import com.szwl.model.utils.MailUtil;
@@ -29,6 +30,9 @@ public class TMessageCodeServiceImpl extends ServiceImpl<TMessageCodeMapper, TMe
     @Autowired
     TMessageCodeMapper tMessageCodeMapper;
 
+    @Autowired
+    TokenManager tokenManager;
+
     private static final String appid = "07784f5fedb508046c841b391005b7de";
 
     /*
@@ -181,6 +185,39 @@ public class TMessageCodeServiceImpl extends ServiceImpl<TMessageCodeMapper, TMe
         return "Send Success";
     }
 
+    @Override
+    public String sentLoginMessage(String phoneOrEmail, String companyType) {
+
+        String code = addCode();
+        try {
+            String result = YunPianSms.sendSms(appid, getMessage(companyType, code), phoneOrEmail);
+            JSONObject sult = JSONObject.parseObject(result);
+            Object mobile = sult.get("mobile");
+            if (mobile != null) {
+                tokenManager.saveLoginCode(phoneOrEmail, code);
+            }
+        } catch (Exception e) {
+
+        }
+        return code;
+    }
+
+    @Override
+    public String sentLoginEmail(String phoneOrEmail, String hostName) {
+        String code = addCode();
+        String subject = getSubject("0");
+        String content = "";
+        content = getContent("0", code);
+        String AETI = "Portalmcc";
+        if (StringUtils.isNotEmpty(hostName) && AETI.equals(hostName)) {
+            new SampleMail().sendAuthCodePortalmcc(phoneOrEmail, content);
+        } else {
+            new SampleMail().sendAuthCode(phoneOrEmail, content);
+        }
+        tokenManager.saveLoginCode(phoneOrEmail, code);
+        return code;
+    }
+
     //邮件标题
     private String getSubject(String type) {
         String subject = "";