Forráskód Böngészése

物业管理端评论

tjf 2 hónapja
szülő
commit
0e7022c807

+ 60 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/AppletController.java

@@ -0,0 +1,60 @@
+package com.ruoyi.web.controller.common;
+
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.SendSmsUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author: tjf
+ * @Date: 2023/5/25 11:46
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/wuYe/applet")
+public class AppletController extends BaseController {
+
+    @Resource
+    private RedisCache redisCache;
+
+    @Resource
+    private ISysUserService sysUserService;
+
+    /**
+     * 忘记密码发送验证短信
+     */
+    @GetMapping("/appForgetPW/{phone}")
+    public AjaxResult appForgetPW(@PathVariable String phone) {
+        String code = SendSmsUtils.getCode(6);
+        SendSmsUtils.sendSms(phone, "SMS_219525380", "{\"code\":\"" + code + "\"}");
+        String key = "SMS_CODE:" + phone;
+        redisCache.setCacheObject(key, code, 5, TimeUnit.MINUTES);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 忘记密码校验验证码,修改密码
+     */
+    @GetMapping("/appCheck")
+    public AjaxResult appCheck(@RequestParam("code") String code, @RequestParam("phone") String phone, @RequestParam("password") String password) {
+        String key = "SMS_CODE:" + phone;
+        Object cacheObject = redisCache.getCacheObject(key);
+        if (ObjectUtils.isNotEmpty(cacheObject)) {
+            if (code.equals(String.valueOf(cacheObject))) {
+                redisCache.deleteObject(key);
+                //修改密码
+                return toAjax(sysUserService.resetUserPwdByUserName(phone, SecurityUtils.encryptPassword(password)));
+            }
+        }
+        return AjaxResult.error();
+    }
+
+}

+ 68 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java

@@ -0,0 +1,68 @@
+package com.ruoyi.web.controller.common;
+
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginBody;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SendSmsUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.concurrent.TimeUnit;
+import static com.ruoyi.common.constant.Constants.LOGIN_USER_SMS;
+
+
+/**
+ * @Author: tjf
+ * @Date: 2024/03/05 17:15
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/wuYe/sendSms")
+public class SendSmsController {
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private ISysUserService sysUserService;
+
+    /**
+     * 发送登录短信接口
+     *
+     * @return
+     */
+    @PostMapping("/sendLoginSms")
+    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
+    public AjaxResult sendLoginSms(@RequestBody LoginBody user) {
+        String code = SendSmsUtils.getCode(6);
+        String phonenumber = user.getPhonenumber();
+        SysUser sysUser = sysUserService.selectUserByPhonenumber(phonenumber);
+        if (sysUser != null) {
+            redisCache.setCacheObject(LOGIN_USER_SMS + phonenumber, code, 5, TimeUnit.MINUTES);
+            String msg = SendSmsUtils.sendPassword(code, phonenumber);
+            System.out.println(phonenumber + "登录短信发送回复:" + msg);
+            return AjaxResult.success();
+        }
+        return AjaxResult.error("当前手机号不存在");
+    }
+
+    /**
+     * 发送注册短信接口
+     *
+     * @return
+     */
+    @PostMapping("/sendRegisterSms")
+    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
+    public AjaxResult sendRegisterSms(@RequestBody LoginBody user) {
+        String code = SendSmsUtils.getCode(4);
+        String phonenumber = user.getPhonenumber();
+        redisCache.setCacheObject(LOGIN_USER_SMS + phonenumber, code, 5, TimeUnit.MINUTES);
+        String msg = SendSmsUtils.sendPassword(code, phonenumber);
+        System.out.println(phonenumber + "登录短信发送回复:" + msg);
+        return AjaxResult.success(msg);
+    }
+}

+ 6 - 0
ruoyi-common/pom.xml

@@ -16,6 +16,12 @@
     </description>
 
     <dependencies>
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.24</version>
+        </dependency>
         <!--身份验证依赖-->
         <dependency>
             <groupId>com.aliyun</groupId>

+ 4 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@@ -247,4 +247,8 @@ public class Constants
     //记录社区资讯某个用户对应资讯下有多少个未读的互动key=comment_interaction_community_user_count:{userId} hkey = {community_id} value = 资讯下有多少个未读的互动(点赞,收藏,回复)
     public static final String COMMENT_INTERACTION_COMMUNITY_USER_COUNT ="comment_interaction_community_user_count:";
 
+    /**
+     * 短信登录验证码前缀
+     */
+    public static final String LOGIN_USER_SMS = "login_user_sms:";
 }

+ 12 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java

@@ -11,6 +11,10 @@ public class LoginBody
      * 用户名
      */
     private String username;
+    /**
+     * 手机号
+     */
+    private String phonenumber;
 
     /**
      * 用户密码
@@ -27,6 +31,14 @@ public class LoginBody
      */
     private String uuid;
 
+    public String getPhonenumber() {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber) {
+        this.phonenumber = phonenumber;
+    }
+
     public String getUsername()
     {
         return username;

+ 133 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java

@@ -0,0 +1,133 @@
+package com.ruoyi.common.utils;
+
+
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendBatchSmsResponse;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.tea.TeaException;
+
+/**阿里云
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    //阿里云ACCESS_KEY短信参数
+    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);
+            if (j <= 0) {
+                j = 1;
+            }
+            code.append(codes[j - 1]);
+
+        }
+        return code.toString();
+    }
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+                .setAccessKeyId(ACCESS_KEY_ID)
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+                .setAccessKeySecret(ACCESS_KEY_SECRET);
+        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+        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 com.aliyun.teautil.models.RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+
+    /**
+     * 阿里云批量发送 短信接口,一次最多100个手机号码
+     *
+     * @return
+     * @throws
+     */
+    public static SendBatchSmsResponse sendBatchSms(SendBatchSmsRequest sendBatchSmsRequest) {
+        try {
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+            SendBatchSmsResponse sendBatchSmsResponse = client.sendBatchSmsWithOptions(sendBatchSmsRequest, runtime);
+            return sendBatchSmsResponse;
+            // 复制代码运行请自行打印 API 的返回值
+        } catch (TeaException error) {
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 如有需要,请打印 error
+            com.aliyun.teautil.Common.assertAsString(error.message);
+        }
+        return null;
+    }
+
+    /**
+     * 发送注册的随机密码
+     *
+     * @return
+     */
+    public static String sendPassword(String code, String phone) {
+        try {
+            // 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            String smsCode = "{\"code\":\"" + code + "\"}";
+            com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                    //手机号码
+                    .setPhoneNumbers(phone)
+                    //短信签名名称。中新云
+                    .setSignName("中新云")
+                    //短信模板CODE
+                    .setTemplateCode("SMS_219525380")
+                    //短信模板变量对应的实际值{"name": code}
+                    .setTemplateParam(smsCode);
+            // 复制代码运行请自行打印 API 的返回值
+            SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, new com.aliyun.teautil.models.RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+}
+

+ 1 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -115,6 +115,7 @@ public class SecurityConfig
                     // 静态资源,可匿名访问
                     .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                     .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
+                    .antMatchers("/wuYe/applet/**","/wuYe/sendSms/**").permitAll()
                     // 除上面外的所有请求全部需要鉴权认证
                     .anyRequest().authenticated();
             })

+ 6 - 2
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -1,8 +1,9 @@
 package com.ruoyi.system.mapper;
 
-import java.util.List;
-import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 用户表 数据层
@@ -11,6 +12,7 @@ import com.ruoyi.common.core.domain.entity.SysUser;
  */
 public interface SysUserMapper
 {
+    public SysUser selectUserByPhonenumber(String phonenumber);
     /**
      * 根据条件分页查询用户列表
      * 
@@ -126,4 +128,6 @@ public interface SysUserMapper
     public SysUser checkEmailUnique(String email);
 
     int deleteUserByUserName(String phoneNumber);
+
+    int resetUserPwdByUserName(@Param("userName") String userName, @Param("password") String password);
 }

+ 12 - 1
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -1,8 +1,9 @@
 package com.ruoyi.system.service;
 
-import java.util.List;
 import com.ruoyi.common.core.domain.entity.SysUser;
 
+import java.util.List;
+
 /**
  * 用户 业务层
  * 
@@ -205,4 +206,14 @@ public interface ISysUserService
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
 
     public int deleteUserByUserName(String phoneNumber);
+
+    public SysUser selectUserByPhonenumber(String phonenumber);
+    /**
+     * 根据手机号重置用户密码
+     *
+     * @param userName   用户手机号
+     * @param password 密码
+     * @return 结果
+     */
+    int resetUserPwdByUserName(String userName, String password);
 }

+ 29 - 15
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -1,15 +1,5 @@
 package com.ruoyi.system.service.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import javax.validation.Validator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.SysRole;
@@ -22,14 +12,21 @@ import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.system.domain.SysPost;
 import com.ruoyi.system.domain.SysUserPost;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.mapper.SysPostMapper;
-import com.ruoyi.system.mapper.SysRoleMapper;
-import com.ruoyi.system.mapper.SysUserMapper;
-import com.ruoyi.system.mapper.SysUserPostMapper;
-import com.ruoyi.system.mapper.SysUserRoleMapper;
+import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysDeptService;
 import com.ruoyi.system.service.ISysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.validation.Validator;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 用户 业务层处理
@@ -552,4 +549,21 @@ public class SysUserServiceImpl implements ISysUserService
     public int deleteUserByUserName(String phoneNumber) {
         return userMapper.deleteUserByUserName(phoneNumber);
     }
+
+    @Override
+    public SysUser selectUserByPhonenumber(String phonenumber) {
+        return userMapper.selectUserByPhonenumber(phonenumber);
+    }
+
+    /**
+     * 根据手机号重置用户密码
+     *
+     * @param userName   用户手机号
+     * @param password 密码
+     * @return 结果
+     */
+    @Override
+    public int resetUserPwdByUserName(String userName, String password) {
+        return userMapper.resetUserPwdByUserName(userName,password);
+    }
 }

+ 14 - 2
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -45,7 +45,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="dataScope"    column="data_scope"     />
         <result property="status"       column="role_status"    />
     </resultMap>
-	
+	<select id="selectUserByPhonenumber" parameterType="String" resultMap="SysUserResult">
+		select u.user_id, u.dept_id, u.user_name, u.nick_name,u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
+			   d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
+			   r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
+		from sys_user u
+				 left join sys_dept d on u.dept_id = d.dept_id
+				 left join sys_user_role ur on u.user_id = ur.user_id
+				 left join sys_role r on r.role_id = ur.role_id
+		where u.phonenumber = #{phonenumber} and u.del_flag = '0'
+	</select>
+
 	<sql id="selectUserVo">
         select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, 
         d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
@@ -220,5 +230,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <delete id="deleteUserByUserName" parameterType="Long">
 		update sys_user set del_flag = '2' where user_name = #{phoneNumber}
 	</delete>
-
+	<update id="resetUserPwdByUserName" parameterType = "string">
+		update sys_user set password = #{password} where user_name = #{userName}
+	</update>
 </mapper>