Explorar o código

fix 短信登录,项目中delect put

Administrator hai 1 ano
pai
achega
da804b2cfa
Modificáronse 31 ficheiros con 511 adicións e 150 borrados
  1. 44 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/SendSmsController.java
  2. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
  3. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
  4. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
  5. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
  6. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
  7. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
  8. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
  9. 3 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
  10. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
  11. 1 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
  12. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
  13. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
  14. 2 2
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
  15. 4 3
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
  16. 7 7
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
  17. 16 11
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  18. 5 8
      ruoyi-admin/src/main/resources/application-prod.yml
  19. 2 43
      ruoyi-admin/src/main/resources/application.yml
  20. 6 0
      ruoyi-common/pom.xml
  21. 34 0
      ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java
  22. 1 1
      ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
  23. 10 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
  24. 12 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
  25. 111 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/PwdCheckUtil.java
  26. 132 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java
  27. 54 45
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
  28. 1 1
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
  29. 8 1
      ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
  30. 26 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
  31. 12 2
      ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

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

@@ -0,0 +1,44 @@
+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.domain.model.LoginUser;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.SendSmsUtils;
+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 static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
+
+
+/**
+ * @Author: tjf
+ * @Date: 2024/03/05 17:15
+ * @Describe:
+ */
+@RestController
+@RequestMapping("/sendSms")
+public class SendSmsController {
+    @Autowired
+    private RedisCache redisCache;
+
+    /**
+     * 发送登录短信接口
+     * @return
+     */
+    @PostMapping("/sendLoginSms")
+    @RepeatSubmit(interval = 1000, message = "请求过于频繁")
+    public AjaxResult sendLoginSms(@RequestBody LoginBody user) {
+        String code = SendSmsUtils.getCode(4);
+        String username = user.getUsername();
+        redisCache.setCacheObject(LOGIN_USER_SMS + username, code);
+        String msg = SendSmsUtils.sendPassword(code, username);
+        System.out.println(username+"登录短信发送回复:"+msg);
+        return AjaxResult.success();
+    }
+}

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java

@@ -93,7 +93,7 @@ public class CacheController
     }
 
     @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheName/{cacheName}")
+    @GetMapping("/clearCacheName/{cacheName}")
     public AjaxResult clearCacheName(@PathVariable String cacheName)
     {
         Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
@@ -102,7 +102,7 @@ public class CacheController
     }
 
     @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheKey/{cacheKey}")
+    @GetMapping("/clearCacheKey/{cacheKey}")
     public AjaxResult clearCacheKey(@PathVariable String cacheKey)
     {
         redisTemplate.delete(cacheKey);
@@ -110,7 +110,7 @@ public class CacheController
     }
 
     @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
-    @DeleteMapping("/clearCacheAll")
+    @GetMapping("/clearCacheAll")
     public AjaxResult clearCacheAll()
     {
         Collection<String> cacheKeys = redisTemplate.keys("*");

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java

@@ -56,7 +56,7 @@ public class SysLogininforController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
     @Log(title = "登录日志", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{infoIds}")
+    @GetMapping("/delete/{infoIds}")
     public AjaxResult remove(@PathVariable Long[] infoIds)
     {
         return toAjax(logininforService.deleteLogininforByIds(infoIds));
@@ -64,7 +64,7 @@ public class SysLogininforController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
     @Log(title = "登录日志", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/clean")
+    @GetMapping("/clean")
     public AjaxResult clean()
     {
         logininforService.cleanLogininfor();

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java

@@ -52,7 +52,7 @@ public class SysOperlogController extends BaseController
 
     @Log(title = "操作日志", businessType = BusinessType.DELETE)
     @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
-    @DeleteMapping("/{operIds}")
+    @GetMapping("/delete/{operIds}")
     public AjaxResult remove(@PathVariable Long[] operIds)
     {
         return toAjax(operLogService.deleteOperLogByIds(operIds));
@@ -60,7 +60,7 @@ public class SysOperlogController extends BaseController
 
     @Log(title = "操作日志", businessType = BusinessType.CLEAN)
     @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
-    @DeleteMapping("/clean")
+    @GetMapping("/clean")
     public AjaxResult clean()
     {
         operLogService.cleanOperLog();

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java

@@ -74,7 +74,7 @@ public class SysUserOnlineController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
-    @DeleteMapping("/{tokenId}")
+    @GetMapping("/delete/{tokenId}")
     public AjaxResult forceLogout(@PathVariable String tokenId)
     {
         redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java

@@ -96,7 +96,7 @@ public class SysConfigController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:config:edit')")
     @Log(title = "参数管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysConfig config)
     {
         if (!configService.checkConfigKeyUnique(config))
@@ -112,7 +112,7 @@ public class SysConfigController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{configIds}")
+    @GetMapping("/delete/{configIds}")
     public AjaxResult remove(@PathVariable Long[] configIds)
     {
         configService.deleteConfigByIds(configIds);
@@ -124,7 +124,7 @@ public class SysConfigController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:config:remove')")
     @Log(title = "参数管理", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/refreshCache")
+    @GetMapping("/refreshCache")
     public AjaxResult refreshCache()
     {
         configService.resetConfigCache();

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java

@@ -89,7 +89,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:edit')")
     @Log(title = "部门管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysDept dept)
     {
         Long deptId = dept.getDeptId();
@@ -115,7 +115,7 @@ public class SysDeptController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dept:remove')")
     @Log(title = "部门管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{deptId}")
+    @GetMapping("/delete/{deptId}")
     public AjaxResult remove(@PathVariable Long deptId)
     {
         if (deptService.hasChildByDeptId(deptId))

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java

@@ -100,7 +100,7 @@ public class SysDictDataController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典数据", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysDictData dict)
     {
         dict.setUpdateBy(getUsername());
@@ -112,7 +112,7 @@ public class SysDictDataController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictCodes}")
+    @GetMapping("/delete/{dictCodes}")
     public AjaxResult remove(@PathVariable Long[] dictCodes)
     {
         dictDataService.deleteDictDataByIds(dictCodes);

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java

@@ -84,7 +84,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:edit')")
     @Log(title = "字典类型", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysDictType dict)
     {
         if (!dictTypeService.checkDictTypeUnique(dict))
@@ -100,7 +100,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{dictIds}")
+    @GetMapping("/delete/{dictIds}")
     public AjaxResult remove(@PathVariable Long[] dictIds)
     {
         dictTypeService.deleteDictTypeByIds(dictIds);
@@ -112,7 +112,7 @@ public class SysDictTypeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:dict:remove')")
     @Log(title = "字典类型", businessType = BusinessType.CLEAN)
-    @DeleteMapping("/refreshCache")
+    @GetMapping("/refreshCache")
     public AjaxResult refreshCache()
     {
         dictTypeService.resetDictCache();

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

@@ -24,6 +24,6 @@ public class SysIndexController
     @RequestMapping("/")
     public String index()
     {
-        return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
+        return StringUtils.format("欢迎使用{}政协管理平台,当前版本:v{},请通过地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
     }
 }

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

@@ -46,7 +46,7 @@ public class SysLoginController
         AjaxResult ajax = AjaxResult.success();
         // 生成令牌
         String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
-                loginBody.getUuid());
+                loginBody.getUuid(),loginBody.getType());
         ajax.put(Constants.TOKEN, token);
         return ajax;
     }

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java

@@ -102,7 +102,7 @@ public class SysMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:menu:edit')")
     @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysMenu menu)
     {
         if (!menuService.checkMenuNameUnique(menu))
@@ -126,7 +126,7 @@ public class SysMenuController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:menu:remove')")
     @Log(title = "菜单管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{menuId}")
+    @GetMapping("/delete/{menuId}")
     public AjaxResult remove(@PathVariable("menuId") Long menuId)
     {
         if (menuService.hasChildByMenuId(menuId))

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java

@@ -71,7 +71,7 @@ public class SysNoticeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:notice:edit')")
     @Log(title = "通知公告", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysNotice notice)
     {
         notice.setUpdateBy(getUsername());
@@ -83,7 +83,7 @@ public class SysNoticeController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:notice:remove')")
     @Log(title = "通知公告", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{noticeIds}")
+    @GetMapping("/delete/{noticeIds}")
     public AjaxResult remove(@PathVariable Long[] noticeIds)
     {
         return toAjax(noticeService.deleteNoticeByIds(noticeIds));

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java

@@ -91,7 +91,7 @@ public class SysPostController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:post:edit')")
     @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysPost post)
     {
         if (!postService.checkPostNameUnique(post))
@@ -111,7 +111,7 @@ public class SysPostController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:post:remove')")
     @Log(title = "岗位管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{postIds}")
+    @GetMapping("/delete/{postIds}")
     public AjaxResult remove(@PathVariable Long[] postIds)
     {
         return toAjax(postService.deletePostByIds(postIds));

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

@@ -56,7 +56,7 @@ public class SysProfileController extends BaseController
      * 修改用户
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult updateProfile(@RequestBody SysUser user)
     {
         LoginUser loginUser = getLoginUser();
@@ -86,7 +86,7 @@ public class SysProfileController extends BaseController
      * 重置密码
      */
     @Log(title = "个人信息", businessType = BusinessType.UPDATE)
-    @PutMapping("/updatePwd")
+    @PostMapping("/updatePwd")
     public AjaxResult updatePwd(String oldPassword, String newPassword)
     {
         LoginUser loginUser = getLoginUser();
@@ -100,8 +100,9 @@ public class SysProfileController extends BaseController
         {
             return error("新密码不能与旧密码相同");
         }
+        String plaintext = newPassword;
         newPassword = SecurityUtils.encryptPassword(newPassword);
-        if (userService.resetUserPwd(userName, newPassword) > 0)
+        if (userService.resetUserPwd(userName, newPassword,plaintext) > 0)
         {
             // 更新缓存用户密码
             loginUser.getUser().setPassword(newPassword);

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

@@ -111,7 +111,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -146,7 +146,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/dataScope")
+    @PostMapping("/dataScope")
     public AjaxResult dataScope(@RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -159,7 +159,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
+    @PostMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysRole role)
     {
         roleService.checkRoleAllowed(role);
@@ -173,7 +173,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:remove')")
     @Log(title = "角色管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{roleIds}")
+    @GetMapping("/delete/{roleIds}")
     public AjaxResult remove(@PathVariable Long[] roleIds)
     {
         return toAjax(roleService.deleteRoleByIds(roleIds));
@@ -218,7 +218,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/cancel")
+    @PostMapping("/authUser/cancel")
     public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
     {
         return toAjax(roleService.deleteAuthUser(userRole));
@@ -229,7 +229,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/cancelAll")
+    @PostMapping("/authUser/cancelAll")
     public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
     {
         return toAjax(roleService.deleteAuthUsers(roleId, userIds));
@@ -240,7 +240,7 @@ public class SysRoleController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:role:edit')")
     @Log(title = "角色管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authUser/selectAll")
+    @PostMapping("/authUser/selectAll")
     public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
     {
         roleService.checkRoleDataScope(roleId);

+ 16 - 11
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java

@@ -32,6 +32,8 @@ import com.ruoyi.system.service.ISysPostService;
 import com.ruoyi.system.service.ISysRoleService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.CommonConstants.ONE;
+
 /**
  * 用户信息
  * 
@@ -132,11 +134,11 @@ 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.setPlaintext(user.getPassword());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         return toAjax(userService.insertUser(user));
     }
@@ -146,7 +148,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PostMapping("/put")
     public AjaxResult edit(@Validated @RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
@@ -159,9 +161,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));
@@ -172,7 +173,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "用户管理", businessType = BusinessType.DELETE)
-    @DeleteMapping("/{userIds}")
+    @GetMapping("/delete/{userIds}")
     public AjaxResult remove(@PathVariable Long[] userIds)
     {
         if (ArrayUtils.contains(userIds, getUserId()))
@@ -187,11 +188,15 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/resetPwd")
+    @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.setPlaintext(user.getPassword());
         user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
         user.setUpdateBy(getUsername());
         return toAjax(userService.resetPwd(user));
@@ -202,7 +207,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.UPDATE)
-    @PutMapping("/changeStatus")
+    @PostMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody SysUser user)
     {
         userService.checkUserAllowed(user);
@@ -231,7 +236,7 @@ public class SysUserController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "用户管理", businessType = BusinessType.GRANT)
-    @PutMapping("/authRole")
+    @PostMapping("/authRole")
     public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
     {
         userService.checkUserDataScope(userId);

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

@@ -5,9 +5,9 @@ ruoyi:
     # 版本
     version: 3.8.7
     # 版权年份
-    copyrightYear: 2023
+    copyrightYear: 2024
     # 实例演示开关
-    demoEnabled: true
+    demoEnabled: false
     # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
     profile: /home/ruoyi/uploadPath
     # 获取ip地址开关
@@ -102,8 +102,8 @@ spring:
                 allow:
                 url-pattern: /druid/*
                 # 控制台管理用户名和密码
-                login-username:
-                login-password:
+                login-username: admin
+                login-password: Boman123
             filter:
                 stat:
                     enabled: true
@@ -113,7 +113,4 @@ spring:
                     merge-sql: true
                 wall:
                     config:
-                        multi-statement-allow: true
-
-
-#极光推送
+                        multi-statement-allow: true

+ 2 - 43
ruoyi-admin/src/main/resources/application.yml

@@ -70,47 +70,6 @@ xss:
   # 过滤开关
   enabled: true
   # 排除链接(多个用逗号分隔)
-  excludes: /system/notice,/new/news,/new/news/put
+  excludes: /system/notice
   # 匹配链接
-  urlPatterns: /system/*,/monitor/*,/tool/*
-
-# 微信小程序支付配置信息
-wx:
-  # 微信小程序appid
-  app-id: wx5d36c8939e36eaa6
-  # 小程序密钥
-  app-secret: 09e722ccf7f6bd5224816078536d8cec
-  # 商户号
-  mch-id: 1615686058
-  # 证书序列号
-  mch-serial-no: 5C7B3CAA15A5D622ED23B9DA9B9C4C351BDDF1D2
-  # apiV3密钥
-  api-key: tzsdmgtxcx1937879258888125555541
-  # 回调接口地址
-  notify-url: https://dmgt.qs163.cn/prod-api/wx/pay/payNotify
-  # 证书地址
-  key-path: apiclient_key.pem
-# 支付宝支付相关参数
-ali:
-  # 应用ID ,APPID
-  app-id: 2021000
-  # 商户PID
-  seller-id: 208862198
-  # 支付宝网关
-  gateway-url: https://openapi.alipaydev.com/gateway.do
-  #商户私钥 RSA2私钥
-  merchant-private-key: /IE7GuL7ncnxUFofSBQpS7vdbvVNqmuI+1aT8ratWN9QvPdjjrKXmo79iR+KHe+gz2NsC8nnjsV5sTA21mbnnnO3IUg1qJkbpL7lgKSE3GjH/f+8IGgllIKac/2UfWxbjaVjuSCxND5yHgpZLagO6DxkKID68czt/r602avcJtJ1x6TMwrYyvVrtuSBvy/9iNJPKN8aIt596znIAX+8XXJx7UJ9B1NwoaAUbwvu0Wdk4v9Vw55IOZGIUHVwfW3K3ol2QWPlxIb8cxK4pwvcnk0+dcZ2cU7YDNO0DYYoy4sIXLBvn52TR/FPAgMBAAECggEAQ8itCkCVOKb4O3g3WGCcwXAbQSjMcTuJAZGhEd5auKc0n4ZNYFVKmUg2tDhdzHoQbpV+sDUBZS9+5RVX538+AcKHlZaDCsmzEIHvG86MtYVTry69zZtzfEMASdvwH+VmJZD16NR8ctLJxPk4+iTYm1v1jONojizF4MuEV37NYs1CXcDPzg3iW3QYuTCgqzyD6U1XB8BwpzzxA0spvU97TuTtsuqom57fZVTwvqeyIUcR9t86m4Yt4oSH5k1cWc+rxvcsa+tIoXFo8x4NO/RB0H5Pnpxr5RkLz+PfJ2P4TnN2XunZHFI5GfuxWS6Dry81aV2yKeFp/sDUDED65h8wYQKBgQDPv/sZihsfRhFaCwAr/NWTgv12/rPbPULbsCOVO2mS7KDn4gM4b9xqUVtCmwjVAPVSK4K3RipcmKA4rNa0KH+0Ku109L5ydlErcHTnLJwFirwGezKHwCzT+yBYATLKg4NRJmDDcMJtTQA2tmA3YIC7HKFfjUqnWUR6z6bhucl/GQKBgQCg0q7HtX/a0FjB2RyCSnH03Ujeq250FuLPC/F5EiRx5YkGDnSvvaGdCwXHEYRwN75FIMAssi5hs1EU3OQVYgEtnGDwKvKgmdZySL4g+TfZezmMeoyokZV33KI/3lk16x9IYAR9LCGCMyghWbEd+4EM/WJJavdQ6vShC/sGy69IpwKBgHkhcwMdJ1tAu3VI3LzJGq57vdXYBH5cZdM6DEVC8vebyOXrPf12G4pSDWf0hV3MxT036Wt7GdALnb/t5vH8exlNvk5nNXP/0KwHUeJIfGAu2BrfUkMcpgajceReLoMt0y9JtTm/UV3xe6JrDAa92dE/jEfuVgzlW6xPzvnmHbphAoGAWHCDvT+KeAJrTO7gRqY51LZ8BDeyHhUX1VR0Dmhzsk7P84yvjpVx8rLFEpwHgM6my80e4XV7HC9IP3jZ1Qh4LWT5yhlUJA11aJOoOunSVL72/tHF2E13LNsgPo8/7+7E3UAwN8W1B6yqPOzeAeb1KPeOvWEdcFpE/OthuHL6ibECgYEArFSKaurnzbs01mFICz5P5kDoytM3cII9oZsDktdUVtB6roaVc4gbP4BSCwUH3Abkkm8mNJdcXZB0gRmn+JGhJ0m6CvGCLEefmMndxHuYQAtDYJO78XvAPHokx80U0RSWRQZ6/fEygHctmu9Bj/kHYXiH1lxIo1Dbcu4rvJb9LXc=
-  # 支付宝公钥
-  public-key: /+BlPxc8HG/4p2r+Z4EIzU7gFKkuE1I2xnDdJ+Dm1l//vYsArvtNwIKpOr0/oNfsNLhxhrswX7WEW3tyQopEU//KAhTXpsT0KTeKo8dxpl4FOJ9jrnkdVnxg/I2xY/oM7LeGoREiecJulcCa5cZbEct1OdnLzeQVomLlXUhBXZWyx1OVyzaQDk+X+yA2VY90uPvFcqFRBR5k3Y3fN7/39CTQvYWl+wvMcY4TFwO4j7hvLim9vgI3iyn2rOObMkGTJPlL9VNU5hBnRflBSjWAwIDAQAB
-  # 接口内容加密密钥 对此密钥
-  content-key: +ZyQ==
-  #页面跳转同步通知页面   测试地址  后期需要修改为实际地址
-  return-url: https://www.baidu.com/ali/pay/tradeNotify
-#顺风配置
-sf:
-  #此处替换为您在丰桥平台获取的顾客编码
-  client-code: ZXYJS48Y74BY
-  #生产校验码
-  check-word: BoSL7gKn7aFKht0E0OwEePsM1oo0oJxG
-  #生产环境的地址 -PRO
-  call-url-prod: https://bspgw.sf-express.com/std/service
+  urlPatterns: /system/*,/monitor/*,/tool/*

+ 6 - 0
ruoyi-common/pom.xml

@@ -16,6 +16,12 @@
     </description>
 
     <dependencies>
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.23</version>
+        </dependency>
 
         <!-- Spring框架基本的核心工具 -->
         <dependency>

+ 34 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CommonConstants.java

@@ -0,0 +1,34 @@
+package com.ruoyi.common.constant;
+
+/**公共常量
+ * @Author: tjf
+ * @Date: 2023/2/23 15:01
+ * @Describe:
+ */
+public class CommonConstants {
+    //数字常量
+    public static final String ONE = "1";
+    public static final String TWO = "2";
+    public static final String THR = "3";
+    public static final String FOR = "4";
+    public static final String FIV = "5";
+    public static final String SIX = "6";
+    public static final String SEV = "7";
+    public static final String EIG = "8";
+    public static final String NIN = "9";
+    public static final String TEN = "10";
+    public static final String ELE = "11";
+    public static final String TWE = "12";
+
+    //角色权限
+    //超级管理员
+    public static final String  ADMIN= "admin";
+    //平台管理员
+    public static final String  MANAGE= "manage";
+
+    /**
+     * 短信登录验证码前缀
+     */
+    public static final String LOGIN_USER_SMS = "login_user_sms:";
+
+}

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

@@ -73,6 +73,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;
 }

+ 10 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java

@@ -54,6 +54,8 @@ public class SysUser extends BaseEntity
 
     /** 密码 */
     private String password;
+    /** 明文密码 */
+    private String plaintext;
 
     /** 帐号状态(0正常 1停用) */
     @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
@@ -94,6 +96,14 @@ public class SysUser extends BaseEntity
 
     }
 
+    public String getPlaintext() {
+        return plaintext;
+    }
+
+    public void setPlaintext(String plaintext) {
+        this.plaintext = plaintext;
+    }
+
     public SysUser(Long userId)
     {
         this.userId = userId;

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

@@ -26,6 +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()
     {

+ 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;
+    }
+}

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

@@ -0,0 +1,132 @@
+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;
+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);
+            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 {
+        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;
+    }
+
+    /**
+     * 阿里云批量发送 短信接口,一次最多100个手机号码
+     *
+     * @return
+     * @throws
+     */
+    public static SendBatchSmsResponse sendBatchSms(SendBatchSmsRequest sendBatchSmsRequest){
+        try {
+            com.aliyun.dysmsapi20170525.Client client = SendSmsUtils.createClient();
+            RuntimeOptions runtime = new 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 RuntimeOptions());
+            code = sendSmsResponse.getBody().code;
+        } catch (Exception _error) {
+        }
+        return code;
+    }
+}
+

+ 54 - 45
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java

@@ -1,6 +1,7 @@
 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;
@@ -29,14 +30,16 @@ import com.ruoyi.framework.security.context.AuthenticationContextHolder;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.CommonConstants.LOGIN_USER_SMS;
+import static com.ruoyi.common.constant.CommonConstants.TWO;
+
 /**
  * 登录校验方法
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SysLoginService
-{
+public class SysLoginService {
     @Autowired
     private TokenService tokenService;
 
@@ -45,7 +48,7 @@ public class SysLoginService
 
     @Autowired
     private RedisCache redisCache;
-    
+
     @Autowired
     private ISysUserService userService;
 
@@ -54,43 +57,37 @@ public class SysLoginService
 
     /**
      * 登录验证
-     * 
+     *
      * @param username 用户名
      * @param password 密码
-     * @param code 验证码
-     * @param uuid 唯一标识
+     * @param code     验证码
+     * @param uuid     唯一标识
+     * @param type     登录类型
      * @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);
+        //登录类型校验 如果是短信验证码登录,校验短信验证码是否正确,给密码 查询用户信息后赋值
+        password = validateType(username, type, password, code);
         // 登录前置校验
         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 +99,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);
             redisCache.deleteObject(verifyKey);
-            if (captcha == null)
-            {
+            if (captcha == null) {
                 AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
                 throw new CaptchaExpireException();
             }
-            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,47 +124,63 @@ 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();
         }
     }
 
+    /**
+     * 登录类型校验 如果是短信验证码登录,校验短信验证码是否正确,给密码 查询用户信息后赋值
+     *
+     * @param username 用户名
+     * @param type     登录类型
+     * @param password 用户密码
+     * @param code     短信验证码
+     */
+    public String validateType(String username, String type, String password, String code) {
+        if (TWO.equals(type)) {
+            //校验短信验证码
+            Object cacheObject = redisCache.getCacheObject(LOGIN_USER_SMS + username);
+            if (code.equals(cacheObject)) {
+                //根据用户名查询用户信息
+                SysUser sysUser = userService.selectUserByUserName(username);
+                password = sysUser.getPlaintext();
+            }
+        }
+        return password;
+    }
+
     /**
      * 记录登录信息
      *
      * @param userId 用户ID
      */
-    public void recordLoginInfo(Long userId)
-    {
+    public void recordLoginInfo(Long userId) {
         SysUser sysUser = new SysUser();
         sysUser.setUserId(userId);
         sysUser.setLoginIp(IpUtils.getIpAddr());

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

@@ -83,7 +83,7 @@ public interface SysUserMapper
      * @param password 密码
      * @return 结果
      */
-    public int resetUserPwd(@Param("userName") String userName, @Param("password") String password);
+    public int resetUserPwd(@Param("userName") String userName, @Param("password") String password,@Param("plaintext") String plaintext);
 
     /**
      * 通过用户ID删除用户

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

@@ -90,6 +90,13 @@ public interface ISysUserService
      */
     public boolean checkEmailUnique(SysUser user);
 
+    /**
+     * 校验强密码
+     * @param user
+     * @return
+     */
+    public String checkStrongPwd(SysUser user);
+
     /**
      * 校验用户是否允许操作
      * 
@@ -176,7 +183,7 @@ public interface ISysUserService
      * @param password 密码
      * @return 结果
      */
-    public int resetUserPwd(String userName, String password);
+    public int resetUserPwd(String userName, String password,String plaintext);
 
     /**
      * 通过用户ID删除用户

+ 26 - 2
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -4,6 +4,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import javax.validation.Validator;
+
+import com.ruoyi.common.utils.PwdCheckUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -30,6 +32,9 @@ import com.ruoyi.system.mapper.SysUserRoleMapper;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
+import static com.ruoyi.common.constant.CommonConstants.ONE;
+import static com.ruoyi.common.constant.CommonConstants.TWO;
+
 /**
  * 用户 业务层处理
  * 
@@ -212,6 +217,25 @@ public class SysUserServiceImpl implements ISysUserService
         return UserConstants.UNIQUE;
     }
 
+    @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;
+    }
+
     /**
      * 校验用户是否允许操作
      * 
@@ -370,9 +394,9 @@ public class SysUserServiceImpl implements ISysUserService
      * @return 结果
      */
     @Override
-    public int resetUserPwd(String userName, String password)
+    public int resetUserPwd(String userName, String password,String plaintext)
     {
-        return userMapper.resetUserPwd(userName, password);
+        return userMapper.resetUserPwd(userName, password,plaintext);
     }
 
     /**

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

@@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="sex"          column="sex"          />
         <result property="avatar"       column="avatar"       />
         <result property="password"     column="password"     />
+        <result property="plaintext"     column="plaintext"     />
         <result property="status"       column="status"       />
         <result property="delFlag"      column="del_flag"     />
         <result property="loginIp"      column="login_ip"     />
@@ -121,7 +122,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</select>
 	
 	<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
-	    <include refid="selectUserVo"/>
+		select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password,u.plaintext, 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.user_name = #{userName} and u.del_flag = '0'
 	</select>
 	
@@ -153,6 +160,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
  			<if test="sex != null and sex != ''">sex,</if>
  			<if test="password != null and password != ''">password,</if>
+ 			<if test="plaintext != null and plaintext != ''">plaintext,</if>
  			<if test="status != null and status != ''">status,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
  			<if test="remark != null and remark != ''">remark,</if>
@@ -167,6 +175,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
  			<if test="sex != null and sex != ''">#{sex},</if>
  			<if test="password != null and password != ''">#{password},</if>
+ 			<if test="plaintext != null and plaintext != ''">#{plaintext},</if>
  			<if test="status != null and status != ''">#{status},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
  			<if test="remark != null and remark != ''">#{remark},</if>
@@ -185,6 +194,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="sex != null and sex != ''">sex = #{sex},</if>
  			<if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
  			<if test="password != null and password != ''">password = #{password},</if>
+ 			<if test="plaintext != null and plaintext != ''">plaintext = #{plaintext},</if>
  			<if test="status != null and status != ''">status = #{status},</if>
  			<if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
  			<if test="loginDate != null">login_date = #{loginDate},</if>
@@ -204,7 +214,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</update>
 	
 	<update id="resetUserPwd" parameterType="SysUser">
- 		update sys_user set password = #{password} where user_name = #{userName}
+ 		update sys_user set password = #{password} and plaintext = #{plaintext} where user_name = #{userName}
 	</update>
 	
 	<delete id="deleteUserById" parameterType="Long">