Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

LIVE_YE 2 týždňov pred
rodič
commit
6d252f672e
27 zmenil súbory, kde vykonal 1046 pridanie a 102 odobranie
  1. 4 0
      ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  2. 0 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/OcrController.java
  3. 48 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java
  4. 108 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/manage/BannerController.java
  5. 8 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
  6. 7 4
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
  7. 9 6
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  8. 6 0
      ruoyi-common/pom.xml
  9. 7 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  10. 1 1
      ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
  11. 11 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
  12. 14 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  13. 111 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/PwdCheckUtil.java
  14. 79 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java
  15. 80 57
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
  16. 147 0
      ruoyi-system/src/main/java/com/ruoyi/manage/domain/Banner.java
  17. 62 0
      ruoyi-system/src/main/java/com/ruoyi/manage/mapper/BannerMapper.java
  18. 62 0
      ruoyi-system/src/main/java/com/ruoyi/manage/service/IBannerService.java
  19. 97 0
      ruoyi-system/src/main/java/com/ruoyi/manage/service/impl/BannerServiceImpl.java
  20. 3 3
      ruoyi-system/src/main/java/com/ruoyi/manage/service/impl/ColumnNewsServiceImpl.java
  21. 0 1
      ruoyi-system/src/main/java/com/ruoyi/mqtt/service/MqttService.java
  22. 4 2
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  23. 15 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  24. 5 5
      ruoyi-system/src/main/java/com/ruoyi/system/service/Task.java
  25. 41 16
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  26. 107 0
      ruoyi-system/src/main/resources/mapper/manage/BannerMapper.xml
  27. 10 1
      ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

+ 4 - 0
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -3,12 +3,16 @@ package com.ruoyi;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 启动程序
  * 
  * @author ruoyi
  */
+@EnableAsync
+@EnableScheduling
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 public class RuoYiApplication
 {

+ 0 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/OcrController.java

@@ -51,9 +51,6 @@ public class OcrController {
     }
 
 
-
-
-
     /**
      * 人脸识别阿里云金融级实人认证
      *

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

@@ -0,0 +1,48 @@
+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.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.SMS_CODE;
+
+
+/**
+ * @Author: tjf
+ * @Date: 2024/03/05 17:15
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/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 phone = user.getUsername();
+        SendSmsUtils.sendSms(phone, "SMS_219525380", "{\"code\":\"" + code + "\"}");
+        String key = SMS_CODE + phone;
+        redisCache.setCacheObject(key, code, 5, TimeUnit.MINUTES);
+        return AjaxResult.success("发送成功");
+    }
+}

+ 108 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/manage/BannerController.java

@@ -0,0 +1,108 @@
+package com.ruoyi.web.controller.manage;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.manage.domain.Banner;
+import com.ruoyi.manage.service.IBannerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 轮播图Controller
+ *
+ * @author boman
+ * @date 2025-08-01
+ */
+@RestController
+@RequestMapping("/manage/banner")
+public class BannerController extends BaseController
+{
+    @Autowired
+    private IBannerService bannerService;
+
+/**
+ * 查询轮播图列表
+ */
+@PreAuthorize("@ss.hasPermi('manage:banner:list')")
+@GetMapping("/list")
+    public TableDataInfo list(Banner banner)
+    {
+        startPage();
+        List<Banner> list = bannerService.selectBannerList(banner);
+        return getDataTable(list);
+    }
+
+    /**
+     * 查询轮播图列表不分页
+     */
+    @GetMapping("/listNoPage")
+    public TableDataInfo listNoPage(Banner banner)
+    {
+        List<Banner> list = bannerService.selectBannerList(banner);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出轮播图列表
+     */
+    @PreAuthorize("@ss.hasPermi('manage:banner:export')")
+    @Log(title = "轮播图", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, Banner banner)
+    {
+        List<Banner> list = bannerService.selectBannerList(banner);
+        ExcelUtil<Banner> util = new ExcelUtil<Banner>(Banner.class);
+        util.exportExcel(response, list, "轮播图数据");
+    }
+
+    /**
+     * 获取轮播图详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('manage:banner:query')")
+    @GetMapping(value = "/{bannerId}")
+    public AjaxResult getInfo(@PathVariable("bannerId") Long bannerId)
+    {
+        return success(bannerService.selectBannerByBannerId(bannerId));
+    }
+
+    /**
+     * 新增轮播图
+     */
+    @PreAuthorize("@ss.hasPermi('manage:banner:add')")
+    @Log(title = "轮播图", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody Banner banner)
+    {
+        return toAjax(bannerService.insertBanner(banner));
+    }
+
+    /**
+     * 修改轮播图
+     */
+    @PreAuthorize("@ss.hasPermi('manage:banner:edit')")
+    @Log(title = "轮播图", businessType = BusinessType.UPDATE)
+    @PostMapping("/put")
+    public AjaxResult edit(@RequestBody Banner banner)
+    {
+        return toAjax(bannerService.updateBanner(banner));
+    }
+
+    /**
+     * 删除轮播图
+     */
+    @PreAuthorize("@ss.hasPermi('manage:banner:remove')")
+    @Log(title = "轮播图", businessType = BusinessType.DELETE)
+    @GetMapping("/delete/{bannerIds}")
+    public AjaxResult remove(@PathVariable Long[] bannerIds)
+    {
+        return toAjax(bannerService.deleteBannerByBannerIds(bannerIds));
+    }
+}

+ 8 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginBody;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.framework.web.service.SysLoginService;
 import com.ruoyi.framework.web.service.SysPermissionService;
 import com.ruoyi.framework.web.service.TokenService;
@@ -20,6 +21,8 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
 import java.util.Set;
 
+import static com.ruoyi.common.constant.Constants.ONE;
+
 /**
  * 登录验证
  * 
@@ -49,10 +52,14 @@ public class SysLoginController
     @PostMapping("/login")
     public AjaxResult login(@RequestBody LoginBody loginBody)
     {
+        String type = loginBody.getType();
+        if (StringUtils.isBlank(type)){
+            type = ONE;
+        }
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
         String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
+                loginBody.getUuid(),type);
         ajax.put(Constants.TOKEN, token);
         return ajax;
     }

+ 7 - 4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java

@@ -17,6 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import static com.ruoyi.common.constant.Constants.ONE;
+
 /**
  * 个人信息 业务处理
  * 
@@ -63,10 +65,6 @@ public class SysProfileController extends BaseController
         {
             return error("修改用户'" + loginUser.getUsername() + "'失败,手机号码已存在");
         }
-        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
-        {
-            return error("修改用户'" + loginUser.getUsername() + "'失败,邮箱账号已存在");
-        }
         if (userService.updateUserProfile(currentUser) > 0)
         {
             // 更新缓存用户信息
@@ -88,6 +86,11 @@ public class SysProfileController extends BaseController
         LoginUser loginUser = getLoginUser();
         String userName = loginUser.getUsername();
         String password = loginUser.getPassword();
+        SysUser sysUser = new SysUser();
+        sysUser.setPassword(newPassword);
+        if (ONE.equals(userService.checkStrongPwd(sysUser))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
+        }
         if (!SecurityUtils.matchesPassword(oldPassword, password))
         {
             return error("修改密码失败,旧密码错误");

+ 9 - 6
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -26,6 +26,8 @@ import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import static com.ruoyi.common.constant.Constants.ONE;
+
 /**
  * 用户信息
  * 
@@ -128,9 +130,8 @@ public class SysUserController extends BaseController
         {
             return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
-            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        else if (ONE.equals(userService.checkStrongPwd(user))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
         }
         user.setCreateBy(getUsername());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -157,9 +158,8 @@ public class SysUserController extends BaseController
         {
             return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
         }
-        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
-        {
-            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
+        else if (ONE.equals(userService.checkStrongPwd(user))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
         }
         user.setUpdateBy(getUsername());
         return toAjax(userService.updateUser(user));
@@ -188,6 +188,9 @@ public class SysUserController extends BaseController
     @PostMapping("/resetPwd")
     public AjaxResult resetPwd(@RequestBody SysUser user)
     {
+        if (ONE.equals(userService.checkStrongPwd(user))) {
+            return AjaxResult.error("密码必须包含数字、大小写字母、特殊符号且大于8位");
+        }
         userService.checkUserAllowed(user);
         userService.checkUserDataScope(user.getUserId());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));

+ 6 - 0
ruoyi-common/pom.xml

@@ -22,6 +22,12 @@
     </properties>
 
     <dependencies>
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.24</version>
+        </dependency>
         <!--hutool工具-->
         <dependency>
             <groupId>cn.hutool</groupId>

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

@@ -180,6 +180,11 @@ public class Constants {
     public static final String ONE = "1";
     public static final String TWO = "2";
     public static final String TEN = "10";
+
+    /**
+     * 短信登录验证码前缀
+     */
+    public static final String SMS_CODE = "sms_code:";
     //上月告警统计key
     public static final String WARN_LAST_MONTH = "warn_last_month:";
     //坐标
@@ -208,4 +213,6 @@ public class Constants {
     public static final String WARN_MANAGE_LAST_YEAR = "warn_manage_last_year:";
     //防溺水新闻:id value=阅读次数,每10次更新一下数据库
     public static final String COLUMN_NEWS_NUM = "column_news_num:";
+
+
 }

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java

@@ -76,6 +76,6 @@ public class UserConstants
     /**
      * 密码长度限制
      */
-    public static final int PASSWORD_MIN_LENGTH = 5;
+    public static final int PASSWORD_MIN_LENGTH = 8;
     public static final int PASSWORD_MAX_LENGTH = 20;
 }

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

@@ -26,7 +26,18 @@ public class LoginBody
      * 唯一标识
      */
     private String uuid;
+    /**
+     * 登录模式:1:账号密码 2:短信验证码
+     */
+    private String type;
 
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
     public String getUsername()
     {
         return username;

+ 14 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -201,6 +201,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return sec;
     }
 
+
+
+    /**
+     * 获取时间date1与date2相差的秒数
+     *
+     * @param startDate 起始时间
+     * @param endDate 结束时间
+     * @return 返回相差的秒数
+     */
+    public static int getOffsetSeconds(Date startDate, Date endDate) {
+        int seconds = (int) ((endDate.getTime() - startDate.getTime()) / 1000);
+        return seconds;
+    }
+
     /**
      * 增加 LocalDateTime ==> Date
      */

+ 111 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/PwdCheckUtil.java

@@ -0,0 +1,111 @@
+package com.ruoyi.common.utils;
+
+/**
+ * @Author: tjf
+ * @Date: 2022/10/10 9:24
+ * @Describe:
+ */
+public class PwdCheckUtil {
+    //定义特殊字符
+    public static String SPECIAL_CHAR = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
+
+    /**
+     * @brief   检测密码中字符长度
+     * @param[in] password            密码字符串
+     * @return  符合长度要求 返回true
+     */
+    public static boolean checkPasswordLength(String password, String minNum, String maxNum) {
+        boolean flag =false;
+        if (StringUtils.isBlank(maxNum))  {
+            minNum = StringUtils.isBlank(minNum) ? "0":minNum;
+            if (password.length() >= Integer.parseInt(minNum)) {
+                flag = true;
+            }
+        } else {
+            minNum = StringUtils.isBlank(minNum) ? "0":minNum;
+            if (password.length() >= Integer.parseInt(minNum) &&
+                    password.length() <= Integer.parseInt(maxNum)) {
+                flag = true;
+            }
+        }
+        return flag;
+    }
+
+    /**
+     * @brief   检测密码中是否包含数字
+     * @param[in] password            密码字符串
+     * @return  包含数字 返回true
+     */
+    public static boolean checkContainDigit(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isDigit(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * @brief   检测密码中是否包含字母(不区分大小写)
+     * @param[in] password            密码字符串
+     * @return  包含字母 返回true
+     */
+    public static boolean checkContainCase(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isLetter(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * @brief   检测密码中是否包含小写字母
+     * @param[in] password            密码字符串
+     * @return  包含小写字母 返回true
+     */
+    public static boolean checkContainLowerCase(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isLowerCase(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * @brief   检测密码中是否包含大写字母
+     * @param[in] password            密码字符串
+     * @return  包含大写字母 返回true
+     */
+    public static boolean checkContainUpperCase(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (Character.isUpperCase(chPass[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * @brief   检测密码中是否包含特殊符号
+     * @param[in] password            密码字符串
+     * @return  包含特殊符号 返回true
+     */
+    public static boolean checkContainSpecialChar(String password) {
+        char[] chPass = password.toCharArray();
+        for (int i = 0; i < chPass.length; i++) {
+            if (SPECIAL_CHAR.indexOf(chPass[i]) != -1) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

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

@@ -0,0 +1,79 @@
+package com.ruoyi.common.utils;
+
+
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+
+/**阿里云
+ * @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;
+    }
+}
+

+ 80 - 57
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java

@@ -1,12 +1,5 @@
 package com.ruoyi.framework.web.service;
 
-import javax.annotation.Resource;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.stereotype.Component;
 import com.ruoyi.common.constant.CacheConstants;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.constant.UserConstants;
@@ -14,11 +7,7 @@ import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.exception.user.BlackListException;
-import com.ruoyi.common.exception.user.CaptchaException;
-import com.ruoyi.common.exception.user.CaptchaExpireException;
-import com.ruoyi.common.exception.user.UserNotExistsException;
-import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
+import com.ruoyi.common.exception.user.*;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -28,15 +17,25 @@ import com.ruoyi.framework.manager.factory.AsyncFactory;
 import com.ruoyi.framework.security.context.AuthenticationContextHolder;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+import static com.ruoyi.common.constant.Constants.SMS_CODE;
+import static com.ruoyi.common.constant.Constants.TWO;
 
 /**
  * 登录校验方法
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private TokenService tokenService;
 
@@ -45,7 +44,7 @@ public class SysLoginService
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
     private ISysUserService userService;
 
@@ -54,43 +53,40 @@ public class SysLoginService
 
     /**
      * 登录验证
-     * 
+     *
      * @param username 用户名
      * @param password 密码
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
      * @return 结果
      */
-    public String login(String username, String password, String code, String uuid)
-    {
+    public String login(String username, String password, String code, String uuid, String type) {
         // 验证码校验
         validateCaptcha(username, code, uuid);
+        //登录类型校验 如果是短信验证码登录,校验短信验证码是否正确
+        String passwordResult = validateType(username, type, code);
+        if (StringUtils.isBlank(passwordResult)) {
+            throw new CaptchaException();
+        }
+        password = passwordResult;
         // 登录前置校验
         loginPreCheck(username, password);
         // 用户验证
         Authentication authentication = null;
-        try
-        {
+        try {
             UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
             AuthenticationContextHolder.setContext(authenticationToken);
             // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
             authentication = authenticationManager.authenticate(authenticationToken);
-        }
-        catch (Exception e)
-        {
-            if (e instanceof BadCredentialsException)
-            {
+        } catch (Exception e) {
+            if (e instanceof BadCredentialsException) {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
                 throw new UserPasswordNotMatchException();
-            }
-            else
-            {
+            } else {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
                 throw new ServiceException(e.getMessage());
             }
-        }
-        finally
-        {
+        } finally {
             AuthenticationContextHolder.clearContext();
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
@@ -102,27 +98,23 @@ public class SysLoginService
 
     /**
      * 校验验证码
-     * 
+     *
      * @param username 用户名
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
      * @return 结果
      */
-    public void validateCaptcha(String username, String code, String uuid)
-    {
+    public void validateCaptcha(String username, String code, String uuid) {
         boolean captchaEnabled = configService.selectCaptchaEnabled();
-        if (captchaEnabled)
-        {
+        if (captchaEnabled) {
             String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
             String captcha = redisCache.getCacheObject(verifyKey);
-            if (captcha == null)
-            {
+            if (captcha == null) {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
                 throw new CaptchaExpireException();
             }
             redisCache.deleteObject(verifyKey);
-            if (!code.equalsIgnoreCase(captcha))
-            {
+            if (!code.equalsIgnoreCase(captcha)) {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
                 throw new CaptchaException();
             }
@@ -131,35 +123,31 @@ public class SysLoginService
 
     /**
      * 登录前置校验
+     *
      * @param username 用户名
      * @param password 用户密码
      */
-    public void loginPreCheck(String username, String password)
-    {
+    public void loginPreCheck(String username, String password) {
         // 用户名或密码为空 错误
-        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password))
-        {
+        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
             throw new UserNotExistsException();
         }
         // 密码如果不在指定范围内 错误
         if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
-                || password.length() > UserConstants.PASSWORD_MAX_LENGTH)
-        {
+                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
             throw new UserPasswordNotMatchException();
         }
         // 用户名不在指定范围内 错误
         if (username.length() < UserConstants.USERNAME_MIN_LENGTH
-                || username.length() > UserConstants.USERNAME_MAX_LENGTH)
-        {
+                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
             throw new UserPasswordNotMatchException();
         }
         // IP黑名单校验
         String blackStr = configService.selectConfigByKey("sys.login.blackIPList");
-        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
-        {
+        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
             AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked")));
             throw new BlackListException();
         }
@@ -170,12 +158,47 @@ public class SysLoginService
      *
      * @param userId 用户ID
      */
-    public void recordLoginInfo(Long userId)
-    {
+    public void recordLoginInfo(Long userId) {
         SysUser sysUser = new SysUser();
         sysUser.setUserId(userId);
         sysUser.setLoginIp(IpUtils.getIpAddr());
         sysUser.setLoginDate(DateUtils.getNowDate());
         userService.updateUserProfile(sysUser);
     }
+
+    /**
+     * 登录类型校验 如果是短信验证码登录,校验短信验证码是否正确,给密码 查询用户信息后赋值
+     *
+     * @param phone 用户名
+     * @param type  登录类型
+     * @param code  短信验证码
+     */
+    public String validateType(String phone, String type, String code) {
+        String password = "1qaz@WSX";
+        if (TWO.equals(type)) {
+            //校验短信验证码
+            Object cacheObject = redisCache.getCacheObject(SMS_CODE + phone);
+            if (code.equals(cacheObject)) {
+                //根据手机号查询用户信息
+                SysUser sysUser = userService.selectUserByPhonenumber(phone);
+                if (sysUser == null) {
+                    //新增用户 todo
+                    SysUser sysUserNew = new SysUser();
+                    sysUserNew.setPhonenumber(phone);
+                    sysUserNew.setNickName(phone);
+                    sysUserNew.setUserName(phone);
+                    sysUserNew.setLoginIp(IpUtils.getIpAddr());
+                    sysUserNew.setPassword(password);
+                    Long[] roleIds = new Long[1];
+                    roleIds[0] = 2L;
+                    sysUserNew.setRoleIds(roleIds);
+                    userService.insertUser(sysUserNew);
+                }
+                redisCache.deleteObject(SMS_CODE + phone);
+            } else {
+                return null;
+            }
+        }
+        return password;
+    }
 }

+ 147 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/domain/Banner.java

@@ -0,0 +1,147 @@
+package com.ruoyi.manage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 轮播图对象 banner
+ * 
+ * @author boman
+ * @date 2025-08-01
+ */
+public class Banner extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long bannerId;
+
+    /** 标题 */
+    @Excel(name = "标题")
+    private String title;
+
+    /** 排序 */
+    @Excel(name = "排序")
+    private Integer sort;
+
+    /** 图片地址 */
+    @Excel(name = "图片地址")
+    private String imgUrl;
+
+    /** 三方链接 */
+    @Excel(name = "三方链接")
+    private String linkUrl;
+
+    /** 内容 */
+    @Excel(name = "内容")
+    private String content;
+
+    /** 类型  */
+    @Excel(name = "类型 ")
+    private Integer type;
+
+    /** 状态 1:启用 2:不启用 */
+    @Excel(name = "状态 1:启用 2:不启用")
+    private String status;
+
+    public void setBannerId(Long bannerId) 
+    {
+        this.bannerId = bannerId;
+    }
+
+    public Long getBannerId() 
+    {
+        return bannerId;
+    }
+
+    public void setTitle(String title) 
+    {
+        this.title = title;
+    }
+
+    public String getTitle() 
+    {
+        return title;
+    }
+
+    public void setSort(Integer sort) 
+    {
+        this.sort = sort;
+    }
+
+    public Integer getSort() 
+    {
+        return sort;
+    }
+
+    public void setImgUrl(String imgUrl) 
+    {
+        this.imgUrl = imgUrl;
+    }
+
+    public String getImgUrl() 
+    {
+        return imgUrl;
+    }
+
+    public void setLinkUrl(String linkUrl) 
+    {
+        this.linkUrl = linkUrl;
+    }
+
+    public String getLinkUrl() 
+    {
+        return linkUrl;
+    }
+
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+
+    public void setType(Integer type) 
+    {
+        this.type = type;
+    }
+
+    public Integer getType() 
+    {
+        return type;
+    }
+
+    public void setStatus(String status) 
+    {
+        this.status = status;
+    }
+
+    public String getStatus() 
+    {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("bannerId", getBannerId())
+            .append("title", getTitle())
+            .append("sort", getSort())
+            .append("imgUrl", getImgUrl())
+            .append("linkUrl", getLinkUrl())
+            .append("content", getContent())
+            .append("type", getType())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/mapper/BannerMapper.java

@@ -0,0 +1,62 @@
+package com.ruoyi.manage.mapper;
+
+import com.ruoyi.manage.domain.Banner;
+
+import java.util.List;
+
+/**
+ * 轮播图Mapper接口
+ * 
+ * @author boman
+ * @date 2025-08-01
+ */
+public interface BannerMapper 
+{
+    /**
+     * 查询轮播图
+     * 
+     * @param bannerId 轮播图主键
+     * @return 轮播图
+     */
+    public Banner selectBannerByBannerId(Long bannerId);
+
+    /**
+     * 查询轮播图列表
+     * 
+     * @param banner 轮播图
+     * @return 轮播图集合
+     */
+    public List<Banner> selectBannerList(Banner banner);
+
+    /**
+     * 新增轮播图
+     * 
+     * @param banner 轮播图
+     * @return 结果
+     */
+    public int insertBanner(Banner banner);
+
+    /**
+     * 修改轮播图
+     * 
+     * @param banner 轮播图
+     * @return 结果
+     */
+    public int updateBanner(Banner banner);
+
+    /**
+     * 删除轮播图
+     * 
+     * @param bannerId 轮播图主键
+     * @return 结果
+     */
+    public int deleteBannerByBannerId(Long bannerId);
+
+    /**
+     * 批量删除轮播图
+     * 
+     * @param bannerIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBannerByBannerIds(Long[] bannerIds);
+}

+ 62 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/service/IBannerService.java

@@ -0,0 +1,62 @@
+package com.ruoyi.manage.service;
+
+import com.ruoyi.manage.domain.Banner;
+
+import java.util.List;
+
+/**
+ * 轮播图Service接口
+ * 
+ * @author boman
+ * @date 2025-08-01
+ */
+public interface IBannerService 
+{
+    /**
+     * 查询轮播图
+     * 
+     * @param bannerId 轮播图主键
+     * @return 轮播图
+     */
+    public Banner selectBannerByBannerId(Long bannerId);
+
+    /**
+     * 查询轮播图列表
+     * 
+     * @param banner 轮播图
+     * @return 轮播图集合
+     */
+    public List<Banner> selectBannerList(Banner banner);
+
+    /**
+     * 新增轮播图
+     * 
+     * @param banner 轮播图
+     * @return 结果
+     */
+    public int insertBanner(Banner banner);
+
+    /**
+     * 修改轮播图
+     * 
+     * @param banner 轮播图
+     * @return 结果
+     */
+    public int updateBanner(Banner banner);
+
+    /**
+     * 批量删除轮播图
+     * 
+     * @param bannerIds 需要删除的轮播图主键集合
+     * @return 结果
+     */
+    public int deleteBannerByBannerIds(Long[] bannerIds);
+
+    /**
+     * 删除轮播图信息
+     * 
+     * @param bannerId 轮播图主键
+     * @return 结果
+     */
+    public int deleteBannerByBannerId(Long bannerId);
+}

+ 97 - 0
ruoyi-system/src/main/java/com/ruoyi/manage/service/impl/BannerServiceImpl.java

@@ -0,0 +1,97 @@
+package com.ruoyi.manage.service.impl;
+
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.manage.domain.Banner;
+import com.ruoyi.manage.mapper.BannerMapper;
+import com.ruoyi.manage.service.IBannerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 轮播图Service业务层处理
+ * 
+ * @author boman
+ * @date 2025-08-01
+ */
+@Service
+public class BannerServiceImpl implements IBannerService 
+{
+    @Autowired
+    private BannerMapper bannerMapper;
+
+    /**
+     * 查询轮播图
+     * 
+     * @param bannerId 轮播图主键
+     * @return 轮播图
+     */
+    @Override
+    public Banner selectBannerByBannerId(Long bannerId)
+    {
+        return bannerMapper.selectBannerByBannerId(bannerId);
+    }
+
+    /**
+     * 查询轮播图列表
+     * 
+     * @param banner 轮播图
+     * @return 轮播图
+     */
+    @Override
+    public List<Banner> selectBannerList(Banner banner)
+    {
+        return bannerMapper.selectBannerList(banner);
+    }
+
+    /**
+     * 新增轮播图
+     * 
+     * @param banner 轮播图
+     * @return 结果
+     */
+    @Override
+    public int insertBanner(Banner banner)
+    {
+        banner.setCreateTime(DateUtils.getNowDate());
+        return bannerMapper.insertBanner(banner);
+    }
+
+    /**
+     * 修改轮播图
+     * 
+     * @param banner 轮播图
+     * @return 结果
+     */
+    @Override
+    public int updateBanner(Banner banner)
+    {
+        banner.setUpdateTime(DateUtils.getNowDate());
+        return bannerMapper.updateBanner(banner);
+    }
+
+    /**
+     * 批量删除轮播图
+     * 
+     * @param bannerIds 需要删除的轮播图主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBannerByBannerIds(Long[] bannerIds)
+    {
+        return bannerMapper.deleteBannerByBannerIds(bannerIds);
+    }
+
+    /**
+     * 删除轮播图信息
+     * 
+     * @param bannerId 轮播图主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBannerByBannerId(Long bannerId)
+    {
+        return bannerMapper.deleteBannerByBannerId(bannerId);
+    }
+}

+ 3 - 3
ruoyi-system/src/main/java/com/ruoyi/manage/service/impl/ColumnNewsServiceImpl.java

@@ -35,9 +35,9 @@ public class ColumnNewsServiceImpl implements IColumnNewsService {
     @Override
     public ColumnNews selectColumnNewsByNewsId(Long newsId) {
         ColumnNews columnNews = columnNewsMapper.selectColumnNewsByNewsId(newsId);
-        String viewsNumOld = redisCache.getCacheObject(COLUMN_NEWS_NUM + newsId);
+        Object viewsNumOld = redisCache.getCacheObject(COLUMN_NEWS_NUM + newsId);
         if (viewsNumOld != null) {
-            viewsNumOld = String.valueOf(Integer.parseInt(viewsNumOld) + 1);
+            viewsNumOld = String.valueOf(Integer.parseInt(viewsNumOld.toString()) + 1);
         }else {
             redisCache.setCacheObject(COLUMN_NEWS_NUM + newsId, 1);
         }
@@ -48,7 +48,7 @@ public class ColumnNewsServiceImpl implements IColumnNewsService {
             //重置计数器
             redisCache.setCacheObject(COLUMN_NEWS_NUM + newsId, ZERO);
         }
-        columnNews.setViewsNum(viewsNumOld);
+        columnNews.setViewsNum(viewsNumOld.toString());
         return columnNews;
     }
 

+ 0 - 1
ruoyi-system/src/main/java/com/ruoyi/mqtt/service/MqttService.java

@@ -117,7 +117,6 @@ public class MqttService {
 
         return future;
     }
-
     /**
      * 发布消息
      *

+ 4 - 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 userName);
     /**
      * 根据条件分页查询用户列表
      * 

+ 15 - 2
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;
+
 /**
  * 用户 业务层
  * 
@@ -17,7 +18,12 @@ public interface ISysUserService
      * @return 用户信息集合信息
      */
     public List<SysUser> selectUserList(SysUser user);
-
+    /**
+     * 校验强密码
+     * @param user
+     * @return
+     */
+    public String checkStrongPwd(SysUser user);
     /**
      * 根据条件分页查询已分配用户角色列表
      * 
@@ -203,4 +209,11 @@ public interface ISysUserService
      * @return 结果
      */
     public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+
+    /**
+     * 根据手机号查询用户信息
+     * @param phonenumber
+     * @return
+     */
+    public SysUser selectUserByPhonenumber(String phonenumber);
 }

+ 5 - 5
ruoyi-system/src/main/java/com/ruoyi/system/service/Task.java

@@ -34,7 +34,7 @@ public class Task {
      * 查询是否是节假日
      */
     @Async
-    @Scheduled(cron = "0 5 0 * * ? ")
+    @Scheduled(cron = "0 26 10 * * ? ")
     public void thirdNucleicAcid() {
         String data = DateUtils.getDate();
         //判断当天天是否是法定节假日  0 上班 1周末 2节假日
@@ -61,7 +61,7 @@ public class Task {
                     String date = DateUtils.getDate();
                     Date dateEnd = DateUtils.parseDate(date + " " + clockBeginAm);
                     //活得差值的秒数
-                    long sec = DateUtils.timeDistanceSec(dateEnd, dateBegin);
+                    long sec = DateUtils.getOffsetSeconds(dateBegin, dateEnd);
                     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
                     Runnable task = () -> mqttService.publish(DETECTION_WORK_STAT, ONE);
                     scheduler.schedule(task, sec, TimeUnit.SECONDS);
@@ -72,7 +72,7 @@ public class Task {
                     String date = DateUtils.getDate();
                     Date dateEnd = DateUtils.parseDate(date + " " + clockEndAm);
                     //活得差值的秒数
-                    long sec = DateUtils.timeDistanceSec(dateEnd, dateBegin);
+                    long sec = DateUtils.getOffsetSeconds(dateBegin, dateEnd);
                     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
                     Runnable task = () -> mqttService.publish(DETECTION_WORK_STAT, ZERO);
                     scheduler.schedule(task, sec, TimeUnit.SECONDS);
@@ -83,7 +83,7 @@ public class Task {
                     String date = DateUtils.getDate();
                     Date dateEnd = DateUtils.parseDate(date + " " + clockBeginPm);
                     //活得差值的秒数
-                    long sec = DateUtils.timeDistanceSec(dateEnd, dateBegin);
+                    long sec = DateUtils.getOffsetSeconds(dateBegin, dateEnd);
                     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
                     Runnable task = () -> mqttService.publish(DETECTION_WORK_STAT, ONE);
                     scheduler.schedule(task, sec, TimeUnit.SECONDS);
@@ -94,7 +94,7 @@ public class Task {
                     String date = DateUtils.getDate();
                     Date dateEnd = DateUtils.parseDate(date + " " + clockEndPm);
                     //活得差值的秒数
-                    long sec = DateUtils.timeDistanceSec(dateEnd, dateBegin);
+                    long sec = DateUtils.getOffsetSeconds(dateBegin, dateEnd);
                     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
                     Runnable task = () -> mqttService.publish(DETECTION_WORK_STAT, ZERO);
                     scheduler.schedule(task, sec, TimeUnit.SECONDS);

+ 41 - 16
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -1,20 +1,11 @@
 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;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.PwdCheckUtil;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanValidators;
@@ -22,14 +13,24 @@ 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;
+
+import static com.ruoyi.common.constant.Constants.ONE;
+import static com.ruoyi.common.constant.Constants.TWO;
 
 /**
  * 用户 业务层处理
@@ -78,9 +79,28 @@ public class SysUserServiceImpl implements ISysUserService
         return userMapper.selectUserList(user);
     }
 
+    @Override
+    public String checkStrongPwd(SysUser user) {
+        String pwd = user.getPassword();
+        String result = TWO;
+        try {
+            if (!PwdCheckUtil.checkPasswordLength(pwd, "8", "16")
+                    || !PwdCheckUtil.checkContainLowerCase(pwd)
+                    || !PwdCheckUtil.checkContainUpperCase(pwd)
+                    || !PwdCheckUtil.checkContainDigit(pwd)
+                    || !PwdCheckUtil.checkContainSpecialChar(pwd)
+            ) {
+                result = ONE;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
     /**
      * 根据条件分页查询已分配用户角色列表
-     * 
+     *
      * @param user 用户信息
      * @return 用户信息集合信息
      */
@@ -547,4 +567,9 @@ public class SysUserServiceImpl implements ISysUserService
         }
         return successMsg.toString();
     }
+
+    @Override
+    public SysUser selectUserByPhonenumber(String phonenumber) {
+        return userMapper.selectUserByPhonenumber(phonenumber);
+    }
 }

+ 107 - 0
ruoyi-system/src/main/resources/mapper/manage/BannerMapper.xml

@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.manage.mapper.BannerMapper">
+    
+    <resultMap type="Banner" id="BannerResult">
+        <result property="bannerId"    column="banner_id"    />
+        <result property="title"    column="title"    />
+        <result property="sort"    column="sort"    />
+        <result property="imgUrl"    column="img_url"    />
+        <result property="linkUrl"    column="link_url"    />
+        <result property="content"    column="content"    />
+        <result property="type"    column="type"    />
+        <result property="status"    column="status"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectBannerVo">
+        select banner_id, title, sort, img_url, link_url, content, type, status, create_by, create_time, update_by, update_time, remark from banner
+    </sql>
+
+    <select id="selectBannerList" parameterType="Banner" resultMap="BannerResult">
+        <include refid="selectBannerVo"/>
+        <where>  
+            <if test="title != null  and title != ''"> and title = #{title}</if>
+            <if test="sort != null "> and sort = #{sort}</if>
+            <if test="imgUrl != null  and imgUrl != ''"> and img_url = #{imgUrl}</if>
+            <if test="linkUrl != null  and linkUrl != ''"> and link_url = #{linkUrl}</if>
+            <if test="content != null  and content != ''"> and content = #{content}</if>
+            <if test="type != null "> and type = #{type}</if>
+            <if test="status != null  and status != ''"> and status = #{status}</if>
+        </where>
+        order by create_time DESC
+    </select>
+    
+    <select id="selectBannerByBannerId" parameterType="Long" resultMap="BannerResult">
+        <include refid="selectBannerVo"/>
+        where banner_id = #{bannerId}
+    </select>
+
+    <insert id="insertBanner" parameterType="Banner" useGeneratedKeys="true" keyProperty="bannerId">
+        insert into banner
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="title != null">title,</if>
+            <if test="sort != null">sort,</if>
+            <if test="imgUrl != null">img_url,</if>
+            <if test="linkUrl != null">link_url,</if>
+            <if test="content != null">content,</if>
+            <if test="type != null">type,</if>
+            <if test="status != null">status,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="title != null">#{title},</if>
+            <if test="sort != null">#{sort},</if>
+            <if test="imgUrl != null">#{imgUrl},</if>
+            <if test="linkUrl != null">#{linkUrl},</if>
+            <if test="content != null">#{content},</if>
+            <if test="type != null">#{type},</if>
+            <if test="status != null">#{status},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateBanner" parameterType="Banner">
+        update banner
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="title != null">title = #{title},</if>
+            <if test="sort != null">sort = #{sort},</if>
+            <if test="imgUrl != null">img_url = #{imgUrl},</if>
+            <if test="linkUrl != null">link_url = #{linkUrl},</if>
+            <if test="content != null">content = #{content},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where banner_id = #{bannerId}
+    </update>
+
+    <delete id="deleteBannerByBannerId" parameterType="Long">
+        delete from banner where banner_id = #{bannerId}
+    </delete>
+
+    <delete id="deleteBannerByBannerIds" parameterType="String">
+        delete from banner where banner_id in 
+        <foreach item="bannerId" collection="array" open="(" separator="," close=")">
+            #{bannerId}
+        </foreach>
+    </delete>
+</mapper>

+ 10 - 1
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -55,7 +55,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		    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
     </sql>
-    
+	<select id="selectUserByPhonenumber" parameterType="String" resultMap="SysUserResult">
+		select u.user_id, u.dept_id, u.user_name, u.nick_name,u.user_type,u.init_face, 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>
     <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
 		select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
 		left join sys_dept d on u.dept_id = d.dept_id