فهرست منبع

新增忘记密码

Administrator 1 سال پیش
والد
کامیت
e8e91d4404

+ 6 - 1
ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java

@@ -24,6 +24,10 @@ import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.config.properties.CaptchaProperties;
 import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.sms4j.api.SmsBlend;
+import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.core.factory.SmsFactory;
+import org.dromara.sms4j.provider.enumerate.SupplierType;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.domain.vo.SysUserVo;
@@ -33,6 +37,8 @@ import org.dromara.web.service.IAuthStrategy;
 import org.dromara.web.service.SysLoginService;
 import org.dromara.web.service.SysLoginService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.LinkedHashMap;
+
 /**
 /**
  * 密码认证策略
  * 密码认证策略
  *
  *
@@ -166,5 +172,4 @@ public class PasswordAuthStrategy implements IAuthStrategy {
         }
         }
         return userMapper.selectUserByUserName(username);
         return userMapper.selectUserByUserName(username);
     }
     }
-
 }
 }

+ 0 - 28
ruoyi-admin/src/main/resources/application-dev.yml

@@ -149,34 +149,6 @@ mail:
   # Socket连接超时值,单位毫秒,缺省值不超时
   # Socket连接超时值,单位毫秒,缺省值不超时
   connectionTimeout: 0
   connectionTimeout: 0
 
 
---- # sms 短信 支持 阿里云 腾讯云 云片 等等各式各样的短信服务商
-# https://wind.kim/doc/start 文档地址 各个厂商可同时使用
-sms:
-  # 阿里云 dysmsapi.aliyuncs.com
-  alibaba:
-    #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
-    requestUrl: dysmsapi.aliyuncs.com
-    #阿里云的accessKey
-    accessKeyId: xxxxxxx
-    #阿里云的accessKeySecret
-    accessKeySecret: xxxxxxx
-    #短信签名
-    signature: 测试
-  tencent:
-    #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
-    requestUrl: sms.tencentcloudapi.com
-    #腾讯云的accessKey
-    accessKeyId: xxxxxxx
-    #腾讯云的accessKeySecret
-    accessKeySecret: xxxxxxx
-    #短信签名
-    signature: 测试
-    #短信sdkAppId
-    sdkAppId: appid
-    #地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
-    territory: ap-guangzhou
-
-
 --- # 三方授权
 --- # 三方授权
 justauth:
 justauth:
   enabled: false
   enabled: false

+ 3 - 3
ruoyi-admin/src/main/resources/application-prod.yml

@@ -179,11 +179,11 @@ sms:
     #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
     #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
     requestUrl: dysmsapi.aliyuncs.com
     requestUrl: dysmsapi.aliyuncs.com
     #阿里云的accessKey
     #阿里云的accessKey
-    accessKeyId: LTAI5tNA2fcBJH6EWRH6Pxr6
+    accessKeyId: xxxxxxx
     #阿里云的accessKeySecret
     #阿里云的accessKeySecret
-    accessKeySecret: 5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr
+    accessKeySecret: xxxxxxx
     #短信签名
     #短信签名
-    signature: 中新云
+    signature: xxxxxxx
   tencent:
   tencent:
     #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
     #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
     requestUrl: sms.tencentcloudapi.com
     requestUrl: sms.tencentcloudapi.com

+ 6 - 6
ruoyi-admin/src/main/resources/application.yml

@@ -116,12 +116,12 @@ security:
     # 公共路径
     # 公共路径
     - /favicon.ico
     - /favicon.ico
     - /error
     - /error
-    # swagger 文档配置
-    - /*/api-docs
-    - /*/api-docs/**
-    # actuator 监控配置
-    - /actuator
-    - /actuator/**
+#    # swagger 文档配置
+#    - /*/api-docs
+#    - /*/api-docs/**
+#    # actuator 监控配置
+#    - /actuator
+#    - /actuator/**
     # 开放接口
     # 开放接口
     - /register
     - /register
     - /captchaImage
     - /captchaImage

+ 7 - 0
ruoyi-modules/ruoyi-system/pom.xml

@@ -16,6 +16,13 @@
     </description>
     </description>
 
 
     <dependencies>
     <dependencies>
+
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.23</version>
+        </dependency>
         <!-- 通用工具-->
         <!-- 通用工具-->
         <dependency>
         <dependency>
             <groupId>org.dromara</groupId>
             <groupId>org.dromara</groupId>

+ 44 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/common/AppletController.java

@@ -2,17 +2,27 @@ package org.dromara.system.controller.common;
 
 
 
 
 import cn.dev33.satoken.annotation.SaIgnore;
 import cn.dev33.satoken.annotation.SaIgnore;
+import cn.dev33.satoken.secure.BCrypt;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.SneakyThrows;
+import org.apache.commons.lang3.ObjectUtils;
 import org.dromara.common.core.domain.AjaxResult;
 import org.dromara.common.core.domain.AjaxResult;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.system.domain.FormalTeacherClass;
 import org.dromara.system.domain.FormalTeacherClass;
+import org.dromara.system.domain.SysUser;
+import org.dromara.system.service.ISysUserService;
 import org.dromara.system.service.Task;
 import org.dromara.system.service.Task;
 import org.dromara.system.service.common.IAppletService;
 import org.dromara.system.service.common.IAppletService;
+import org.dromara.system.utils.SendSmsUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+
 /**小程序公共接口
 /**小程序公共接口
  * @Author: tjf
  * @Author: tjf
  * @Date: 2023/5/25 11:46
  * @Date: 2023/5/25 11:46
@@ -25,9 +35,11 @@ import org.springframework.web.bind.annotation.*;
 public class AppletController extends BaseController {
 public class AppletController extends BaseController {
 
 
     private final IAppletService appletService;
     private final IAppletService appletService;
+    private final ISysUserService sysUserService;
 
 
     private final Task task;
     private final Task task;
 
 
+
     /**
     /**
      * 准备下课
      * 准备下课
      */
      */
@@ -92,6 +104,37 @@ public class AppletController extends BaseController {
         task.afterClass();
         task.afterClass();
         return  AjaxResult.success("成功");
         return  AjaxResult.success("成功");
     }
     }
-
+    /**
+     *忘记密码发送验证短信
+     */
+    @SaIgnore
+    @RepeatSubmit(interval = 1,timeUnit = TimeUnit.MINUTES)
+    @GetMapping("/appForgetPW/{photo}")
+    public AjaxResult appForgetPW(@PathVariable String photo)
+    {
+        String code = SendSmsUtils.getCode(4);
+        SendSmsUtils.sendSms(photo,"SMS_232893584","{\"code\":\"" + code + "\"}");
+        String key = "SMS_CODE:"+photo;
+        RedisUtils.setCacheObject(key,code, Duration.ofMinutes(5));
+        return  AjaxResult.success(code);
+    }
+    /**
+     *忘记密码校验验证码,修改密码
+     */
+    @SaIgnore
+    @RepeatSubmit
+    @GetMapping("/appCheck")
+    public R<Void> appCheck(@RequestParam("code") String code,@RequestParam("photo") String photo,@RequestParam("password") String password)
+    {
+        String key = "SMS_CODE:"+photo;
+        Object cacheObject = RedisUtils.getCacheObject(key);
+        if (ObjectUtils.isNotEmpty(cacheObject)){
+            if (code.equals(String.valueOf(cacheObject))){
+               //修改密码
+               return toAjax(sysUserService.resetUserPwdByUserName(photo,BCrypt.hashpw(password)));
+            }
+        }
+        return  R.fail();
+    }
 
 
 }
 }

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java

@@ -185,6 +185,14 @@ public interface ISysUserService {
      * @return 结果
      * @return 结果
      */
      */
     int resetUserPwd(Long userId, String password);
     int resetUserPwd(Long userId, String password);
+    /**
+     * 重置用户密码
+     *
+     * @param userName   用户手机号
+     * @param password 密码
+     * @return 结果
+     */
+    int resetUserPwdByUserName(String userName, String password);
 
 
     /**
     /**
      * 通过用户ID删除用户
      * 通过用户ID删除用户

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -404,6 +404,20 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                 .eq(SysUser::getUserId, userId));
                 .eq(SysUser::getUserId, userId));
     }
     }
 
 
+    /**
+     * 重置用户密码
+     *
+     * @param userName   用户ID
+     * @param password 密码
+     * @return 结果
+     */
+    @Override
+    public int resetUserPwdByUserName(String userName, String password) {
+        return baseMapper.update(null,
+            new LambdaUpdateWrapper<SysUser>()
+                .set(SysUser::getPassword, password)
+                .eq(SysUser::getUserName, userName));
+    }
     /**
     /**
      * 新增用户角色信息
      * 新增用户角色信息
      *
      *

+ 7 - 7
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/reservat/XiaoyuanReservatServiceImpl.java

@@ -30,6 +30,7 @@ import org.dromara.system.domain.reservat.vo.XiaoyuanReservatVo;
 import org.dromara.system.mapper.reservat.XiaoyuanReservatConfigMapper;
 import org.dromara.system.mapper.reservat.XiaoyuanReservatConfigMapper;
 import org.dromara.system.mapper.reservat.XiaoyuanReservatMapper;
 import org.dromara.system.mapper.reservat.XiaoyuanReservatMapper;
 import org.dromara.system.service.reservat.IXiaoyuanReservatService;
 import org.dromara.system.service.reservat.IXiaoyuanReservatService;
+import org.dromara.system.utils.SendSmsUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.*;
 import java.util.*;
@@ -281,15 +282,14 @@ public class XiaoyuanReservatServiceImpl implements IXiaoyuanReservatService {
 
 
     @Override
     @Override
     public Boolean shByBo(XiaoyuanReservatBo bo) {
     public Boolean shByBo(XiaoyuanReservatBo bo) {
-        LinkedHashMap<String,String> map = new LinkedHashMap<>(1);
-        map.put("link",String.valueOf(bo.getReservatId()));
-        SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
-        String templateId = "SMS_463685073";
+        String templateCode = "";
         if("2".equals(bo.getVisitType())){
         if("2".equals(bo.getVisitType())){
-            templateId = "SMS_463610067";
+            templateCode = "SMS_463610067";
+        }else if ("3".equals(bo.getVisitType())){
+             templateCode = "SMS_463685073";
         }
         }
-        SmsResponse smsResponse = smsBlend.sendMessage(bo.getVisitPhone(),templateId,map);
-        System.out.println(bo.getVisitPhone()+"短信回执码"+smsResponse.getCode());
+        //"{\"code\":\"1111\"}"
+        SendSmsUtils.sendSms(bo.getTeacherPhone(),templateCode,"{\"link\":\""+bo.getReservatId()+"\"}");
         XiaoyuanReservat update = MapstructUtils.convert(bo, XiaoyuanReservat.class);
         XiaoyuanReservat update = MapstructUtils.convert(bo, XiaoyuanReservat.class);
         validEntityBeforeSave(update);
         validEntityBeforeSave(update);
         return baseMapper.updateById(update) > 0;
         return baseMapper.updateById(update) > 0;

+ 104 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/SendSmsUtils.java

@@ -0,0 +1,104 @@
+package org.dromara.system.utils;
+
+
+
+
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teautil.models.RuntimeOptions;
+
+/**
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    //短信参数
+    static final String ACCESS_KEY_ID = "LTAI5tNA2fcBJH6EWRH6Pxr6";
+    static final String ACCESS_KEY_SECRET = "5WdaPEOvC3u9LC7pwy2DQ9pgmJvgUr";
+
+
+    //生成X位验证码
+    public static String getCode(Integer num) {
+        String[] codes = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
+        StringBuilder code = new StringBuilder();
+        for (int i = 0; i < num; i++) {
+            int j = (int) (Math.random() * 10);
+            code.append(codes[j]);
+        }
+        return code.toString();
+    }
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+            // 必填,您的 AccessKey ID
+            .setAccessKeyId(ACCESS_KEY_ID)
+            // 必填,您的 AccessKey Secret
+            .setAccessKeySecret(ACCESS_KEY_SECRET);
+        // 访问的域名
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+
+    /**
+     * 发送短信消息
+     *
+     * @return
+     */
+    public static String sendSms(String phone,String templateCode,String smsCode) {
+        String code = "";
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                //手机号码
+                .setPhoneNumbers(phone)
+                //短信签名名称。中新云
+                .setSignName("中新云")
+                //短信模板变量对应的实际值{"name": code}
+                .setTemplateParam(smsCode)
+                //短信模板CODE
+                .setTemplateCode(templateCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+
+    /**
+     * 发送注册的随机密码
+     *
+     * @return
+     */
+    public static String sendPassword(String password,String phone,String templateCode) {
+        String code = "";
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            String smsCode = "{\"password\":\"" + password + "\"}";
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                //手机号码
+                .setPhoneNumbers(phone)
+                //短信签名名称。潜山市数据资源局
+                .setSignName("中新云")
+                //短信模板CODE
+                .setTemplateCode(templateCode)
+                //短信模板变量对应的实际值{"name": code}
+                .setTemplateParam(smsCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+}
+