Jelajahi Sumber

更新忘记密码功能

sola 1 tahun lalu
induk
melakukan
f243017370

+ 4 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxApiService.java

@@ -14,4 +14,8 @@ public interface ZhcxApiService {
     List<ZhcxOutsideInspectionVo> getOutsideInspectionList(Map<String, Object> map);
 
     R sendCode(Map<String, Object> map);
+
+    R getAccountInfoForForgotPassword(Map<String, Object> map);
+
+    R resetPassword(Map<String, Object> map);
 }

+ 84 - 9
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxApiServiceImpl.java

@@ -11,10 +11,15 @@ import com.rongwei.bsentity.vo.ZhcxOutsideInspectionVo;
 import com.rongwei.commonservice.service.RedisService;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
 import com.rongwei.rwadmincommon.system.service.SysUserService;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.CheckPasswordUtils;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
+import lombok.extern.java.Log;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -24,6 +29,7 @@ import java.util.Random;
 /**
  * @author zhuang
  */
+@Log
 @Service
 public class ZhcxApiServiceImpl implements ZhcxApiService {
 
@@ -69,15 +75,84 @@ public class ZhcxApiServiceImpl implements ZhcxApiService {
         if(StringUtils.isBlank(phone)){
             return R.error("未获取到手机号,请联系系统管理员");
         }
-        boolean exists = redisService.hasKey(loginType + phone);
-        String sendCodeTimeObj = (String) redisService.getRedisCatchObj(loginType + phone);
+        String redisKeyName = loginType + phone;
+        String redisLabelName = loginType + account;
+        return sendSmsCode(null, redisKeyName, phone, redisLabelName);
+    }
+
+    @Override
+    public R getAccountInfoForForgotPassword(Map<String, Object> map) {
+        String account = map.get("account").toString();
+        LambdaQueryWrapper<SysUserDo> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.and(i -> i.eq(SysUserDo::getAccount, account));
+        SysUserDo sysUserDo = sysUserService.getOne(queryWrapper);
+        if (sysUserDo == null) {
+            return R.error("账号信息输入有误, 请重新输入!");
+        }
+        String sendType = map.get("sendType").toString();
+        String loginType = map.get("loginType").toString();
+        String smsCodeTpl = map.get("smsCodeTpl").toString();
+        String phone = sysUserDo.getMobile();
+        String redisKeyName = "forgot_password_" + loginType + phone;
+        String redisLabelName = "forgot_password_" + loginType + account;
+        if (sendType.contains("sms")) {
+            return sendSmsCode(smsCodeTpl, redisKeyName, phone, redisLabelName);
+        }
+        return R.error("获取账号信息失败, 请联系管理员!");
+    }
+
+    @Override
+    public R resetPassword(Map<String, Object> map) {
+
+        Object loginTypeObj = map.get("loginType");
+        Object accountObj = map.get("account");
+        Object passwordObj = map.get("password");
+        Object codeObj = map.get("smsCode");
+        if( ObjectUtil.isNotEmpty(loginTypeObj) && ObjectUtil.isNotEmpty(accountObj) && ObjectUtil.isNotEmpty(passwordObj)
+                && ObjectUtil.isNotEmpty(codeObj)){
+            LambdaQueryWrapper<SysUserDo> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.and(i -> i.eq(SysUserDo::getAccount, accountObj.toString()));
+            SysUserDo sysUserDo = sysUserService.getOne(queryWrapper);
+            String redisKeyName = "forgot_password_" + loginTypeObj.toString() + accountObj.toString();
+            boolean exist = redisService.hasKey(redisKeyName);
+            if (exist) {
+                Object yzmObj = redisService.getRedisCatchObj(redisKeyName);
+                if(ObjectUtil.isEmpty(yzmObj)){
+                    return R.error("未获取到验证码或验证码已过期,请获取验证码");
+                }
+                String yzm = (String) yzmObj;
+                if (codeObj.toString().equals(yzm)) {
+                    Boolean ischeck = CheckPasswordUtils.checkPasswordDefaultRule(passwordObj.toString());
+                    if(!ischeck){
+                        return R.error("密码长度不小于8,并且大写字母、小写字母、数字、特殊字符,至少包含三种");
+                    }
+                    sysUserDo.setPassword(SecurityUtil.getSaltMd5AndSha(passwordObj.toString(), sysUserDo.getId()));
+                    sysUserService.updateById(sysUserDo);
+                    RedisTemplate redisTemplate = redisService.getRedisTemplate();
+                    redisTemplate.delete(redisKeyName);
+                    redisTemplate.delete("forgot_password_" + loginTypeObj.toString() + sysUserDo.getMobile());
+                    return R.ok();
+                } else {
+                    return R.error("验证码错误,请重新输入");
+                }
+            } else {
+                return R.error("未获取到验证码或验证码已过期,请获取验证码");
+            }
+        }
+
+        return R.error("重置密码失败, 请联系管理员!");
+    }
+
+    private R sendSmsCode(String templateId, String redisKeyName, String mobile, String redisLabelName) {
+        boolean exists = redisService.hasKey(redisKeyName);
+        String sendCodeTimeObj = (String) redisService.getRedisCatchObj(redisKeyName);
         if (StringUtils.isBlank(sendCodeTimeObj)) {
             sendCodeTimeObj = "0";
         }
         int sendCodeTime = Integer.parseInt(sendCodeTimeObj);
         if( exists && sendCodeTime >= 3 ){
             sendCodeTime += 1;
-            redisService.redisCatchInit(loginType + phone,String.valueOf(sendCodeTime),300);
+            redisService.redisCatchInit(redisKeyName,String.valueOf(sendCodeTime),300);
             return R.error("验证发送次数频繁,请过5分钟后再尝试");
         }
         StringBuilder code = new StringBuilder();
@@ -89,22 +164,22 @@ public class ZhcxApiServiceImpl implements ZhcxApiService {
             }
         }
         try {
-            JSONObject jsonObject = HwSmsUtil.sendSms(code.toString(), phone);
+            JSONObject jsonObject = HwSmsUtil.sendSms(templateId, code.toString(), mobile);
             String returnCode = jsonObject.getString("code");
             if("000000".equals(returnCode)){
                 if(!exists){
-                    redisService.redisCatchInit(loginType + phone,0,300);
+                    redisService.redisCatchInit(redisKeyName,0,300);
                 }
                 sendCodeTime += 1;
-                redisService.redisCatchInit(loginType + phone,String.valueOf(sendCodeTime),300);
-                redisService.redisCatchInit(loginType + account,code.toString(),120);
+                redisService.redisCatchInit(redisKeyName,String.valueOf(sendCodeTime),300);
+                redisService.redisCatchInit(redisLabelName,code.toString(),120);
                 JSONObject json = new JSONObject();
-                json.put("phone",phone.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));
+                json.put("phone",mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"));
                 return R.ok("发送成功").putData(json);
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return R.error();
+        return R.error("获取账号信息失败, 请联系管理员!");
     }
 }

+ 8 - 5
business-common/src/main/java/com/rongwei/bscommon/sys/utils/HwSmsUtil.java

@@ -1,6 +1,7 @@
 package com.rongwei.bscommon.sys.utils;
 
 import com.alibaba.fastjson.JSONObject;
+import com.rongwei.rwcommon.utils.StringUtils;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.http.HttpResponse;
@@ -32,26 +33,28 @@ public class HwSmsUtil {
 
     public static void main(String[] args) throws Exception{
 
-        sendSms("[\""+1235+"\"]","13720166098");
+        sendSms(null, "[\""+1235+"\"]","13720166098");
 //        sendSms("[\"17623778642\",\"蓉A-7823\"]","17623778642","8819122535459","6c848255000c4619833ab690e393f906");
 //        sendSms("[\"17623778642\",\"蓉A-7823\",\"2019/12/27\",\"14:00\"]","17623778642","8819122535459","bb13d00d11e043659001a89c72d54cab");
     }
 
     /**
      * 调用短信
-     * @param sender 国内短信签名通道号或国际/港澳台短信通道号
+     * sender 国内短信签名通道号或国际/港澳台短信通道号
      * @param templateId  模板ID
      * @param code  入参
      * @param phone 接收短信手机号
      * @throws Exception
      * @return
      */
-    public static JSONObject sendSms(String code, String phone) throws Exception{
+    public static JSONObject sendSms(String templateId, String code, String phone) throws Exception{
         //必填,请参考"开发准备"获取如下数据,替换为实际值
         String url = "https://smsapi.cn-south-1.myhuaweicloud.com:443/sms/batchSendSms/v1"; //APP接入地址+接口访问URI
         String appKey = "iZA4u69023CpkvGGxrXxrBuNMp1B"; //APP_Key
         String appSecret = "CRZrS3exn54u6xL9he0s7Vi4ihR3"; //APP_Secret
-
+        if (StringUtils.isBlank(templateId)) {
+            templateId = TEMPLATE_ID;
+        }
         //条件必填,国内短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
         //国际/港澳台短信不用关注该参数
         String signature = null; //签名名称
@@ -72,7 +75,7 @@ public class HwSmsUtil {
         String templateParas = "["+code+"]"; //模板变量
 
         //请求Body,不携带签名名称时,signature请填null
-        String body = buildRequestBody(SENDER, receiver, TEMPLATE_ID, templateParas, statusCallBack, signature);
+        String body = buildRequestBody(SENDER, receiver, templateId, templateParas, statusCallBack, signature);
         if (null == body || body.isEmpty()) {
             System.out.println("body is null.");
             return null;

+ 12 - 0
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxApiController.java

@@ -39,4 +39,16 @@ public class ZhcxApiController {
         R r = zhcxApiService.sendCode(map);
         return r;
     }
+
+    @RequestMapping("/gaiffp")
+    public R getAccountInfoForForgotPassword(@RequestBody Map<String,Object> map){
+        R r = zhcxApiService.getAccountInfoForForgotPassword(map);
+        return r;
+    }
+
+    @RequestMapping("/repw")
+    public R resetPassword(@RequestBody Map<String,Object> map){
+        R r = zhcxApiService.resetPassword(map);
+        return r;
+    }
 }