diff --git a/README.md b/README.md index 7004f0e50..cbf2da393 100644 --- a/README.md +++ b/README.md @@ -4,26 +4,27 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.4.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-3.5.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.5-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() -[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]() -> RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级(不兼容原框架) +> RuoYi-Vue-Plus 是重写 RuoYi-Vue 针对 `分布式集群` 场景全方位升级(不兼容原框架) > 系统演示: [传送门](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/系统演示?sort_id=4836388) | 功能介绍 | 使用技术 | 文档地址 | 特性注意事项 | |---|---|---|---| | 当前框架 | RuoYi-Vue-Plus | [RuoYi-Vue-Plus文档](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages) | 重写RuoYi-Vue全方位升级(不兼容原框架) | -| satoken分支 | RuoYi-Vue-Plus-satoken | [satoken分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) | 使用satoken重构权限鉴权(公测 可尝试上生产) | +| satoken分支 | RuoYi-Vue-Plus-satoken | [satoken分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/satoken/) | 高可读性 扩展性(推荐使用) | | 单体分支 | RuoYi-Vue-Plus-fast | [fast分支地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/tree/fast/) | 单体应用结构 | +| Vue3分支 | RuoYi-Vue-Plus-UI | [UI地址](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus-UI) | 由于组件还未完善 仅供学习 | | 原框架 | RuoYi-Vue | [RuoYi-Vue官网](http://ruoyi.vip/) | 定期同步需要的功能 | | 前端开发框架 | Vue、Element UI | [Element UI官网](https://element.eleme.cn/#/zh-CN) | | | 后端开发框架 | SpringBoot | [SpringBoot官网](https://spring.io/projects/spring-boot/#learn) | | -| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 Netty 的高性能容器 | +| 容器框架 | Undertow | [Undertow官网](https://undertow.io/) | 基于 XNIO 的高性能容器 | | 权限认证框架 | Spring Security、Jwt | [SpringSecurity官网](https://spring.io/projects/spring-security#learn) | 支持多终端认证系统 | +| 权限认证框架 | Sa-Token、Jwt | [Sa-Token官网](https://sa-token.dev33.cn/) | 强解耦、强扩展 | | 关系数据库 | MySQL | [MySQL官网](https://dev.mysql.com/) | 适配 8.X 最低 5.7 | | 缓存数据库 | Redis | [Redis官网](https://redis.io/) | 适配 6.X 最低 4.X | | 数据库框架 | Mybatis-Plus | [Mybatis-Plus文档](https://baomidou.com/guide/) | 快速 CRUD 增加开发效率 | diff --git a/pom.xml b/pom.xml index 4dd51662f..91fd51af2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,15 +6,15 @@ com.ruoyi ruoyi-vue-plus - 3.4.0 + 3.5.0 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 3.4.0 - 2.5.7 + 3.5.0 + 2.5.8 UTF-8 UTF-8 1.8 @@ -24,27 +24,27 @@ 1.5.22 4.1.2 2.2.11 + 3.3.0 2.3 - 0.9.1 3.4.3.4 3.9.1 - 5.7.16 + 5.7.18 4.9.2 - 2.5.4 - 3.16.4 + 2.5.5 + 3.16.7 2.2.1 - 3.4.1 - 1.3.4 + 3.5.0 + 1.3.6 2.3.0 3.0.1 - 7.8.0 + 7.9.0 3.13.1 5.6.58 - 8.3.3 + 8.3.4 localhost @@ -115,6 +115,12 @@ + + cglib + cglib + ${cglib.version} + + org.apache.velocity @@ -122,13 +128,6 @@ ${velocity.version} - - - io.jsonwebtoken - jjwt - ${jwt.version} - - com.sun.xml.bind @@ -162,7 +161,31 @@ cn.hutool - hutool-all + hutool-core + ${hutool.version} + + + + cn.hutool + hutool-http + ${hutool.version} + + + + cn.hutool + hutool-captcha + ${hutool.version} + + + + cn.hutool + hutool-extra + ${hutool.version} + + + + cn.hutool + hutool-jwt ${hutool.version} @@ -204,29 +227,13 @@ com.yomahub - tlog-spring-boot-configuration - ${tlog.version} - - - - com.yomahub - tlog-webroot + tlog-web-spring-boot-starter ${tlog.version} - - - javassist - org.javassist - - - guava - com.google.guava - - com.yomahub - tlog-xxl-job + tlog-xxljob-spring-boot-starter ${tlog.version} diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 91aa0133f..29d95ddbf 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 jar diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java index 17df95cee..106605ae3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java @@ -3,6 +3,7 @@ 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.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -36,8 +37,8 @@ public class SysLogininforController extends BaseController { @ApiOperation("查询系统访问记录列表") @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')") @GetMapping("/list") - public TableDataInfo list(SysLogininfor logininfor) { - return logininforService.selectPageLogininforList(logininfor); + public TableDataInfo list(SysLogininfor logininfor, PageQuery pageQuery) { + return logininforService.selectPageLogininforList(logininfor, pageQuery); } @ApiOperation("导出系统访问记录列表") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index 0b6ee7f91..8af583277 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -3,6 +3,7 @@ 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.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -36,8 +37,8 @@ public class SysOperlogController extends BaseController { @ApiOperation("查询操作日志记录列表") @PreAuthorize("@ss.hasPermi('monitor:operlog:list')") @GetMapping("/list") - public TableDataInfo list(SysOperLog operLog) { - return operLogService.selectPageOperLogList(operLog); + public TableDataInfo list(SysOperLog operLog, PageQuery pageQuery) { + return operLogService.selectPageOperLogList(operLog, pageQuery); } @ApiOperation("导出操作日志记录列表") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java index 013748376..05917807f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java @@ -7,7 +7,6 @@ import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysUserOnline; @@ -63,7 +62,7 @@ public TableDataInfo list(String ipaddr, String userName) { } Collections.reverse(userOnlineList); userOnlineList.removeAll(Collections.singleton(null)); - return PageUtils.buildDataInfo(userOnlineList); + return TableDataInfo.build(userOnlineList); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java index e2b397d0e..e646b9a86 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java @@ -4,6 +4,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -41,8 +42,8 @@ public class SysConfigController extends BaseController { @ApiOperation("获取参数配置列表") @PreAuthorize("@ss.hasPermi('system:config:list')") @GetMapping("/list") - public TableDataInfo list(SysConfig config) { - return configService.selectPageConfigList(config); + public TableDataInfo list(SysConfig config, PageQuery pageQuery) { + return configService.selectPageConfigList(config, pageQuery); } @ApiOperation("导出参数配置列表") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java index 0a54db315..07cb74e03 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java @@ -3,6 +3,7 @@ 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.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -41,8 +42,8 @@ public class SysDictDataController extends BaseController { @ApiOperation("查询字典数据列表") @PreAuthorize("@ss.hasPermi('system:dict:list')") @GetMapping("/list") - public TableDataInfo list(SysDictData dictData) { - return dictDataService.selectPageDictDataList(dictData); + public TableDataInfo list(SysDictData dictData, PageQuery pageQuery) { + return dictDataService.selectPageDictDataList(dictData, pageQuery); } @ApiOperation("导出字典数据列表") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java index 37e9d8c63..ca43783b2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java @@ -4,6 +4,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; @@ -38,8 +39,8 @@ public class SysDictTypeController extends BaseController { @ApiOperation("查询字典类型列表") @PreAuthorize("@ss.hasPermi('system:dict:list')") @GetMapping("/list") - public TableDataInfo list(SysDictType dictType) { - return dictTypeService.selectPageDictTypeList(dictType); + public TableDataInfo list(SysDictType dictType, PageQuery pageQuery) { + return dictTypeService.selectPageDictTypeList(dictType, pageQuery); } @ApiOperation("导出字典类型列表") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java index bafb720b5..337bf32a3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java @@ -3,6 +3,7 @@ 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.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.system.domain.SysNotice; @@ -36,8 +37,8 @@ public class SysNoticeController extends BaseController { @ApiOperation("获取通知公告列表") @PreAuthorize("@ss.hasPermi('system:notice:list')") @GetMapping("/list") - public TableDataInfo list(SysNotice notice) { - return noticeService.selectPageNoticeList(notice); + public TableDataInfo list(SysNotice notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java index db6ce7e33..803f95ece 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java @@ -4,6 +4,7 @@ import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; @@ -47,8 +48,8 @@ public class SysOssConfigController extends BaseController { @ApiOperation("查询对象存储配置列表") @PreAuthorize("@ss.hasPermi('system:oss:list')") @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo) { - return iSysOssConfigService.queryPageList(bo); + public TableDataInfo list(@Validated(QueryGroup.class) SysOssConfigBo bo, PageQuery pageQuery) { + return iSysOssConfigService.queryPageList(bo, pageQuery); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java index 013f319f0..01e1bd049 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssController.java @@ -10,6 +10,7 @@ import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; @@ -61,8 +62,8 @@ public class SysOssController extends BaseController { @ApiOperation("查询OSS对象存储列表") @PreAuthorize("@ss.hasPermi('system:oss:list')") @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo) { - return iSysOssService.queryPageList(bo); + public TableDataInfo list(@Validated(QueryGroup.class) SysOssBo bo, PageQuery pageQuery) { + return iSysOssService.queryPageList(bo, pageQuery); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java index d115619fa..4f119e411 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java @@ -4,6 +4,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -41,8 +42,8 @@ public class SysPostController extends BaseController { @ApiOperation("获取岗位列表") @PreAuthorize("@ss.hasPermi('system:post:list')") @GetMapping("/list") - public TableDataInfo list(SysPost post) { - return postService.selectPagePostList(post); + public TableDataInfo list(SysPost post, PageQuery pageQuery) { + return postService.selectPagePostList(post, pageQuery); } @ApiOperation("导出岗位列表") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 4261f17e4..ce5af78a1 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -13,7 +13,10 @@ import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.service.ISysOssService; import com.ruoyi.system.service.ISysUserService; -import io.swagger.annotations.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -92,9 +95,9 @@ public AjaxResult updateProfile(@RequestBody SysUser user) { @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") public AjaxResult updatePwd(String oldPassword, String newPassword) { - LoginUser loginUser = getLoginUser(); - String userName = loginUser.getUsername(); - String password = loginUser.getPassword(); + SysUser user = userService.selectUserById(SecurityUtils.getUserId()); + String userName = user.getUserName(); + String password = user.getPassword(); if (!SecurityUtils.matchesPassword(oldPassword, password)) { return AjaxResult.error("修改密码失败,旧密码错误"); } @@ -102,9 +105,6 @@ public AjaxResult updatePwd(String oldPassword, String newPassword) { return AjaxResult.error("新密码不能与旧密码相同"); } if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) { - // 更新缓存用户密码 - loginUser.setPassword(SecurityUtils.encryptPassword(newPassword)); - tokenService.setLoginUser(loginUser); return AjaxResult.success(); } return AjaxResult.error("修改密码异常,请联系管理员"); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java index 19cda5e45..9ddb2178d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java @@ -4,6 +4,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; @@ -46,8 +47,8 @@ public class SysRoleController extends BaseController { @ApiOperation("查询角色信息列表") @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/list") - public TableDataInfo list(SysRole role) { - return roleService.selectPageRoleList(role); + public TableDataInfo list(SysRole role, PageQuery pageQuery) { + return roleService.selectPageRoleList(role, pageQuery); } @ApiOperation("导出角色信息列表") @@ -107,7 +108,7 @@ public AjaxResult edit(@Validated @RequestBody SysRole role) { LoginUser loginUser = getLoginUser(); SysUser sysUser = userService.selectUserById(loginUser.getUserId()); if (StringUtils.isNotNull(sysUser) && !sysUser.isAdmin()) { - loginUser.setPermissions(permissionService.getMenuPermission(sysUser)); + loginUser.setMenuPermissions(permissionService.getMenuPermission(sysUser)); tokenService.setLoginUser(loginUser); } return AjaxResult.success(); @@ -166,8 +167,8 @@ public AjaxResult> optionselect() { @ApiOperation("查询已分配用户角色列表") @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/authUser/allocatedList") - public TableDataInfo allocatedList(SysUser user) { - return userService.selectAllocatedList(user); + public TableDataInfo allocatedList(SysUser user, PageQuery pageQuery) { + return userService.selectAllocatedList(user, pageQuery); } /** @@ -176,8 +177,8 @@ public TableDataInfo allocatedList(SysUser user) { @ApiOperation("查询未分配用户角色列表") @PreAuthorize("@ss.hasPermi('system:role:list')") @GetMapping("/authUser/unallocatedList") - public TableDataInfo unallocatedList(SysUser user) { - return userService.selectUnallocatedList(user); + public TableDataInfo unallocatedList(SysUser user, PageQuery pageQuery) { + return userService.selectUnallocatedList(user, pageQuery); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java index 194c99362..c517b5d10 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java @@ -7,6 +7,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; @@ -59,8 +60,8 @@ public class SysUserController extends BaseController { @ApiOperation("获取用户列表") @PreAuthorize("@ss.hasPermi('system:user:list')") @GetMapping("/list") - public TableDataInfo list(SysUser user) { - return userService.selectPageUserList(user); + public TableDataInfo list(SysUser user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); } @ApiOperation("导出用户列表") diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 015b3028e..c9b246b23 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -51,7 +51,9 @@ spring: # 主库数据源 master: driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true + # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 + # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) + url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true username: root password: root # 从库数据源 diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 1d680d7de..cfa8c7cc4 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -58,7 +58,9 @@ spring: # 主库数据源 master: driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://172.30.0.36:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true + # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562 + # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题) + url: jdbc:mysql://172.30.0.36:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true username: root password: root # 从库数据源 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index f7ef6339d..ae361f402 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -11,7 +11,7 @@ ruoyi: # 获取ip地址开关 addressEnabled: true # 缓存懒加载 - cacheLazy: true + cacheLazy: false captcha: # 页面 <参数设置> 可开启关闭 验证码校验 @@ -53,10 +53,6 @@ logging: org.springframework: warn config: classpath:logback.xml -# tlog 全局访问性能拦截 -tlog: - enable-invoke-time-print: true - # Spring配置 spring: application: @@ -120,11 +116,11 @@ security: - /*/api-docs # druid 监控配置 - /druid/** + # 用户放行 + permit-all: # actuator 监控配置 - /actuator - /actuator/** - # 用户放行 - permit-all: # 重复提交 repeat-submit: diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index ede2df8c8..6db4b42c5 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -2,12 +2,12 @@ not.null=* 必须填写 user.jcaptcha.error=验证码错误 user.jcaptcha.expire=验证码已失效 -user.not.exists=用户不存在/密码错误 +user.not.exists=对不起, 您的账号:{0} 不存在. user.password.not.match=用户不存在/密码错误 user.password.retry.limit.count=密码输入错误{0}次 -user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟 -user.password.delete=对不起,您的账号已被删除 -user.blocked=用户已封禁,请联系管理员 +user.password.retry.limit.exceed=密码错误次数过多,帐户锁定{0}分钟 +user.password.delete=对不起,您的账号:{0} 已被删除 +user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 role.blocked=角色已封禁,请联系管理员 user.logout.success=退出成功 length.not.valid=长度必须在{min}到{max}个字符之间 diff --git a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties index af57cf4e4..c67beab66 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -2,12 +2,12 @@ not.null=* Required fill in user.jcaptcha.error=Captcha error user.jcaptcha.expire=Captcha invalid -user.not.exists=User does not exist/Password error +user.not.exists=Sorry, your account: {0} does not exist user.password.not.match=User does not exist/Password error user.password.retry.limit.count=Password input error {0} times -user.password.retry.limit.exceed=Password input error {0} times, account locked for 10 minutes -user.password.delete=Sorry, your account has been deleted -user.blocked=User disabled,please contact administrators +user.password.retry.limit.exceed=Too many password errors, account locked for {0} minutes +user.password.delete=Sorry, your account:{0} has been deleted +user.blocked=Sorry, your account: {0} has been disabled. Please contact the administrator role.blocked=Role disabled,please contact administrators user.logout.success=Exit successful length.not.valid=The length must be between {min} and {max} characters diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index ede2df8c8..6db4b42c5 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -2,12 +2,12 @@ not.null=* 必须填写 user.jcaptcha.error=验证码错误 user.jcaptcha.expire=验证码已失效 -user.not.exists=用户不存在/密码错误 +user.not.exists=对不起, 您的账号:{0} 不存在. user.password.not.match=用户不存在/密码错误 user.password.retry.limit.count=密码输入错误{0}次 -user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟 -user.password.delete=对不起,您的账号已被删除 -user.blocked=用户已封禁,请联系管理员 +user.password.retry.limit.exceed=密码错误次数过多,帐户锁定{0}分钟 +user.password.delete=对不起,您的账号:{0} 已被删除 +user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 role.blocked=角色已封禁,请联系管理员 user.logout.success=退出成功 length.not.valid=长度必须在{min}到{max}个字符之间 diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 4a0e1a863..a91b5b4f4 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 @@ -64,16 +64,15 @@ easyexcel - - org.yaml - snakeyaml + cglib + cglib - + - io.jsonwebtoken - jjwt + org.yaml + snakeyaml @@ -96,18 +95,41 @@ com.baomidou mybatis-plus-extension + + + + com.baomidou + dynamic-datasource-spring-boot-starter + + cn.hutool - hutool-all + hutool-core + - org.projectlombok - lombok + cn.hutool + hutool-http + + + + cn.hutool + hutool-captcha - de.codecentric - spring-boot-admin-starter-client + cn.hutool + hutool-jwt + + + + cn.hutool + hutool-extra + + + + org.projectlombok + lombok @@ -120,10 +142,6 @@ swagger-annotations - - org.springframework.boot - spring-boot-starter-actuator - org.springframework.boot @@ -141,16 +159,6 @@ lock4j-redisson-spring-boot-starter - - com.yomahub - tlog-spring-boot-configuration - - - - com.yomahub - tlog-webroot - - diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java new file mode 100644 index 000000000..bd2ddece1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataColumn.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限 + * + * @author Lion Li + * @version 3.5.0 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataColumn { + + /** + * 占位符关键字 + */ + String key() default "deptName"; + + /** + * 占位符替换值 + */ + String value() default "dept_id"; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java new file mode 100644 index 000000000..73d9c039c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataPermission.java @@ -0,0 +1,18 @@ +package com.ruoyi.common.annotation; + +import java.lang.annotation.*; + +/** + * 数据权限组 + * + * @author Lion Li + * @version 3.5.0 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataPermission { + + DataColumn[] value(); + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java index feaa3f42c..f1a4f9f34 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java @@ -6,11 +6,14 @@ * 数据权限过滤注解 * * @author ruoyi + * @deprecated 3.6.0 移除 {@link com.ruoyi.common.annotation.DataPermission} */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated public @interface DataScope { + /** * 部门表的别名 */ @@ -25,4 +28,5 @@ * 是否过滤用户权限 */ boolean isUser() default false; + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java index e7d2250a6..9bbc8125e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java @@ -10,11 +10,13 @@ * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 * * @author ruoyi + * @deprecated 3.6.0 移除 使用原生注解处理 方法更全 {@link com.baomidou.dynamic.datasource.annotation.DS} */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited +@Deprecated public @interface DataSource { /** * 切换数据源名称 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 9c91a1a15..76e959dee 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -1,136 +1,151 @@ package com.ruoyi.common.constant; -import io.jsonwebtoken.Claims; /** * 通用常量信息 * * @author ruoyi */ -public class Constants { +public interface Constants { + /** * UTF-8 字符集 */ - public static final String UTF8 = "UTF-8"; + String UTF8 = "UTF-8"; /** * GBK 字符集 */ - public static final String GBK = "GBK"; + String GBK = "GBK"; /** * http请求 */ - public static final String HTTP = "http://"; + String HTTP = "http://"; /** * https请求 */ - public static final String HTTPS = "https://"; + String HTTPS = "https://"; /** * 通用成功标识 */ - public static final String SUCCESS = "0"; + String SUCCESS = "0"; /** * 通用失败标识 */ - public static final String FAIL = "1"; + String FAIL = "1"; /** * 登录成功 */ - public static final String LOGIN_SUCCESS = "Success"; + String LOGIN_SUCCESS = "Success"; /** * 注销 */ - public static final String LOGOUT = "Logout"; + String LOGOUT = "Logout"; /** * 注册 */ - public static final String REGISTER = "Register"; + String REGISTER = "Register"; /** * 登录失败 */ - public static final String LOGIN_FAIL = "Error"; + String LOGIN_FAIL = "Error"; /** * 验证码 redis key */ - public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + String CAPTCHA_CODE_KEY = "captcha_codes:"; /** * 登录用户 redis key */ - public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + String LOGIN_TOKEN_KEY = "login_tokens:"; /** * 防重提交 redis key */ - public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + String REPEAT_SUBMIT_KEY = "repeat_submit:"; /** * 限流 redis key */ - public static final String RATE_LIMIT_KEY = "rate_limit:"; + String RATE_LIMIT_KEY = "rate_limit:"; /** * 验证码有效期(分钟) */ - public static final Integer CAPTCHA_EXPIRATION = 2; + Integer CAPTCHA_EXPIRATION = 2; + + /** + * 登陆错误 redis key + */ + String LOGIN_ERROR = "login_error:"; + + /** + * 登录错误次数 + */ + Integer LOGIN_ERROR_NUMBER = 5; + + /** + * 登录错误限制时间(分钟) + */ + Integer LOGIN_ERROR_LIMIT_TIME = 10; /** * 令牌 */ - public static final String TOKEN = "token"; + String TOKEN = "token"; /** * 令牌前缀 */ - public static final String TOKEN_PREFIX = "Bearer "; + String TOKEN_PREFIX = "Bearer "; /** * 令牌前缀 */ - public static final String LOGIN_USER_KEY = "login_user_key"; + String LOGIN_USER_KEY = "login_user_key"; /** * 用户ID */ - public static final String JWT_USERID = "userid"; + String JWT_USERID = "userid"; /** * 用户名称 */ - public static final String JWT_USERNAME = Claims.SUBJECT; + String JWT_USERNAME = "sub"; /** * 用户头像 */ - public static final String JWT_AVATAR = "avatar"; + String JWT_AVATAR = "avatar"; /** * 创建时间 */ - public static final String JWT_CREATED = "created"; + String JWT_CREATED = "created"; /** * 用户权限 */ - public static final String JWT_AUTHORITIES = "authorities"; + String JWT_AUTHORITIES = "authorities"; /** * 参数管理 cache key */ - public static final String SYS_CONFIG_KEY = "sys_config:"; + String SYS_CONFIG_KEY = "sys_config:"; /** * 字典管理 cache key */ - public static final String SYS_DICT_KEY = "sys_dict:"; + String SYS_DICT_KEY = "sys_dict:"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java index 4d0a4e8a7..60bf88130 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java @@ -5,184 +5,184 @@ * * @author ruoyi */ -public class GenConstants { +public interface GenConstants { /** * 单表(增删改查) */ - public static final String TPL_CRUD = "crud"; + String TPL_CRUD = "crud"; /** * 树表(增删改查) */ - public static final String TPL_TREE = "tree"; + String TPL_TREE = "tree"; /** * 主子表(增删改查) */ - public static final String TPL_SUB = "sub"; + String TPL_SUB = "sub"; /** * 树编码字段 */ - public static final String TREE_CODE = "treeCode"; + String TREE_CODE = "treeCode"; /** * 树父编码字段 */ - public static final String TREE_PARENT_CODE = "treeParentCode"; + String TREE_PARENT_CODE = "treeParentCode"; /** * 树名称字段 */ - public static final String TREE_NAME = "treeName"; + String TREE_NAME = "treeName"; /** * 上级菜单ID字段 */ - public static final String PARENT_MENU_ID = "parentMenuId"; + String PARENT_MENU_ID = "parentMenuId"; /** * 上级菜单名称字段 */ - public static final String PARENT_MENU_NAME = "parentMenuName"; + String PARENT_MENU_NAME = "parentMenuName"; /** * 数据库字符串类型 */ - public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; + String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; /** * 数据库文本类型 */ - public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; /** * 数据库时间类型 */ - public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; /** * 数据库数字类型 */ - public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", - "bit", "bigint", "float", "double", "decimal"}; + String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal"}; /** * BO对象 不需要添加字段 */ - public static final String[] COLUMNNAME_NOT_ADD = {"create_by", "create_time", "del_flag", "update_by", - "update_time", "version"}; + String[] COLUMNNAME_NOT_ADD = {"create_by", "create_time", "del_flag", "update_by", + "update_time", "version"}; /** * BO对象 不需要编辑字段 */ - public static final String[] COLUMNNAME_NOT_EDIT = {"create_by", "create_time", "del_flag", "update_by", - "update_time", "version"}; + String[] COLUMNNAME_NOT_EDIT = {"create_by", "create_time", "del_flag", "update_by", + "update_time", "version"}; /** * VO对象 不需要返回字段 */ - public static final String[] COLUMNNAME_NOT_LIST = {"create_by", "create_time", "del_flag", "update_by", - "update_time", "version"}; + String[] COLUMNNAME_NOT_LIST = {"create_by", "create_time", "del_flag", "update_by", + "update_time", "version"}; /** * BO对象 不需要查询字段 */ - public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", - "update_time", "remark", "version"}; + String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark", "version"}; /** * Entity基类字段 */ - public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime"}; + String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime"}; /** * Tree基类字段 */ - public static final String[] TREE_ENTITY = {"parentName", "parentId", "children"}; + String[] TREE_ENTITY = {"parentName", "parentId", "children"}; /** * 文本框 */ - public static final String HTML_INPUT = "input"; + String HTML_INPUT = "input"; /** * 文本域 */ - public static final String HTML_TEXTAREA = "textarea"; + String HTML_TEXTAREA = "textarea"; /** * 下拉框 */ - public static final String HTML_SELECT = "select"; + String HTML_SELECT = "select"; /** * 单选框 */ - public static final String HTML_RADIO = "radio"; + String HTML_RADIO = "radio"; /** * 复选框 */ - public static final String HTML_CHECKBOX = "checkbox"; + String HTML_CHECKBOX = "checkbox"; /** * 日期控件 */ - public static final String HTML_DATETIME = "datetime"; + String HTML_DATETIME = "datetime"; /** * 图片上传控件 */ - public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + String HTML_IMAGE_UPLOAD = "imageUpload"; /** * 文件上传控件 */ - public static final String HTML_FILE_UPLOAD = "fileUpload"; + String HTML_FILE_UPLOAD = "fileUpload"; /** * 富文本控件 */ - public static final String HTML_EDITOR = "editor"; + String HTML_EDITOR = "editor"; /** * 字符串类型 */ - public static final String TYPE_STRING = "String"; + String TYPE_STRING = "String"; /** * 整型 */ - public static final String TYPE_INTEGER = "Integer"; + String TYPE_INTEGER = "Integer"; /** * 长整型 */ - public static final String TYPE_LONG = "Long"; + String TYPE_LONG = "Long"; /** * 浮点型 */ - public static final String TYPE_DOUBLE = "Double"; + String TYPE_DOUBLE = "Double"; /** * 高精度计算类型 */ - public static final String TYPE_BIGDECIMAL = "BigDecimal"; + String TYPE_BIGDECIMAL = "BigDecimal"; /** * 时间类型 */ - public static final String TYPE_DATE = "Date"; + String TYPE_DATE = "Date"; /** * 模糊查询 */ - public static final String QUERY_LIKE = "LIKE"; + String QUERY_LIKE = "LIKE"; /** * 需要 */ - public static final String REQUIRE = "1"; + String REQUIRE = "1"; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java index fa88e7c17..eebbb4b46 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java @@ -5,108 +5,108 @@ * * @author ruoyi */ -public class UserConstants { +public interface UserConstants { /** * 平台内系统用户的唯一标志 */ - public static final String SYS_USER = "SYS_USER"; + String SYS_USER = "SYS_USER"; /** * 正常状态 */ - public static final String NORMAL = "0"; + String NORMAL = "0"; /** * 异常状态 */ - public static final String EXCEPTION = "1"; + String EXCEPTION = "1"; /** * 用户封禁状态 */ - public static final String USER_DISABLE = "1"; + String USER_DISABLE = "1"; /** * 角色封禁状态 */ - public static final String ROLE_DISABLE = "1"; + String ROLE_DISABLE = "1"; /** * 部门正常状态 */ - public static final String DEPT_NORMAL = "0"; + String DEPT_NORMAL = "0"; /** * 部门停用状态 */ - public static final String DEPT_DISABLE = "1"; + String DEPT_DISABLE = "1"; /** * 字典正常状态 */ - public static final String DICT_NORMAL = "0"; + String DICT_NORMAL = "0"; /** * 是否为系统默认(是) */ - public static final String YES = "Y"; + String YES = "Y"; /** * 是否菜单外链(是) */ - public static final String YES_FRAME = "0"; + String YES_FRAME = "0"; /** * 是否菜单外链(否) */ - public static final String NO_FRAME = "1"; + String NO_FRAME = "1"; /** * 菜单类型(目录) */ - public static final String TYPE_DIR = "M"; + String TYPE_DIR = "M"; /** * 菜单类型(菜单) */ - public static final String TYPE_MENU = "C"; + String TYPE_MENU = "C"; /** * 菜单类型(按钮) */ - public static final String TYPE_BUTTON = "F"; + String TYPE_BUTTON = "F"; /** * Layout组件标识 */ - public final static String LAYOUT = "Layout"; + String LAYOUT = "Layout"; /** * ParentView组件标识 */ - public final static String PARENT_VIEW = "ParentView"; + String PARENT_VIEW = "ParentView"; /** * InnerLink组件标识 */ - public final static String INNER_LINK = "InnerLink"; + String INNER_LINK = "InnerLink"; /** * 校验返回结果码 */ - public final static String UNIQUE = "0"; - public final static String NOT_UNIQUE = "1"; + String UNIQUE = "0"; + String NOT_UNIQUE = "1"; /** * 用户名长度限制 */ - public static final int USERNAME_MIN_LENGTH = 2; - public static final int USERNAME_MAX_LENGTH = 20; + int USERNAME_MIN_LENGTH = 2; + int USERNAME_MAX_LENGTH = 20; /** * 密码长度限制 */ - public static final int PASSWORD_MIN_LENGTH = 5; - public static final int PASSWORD_MAX_LENGTH = 20; + int PASSWORD_MIN_LENGTH = 5; + int PASSWORD_MAX_LENGTH = 20; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java new file mode 100644 index 000000000..d82779ad1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/PageQuery.java @@ -0,0 +1,93 @@ +package com.ruoyi.common.core.domain; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 分页查询实体类 + * + * @author Lion Li + */ + +@Data +@Accessors(chain = true) +public class PageQuery implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 分页大小 + */ + @ApiModelProperty("分页大小") + private Integer pageSize; + + /** + * 当前页数 + */ + @ApiModelProperty("当前页数") + private Integer pageNum; + + /** + * 排序列 + */ + @ApiModelProperty("排序列") + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + @ApiModelProperty(value = "排序的方向", example = "asc,desc") + private String isAsc; + + /** + * 当前记录起始索引 默认值 + */ + public static final int DEFAULT_PAGE_NUM = 1; + + /** + * 每页显示记录数 默认值 默认查全部 + */ + public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + + public Page build() { + Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); + Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); + if (pageNum <= 0) { + pageNum = DEFAULT_PAGE_NUM; + } + Page page = new Page<>(pageNum, pageSize); + OrderItem orderItem = buildOrderItem(); + if (ObjectUtil.isNotNull(orderItem)) { + page.addOrder(orderItem); + } + return page; + } + + private OrderItem buildOrderItem() { + // 兼容前端排序类型 + if ("ascending".equals(isAsc)) { + isAsc = "asc"; + } else if ("descending".equals(isAsc)) { + isAsc = "desc"; + } + if (StringUtils.isNotBlank(orderByColumn)) { + String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); + orderBy = StringUtils.toUnderScoreCase(orderBy); + if ("asc".equals(isAsc)) { + return OrderItem.asc(orderBy); + } else if ("desc".equals(isAsc)) { + return OrderItem.desc(orderBy); + } + } + return null; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java index 30d074b75..8efc9f7a0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java @@ -1,5 +1,6 @@ package com.ruoyi.common.core.domain.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.domain.TreeEntity; @@ -65,6 +66,7 @@ public class SysMenu extends TreeEntity { * 路由参数 */ @ApiModelProperty(value = "路由参数") + @TableField("`query`") private String query; /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 2fa57f5ca..dde679c34 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -48,15 +49,17 @@ public class SysUser extends BaseEntity { * 用户账号 */ @ApiModelProperty(value = "用户账号") - @NotBlank(message = "用户账号不能为空") + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") private String userName; /** * 用户昵称 */ - @ApiModelProperty(value = "用户昵称") - @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + @ApiModelProperty(value = "用户昵称") + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") private String nickName; /** @@ -162,7 +165,7 @@ public String getPassword() { private Long[] postIds; /** - * 角色ID + * 数据权限 当前角色ID */ @ApiModelProperty(value = "角色ID") @TableField(exist = false) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index b138c529a..0506883b2 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -69,9 +69,14 @@ public class LoginUser implements UserDetails { private String os; /** - * 权限列表 + * 菜单权限 */ - private Set permissions; + private Set menuPermissions; + + /** + * 角色权限 + */ + private Set rolePermissions; /** * 用户名 @@ -83,20 +88,6 @@ public class LoginUser implements UserDetails { */ private String password; - public LoginUser(String username, String password, Set permissions) { - this.username = username; - this.password = password; - this.permissions = permissions; - } - - public LoginUser(Long userId, Long deptId, String username, String password, Set permissions) { - this.userId = userId; - this.deptId = deptId; - this.username = username; - this.password = password; - this.permissions = permissions; - } - @JsonIgnore @Override public String getPassword() { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java index ee20abd81..e11ec94ec 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/BaseMapperPlus.java @@ -1,9 +1,18 @@ package com.ruoyi.common.core.mybatisplus.core; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.utils.BeanCopyUtils; import org.apache.ibatis.annotations.Param; +import java.io.Serializable; import java.util.Collection; +import java.util.List; +import java.util.Map; /** * 自定义 Mapper 接口, 实现 自定义扩展 @@ -18,4 +27,72 @@ public interface BaseMapperPlus extends BaseMapper { */ int insertAll(@Param("list") Collection batchList); + /** + * 根据 ID 查询 + */ + default V selectVoById(Serializable id, Class voClass){ + T obj = this.selectById(id); + if (ObjectUtil.isNull(obj)) { + return null; + } + return BeanCopyUtils.copy(obj, voClass); + } + + /** + * 查询(根据ID 批量查询) + */ + default List selectVoBatchIds(Collection idList, Class voClass){ + List list = this.selectBatchIds(idList); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + /** + * 查询(根据 columnMap 条件) + */ + default List selectVoByMap(Map map, Class voClass){ + List list = this.selectByMap(map); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + /** + * 根据 entity 条件,查询一条记录 + */ + default V selectVoOne(Wrapper wrapper, Class voClass) { + T obj = this.selectOne(wrapper); + if (ObjectUtil.isNull(obj)) { + return null; + } + return BeanCopyUtils.copy(obj, voClass); + } + + /** + * 根据 entity 条件,查询全部记录 + */ + default List selectVoList(Wrapper wrapper, Class voClass) { + List list = this.selectList(wrapper); + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return BeanCopyUtils.copyList(list, voClass); + } + + /** + * 分页查询VO + */ + default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + IPage pageData = this.selectPage(page, wrapper); + IPage voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal()); + if (CollUtil.isEmpty(pageData.getRecords())) { + return (P) voPage; + } + voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass)); + return (P) voPage; + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java index 815791bf0..e645562a5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java @@ -1,7 +1,7 @@ package com.ruoyi.common.core.mybatisplus.core; -import cn.hutool.core.bean.copier.CopyOptions; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.PagePlus; @@ -23,14 +23,9 @@ public interface IServicePlus extends IService { /** * @param id 主键id - * @param copyOptions copy条件 * @return V对象 */ - V getVoById(Serializable id, CopyOptions copyOptions); - - default V getVoById(Serializable id) { - return getVoById(id, new CopyOptions()); - } + V getVoById(Serializable id); /** * @param convertor 自定义转换器 @@ -41,14 +36,9 @@ default V getVoById(Serializable id, Function convertor) { /** * @param idList id列表 - * @param copyOptions copy条件 * @return V对象 */ - List listVoByIds(Collection idList, CopyOptions copyOptions); - - default List listVoByIds(Collection idList) { - return listVoByIds(idList, new CopyOptions()); - } + List listVoByIds(Collection idList); /** * @param convertor 自定义转换器 @@ -64,14 +54,9 @@ default List listVoByIds(Collection idList, /** * @param columnMap 表字段 map 对象 - * @param copyOptions copy条件 * @return V对象 */ - List listVoByMap(Map columnMap, CopyOptions copyOptions); - - default List listVoByMap(Map columnMap) { - return listVoByMap(columnMap, new CopyOptions()); - } + List listVoByMap(Map columnMap); /** * @param convertor 自定义转换器 @@ -87,14 +72,9 @@ default List listVoByMap(Map columnMap, /** * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - V getVoOne(Wrapper queryWrapper, CopyOptions copyOptions); - - default V getVoOne(Wrapper queryWrapper) { - return getVoOne(queryWrapper, new CopyOptions()); - } + V getVoOne(Wrapper queryWrapper); /** * @param convertor 自定义转换器 @@ -105,14 +85,9 @@ default V getVoOne(Wrapper queryWrapper, Function convertor) { /** * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - List listVo(Wrapper queryWrapper, CopyOptions copyOptions); - - default List listVo(Wrapper queryWrapper) { - return listVo(queryWrapper, new CopyOptions()); - } + List listVo(Wrapper queryWrapper); /** * @param convertor 自定义转换器 @@ -139,31 +114,36 @@ default List listVo(Function, List> convertor) { /** * @param page 分页对象 * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 + * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} */ - PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions); - - default PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { - return pageVo(page, queryWrapper, new CopyOptions()); - } - - /** - * @param convertor 自定义转换器 - */ + @Deprecated + PagePlus pageVo(PagePlus page, Wrapper queryWrapper); + + /** + * @param convertor 自定义转换器 + * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} + */ + @Deprecated default PagePlus pageVo(PagePlus page, Wrapper queryWrapper, Function, List> convertor) { PagePlus result = getBaseMapper().selectPage(page, queryWrapper); return result.setRecordsVo(convertor.apply(result.getRecords())); } + /** + * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} + */ + @Deprecated default PagePlus pageVo(PagePlus page) { return pageVo(page, Wrappers.emptyWrapper()); } /** * @param convertor 自定义转换器 + * @deprecated 3.6.0 移除 请使用 {@link ServicePlusImpl#pageVo(IPage, Wrapper)} */ + @Deprecated default PagePlus pageVo(PagePlus page, Function, List> convertor) { return pageVo(page, Wrappers.emptyWrapper(), convertor); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java index e9c1f191e..0650cfa97 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java @@ -1,9 +1,9 @@ package com.ruoyi.common.core.mybatisplus.core; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.Assert; @@ -161,81 +161,66 @@ public boolean saveOrUpdateAll(Collection entityList) { /** * 根据 ID 查询 - * - * @param id 主键ID */ @Override - public V getVoById(Serializable id, CopyOptions copyOptions) { - T t = getBaseMapper().selectById(id); - return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + public V getVoById(Serializable id) { + return getBaseMapper().selectVoById(id, voClass); } /** * 查询(根据ID 批量查询) - * - * @param idList 主键ID列表 */ @Override - public List listVoByIds(Collection idList, CopyOptions copyOptions) { - List list = getBaseMapper().selectBatchIds(idList); - if (list == null) { - return null; - } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + public List listVoByIds(Collection idList) { + return getBaseMapper().selectVoBatchIds(idList, voClass); } /** * 查询(根据 columnMap 条件) - * - * @param columnMap 表字段 map 对象 */ @Override - public List listVoByMap(Map columnMap, CopyOptions copyOptions) { - List list = getBaseMapper().selectByMap(columnMap); - if (list == null) { - return null; - } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + public List listVoByMap(Map columnMap) { + return getBaseMapper().selectVoByMap(columnMap, voClass); } /** * 根据 Wrapper,查询一条记录
*

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

- * - * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ @Override - public V getVoOne(Wrapper queryWrapper, CopyOptions copyOptions) { - T t = getOne(queryWrapper, true); - return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + public V getVoOne(Wrapper queryWrapper) { + return getBaseMapper().selectVoOne(queryWrapper, voClass); } /** * 查询列表 - * - * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ @Override - public List listVo(Wrapper queryWrapper, CopyOptions copyOptions) { - List list = getBaseMapper().selectList(queryWrapper); - if (list == null) { - return null; - } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + public List listVo(Wrapper queryWrapper) { + return getBaseMapper().selectVoList(queryWrapper, voClass); } /** * 翻页查询 - * - * @param page 翻页对象 - * @param queryWrapper 实体对象封装操作类 + * @deprecated 3.6.0 移除 请使用 {@link #pageVo(IPage, Wrapper)} */ @Override - public PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions) { + @Deprecated + public PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - List volist = BeanCopyUtils.listCopy(result.getRecords(), copyOptions, voClass); + List volist = BeanCopyUtils.copyList(result.getRecords(), voClass); result.setRecordsVo(volist); return result; } + /** + * 翻页查询 + * + * @param page 翻页对象 + * @param queryWrapper 实体对象封装操作类 + */ + public

> P pageVo(IPage page, Wrapper queryWrapper) { + return getBaseMapper().selectVoPage(page, queryWrapper, voClass); + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java index 79d889cf0..bff381c40 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PagePlus.java @@ -16,9 +16,11 @@ * @param 数据库实体 * @param vo实体 * @author Lion Li + * @deprecated 3.6.0 删除 请使用 {@link com.ruoyi.common.core.domain.PageQuery#build()} */ @Data @Accessors(chain = true) +@Deprecated public class PagePlus implements IPage { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java index 81c596b4f..46b01b94d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java @@ -1,5 +1,7 @@ package com.ruoyi.common.core.page; +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -57,4 +59,29 @@ public TableDataInfo(List list, long total) { this.total = total; } + public static TableDataInfo build(IPage page) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(page.getRecords()); + rspData.setTotal(page.getTotal()); + return rspData; + } + + public static TableDataInfo build(List list) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(list.size()); + return rspData; + } + + public static TableDataInfo build() { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + return rspData; + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java new file mode 100644 index 000000000..7cf3d5e31 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataScopeType.java @@ -0,0 +1,72 @@ +package com.ruoyi.common.enums; + +import com.ruoyi.common.utils.StringUtils; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 数据权限类型 + * + * 语法支持 spel 模板表达式 + * + * 内置数据 user 当前用户 内容参考 SysUser + * 如需扩展数据 可使用 {@link com.ruoyi.common.helper.DataPermissionHelper} 操作 + * 内置服务 sdss 系统数据权限服务 内容参考 SysDataScopeService + * 如需扩展更多自定义服务 可以参考 sdss 自行编写 + * + * @author Lion Li + * @version 3.5.0 + */ +@Getter +@AllArgsConstructor +public enum DataScopeType { + + /** + * 全部数据权限 + */ + ALL("1", "", ""), + + /** + * 自定数据权限 + */ + CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", ""), + + /** + * 部门数据权限 + */ + DEPT("3", " #{#deptName} = #{#user.deptId} ", ""), + + /** + * 部门及以下数据权限 + */ + DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", ""), + + /** + * 仅本人数据权限 + */ + SELF("5", " #{#userName} = #{#user.userId} " , " 1 = 0 "); + + private final String code; + + /** + * 语法 采用 spel 模板表达式 + */ + private final String sqlTemplate; + + /** + * 不满足 sqlTemplate 则填充 + */ + private final String elseSql; + + public static DataScopeType findCode(String code) { + if (StringUtils.isBlank(code)) { + return null; + } + for (DataScopeType type : values()) { + if (type.getCode().equals(code)) { + return type; + } + } + return null; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java index d6fe72864..afa4e14f0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java @@ -7,8 +7,10 @@ * 数据源 * * @author Lion Li + * @deprecated 3.6.0 移除 */ @AllArgsConstructor +@Deprecated public enum DataSourceType { /** * 主库 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java index f626a5e11..9936f6762 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java @@ -5,7 +5,7 @@ import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.exception.ExcelDataConvertException; -import com.alibaba.fastjson.JSON; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.ValidatorUtils; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -84,7 +84,7 @@ public void onException(Exception exception, AnalysisContext context) throws Exc @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { this.headMap = headMap; - log.debug("解析到一条表头数据: {}", JSON.toJSONString(headMap)); + log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); } @Override diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java index 90404854c..2345c2045 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaException.java @@ -9,6 +9,6 @@ public class CaptchaException extends UserException { private static final long serialVersionUID = 1L; public CaptchaException() { - super("user.jcaptcha.error", null); + super("user.jcaptcha.error"); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java index ae5f759f0..bb4c0376f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/CaptchaExpireException.java @@ -9,6 +9,6 @@ public class CaptchaExpireException extends UserException { private static final long serialVersionUID = 1L; public CaptchaExpireException() { - super("user.jcaptcha.expire", null); + super("user.jcaptcha.expire"); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java index 94dbcdd52..99a888056 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserException.java @@ -10,7 +10,7 @@ public class UserException extends BaseException { private static final long serialVersionUID = 1L; - public UserException(String code, Object[] args) { + public UserException(String code, Object... args) { super("user", code, args, null); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java index 0fab11678..863ba7658 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/user/UserPasswordNotMatchException.java @@ -9,6 +9,6 @@ public class UserPasswordNotMatchException extends UserException { private static final long serialVersionUID = 1L; public UserPasswordNotMatchException() { - super("user.password.not.match", null); + super("user.password.not.match"); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java new file mode 100644 index 000000000..96f5425f1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/helper/DataPermissionHelper.java @@ -0,0 +1,45 @@ +package com.ruoyi.common.helper; + +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.utils.ServletUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Map; + +/** + * 数据权限助手 + * + * @author Lion Li + * @version 3.5.0 + */ +@SuppressWarnings("unchecked cast") +public class DataPermissionHelper { + + private static final String DATA_PERMISSION_KEY = "data:permission"; + + public static T getVariable(String key) { + Map context = getContext(); + return (T) context.get(key); + } + + + + public static void setVariable(String key, Object value) { + Map context = getContext(); + context.put(key, value); + } + + public static Map getContext() { + HttpServletRequest request = ServletUtils.getRequest(); + Object attribute = request.getAttribute(DATA_PERMISSION_KEY); + if (ObjectUtil.isNull(attribute)) { + request.setAttribute(DATA_PERMISSION_KEY, new HashMap<>()); + attribute = request.getAttribute(DATA_PERMISSION_KEY); + } + if (attribute instanceof Map) { + return (Map) attribute; + } + throw new NullPointerException("data permission context type exception"); + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java index 8bf40d16a..0bd4a55b9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java @@ -1,66 +1,120 @@ package com.ruoyi.common.utils; -import cn.hutool.core.bean.copier.BeanCopier; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.extra.cglib.CglibUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; /** - * bean深拷贝工具 + * bean深拷贝工具(基于 cglib 性能优异) * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class BeanCopyUtils { /** * 单对象基于class创建拷贝 * - * @param source 数据来源实体 - * @param copyOptions copy条件 - * @param desc 描述对象 转换后的对象 + * @param source 数据来源实体 + * @param desc 描述对象 转换后的对象 * @return desc */ - public static V oneCopy(T source, CopyOptions copyOptions, Class desc) { - V v = ReflectUtil.newInstanceIfPossible(desc); - return oneCopy(source, copyOptions, v); + public static V copy(T source, Class desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CglibUtil.copy(source, desc); } /** * 单对象基于对象创建拷贝 * - * @param source 数据来源实体 - * @param copyOptions copy条件 - * @param desc 转换后的对象 + * @param source 数据来源实体 + * @param desc 转换后的对象 * @return desc */ - public static V oneCopy(T source, CopyOptions copyOptions, V desc) { + public static V copy(T source, V desc) { if (ObjectUtil.isNull(source)) { return null; } - return BeanCopier.create(source, desc, copyOptions).copy(); + if (ObjectUtil.isNull(desc)) { + return null; + } + CglibUtil.copy(source, desc); + return desc; } /** * 列表对象基于class创建拷贝 * - * @param sourceList 数据来源实体列表 - * @param copyOptions copy条件 - * @param desc 描述对象 转换后的对象 + * @param sourceList 数据来源实体列表 + * @param desc 描述对象 转换后的对象 * @return desc */ - public static List listCopy(List sourceList, CopyOptions copyOptions, Class desc) { + public static List copyList(List sourceList, Class desc) { if (ObjectUtil.isNull(sourceList)) { return null; } if (CollUtil.isEmpty(sourceList)) { return CollUtil.newArrayList(); } - return sourceList.stream() - .map(source -> oneCopy(source, copyOptions, desc)) - .collect(Collectors.toList()); + return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc)); + } + + /** + * bean拷贝到map + * + * @param bean 数据来源实体 + * @return map对象 + */ + public static Map copyToMap(T bean) { + if (ObjectUtil.isNull(bean)) { + return null; + } + return CglibUtil.toMap(bean); + } + + /** + * map拷贝到bean + * + * @param map 数据来源 + * @param beanClass bean类 + * @return bean对象 + */ + public static T mapToBean(Map map, Class beanClass) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(beanClass)) { + return null; + } + return CglibUtil.toBean(map, beanClass); + } + + /** + * map拷贝到bean + * + * @param map 数据来源 + * @param bean bean对象 + * @return bean对象 + */ + public static T mapToBean(Map map, T bean) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(bean)) { + return null; + } + return CglibUtil.fillBean(map, bean); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index 1e27f2494..bc38eedd5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -1,5 +1,7 @@ package com.ruoyi.common.utils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.apache.commons.lang3.time.DateFormatUtils; import java.lang.management.ManagementFactory; @@ -12,6 +14,7 @@ * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static String YYYY = "yyyy"; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java deleted file mode 100644 index 3309da14e..000000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.ruoyi.common.utils; - -import cn.hutool.core.collection.CollUtil; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.entity.SysDictData; - -import java.util.Collection; -import java.util.List; - -/** - * 字典工具类 - * - * @author ruoyi - * @deprecated 3.5.0 版本删除 迁移至 {@link com.ruoyi.common.core.service.DictService} - */ -@Deprecated -public class DictUtils { - - /** - * 分隔符 - */ - public static final String SEPARATOR = ","; - - /** - * 设置字典缓存 - * - * @param key 参数键 - * @param dictDatas 字典数据列表 - */ - public static void setDictCache(String key, List dictDatas) { - RedisUtils.setCacheObject(getCacheKey(key), dictDatas); - } - - /** - * 获取字典缓存 - * - * @param key 参数键 - * @return dictDatas 字典数据列表 - */ - public static List getDictCache(String key) { - List dictDatas = RedisUtils.getCacheObject(getCacheKey(key)); - if (StringUtils.isNotNull(dictDatas)) { - return dictDatas; - } - return null; - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @return 字典标签 - */ - public static String getDictLabel(String dictType, String dictValue) { - return getDictLabel(dictType, dictValue, SEPARATOR); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @return 字典值 - */ - public static String getDictValue(String dictType, String dictLabel) { - return getDictValue(dictType, dictLabel, SEPARATOR); - } - - /** - * 根据字典类型和字典值获取字典标签 - * - * @param dictType 字典类型 - * @param dictValue 字典值 - * @param separator 分隔符 - * @return 字典标签 - */ - public static String getDictLabel(String dictType, String dictValue, String separator) { - StringBuilder propertyString = new StringBuilder(); - List datas = getDictCache(dictType); - - if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) { - for (SysDictData dict : datas) { - for (String value : dictValue.split(separator)) { - if (value.equals(dict.getDictValue())) { - propertyString.append(dict.getDictLabel() + separator); - break; - } - } - } - } else { - for (SysDictData dict : datas) { - if (dictValue.equals(dict.getDictValue())) { - return dict.getDictLabel(); - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 根据字典类型和字典标签获取字典值 - * - * @param dictType 字典类型 - * @param dictLabel 字典标签 - * @param separator 分隔符 - * @return 字典值 - */ - public static String getDictValue(String dictType, String dictLabel, String separator) { - StringBuilder propertyString = new StringBuilder(); - List datas = getDictCache(dictType); - - if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) { - for (SysDictData dict : datas) { - for (String label : dictLabel.split(separator)) { - if (label.equals(dict.getDictLabel())) { - propertyString.append(dict.getDictValue() + separator); - break; - } - } - } - } else { - for (SysDictData dict : datas) { - if (dictLabel.equals(dict.getDictLabel())) { - return dict.getDictValue(); - } - } - } - return StringUtils.stripEnd(propertyString.toString(), separator); - } - - /** - * 删除指定字典缓存 - * - * @param key 字典键 - */ - public static void removeDictCache(String key) { - RedisUtils.deleteObject(getCacheKey(key)); - } - - /** - * 清空字典缓存 - */ - public static void clearDictCache() { - Collection keys = RedisUtils.keys(Constants.SYS_DICT_KEY + "*"); - RedisUtils.deleteObject(keys); - } - - /** - * 设置cache key - * - * @param configKey 参数键 - * @return 缓存键key - */ - public static String getCacheKey(String configKey) { - return Constants.SYS_DICT_KEY + configKey; - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java index b65c23dc8..1c01912a3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JsonUtils.java @@ -21,14 +21,18 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class JsonUtils { - private static ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); + private static final ObjectMapper OBJECT_MAPPER = SpringUtils.getBean(ObjectMapper.class); + + public static ObjectMapper getObjectMapper() { + return OBJECT_MAPPER; + } public static String toJsonString(Object object) { if (StringUtils.isNull(object)) { return null; } try { - return objectMapper.writeValueAsString(object); + return OBJECT_MAPPER.writeValueAsString(object); } catch (JsonProcessingException e) { throw new RuntimeException(e); } @@ -39,7 +43,7 @@ public static T parseObject(String text, Class clazz) { return null; } try { - return objectMapper.readValue(text, clazz); + return OBJECT_MAPPER.readValue(text, clazz); } catch (IOException e) { throw new RuntimeException(e); } @@ -50,7 +54,7 @@ public static T parseObject(byte[] bytes, Class clazz) { return null; } try { - return objectMapper.readValue(bytes, clazz); + return OBJECT_MAPPER.readValue(bytes, clazz); } catch (IOException e) { throw new RuntimeException(e); } @@ -61,7 +65,7 @@ public static T parseObject(String text, TypeReference typeReference) { return null; } try { - return objectMapper.readValue(text, typeReference); + return OBJECT_MAPPER.readValue(text, typeReference); } catch (IOException e) { throw new RuntimeException(e); } @@ -72,7 +76,7 @@ public static Map parseMap(String text) { return null; } try { - return objectMapper.readValue(text, new TypeReference>() { + return OBJECT_MAPPER.readValue(text, new TypeReference>() { }); } catch (IOException e) { throw new RuntimeException(e); @@ -84,7 +88,7 @@ public static List parseArray(String text, Class clazz) { return new ArrayList<>(); } try { - return objectMapper.readValue(text, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + return OBJECT_MAPPER.readValue(text, OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java index 039eb2435..c9c091d6f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/MessageUtils.java @@ -1,15 +1,21 @@ package com.ruoyi.common.utils; import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; /** * 获取i18n资源文件 * - * @author ruoyi + * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class MessageUtils { + + private static final MessageSource MESSAGE_SOURCE = SpringUtils.getBean(MessageSource.class); + /** * 根据消息键和参数 获取消息 委托给spring messageSource * @@ -18,7 +24,6 @@ public class MessageUtils { * @return 获取国际化翻译值 */ public static String message(String code, Object... args) { - MessageSource messageSource = SpringUtils.getBean(MessageSource.class); - return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + return MESSAGE_SOURCE.getMessage(code, args, LocaleContextHolder.getLocale()); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java index abc42ddd2..5042de401 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/PageUtils.java @@ -2,11 +2,15 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.sql.SqlUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.List; @@ -14,37 +18,46 @@ * 分页工具 * * @author Lion Li + * @deprecated 3.6.0 删除 请使用 {@link PageQuery} 与 {@link TableDataInfo} */ +@Deprecated +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class PageUtils { /** * 当前记录起始索引 */ + @Deprecated public static final String PAGE_NUM = "pageNum"; /** * 每页显示记录数 */ + @Deprecated public static final String PAGE_SIZE = "pageSize"; /** * 排序列 */ + @Deprecated public static final String ORDER_BY_COLUMN = "orderByColumn"; /** * 排序的方向 "desc" 或者 "asc". */ + @Deprecated public static final String IS_ASC = "isAsc"; /** * 当前记录起始索引 默认值 */ + @Deprecated public static final int DEFAULT_PAGE_NUM = 1; /** * 每页显示记录数 默认值 默认查全部 */ + @Deprecated public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; /** @@ -53,7 +66,10 @@ public class PageUtils { * @param domain 实体 * @param vo 实体 * @return 分页对象 + * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} + * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 */ + @Deprecated public static PagePlus buildPagePlus() { Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM, DEFAULT_PAGE_NUM); Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, DEFAULT_PAGE_SIZE); @@ -70,6 +86,7 @@ public static PagePlus buildPagePlus() { return page; } + @Deprecated public static Page buildPage() { return buildPage(null, null); } @@ -79,7 +96,10 @@ public static Page buildPage() { * * @param domain 实体 * @return 分页对象 + * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} + * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 */ + @Deprecated public static Page buildPage(String defaultOrderByColumn, String defaultIsAsc) { Integer pageNum = ServletUtils.getParameterToInt(PAGE_NUM, DEFAULT_PAGE_NUM); Integer pageSize = ServletUtils.getParameterToInt(PAGE_SIZE, DEFAULT_PAGE_SIZE); @@ -115,6 +135,15 @@ private static OrderItem buildOrderItem(String orderByColumn, String isAsc) { return null; } + /** + * 构建 MP 普通分页对象 + * + * @param domain 实体 + * @return 分页对象 + * @deprecated 3.6.0 删除 请使用 {@link PageQuery#build()} + * 由于使用 Servlet 获取只能从 param 获取 灵活性降低 故将传参操作交给用户 + */ + @Deprecated public static TableDataInfo buildDataInfo(PagePlus page) { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -124,6 +153,10 @@ public static TableDataInfo buildDataInfo(PagePlus page) { return rspData; } + /** + * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build(IPage)} + */ + @Deprecated public static TableDataInfo buildDataInfo(Page page) { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -133,6 +166,10 @@ public static TableDataInfo buildDataInfo(Page page) { return rspData; } + /** + * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build(List)} + */ + @Deprecated public static TableDataInfo buildDataInfo(List list) { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); @@ -142,6 +179,10 @@ public static TableDataInfo buildDataInfo(List list) { return rspData; } + /** + * @deprecated 3.6.0 删除 请使用 {@link TableDataInfo#build()} + */ + @Deprecated public static TableDataInfo buildDataInfo() { TableDataInfo rspData = new TableDataInfo<>(); rspData.setCode(HttpStatus.HTTP_OK); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java index 7f4d2cace..0ccbe0fa5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/RedisUtils.java @@ -1,6 +1,6 @@ package com.ruoyi.common.utils; -import com.google.common.collect.Lists; +import cn.hutool.core.collection.IterUtil; import com.ruoyi.common.utils.spring.SpringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -23,7 +23,7 @@ @SuppressWarnings(value = {"unchecked", "rawtypes"}) public class RedisUtils { - private static RedissonClient client = SpringUtils.getBean(RedissonClient.class); + private static final RedissonClient CLIENT = SpringUtils.getBean(RedissonClient.class); /** * 限流 @@ -35,7 +35,7 @@ public class RedisUtils { * @return -1 表示失败 */ public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) { - RRateLimiter rateLimiter = client.getRateLimiter(key); + RRateLimiter rateLimiter = CLIENT.getRateLimiter(key); rateLimiter.trySetRate(rateType, rate, rateInterval, RateIntervalUnit.SECONDS); if (rateLimiter.tryAcquire()) { return rateLimiter.availablePermits(); @@ -45,10 +45,10 @@ public static long rateLimiter(String key, RateType rateType, int rate, int rate } /** - * 获取实例id + * 获取客户端实例 */ - public static String getClientId() { - return client.getId(); + public static RedissonClient getClient() { + return CLIENT; } /** @@ -59,13 +59,13 @@ public static String getClientId() { * @param consumer 自定义处理 */ public static void publish(String channelKey, T msg, Consumer consumer) { - RTopic topic = client.getTopic(channelKey); + RTopic topic = CLIENT.getTopic(channelKey); topic.publish(msg); consumer.accept(msg); } public static void publish(String channelKey, T msg) { - RTopic topic = client.getTopic(channelKey); + RTopic topic = CLIENT.getTopic(channelKey); topic.publish(msg); } @@ -77,7 +77,7 @@ public static void publish(String channelKey, T msg) { * @param consumer 自定义处理 */ public static void subscribe(String channelKey, Class clazz, Consumer consumer) { - RTopic topic = client.getTopic(channelKey); + RTopic topic = CLIENT.getTopic(channelKey); topic.addListener(clazz, (channel, msg) -> consumer.accept(msg)); } @@ -94,13 +94,13 @@ public static void setCacheObject(final String key, final T value) { /** * 缓存基本的对象,保留当前对象 TTL 有效期 * - * @param key 缓存的键值 - * @param value 缓存的值 + * @param key 缓存的键值 + * @param value 缓存的值 * @param isSaveTtl 是否保留TTL有效期(例如: set之前ttl剩余90 set之后还是为90) * @since Redis 6.X 以上使用 setAndKeepTTL 兼容 5.X 方案 */ public static void setCacheObject(final String key, final T value, final boolean isSaveTtl) { - RBucket bucket = client.getBucket(key); + RBucket bucket = CLIENT.getBucket(key); if (isSaveTtl) { try { bucket.setAndKeepTTL(value); @@ -123,11 +123,24 @@ public static void setCacheObject(final String key, final T value, final boo * @param timeUnit 时间颗粒度 */ public static void setCacheObject(final String key, final T value, final long timeout, final TimeUnit timeUnit) { - RBucket result = client.getBucket(key); + RBucket result = CLIENT.getBucket(key); result.set(value); result.expire(timeout, timeUnit); } + /** + * 注册对象监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addObjectListener(final String key, final ObjectListener listener) { + RBucket result = CLIENT.getBucket(key); + result.addListener(listener); + } + /** * 设置有效时间 * @@ -148,7 +161,7 @@ public static boolean expire(final String key, final long timeout) { * @return true=设置成功;false=设置失败 */ public static boolean expire(final String key, final long timeout, final TimeUnit unit) { - RBucket rBucket = client.getBucket(key); + RBucket rBucket = CLIENT.getBucket(key); return rBucket.expire(timeout, unit); } @@ -159,7 +172,7 @@ public static boolean expire(final String key, final long timeout, final TimeUni * @return 缓存键值对应的数据 */ public static T getCacheObject(final String key) { - RBucket rBucket = client.getBucket(key); + RBucket rBucket = CLIENT.getBucket(key); return rBucket.get(); } @@ -170,29 +183,26 @@ public static T getCacheObject(final String key) { * @return 剩余存活时间 */ public static long getTimeToLive(final String key) { - RBucket rBucket = client.getBucket(key); + RBucket rBucket = CLIENT.getBucket(key); return rBucket.remainTimeToLive(); } /** * 删除单个对象 * - * @param key + * @param key 缓存的键值 */ public static boolean deleteObject(final String key) { - return client.getBucket(key).delete(); + return CLIENT.getBucket(key).delete(); } - /* */ - /** * 删除集合对象 * * @param collection 多个对象 - * @return */ public static void deleteObject(final Collection collection) { - RBatch batch = client.createBatch(); + RBatch batch = CLIENT.createBatch(); collection.forEach(t -> { batch.getBucket(t.toString()).deleteAsync(); }); @@ -207,10 +217,23 @@ public static void deleteObject(final Collection collection) { * @return 缓存的对象 */ public static boolean setCacheList(final String key, final List dataList) { - RList rList = client.getList(key); + RList rList = CLIENT.getList(key); return rList.addAll(dataList); } + /** + * 注册List监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addListListener(final String key, final ObjectListener listener) { + RList rList = CLIENT.getList(key); + rList.addListener(listener); + } + /** * 获得缓存的list对象 * @@ -218,7 +241,7 @@ public static boolean setCacheList(final String key, final List dataList) * @return 缓存键值对应的数据 */ public static List getCacheList(final String key) { - RList rList = client.getList(key); + RList rList = CLIENT.getList(key); return rList.readAll(); } @@ -230,42 +253,68 @@ public static List getCacheList(final String key) { * @return 缓存数据的对象 */ public static boolean setCacheSet(final String key, final Set dataSet) { - RSet rSet = client.getSet(key); + RSet rSet = CLIENT.getSet(key); return rSet.addAll(dataSet); } + /** + * 注册Set监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addSetListener(final String key, final ObjectListener listener) { + RSet rSet = CLIENT.getSet(key); + rSet.addListener(listener); + } + /** * 获得缓存的set * - * @param key - * @return + * @param key 缓存的key + * @return set对象 */ public static Set getCacheSet(final String key) { - RSet rSet = client.getSet(key); + RSet rSet = CLIENT.getSet(key); return rSet.readAll(); } /** * 缓存Map * - * @param key - * @param dataMap + * @param key 缓存的键值 + * @param dataMap 缓存的数据 */ public static void setCacheMap(final String key, final Map dataMap) { if (dataMap != null) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); rMap.putAll(dataMap); } } + /** + * 注册Map监听器 + * + * key 监听器需开启 `notify-keyspace-events` 等 redis 相关配置 + * + * @param key 缓存的键值 + * @param listener 监听器配置 + */ + public static void addMapListener(final String key, final ObjectListener listener) { + RMap rMap = CLIENT.getMap(key); + rMap.addListener(listener); + } + /** * 获得缓存的Map * - * @param key - * @return + * @param key 缓存的键值 + * @return map对象 */ public static Map getCacheMap(final String key) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.getAll(rMap.keySet()); } @@ -277,7 +326,7 @@ public static Map getCacheMap(final String key) { * @param value 值 */ public static void setCacheMapValue(final String key, final String hKey, final T value) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); rMap.put(hKey, value); } @@ -289,7 +338,7 @@ public static void setCacheMapValue(final String key, final String hKey, fin * @return Hash中的对象 */ public static T getCacheMapValue(final String key, final String hKey) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.get(hKey); } @@ -301,7 +350,7 @@ public static T getCacheMapValue(final String key, final String hKey) { * @return Hash中的对象 */ public static T delCacheMapValue(final String key, final String hKey) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.remove(hKey); } @@ -313,7 +362,7 @@ public static T delCacheMapValue(final String key, final String hKey) { * @return Hash对象集合 */ public static Map getMultiCacheMapValue(final String key, final Set hKeys) { - RMap rMap = client.getMap(key); + RMap rMap = CLIENT.getMap(key); return rMap.getAll(hKeys); } @@ -324,7 +373,7 @@ public static Map getMultiCacheMapValue(final String key, final Set * @return 对象列表 */ public static Collection keys(final String pattern) { - Iterable iterable = client.getKeys().getKeysByPattern(pattern); - return Lists.newArrayList(iterable); + Iterable iterable = CLIENT.getKeys().getKeysByPattern(pattern); + return IterUtil.toList(iterable); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java index 91a40ec12..43cb8fe17 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SecurityUtils.java @@ -3,6 +3,8 @@ import cn.hutool.http.HttpStatus; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.ServiceException; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -12,6 +14,7 @@ * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class SecurityUtils { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java index 1e1db3749..5babaeb30 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ServletUtils.java @@ -3,6 +3,8 @@ import cn.hutool.core.convert.Convert; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpStatus; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -19,6 +21,7 @@ * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ServletUtils extends ServletUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 12fc4db9b..f96c1e5a5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -7,6 +7,8 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.*; @@ -15,6 +17,7 @@ * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class StringUtils extends org.apache.commons.lang3.StringUtils { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java index 5be9582ad..1952929dd 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Threads.java @@ -1,7 +1,8 @@ package com.ruoyi.common.utils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.util.concurrent.*; @@ -10,8 +11,9 @@ * * @author ruoyi */ +@Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class Threads { - private static final Logger logger = LoggerFactory.getLogger(Threads.class); /** * sleep等待,单位为毫秒 @@ -38,7 +40,7 @@ public static void shutdownAndAwaitTermination(ExecutorService pool) { if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { pool.shutdownNow(); if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { - logger.info("Pool did not terminate"); + log.info("Pool did not terminate"); } } } catch (InterruptedException ie) { @@ -67,7 +69,7 @@ public static void printException(Runnable r, Throwable t) { } } if (t != null) { - logger.error(t.getMessage(), t); + log.error(t.getMessage(), t); } } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java index a8380a287..76bf864f4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeBuildUtils.java @@ -4,6 +4,8 @@ import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.parser.NodeParser; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.util.List; @@ -12,6 +14,7 @@ * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class TreeBuildUtils extends TreeUtil { /** @@ -19,13 +22,8 @@ public class TreeBuildUtils extends TreeUtil { */ public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); - /** - * 默认树父节点id - */ - public static final Long DEFAULT_PARENT_ID = 0L; - - public static List> build(List list, NodeParser nodeParser) { - return TreeUtil.build(list, DEFAULT_PARENT_ID, DEFAULT_CONFIG, nodeParser); + public static List> build(List list, Long parentId, NodeParser nodeParser) { + return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java index c28cf80fa..522b989b9 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ValidatorUtils.java @@ -1,8 +1,11 @@ package com.ruoyi.common.utils; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; -import javax.validation.Validation; import javax.validation.Validator; import java.util.Set; @@ -11,9 +14,10 @@ * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ValidatorUtils { - private static final Validator VALID = Validation.buildDefaultValidatorFactory().getValidator(); + private static final Validator VALID = SpringUtils.getBean(Validator.class); public static void validate(T object, Class... groups) { Set> validate = VALID.validate(object, groups); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index ff56a2a70..5118d5169 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -1,6 +1,8 @@ package com.ruoyi.common.utils.file; import cn.hutool.core.io.FileUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; @@ -12,6 +14,7 @@ * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class FileUtils extends FileUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java index 808cc8d5c..b519226bb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java @@ -7,6 +7,8 @@ import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.Map; @@ -17,6 +19,7 @@ * @author Lion Li */ @Slf4j +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddressUtils { // IP地址查询 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 6c5dc5fc8..36dc67fa1 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -9,6 +9,8 @@ import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; @@ -21,6 +23,7 @@ * * @author Lion Li */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ExcelUtil { /** diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java index 07ac943c3..0e0d7e7f5 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -2,6 +2,8 @@ import cn.hutool.core.util.ReflectUtil; import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; import java.lang.reflect.Method; @@ -11,6 +13,7 @@ * @author Lion Li */ @SuppressWarnings("rawtypes") +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class ReflectUtils extends ReflectUtil { private static final String SETTER_PREFIX = "set"; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java index 8121e0253..5829a1e91 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java @@ -2,17 +2,26 @@ import com.ruoyi.common.exception.UtilException; import com.ruoyi.common.utils.StringUtils; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; /** * sql操作工具类 * * @author ruoyi */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) public class SqlUtil { + + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare "; + /** * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) */ - public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + public static final String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; /** * 检查字符,防止注入绕过 @@ -30,4 +39,19 @@ public static String escapeOrderBySql(String value) { public static boolean isValidOrderBySql(String value) { return value.matches(SQL_PATTERN); } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) { + if (StringUtils.isEmpty(value)) { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (String sqlKeyword : sqlKeywords) { + if (StringUtils.indexOfIgnoreCase(value, sqlKeyword) > -1) { + throw new UtilException("参数存在SQL注入风险"); + } + } + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java b/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java new file mode 100644 index 000000000..0a26d60a5 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/xss/Xss.java @@ -0,0 +1,26 @@ +package com.ruoyi.common.xss; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义xss校验注解 + * + * @author Lion Li + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER}) +@Constraint(validatedBy = {XssValidator.class}) +public @interface Xss { + + String message() default "不允许任何脚本运行"; + + Class[] groups() default {}; + + Class[] payload() default {}; + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java b/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java new file mode 100644 index 000000000..03102df66 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/xss/XssValidator.java @@ -0,0 +1,21 @@ +package com.ruoyi.common.xss; + +import cn.hutool.core.util.ReUtil; +import cn.hutool.http.HtmlUtil; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 自定义xss校验注解实现 + * + * @author Lion Li + */ +public class XssValidator implements ConstraintValidator { + + @Override + public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { + return !ReUtil.contains(HtmlUtil.RE_HTML_MARK, value); + } + +} diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index 1ca6d92b6..6b0ea78ea 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java index d6e691dbb..54cd4484d 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestBatchController.java @@ -33,10 +33,12 @@ public class TestBatchController extends BaseController { /** * 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大) + * + * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 */ @ApiOperation(value = "新增批量方法") @PostMapping("/add") -// @DataSource(DataSourceType.SLAVE) +// @DS("slave") public AjaxResult add() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { @@ -47,10 +49,12 @@ public AjaxResult add() { /** * 新增或更新 可完美替代 saveOrUpdateBatch 高性能 + * + * 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度 */ @ApiOperation(value = "新增或更新批量方法") @PostMapping("/addOrUpdate") -// @DataSource(DataSourceType.SLAVE) +// @DS("slave") public AjaxResult addOrUpdate() { List list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { @@ -72,7 +76,7 @@ public AjaxResult addOrUpdate() { */ @ApiOperation(value = "删除批量方法") @DeleteMapping() -// @DataSource(DataSourceType.SLAVE) +// @DS("slave") public AjaxResult remove() { return toAjax(iTestDemoService.remove(new LambdaQueryWrapper() .eq(TestDemo::getOrderNum, -1L)) ? 1 : 0); diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index a3b1c7ffa..2d0f43a49 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -5,6 +5,7 @@ import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; @@ -54,8 +55,8 @@ public class TestDemoController extends BaseController { @ApiOperation("查询测试单表列表") @PreAuthorize("@ss.hasPermi('demo:demo:list')") @GetMapping("/list") - public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo) { - return iTestDemoService.queryPageList(bo); + public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.queryPageList(bo, pageQuery); } /** @@ -64,8 +65,8 @@ public TableDataInfo list(@Validated(QueryGroup.class) TestDemoBo bo @ApiOperation("自定义分页查询") @PreAuthorize("@ss.hasPermi('demo:demo:list')") @GetMapping("/page") - public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo) { - return iTestDemoService.customPageList(bo); + public TableDataInfo page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) { + return iTestDemoService.customPageList(bo, pageQuery); } @ApiOperation("导入测试-校验") diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java index 46018b108..63d28368b 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java @@ -1,16 +1,15 @@ package com.ruoyi.demo.domain.bo; +import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; -import javax.validation.constraints.*; - -import java.util.Date; -import com.ruoyi.common.core.domain.BaseEntity; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; /** * 测试单表业务对象 test_demo @@ -66,29 +65,4 @@ public class TestDemoBo extends BaseEntity { @NotBlank(message = "值不能为空", groups = { AddGroup.class, EditGroup.class }) private String value; - - /** - * 分页大小 - */ - @ApiModelProperty("分页大小") - private Integer pageSize; - - /** - * 当前页数 - */ - @ApiModelProperty("当前页数") - private Integer pageNum; - - /** - * 排序列 - */ - @ApiModelProperty("排序列") - private String orderByColumn; - - /** - * 排序的方向desc或者asc - */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java index 2dfe1ff09..c561dd7a1 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java @@ -51,29 +51,4 @@ public class TestTreeBo extends TreeEntity { @NotBlank(message = "树节点名不能为空", groups = { AddGroup.class, EditGroup.class }) private String treeName; - - /** - * 分页大小 - */ - @ApiModelProperty("分页大小") - private Integer pageSize; - - /** - * 当前页数 - */ - @ApiModelProperty("当前页数") - private Integer pageNum; - - /** - * 排序列 - */ - @ApiModelProperty("排序列") - private String orderByColumn; - - /** - * 排序的方向desc或者asc - */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java index dccea6154..7a3cb62d6 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java @@ -1,12 +1,20 @@ package com.ruoyi.demo.mapper; import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.vo.TestDemoVo; import org.apache.ibatis.annotations.Param; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + /** * 测试单表Mapper接口 * @@ -15,6 +23,37 @@ */ public interface TestDemoMapper extends BaseMapperPlus { + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) Page customPageList(@Param("page") Page page, @Param("ew") Wrapper wrapper); + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) +

> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) TestDemo entity); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList); } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java index 05b0153b8..0a7936cfe 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java @@ -1,5 +1,7 @@ package com.ruoyi.demo.mapper; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.demo.domain.TestTree; @@ -9,6 +11,10 @@ * @author Lion Li * @date 2021-07-26 */ +@DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") +}) public interface TestTreeMapper extends BaseMapperPlus { } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java index eb4f21be8..12834d300 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java @@ -1,5 +1,6 @@ package com.ruoyi.demo.service; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.vo.TestDemoVo; import com.ruoyi.demo.domain.bo.TestDemoBo; @@ -26,12 +27,12 @@ public interface ITestDemoService extends IServicePlus { /** * 查询列表 */ - TableDataInfo queryPageList(TestDemoBo bo); + TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery); /** * 自定义分页查询 */ - TableDataInfo customPageList(TestDemoBo bo); + TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery); /** * 查询列表 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java index 4280d509d..a647d241a 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java @@ -1,15 +1,13 @@ package com.ruoyi.demo.service.impl; import cn.hutool.core.bean.BeanUtil; -import com.ruoyi.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ruoyi.common.annotation.DataScope; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; -import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.bo.TestDemoBo; import com.ruoyi.demo.domain.vo.TestDemoVo; @@ -35,24 +33,23 @@ public TestDemoVo queryById(Long id) { return getVoById(id); } - @DataScope(isUser = true) @Override - public TableDataInfo queryPageList(TestDemoBo bo) { - PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); - return PageUtils.buildDataInfo(result); + public TableDataInfo queryPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = pageVo(pageQuery.build(), lqw); + return TableDataInfo.build(result); } /** * 自定义分页查询 */ - @DataScope(isUser = true) @Override - public TableDataInfo customPageList(TestDemoBo bo) { - Page result = baseMapper.customPageList(PageUtils.buildPage(), buildQueryWrapper(bo)); - return PageUtils.buildDataInfo(result); + public TableDataInfo customPageList(TestDemoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.customPageList(pageQuery.build(), lqw); + return TableDataInfo.build(result); } - @DataScope(isUser = true) @Override public List queryList(TestDemoBo bo) { return listVo(buildQueryWrapper(bo)); @@ -60,14 +57,11 @@ public List queryList(TestDemoBo bo) { private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { Map params = bo.getParams(); - Object dataScope = params.get("dataScope"); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey()); lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.apply(dataScope != null && StringUtils.isNotBlank(dataScope.toString()), - dataScope != null ? dataScope.toString() : null); return lqw; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java index e793a86fe..c4097e667 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java @@ -3,7 +3,6 @@ import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.demo.domain.TestTree; @@ -23,7 +22,7 @@ * @author Lion Li * @date 2021-07-26 */ -//@DataSource(DataSourceType.SLAVE) // 切换从库查询 +// @DS("slave") // 切换从库查询 @Service public class TestTreeServiceImpl extends ServicePlusImpl implements ITestTreeService { @@ -32,22 +31,19 @@ public TestTreeVo queryById(Long id) { return getVoById(id); } -// @DataSource(DataSourceType.SLAVE) // 切换从库查询 - @DataScope(isUser = true) +// @DS("slave") // 切换从库查询 @Override public List queryList(TestTreeBo bo) { - return listVo(buildQueryWrapper(bo)); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return listVo(lqw); } private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { Map params = bo.getParams(); - Object dataScope = params.get("dataScope"); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.apply(dataScope != null && StringUtils.isNotBlank(dataScope.toString()), - dataScope != null ? dataScope.toString() : null); return lqw; } diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index ccd525cec..f0ae61d49 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 177c9af3e..4b0d591c9 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-extend com.ruoyi - 3.4.0 + 3.5.0 4.0.0 jar diff --git a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java index 7335e2f25..04a0fdef0 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java +++ b/ruoyi-extend/ruoyi-monitor-admin/src/main/java/com/ruoyi/monitor/admin/config/SecurityConfig.java @@ -2,7 +2,6 @@ import de.codecentric.boot.admin.server.config.AdminServerProperties; import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @@ -15,7 +14,6 @@ */ @Configuration @EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, proxyTargetClass = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { private final String adminContextPath; @@ -34,8 +32,8 @@ protected void configure(HttpSecurity httpSecurity) throws Exception { //授予对所有静态资产和登录页面的公共访问权限。 .antMatchers(adminContextPath + "/assets/**").permitAll() .antMatchers(adminContextPath + "/login").permitAll() - .antMatchers("/actuator").anonymous() - .antMatchers("/actuator/**").anonymous() + .antMatchers("/actuator").permitAll() + .antMatchers("/actuator/**").permitAll() //必须对每个其他请求进行身份验证 .anyRequest().authenticated().and() //配置登录和注销 diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml index 29786ee06..640628e35 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml +++ b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ ruoyi-extend com.ruoyi - 3.4.0 + 3.5.0 ruoyi-xxl-job-admin jar @@ -102,6 +102,7 @@ org.apache.maven.plugins maven-resources-plugin + 2.6 ttf diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java index 57c1c08d2..e55b890fa 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/CookieInterceptor.java @@ -3,8 +3,8 @@ import com.xxl.job.admin.core.util.FtlUtil; import com.xxl.job.admin.core.util.I18nUtil; import org.springframework.stereotype.Component; +import org.springframework.web.servlet.AsyncHandlerInterceptor; import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -17,7 +17,7 @@ * @author xuxueli 2015-12-12 18:09:04 */ @Component -public class CookieInterceptor extends HandlerInterceptorAdapter { +public class CookieInterceptor implements AsyncHandlerInterceptor { @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @@ -36,8 +36,8 @@ public void postHandle(HttpServletRequest request, HttpServletResponse response, if (modelAndView != null) { modelAndView.addObject("I18nUtil", FtlUtil.generateStaticModel(I18nUtil.class.getName())); } - - super.postHandle(request, response, handler, modelAndView); + + AsyncHandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } - + } diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index 5202c2903..19eac7355 100644 --- a/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/ruoyi-extend/ruoyi-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -6,7 +6,7 @@ import com.xxl.job.admin.service.LoginService; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import org.springframework.web.servlet.AsyncHandlerInterceptor; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -18,16 +18,16 @@ * @author xuxueli 2015-12-12 18:09:04 */ @Component -public class PermissionInterceptor extends HandlerInterceptorAdapter { +public class PermissionInterceptor implements AsyncHandlerInterceptor { @Resource private LoginService loginService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - + if (!(handler instanceof HandlerMethod)) { - return super.preHandle(request, response, handler); + return AsyncHandlerInterceptor.super.preHandle(request, response, handler); } // if need login @@ -53,7 +53,7 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); } - return super.preHandle(request, response, handler); + return AsyncHandlerInterceptor.super.preHandle(request, response, handler); } - + } diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index d5466af29..fe60db377 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 @@ -46,23 +46,33 @@ druid-spring-boot-starter - - - com.baomidou - dynamic-datasource-spring-boot-starter - p6spy p6spy + + org.springframework.boot + spring-boot-starter-actuator + + + + de.codecentric + spring-boot-admin-starter-client + + com.ruoyi ruoyi-common + + com.yomahub + tlog-web-spring-boot-starter + + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java index 40cedcaff..1a0d8e042 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java @@ -8,22 +8,21 @@ import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; -import java.util.Map; - /** * 数据过滤处理 * * @author Lion Li + * @deprecated 3.6.0 移除 {@link com.ruoyi.framework.handler.PlusDataPermissionHandler} */ @Aspect @Component +@Deprecated public class DataScopeAspect { /** @@ -137,9 +136,6 @@ private static void putDataScope(JoinPoint joinPoint, String sql) { if (params instanceof BaseEntity) { BaseEntity baseEntity = (BaseEntity) params; baseEntity.getParams().put(DATA_SCOPE, sql); - } else { - Map invoke = ReflectUtils.invokeGetter(params, "params"); - invoke.put(DATA_SCOPE, sql); } } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java index 45ffe3bca..0b1c898b3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java @@ -18,10 +18,12 @@ * 多数据源处理 * * @author Lion Li + * @deprecated 3.6.0 移除 使用原生方法处理 功能更全 */ @Aspect @Order(-500) @Component +@Deprecated public class DataSourceAspect { @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java index df4d9c877..ce3de2bea 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/RateLimiterAspect.java @@ -54,7 +54,7 @@ public String getCombineKey(RateLimiter rateLimiter, JoinPoint point) { stringBuffer.append(ServletUtils.getClientIP()).append("-"); } else if (rateLimiter.limitType() == LimitType.CLUSTER){ // 获取客户端实例id - stringBuffer.append(RedisUtils.getClientId()).append("-"); + stringBuffer.append(RedisUtils.getClient().getId()).append("-"); } MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java index db81b7437..5daaa9acd 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java @@ -1,6 +1,9 @@ package com.ruoyi.framework.config; +import cn.hutool.core.net.NetUtil; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; +import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.injector.ISqlInjector; @@ -10,6 +13,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.ruoyi.common.core.mybatisplus.methods.InsertAll; import com.ruoyi.framework.handler.CreateAndUpdateMetaObjectHandler; +import com.ruoyi.framework.interceptor.PlusDataPermissionInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,6 +34,8 @@ public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 数据权限处理 + interceptor.addInnerInterceptor(dataPermissionInterceptor()); // 分页插件 interceptor.addInnerInterceptor(paginationInnerInterceptor()); // 乐观锁插件 @@ -37,6 +43,13 @@ public MybatisPlusInterceptor mybatisPlusInterceptor() { return interceptor; } + /** + * 数据权限拦截器 + */ + public PlusDataPermissionInterceptor dataPermissionInterceptor() { + return new PlusDataPermissionInterceptor(); + } + /** * 分页插件,自动识别数据库类型 */ @@ -79,24 +92,33 @@ public List getMethodList(Class mapperClass, TableInfo tableI }; } + /** + * 使用网卡信息绑定雪花生成器 + * 防止集群雪花ID重复 + */ + @Bean + public IdentifierGenerator idGenerator() { + return new DefaultIdentifierGenerator(NetUtil.getLocalhost()); + } + /** * PaginationInnerInterceptor 分页插件,自动识别数据库类型 - * https://baomidou.com/guide/interceptor-pagination.html + * https://baomidou.com/pages/97710a/ * OptimisticLockerInnerInterceptor 乐观锁插件 - * https://baomidou.com/guide/interceptor-optimistic-locker.html + * https://baomidou.com/pages/0d93c0/ * MetaObjectHandler 元对象字段填充控制器 - * https://baomidou.com/guide/auto-fill-metainfo.html + * https://baomidou.com/pages/4c6bcf/ * ISqlInjector sql注入器 - * https://baomidou.com/guide/sql-injector.html + * https://baomidou.com/pages/42ea4a/ * BlockAttackInnerInterceptor 如果是对全表的删除或更新操作,就会终止该操作 - * https://baomidou.com/guide/interceptor-block-attack.html + * https://baomidou.com/pages/f9a237/ * IllegalSQLInnerInterceptor sql性能规范插件(垃圾SQL拦截) * IdentifierGenerator 自定义主键策略 - * https://baomidou.com/guide/id-generator.html + * https://baomidou.com/pages/568eb2/ * TenantLineInnerInterceptor 多租户插件 - * https://baomidou.com/guide/interceptor-tenant-line.html + * https://baomidou.com/pages/aef2f2/ * DynamicTableNameInnerInterceptor 动态表名插件 - * https://baomidou.com/guide/interceptor-dynamic-table-name.html + * https://baomidou.com/pages/2a45ff/ */ } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java index d7ae1cdce..6fa54e2a3 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * redis配置 @@ -34,158 +35,164 @@ @EnableCaching public class RedisConfig extends CachingConfigurerSupport { - private static final String REDIS_PROTOCOL_PREFIX = "redis://"; - private static final String REDISS_PROTOCOL_PREFIX = "rediss://"; + private static final String REDIS_PROTOCOL_PREFIX = "redis://"; + private static final String REDISS_PROTOCOL_PREFIX = "rediss://"; - @Autowired - private RedisProperties redisProperties; + @Autowired + private RedisProperties redisProperties; - @Autowired - private RedissonProperties redissonProperties; + @Autowired + private RedissonProperties redissonProperties; - @Bean(destroyMethod = "shutdown") - @ConditionalOnMissingBean(RedissonClient.class) - public RedissonClient redisson() throws IOException { - String prefix = REDIS_PROTOCOL_PREFIX; - if (redisProperties.isSsl()) { - prefix = REDISS_PROTOCOL_PREFIX; - } - Config config = new Config(); - config.setThreads(redissonProperties.getThreads()) - .setNettyThreads(redissonProperties.getNettyThreads()) - .setCodec(JsonJacksonCodec.INSTANCE) - .setTransportMode(redissonProperties.getTransportMode()); + @Bean(destroyMethod = "shutdown") + @ConditionalOnMissingBean(RedissonClient.class) + public RedissonClient redisson() throws IOException { + String prefix = REDIS_PROTOCOL_PREFIX; + if (redisProperties.isSsl()) { + prefix = REDISS_PROTOCOL_PREFIX; + } + Config config = new Config(); + config.setThreads(redissonProperties.getThreads()) + .setNettyThreads(redissonProperties.getNettyThreads()) + .setCodec(JsonJacksonCodec.INSTANCE) + .setTransportMode(redissonProperties.getTransportMode()); - RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); - if (ObjectUtil.isNotNull(singleServerConfig)) { - // 使用单机模式 - config.useSingleServer() - .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()) - .setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue()) - .setDatabase(redisProperties.getDatabase()) - .setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null) - .setTimeout(singleServerConfig.getTimeout()) - .setRetryAttempts(singleServerConfig.getRetryAttempts()) - .setRetryInterval(singleServerConfig.getRetryInterval()) - .setSubscriptionsPerConnection(singleServerConfig.getSubscriptionsPerConnection()) - .setClientName(singleServerConfig.getClientName()) - .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) - .setSubscriptionConnectionMinimumIdleSize(singleServerConfig.getSubscriptionConnectionMinimumIdleSize()) - .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize()) - .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize()) - .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()) - .setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval()); - } - // 集群配置方式 参考下方注释 - RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig(); - if (ObjectUtil.isNotNull(clusterServersConfig)) { - // 使用集群模式 - config.useClusterServers() - .setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue()) - .setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null) - .setTimeout(clusterServersConfig.getTimeout()) - .setRetryAttempts(clusterServersConfig.getRetryAttempts()) - .setRetryInterval(clusterServersConfig.getRetryInterval()) - .setSubscriptionsPerConnection(clusterServersConfig.getSubscriptionsPerConnection()) - .setClientName(clusterServersConfig.getClientName()) - .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout()) - .setPingConnectionInterval(clusterServersConfig.getPingConnectionInterval()) - .setSubscriptionConnectionMinimumIdleSize(clusterServersConfig.getSubscriptionConnectionMinimumIdleSize()) - .setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize()) - .setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize()) - .setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize()) - .setSlaveConnectionMinimumIdleSize(clusterServersConfig.getSlaveConnectionMinimumIdleSize()) - .setSlaveConnectionPoolSize(clusterServersConfig.getSlaveConnectionPoolSize()) - .setDnsMonitoringInterval(clusterServersConfig.getDnsMonitoringInterval()) - .setFailedSlaveReconnectionInterval(clusterServersConfig.getFailedSlaveReconnectionInterval()) - .setScanInterval(clusterServersConfig.getScanInterval()) - .setReadMode(clusterServersConfig.getReadMode()) - .setSubscriptionMode(clusterServersConfig.getSubscriptionMode()) - .setNodeAddresses(redisProperties.getCluster().getNodes()); - } - RedissonClient redissonClient = Redisson.create(config); - log.info("初始化 redis 配置"); - return redissonClient; - } + RedissonProperties.SingleServerConfig singleServerConfig = redissonProperties.getSingleServerConfig(); + if (ObjectUtil.isNotNull(singleServerConfig)) { + // 使用单机模式 + config.useSingleServer() + .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()) + .setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue()) + .setDatabase(redisProperties.getDatabase()) + .setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null) + .setTimeout(singleServerConfig.getTimeout()) + .setRetryAttempts(singleServerConfig.getRetryAttempts()) + .setRetryInterval(singleServerConfig.getRetryInterval()) + .setSubscriptionsPerConnection(singleServerConfig.getSubscriptionsPerConnection()) + .setClientName(singleServerConfig.getClientName()) + .setIdleConnectionTimeout(singleServerConfig.getIdleConnectionTimeout()) + .setSubscriptionConnectionMinimumIdleSize(singleServerConfig.getSubscriptionConnectionMinimumIdleSize()) + .setSubscriptionConnectionPoolSize(singleServerConfig.getSubscriptionConnectionPoolSize()) + .setConnectionMinimumIdleSize(singleServerConfig.getConnectionMinimumIdleSize()) + .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize()) + .setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval()); + } + // 集群配置方式 参考下方注释 + RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig(); + if (ObjectUtil.isNotNull(clusterServersConfig)) { + // 使用集群模式 + String finalPrefix = prefix; + List nodes = redisProperties.getCluster().getNodes() + .stream() + .map(node -> finalPrefix + node) + .collect(Collectors.toList()); - /** - * 整合spring-cache - */ - @Bean - public CacheManager cacheManager(RedissonClient redissonClient) { - List cacheGroup = redissonProperties.getCacheGroup(); - Map config = new HashMap<>(); - for (RedissonProperties.CacheGroup group : cacheGroup) { - CacheConfig cacheConfig = new CacheConfig(group.getTtl(), group.getMaxIdleTime()); - cacheConfig.setMaxSize(group.getMaxSize()); - config.put(group.getGroupId(), cacheConfig); - } - return new RedissonSpringCacheManager(redissonClient, config, JsonJacksonCodec.INSTANCE); - } + config.useClusterServers() + .setConnectTimeout(((Long) redisProperties.getTimeout().toMillis()).intValue()) + .setPassword(StringUtils.isNotBlank(redisProperties.getPassword()) ? redisProperties.getPassword() : null) + .setTimeout(clusterServersConfig.getTimeout()) + .setRetryAttempts(clusterServersConfig.getRetryAttempts()) + .setRetryInterval(clusterServersConfig.getRetryInterval()) + .setSubscriptionsPerConnection(clusterServersConfig.getSubscriptionsPerConnection()) + .setClientName(clusterServersConfig.getClientName()) + .setIdleConnectionTimeout(clusterServersConfig.getIdleConnectionTimeout()) + .setPingConnectionInterval(clusterServersConfig.getPingConnectionInterval()) + .setSubscriptionConnectionMinimumIdleSize(clusterServersConfig.getSubscriptionConnectionMinimumIdleSize()) + .setSubscriptionConnectionPoolSize(clusterServersConfig.getSubscriptionConnectionPoolSize()) + .setMasterConnectionMinimumIdleSize(clusterServersConfig.getMasterConnectionMinimumIdleSize()) + .setMasterConnectionPoolSize(clusterServersConfig.getMasterConnectionPoolSize()) + .setSlaveConnectionMinimumIdleSize(clusterServersConfig.getSlaveConnectionMinimumIdleSize()) + .setSlaveConnectionPoolSize(clusterServersConfig.getSlaveConnectionPoolSize()) + .setDnsMonitoringInterval(clusterServersConfig.getDnsMonitoringInterval()) + .setFailedSlaveReconnectionInterval(clusterServersConfig.getFailedSlaveReconnectionInterval()) + .setScanInterval(clusterServersConfig.getScanInterval()) + .setReadMode(clusterServersConfig.getReadMode()) + .setSubscriptionMode(clusterServersConfig.getSubscriptionMode()) + .setNodeAddresses(nodes); + } + RedissonClient redissonClient = Redisson.create(config); + log.info("初始化 redis 配置"); + return redissonClient; + } - /** - * redis集群配置 yml - * - * --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉) - * spring: - * redis: - * cluster: - * nodes: - * - 192.168.0.100:6379 - * - 192.168.0.101:6379 - * - 192.168.0.102:6379 - * # 密码 - * password: - * # 连接超时时间 - * timeout: 10s - * # 是否开启ssl - * ssl: false - * - * redisson: - * # 线程池数量 - * threads: 16 - * # Netty线程池数量 - * nettyThreads: 32 - * # 传输模式 - * transportMode: "NIO" - * # 集群配置 - * clusterServersConfig: - * # 客户端名称 - * clientName: ${ruoyi.name} - * # master最小空闲连接数 - * masterConnectionMinimumIdleSize: 32 - * # master连接池大小 - * masterConnectionPoolSize: 64 - * # slave最小空闲连接数 - * slaveConnectionMinimumIdleSize: 32 - * # slave连接池大小 - * slaveConnectionPoolSize: 64 - * # 连接空闲超时,单位:毫秒 - * idleConnectionTimeout: 10000 - * # ping连接间隔 - * pingConnectionInterval: 1000 - * # 命令等待超时,单位:毫秒 - * timeout: 3000 - * # 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 - * retryAttempts: 3 - * # 命令重试发送时间间隔,单位:毫秒 - * retryInterval: 1500 - * # 从可用服务器的内部列表中排除 Redis Slave 重新连接尝试的间隔。 - * failedSlaveReconnectionInterval: 3000 - * # 发布和订阅连接池最小空闲连接数 - * subscriptionConnectionMinimumIdleSize: 1 - * # 发布和订阅连接池大小 - * subscriptionConnectionPoolSize: 50 - * # 单个连接最大订阅数量 - * subscriptionsPerConnection: 5 - * # 扫描间隔 - * scanInterval: 1000 - * # DNS监测时间间隔,单位:毫秒 - * dnsMonitoringInterval: 5000 - * # 读取模式 - * readMode: "SLAVE" - * # 订阅模式 - * subscriptionMode: "MASTER" - */ + /** + * 整合spring-cache + */ + @Bean + public CacheManager cacheManager(RedissonClient redissonClient) { + List cacheGroup = redissonProperties.getCacheGroup(); + Map config = new HashMap<>(); + for (RedissonProperties.CacheGroup group : cacheGroup) { + CacheConfig cacheConfig = new CacheConfig(group.getTtl(), group.getMaxIdleTime()); + cacheConfig.setMaxSize(group.getMaxSize()); + config.put(group.getGroupId(), cacheConfig); + } + return new RedissonSpringCacheManager(redissonClient, config, JsonJacksonCodec.INSTANCE); + } + + /** + * redis集群配置 yml + * + * --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉) + * spring: + * redis: + * cluster: + * nodes: + * - 192.168.0.100:6379 + * - 192.168.0.101:6379 + * - 192.168.0.102:6379 + * # 密码 + * password: + * # 连接超时时间 + * timeout: 10s + * # 是否开启ssl + * ssl: false + * + * redisson: + * # 线程池数量 + * threads: 16 + * # Netty线程池数量 + * nettyThreads: 32 + * # 传输模式 + * transportMode: "NIO" + * # 集群配置 + * clusterServersConfig: + * # 客户端名称 + * clientName: ${ruoyi.name} + * # master最小空闲连接数 + * masterConnectionMinimumIdleSize: 32 + * # master连接池大小 + * masterConnectionPoolSize: 64 + * # slave最小空闲连接数 + * slaveConnectionMinimumIdleSize: 32 + * # slave连接池大小 + * slaveConnectionPoolSize: 64 + * # 连接空闲超时,单位:毫秒 + * idleConnectionTimeout: 10000 + * # ping连接间隔 + * pingConnectionInterval: 1000 + * # 命令等待超时,单位:毫秒 + * timeout: 3000 + * # 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。 + * retryAttempts: 3 + * # 命令重试发送时间间隔,单位:毫秒 + * retryInterval: 1500 + * # 从可用服务器的内部列表中排除 Redis Slave 重新连接尝试的间隔。 + * failedSlaveReconnectionInterval: 3000 + * # 发布和订阅连接池最小空闲连接数 + * subscriptionConnectionMinimumIdleSize: 1 + * # 发布和订阅连接池大小 + * subscriptionConnectionPoolSize: 50 + * # 单个连接最大订阅数量 + * subscriptionsPerConnection: 5 + * # 扫描间隔 + * scanInterval: 1000 + * # DNS监测时间间隔,单位:毫秒 + * dnsMonitoringInterval: 5000 + * # 读取模式 + * readMode: "SLAVE" + * # 订阅模式 + * subscriptionMode: "MASTER" + */ } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java index f4e2b5fab..83565b6ec 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java @@ -1,6 +1,6 @@ package com.ruoyi.framework.config; -import com.ruoyi.framework.Interceptor.PlusWebInvokeTimeInterceptor; +import com.ruoyi.framework.interceptor.PlusWebInvokeTimeInterceptor; import com.yomahub.tlog.web.interceptor.TLogWebInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -52,4 +52,4 @@ public CorsFilter corsFilter() { // 返回新的CorsFilter return new CorsFilter(source); } -} \ No newline at end of file +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java index c1665d9b0..5ae55add2 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/TLogConfig.java @@ -1,13 +1,8 @@ package com.ruoyi.framework.config; -import com.yomahub.tlog.core.aop.AspectLogAop; -import com.yomahub.tlog.spring.TLogPropertyInit; -import com.yomahub.tlog.spring.TLogSpringAware; -import com.yomahub.tlog.springboot.property.TLogProperty; -import org.springframework.context.annotation.Bean; +import com.yomahub.tlog.springboot.TLogWebAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; -import org.springframework.core.annotation.Order; /** * 整合 TLog 框架配置 @@ -15,29 +10,9 @@ * @author Lion Li * @since 3.3.0 */ -@Order(-999) @Configuration -@Import(TLogProperty.class) +// 排除 web 自动配置 自定义实现 +@EnableAutoConfiguration(exclude = TLogWebAutoConfiguration.class) public class TLogConfig { - @Bean - public TLogPropertyInit tLogPropertyInit(TLogProperty tLogProperty) { - TLogPropertyInit tLogPropertyInit = new TLogPropertyInit(); - tLogPropertyInit.setPattern(tLogProperty.getPattern()); - tLogPropertyInit.setEnableInvokeTimePrint(tLogProperty.enableInvokeTimePrint()); - tLogPropertyInit.setIdGenerator(tLogProperty.getIdGenerator()); - tLogPropertyInit.setMdcEnable(tLogProperty.getMdcEnable()); - return tLogPropertyInit; - } - - @Bean - public TLogSpringAware tLogSpringAware(){ - return new TLogSpringAware(); - } - - @Bean - public AspectLogAop aspectLogAop() { - return new AspectLogAop(); - } - } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java new file mode 100644 index 000000000..d5f4f5832 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/handler/PlusDataPermissionHandler.java @@ -0,0 +1,192 @@ +package com.ruoyi.framework.handler; + +import cn.hutool.core.annotation.AnnotationUtil; +import cn.hutool.core.collection.ConcurrentHashSet; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ObjectUtil; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.service.UserService; +import com.ruoyi.common.enums.DataScopeType; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.helper.DataPermissionHelper; +import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; +import lombok.extern.slf4j.Slf4j; +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Parenthesis; +import net.sf.jsqlparser.expression.operators.conditional.AndExpression; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.springframework.context.expression.BeanFactoryResolver; +import org.springframework.expression.BeanResolver; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.ParserContext; +import org.springframework.expression.common.TemplateParserContext; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +/** + * 数据权限过滤 + * + * @author Lion Li + * @version 3.5.0 + */ +@Slf4j +public class PlusDataPermissionHandler { + + /** + * 方法或类(名称) 与 注解的映射关系缓存 + */ + private final Map dataPermissionCacheMap = new ConcurrentHashMap<>(); + + /** + * 无效注解方法缓存用于快速返回 + */ + private final Set inavlidCacheSet = new ConcurrentHashSet<>(); + + /** + * spel 解析器 + */ + private final ExpressionParser parser = new SpelExpressionParser(); + private final ParserContext parserContext = new TemplateParserContext(); + /** + * bean解析器 用于处理 spel 表达式中对 bean 的调用 + */ + private final BeanResolver beanResolver = new BeanFactoryResolver(SpringUtils.getBeanFactory()); + + + public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { + DataColumn[] dataColumns = findAnnotation(mappedStatementId); + if (ArrayUtil.isEmpty(dataColumns)) { + inavlidCacheSet.add(mappedStatementId); + return where; + } + SysUser currentUser = DataPermissionHelper.getVariable("user"); + if (ObjectUtil.isNull(currentUser)) { + currentUser = SpringUtils.getBean(UserService.class).selectUserById(SecurityUtils.getUserId()); + DataPermissionHelper.setVariable("user", currentUser); + } + // 如果是超级管理员,则不过滤数据 + if (ObjectUtil.isNull(currentUser) || currentUser.isAdmin()) { + return where; + } + String dataFilterSql = buildDataFilter(dataColumns, isSelect); + if (StringUtils.isBlank(dataFilterSql)) { + return where; + } + try { + Expression expression = CCJSqlParserUtil.parseExpression(dataFilterSql); + // 数据权限使用单独的括号 防止与其他条件冲突 + Parenthesis parenthesis = new Parenthesis(expression); + if (ObjectUtil.isNotNull(where)) { + return new AndExpression(where, parenthesis); + } else { + return parenthesis; + } + } catch (JSQLParserException e) { + throw new ServiceException("数据权限解析异常 => " + e.getMessage()); + } + } + + /** + * 构造数据过滤sql + */ + private String buildDataFilter(DataColumn[] dataColumns, boolean isSelect) { + StringBuilder sqlString = new StringBuilder(); + // 更新或删除需满足所有条件 + String joinStr = isSelect ? " OR " : " AND "; + SysUser user = DataPermissionHelper.getVariable("user"); + StandardEvaluationContext context = new StandardEvaluationContext(); + context.setBeanResolver(beanResolver); + DataPermissionHelper.getContext().forEach(context::setVariable); + for (SysRole role : user.getRoles()) { + user.setRoleId(role.getRoleId()); + // 获取角色权限泛型 + DataScopeType type = DataScopeType.findCode(role.getDataScope()); + if (ObjectUtil.isNull(type)) { + throw new ServiceException("角色数据范围异常 => " + role.getDataScope()); + } + // 全部数据权限直接返回 + if (type == DataScopeType.ALL) { + return ""; + } + boolean isSuccess = false; + for (DataColumn dataColumn : dataColumns) { + // 不包含 key 变量 则不处理 + if (!StringUtils.contains(type.getSqlTemplate(), "#" + dataColumn.key())) { + continue; + } + // 设置注解变量 key 为表达式变量 value 为变量值 + context.setVariable(dataColumn.key(), dataColumn.value()); + + // 解析sql模板并填充 + String sql = parser.parseExpression(type.getSqlTemplate(), parserContext).getValue(context, String.class); + sqlString.append(joinStr).append(sql); + isSuccess = true; + } + // 未处理成功则填充兜底方案 + if (!isSuccess) { + sqlString.append(joinStr).append(type.getElseSql()); + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + return sqlString.substring(joinStr.length()); + } + return ""; + } + + private DataColumn[] findAnnotation(String mappedStatementId) { + StringBuilder sb = new StringBuilder(mappedStatementId); + int index = sb.lastIndexOf("."); + String clazzName = sb.substring(0, index); + String methodName = sb.substring(index + 1, sb.length()); + Class clazz = ClassUtil.loadClass(clazzName); + List methods = Arrays.stream(ClassUtil.getDeclaredMethods(clazz)) + .filter(method -> method.getName().equals(methodName)).collect(Collectors.toList()); + DataPermission dataPermission; + // 获取方法注解 + for (Method method : methods) { + dataPermission = dataPermissionCacheMap.get(method.getName()); + if (ObjectUtil.isNotNull(dataPermission)) { + return dataPermission.value(); + } + if (AnnotationUtil.hasAnnotation(method, DataPermission.class)) { + dataPermission = AnnotationUtil.getAnnotation(method, DataPermission.class); + dataPermissionCacheMap.put(method.getName(), dataPermission); + return dataPermission.value(); + } + } + dataPermission = dataPermissionCacheMap.get(clazz.getName()); + if (ObjectUtil.isNotNull(dataPermission)) { + return dataPermission.value(); + } + // 获取类注解 + if (AnnotationUtil.hasAnnotation(clazz, DataPermission.class)) { + dataPermission = AnnotationUtil.getAnnotation(clazz, DataPermission.class); + dataPermissionCacheMap.put(clazz.getName(), dataPermission); + return dataPermission.value(); + } + return null; + } + + /** + * 是否为无效方法 无数据权限 + */ + public boolean isInvalid(String mappedStatementId) { + return inavlidCacheSet.contains(mappedStatementId); + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java new file mode 100644 index 000000000..508f42167 --- /dev/null +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusDataPermissionInterceptor.java @@ -0,0 +1,108 @@ +package com.ruoyi.framework.interceptor; + +import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import com.ruoyi.framework.handler.PlusDataPermissionHandler; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.statement.delete.Delete; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import net.sf.jsqlparser.statement.select.SelectBody; +import net.sf.jsqlparser.statement.select.SetOperationList; +import net.sf.jsqlparser.statement.update.Update; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +/** + * 数据权限拦截器 + * + * @author Lion Li + * @version 3.5.0 + */ +public class PlusDataPermissionInterceptor extends JsqlParserSupport implements InnerInterceptor { + + private final PlusDataPermissionHandler dataPermissionHandler = new PlusDataPermissionHandler(); + + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { + // 检查忽略注解 + if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { + return; + } + // 检查是否无效 无数据权限注解 + if (dataPermissionHandler.isInvalid(ms.getId())) { + return; + } + // 解析 sql 分配对应方法 + PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql); + mpBs.sql(parserSingle(mpBs.sql(), ms.getId())); + } + + @Override + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + SqlCommandType sct = ms.getSqlCommandType(); + if (sct == SqlCommandType.UPDATE || sct == SqlCommandType.DELETE) { + if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { + return; + } + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + mpBs.sql(parserMulti(mpBs.sql(), ms.getId())); + } + } + + @Override + protected void processSelect(Select select, int index, String sql, Object obj) { + SelectBody selectBody = select.getSelectBody(); + if (selectBody instanceof PlainSelect) { + this.setWhere((PlainSelect) selectBody, (String) obj); + } else if (selectBody instanceof SetOperationList) { + SetOperationList setOperationList = (SetOperationList) selectBody; + List selectBodyList = setOperationList.getSelects(); + selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj)); + } + } + + @Override + protected void processUpdate(Update update, int index, String sql, Object obj) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(update.getWhere(), (String) obj, false); + if (null != sqlSegment) { + update.setWhere(sqlSegment); + } + } + + @Override + protected void processDelete(Delete delete, int index, String sql, Object obj) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(delete.getWhere(), (String) obj, false); + if (null != sqlSegment) { + delete.setWhere(sqlSegment); + } + } + + /** + * 设置 where 条件 + * + * @param plainSelect 查询对象 + * @param mappedStatementId 执行方法id + */ + protected void setWhere(PlainSelect plainSelect, String mappedStatementId) { + Expression sqlSegment = dataPermissionHandler.getSqlSegment(plainSelect.getWhere(), mappedStatementId, true); + if (null != sqlSegment) { + plainSelect.setWhere(sqlSegment); + } + } + +} + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusWebInvokeTimeInterceptor.java similarity index 53% rename from ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java rename to ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusWebInvokeTimeInterceptor.java index e2120bf00..9ba4cff8e 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/Interceptor/PlusWebInvokeTimeInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/PlusWebInvokeTimeInterceptor.java @@ -1,48 +1,55 @@ -package com.ruoyi.framework.Interceptor; +package com.ruoyi.framework.interceptor; +import cn.hutool.core.io.IoUtil; import cn.hutool.core.map.MapUtil; import com.alibaba.ttl.TransmittableThreadLocal; +import com.ruoyi.common.filter.RepeatedlyRequestWrapper; import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; -import com.yomahub.tlog.context.TLogContext; -import com.yomahub.tlog.web.interceptor.AbsTLogWebHandlerMethodInterceptor; -import com.yomahub.tlog.web.wrapper.RequestWrapper; +import com.ruoyi.common.utils.spring.SpringUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.StopWatch; import org.springframework.http.MediaType; +import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; import java.util.Map; /** - * 重写Tlog web的调用时间统计拦截器 + * web的调用时间统计拦截器 + * dev环境有效 * * @author Lion Li * @since 3.3.0 */ @Slf4j -public class PlusWebInvokeTimeInterceptor extends AbsTLogWebHandlerMethodInterceptor { +public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor { private final TransmittableThreadLocal invokeTimeTL = new TransmittableThreadLocal<>(); @Override - public boolean preHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - if (TLogContext.enableInvokeTimePrint()) { + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (!"prod".equals(SpringUtils.getActiveProfile())) { String url = request.getMethod() + " " + request.getRequestURI(); // 打印请求参数 if (isJsonRequest(request)) { - String jsonParam = new RequestWrapper(request).getBodyString(); - log.info("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); + String jsonParam = ""; + if (request instanceof RepeatedlyRequestWrapper) { + BufferedReader reader = request.getReader(); + jsonParam = IoUtil.read(reader); + } + log.debug("[PLUS]开始请求 => URL[{}],参数类型[json],参数:[{}]", url, jsonParam); } else { Map parameterMap = request.getParameterMap(); if (MapUtil.isNotEmpty(parameterMap)) { String parameters = JsonUtils.toJsonString(parameterMap); - log.info("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); + log.debug("[PLUS]开始请求 => URL[{}],参数类型[param],参数:[{}]", url, parameters); } else { - log.info("[PLUS]开始请求 => URL[{}],无参数", url); + log.debug("[PLUS]开始请求 => URL[{}],无参数", url); } } @@ -54,16 +61,16 @@ public boolean preHandleByHandlerMethod(HttpServletRequest request, HttpServletR } @Override - public void postHandleByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override - public void afterCompletionByHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - if (TLogContext.enableInvokeTimePrint()) { + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + if (!"prod".equals(SpringUtils.getActiveProfile())) { StopWatch stopWatch = invokeTimeTL.get(); stopWatch.stop(); - log.info("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); + log.debug("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); invokeTimeTL.remove(); } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java index 857cbe376..76d8090c8 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -7,6 +7,7 @@ import com.ruoyi.common.core.service.LogininforService; import com.ruoyi.common.core.service.TokenService; import com.ruoyi.common.utils.JsonUtils; +import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -40,14 +41,15 @@ public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { LoginUser loginUser = tokenService.getLoginUser(request); - if (StringUtils.isNotNull(loginUser)) { + String message = MessageUtils.message("user.logout.success"); + if (StringUtils.isNotNull(loginUser)) { String userName = loginUser.getUsername(); // 删除用户缓存记录 tokenService.delLoginUser(loginUser.getToken()); // 记录用户退出日志 - asyncService.recordLogininfor(userName, Constants.LOGOUT, "退出成功", request); + asyncService.recordLogininfor(userName, Constants.LOGOUT, message, request); } - ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(HttpStatus.HTTP_OK, "退出成功"))); + ServletUtils.renderString(response, JsonUtils.toJsonString(AjaxResult.error(HttpStatus.HTTP_OK, message))); } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/PermissionService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java similarity index 81% rename from ruoyi-system/src/main/java/com/ruoyi/system/service/PermissionService.java rename to ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java index e41333391..0e97b92f0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/PermissionService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/PermissionService.java @@ -1,12 +1,8 @@ -package com.ruoyi.system.service; +package com.ruoyi.framework.web.service; -import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; -import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.spring.SpringUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -44,10 +40,10 @@ public boolean hasPermi(String permission) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { return false; } - return hasPermissions(loginUser.getPermissions(), permission); + return hasPermissions(loginUser.getMenuPermissions(), permission); } /** @@ -71,10 +67,10 @@ public boolean hasAnyPermi(String permissions) { return false; } LoginUser loginUser = SecurityUtils.getLoginUser(); - if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getMenuPermissions())) { return false; } - Set authorities = loginUser.getPermissions(); + Set authorities = loginUser.getMenuPermissions(); for (String permission : permissions.split(PERMISSION_DELIMETER)) { if (permission != null && hasPermissions(authorities, permission)) { return true; @@ -97,12 +93,11 @@ public boolean hasRole(String role) { if (StringUtils.isNull(loginUser)) { return false; } - SysUser sysUser = SpringUtils.getBean(UserService.class).selectUserById(loginUser.getUserId()); - if (CollectionUtils.isEmpty(sysUser.getRoles())) { + Set rolePermissions = loginUser.getRolePermissions(); + if (CollectionUtils.isEmpty(rolePermissions)) { return false; } - for (SysRole sysRole : sysUser.getRoles()) { - String roleKey = sysRole.getRoleKey(); + for (String roleKey : rolePermissions) { if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { return true; } @@ -134,13 +129,15 @@ public boolean hasAnyRoles(String roles) { if (StringUtils.isNull(loginUser)) { return false; } - SysUser sysUser = SpringUtils.getBean(UserService.class).selectUserById(loginUser.getUserId()); - if (CollectionUtils.isEmpty(sysUser.getRoles())) { + Set rolePermissions = loginUser.getRolePermissions(); + if (CollectionUtils.isEmpty(rolePermissions)) { return false; } for (String role : roles.split(ROLE_DELIMETER)) { - if (hasRole(role)) { - return true; + for (String roleKey : rolePermissions) { + if (SUPER_ADMIN.equals(roleKey) || roleKey.equals(StringUtils.trim(role))) { + return true; + } } } return false; diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index 4b61ea612..0fb2be48e 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java index b90addf71..685a5bbc0 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java @@ -5,6 +5,7 @@ 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.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.generator.domain.GenTable; @@ -46,8 +47,8 @@ public class GenController extends BaseController { @ApiOperation("查询代码生成列表") @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping("/list") - public TableDataInfo genList(GenTable genTable) { - return genTableService.selectPageGenTableList(genTable); + public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageGenTableList(genTable, pageQuery); } /** @@ -73,8 +74,8 @@ public AjaxResult> getInfo(@PathVariable Long talbleId) { @ApiOperation("查询数据库列表") @PreAuthorize("@ss.hasPermi('tool:gen:list')") @GetMapping("/db/list") - public TableDataInfo dataList(GenTable genTable) { - return genTableService.selectPageDbTableList(genTable); + public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { + return genTableService.selectPageDbTableList(genTable, pageQuery); } /** diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java index 1f7e20ce9..d81a45adc 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableColumnMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.generator.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.generator.domain.GenTableColumn; @@ -10,6 +11,7 @@ * * @author Lion Li */ +@InterceptorIgnore(dataPermission = "true") public interface GenTableColumnMapper extends BaseMapperPlus { /** * 根据表名称查询列信息 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java index c55a9a28e..8ea66a2ef 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/GenTableMapper.java @@ -1,5 +1,6 @@ package com.ruoyi.generator.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.generator.domain.GenTable; @@ -12,6 +13,7 @@ * * @author Lion Li */ +@InterceptorIgnore(dataPermission = "true") public interface GenTableMapper extends BaseMapperPlus { diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index b53393f0c..d571468ac 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -4,13 +4,14 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; @@ -66,13 +67,15 @@ public GenTable selectGenTableById(Long id) { } @Override - public TableDataInfo selectPageGenTableList(GenTable genTable) { - return PageUtils.buildDataInfo(baseMapper.selectPageGenTableList(PageUtils.buildPage(), genTable)); + public TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPageGenTableList(pageQuery.build(), genTable); + return TableDataInfo.build(page); } @Override - public TableDataInfo selectPageDbTableList(GenTable genTable) { - return PageUtils.buildDataInfo(baseMapper.selectPageDbTableList(PageUtils.buildPage(), genTable)); + public TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery) { + Page page = baseMapper.selectPageDbTableList(pageQuery.build(), genTable); + return TableDataInfo.build(page); } /** @@ -125,7 +128,7 @@ public List selectGenTableAll() { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void updateGenTable(GenTable genTable) { String options = JsonUtils.toJsonString(genTable.getParams()); genTable.setOptions(options); @@ -144,7 +147,7 @@ public void updateGenTable(GenTable genTable) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void deleteGenTableByIds(Long[] tableIds) { List ids = Arrays.asList(tableIds); removeByIds(ids); @@ -157,7 +160,7 @@ public void deleteGenTableByIds(Long[] tableIds) { * @param tableList 导入表列表 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void importGenTable(List tableList) { String operName = SecurityUtils.getUsername(); try { @@ -271,7 +274,7 @@ public void generatorCode(String tableName) { * @param tableName 表名称 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void synchDb(String tableName) { GenTable table = baseMapper.selectGenTableByName(tableName); List tableColumns = table.getColumns(); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index 1bf0c27e5..2f7832e47 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -1,6 +1,7 @@ package com.ruoyi.generator.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.generator.domain.GenTable; @@ -15,10 +16,10 @@ public interface IGenTableService extends IService { - TableDataInfo selectPageGenTableList(GenTable genTable); + TableDataInfo selectPageGenTableList(GenTable genTable, PageQuery pageQuery); - TableDataInfo selectPageDbTableList(GenTable genTable); + TableDataInfo selectPageDbTableList(GenTable genTable, PageQuery pageQuery); /** * 查询业务列表 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index d2e0e3a65..13f7d8997 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -9,10 +9,7 @@ import com.ruoyi.generator.domain.GenTableColumn; import org.apache.velocity.VelocityContext; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 模板处理工具类 @@ -244,7 +241,7 @@ public static HashSet getImportList(GenTable genTable) { */ public static String getDicts(GenTable genTable) { List columns = genTable.getColumns(); - List dicts = new ArrayList(); + Set dicts = new HashSet(); for (GenTableColumn column : columns) { if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( column.getHtmlType(), diff --git a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml index 768b9fdb0..1aa9ea592 100644 --- a/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml +++ b/ruoyi-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -27,7 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + @@ -52,7 +52,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table @@ -78,7 +78,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select table_name, table_comment, create_time, update_time from information_schema.tables where table_schema = (select database()) - AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' + AND table_name NOT LIKE 'xxl_job_%' AND table_name NOT LIKE 'gen_%' AND table_name NOT IN (select table_name from gen_table) AND lower(table_name) like lower(concat('%', #{tableName}, '%')) @@ -133,22 +133,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by create_time desc - + - + - + - + - + - \ No newline at end of file + diff --git a/ruoyi-generator/src/main/resources/vm/java/bo.java.vm b/ruoyi-generator/src/main/resources/vm/java/bo.java.vm index 8831d0c2c..94d60508d 100644 --- a/ruoyi-generator/src/main/resources/vm/java/bo.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/bo.java.vm @@ -63,28 +63,4 @@ public class ${ClassName}Bo extends ${Entity} { #end #end - /** - * 分页大小 - */ - @ApiModelProperty("分页大小") - private Integer pageSize; - - /** - * 当前页数 - */ - @ApiModelProperty("当前页数") - private Integer pageNum; - - /** - * 排序列 - */ - @ApiModelProperty("排序列") - private String orderByColumn; - - /** - * 排序的方向desc或者asc - */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - } diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index 97bf5ff74..16798f33c 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -14,6 +14,7 @@ import org.springframework.validation.annotation.Validated; import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; @@ -53,8 +54,8 @@ public class ${ClassName}Controller extends BaseController { @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") @GetMapping("/list") #if($table.crud || $table.sub) - public TableDataInfo<${ClassName}Vo> list(@Validated(QueryGroup.class) ${ClassName}Bo bo) { - return i${ClassName}Service.queryPageList(bo); + public TableDataInfo<${ClassName}Vo> list(@Validated(QueryGroup.class) ${ClassName}Bo bo, PageQuery pageQuery) { + return i${ClassName}Service.queryPageList(bo, pageQuery); } #elseif($table.tree) public AjaxResult> list(@Validated(QueryGroup.class) ${ClassName}Bo bo) { diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index 0041c398c..f93053c3b 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -6,6 +6,7 @@ import ${packageName}.domain.bo.${ClassName}Bo; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; #if($table.crud || $table.sub) import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; #end import java.util.Collection; @@ -28,7 +29,7 @@ public interface I${ClassName}Service extends IServicePlus<${ClassName}, ${Class /** * 查询列表 */ - TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo); + TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery); #end /** diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index b9a45c675..bf201516f 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -3,12 +3,12 @@ package ${packageName}.service.impl; import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.utils.StringUtils; #if($table.crud || $table.sub) -import com.ruoyi.common.utils.PageUtils; -import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.domain.PageQuery; #end import org.springframework.stereotype.Service; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import ${packageName}.domain.bo.${ClassName}Bo; @@ -37,15 +37,17 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, #if($table.crud || $table.sub) @Override - public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo) { - PagePlus<${ClassName}, ${ClassName}Vo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); - return PageUtils.buildDataInfo(result); + public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo, PageQuery pageQuery) { + LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + Page<${ClassName}Vo> result = pageVo(pageQuery.build(), lqw); + return TableDataInfo.build(result); } #end @Override public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { - return listVo(buildQueryWrapper(bo)); + LambdaQueryWrapper<${ClassName}> lqw = buildQueryWrapper(bo); + return listVo(lqw); } private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 000000000..55ddca5b0 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,476 @@ + + + diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 000000000..6487f0ffc --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,577 @@ + + + diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt b/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 000000000..99239bb53 --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +ʹõRuoYi-Vue3ǰˣôҪһ´Ŀ¼ģindex.vue.vmindex-tree.vue.vmļϼvueĿ¼ \ No newline at end of file diff --git a/ruoyi-job/pom.xml b/ruoyi-job/pom.xml index a87b3efe9..369ab1789 100644 --- a/ruoyi-job/pom.xml +++ b/ruoyi-job/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 jar @@ -31,7 +31,7 @@ com.yomahub - tlog-xxl-job + tlog-xxljob-spring-boot-starter diff --git a/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java b/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java index 2df063e36..e051ff0d4 100644 --- a/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java +++ b/ruoyi-job/src/main/java/com/ruoyi/job/config/XxlJobConfig.java @@ -2,7 +2,6 @@ import com.ruoyi.job.config.properties.XxlJobProperties; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; -import com.yomahub.tlog.springboot.lifecircle.TLogXxljobEnhanceInit; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -40,9 +39,4 @@ public XxlJobSpringExecutor xxlJobExecutor() { return xxlJobSpringExecutor; } - @Bean - public TLogXxljobEnhanceInit tLogXxljobEnhanceInit(){ - return new TLogXxljobEnhanceInit(); - } - -} \ No newline at end of file +} diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml index 8aaf3e444..1a3c49158 100644 --- a/ruoyi-oss/pom.xml +++ b/ruoyi-oss/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index a436dfcdd..3d549cd70 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 3.4.0 + 3.5.0 4.0.0 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java index 2b230bf6a..aa855a326 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.xss.Xss; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,6 +12,7 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; + /** * 通知公告表 sys_notice * @@ -32,6 +34,7 @@ public class SysNotice extends BaseEntity { /** * 公告标题 */ + @Xss(message = "公告标题不能包含脚本字符") @ApiModelProperty(value = "公告标题") @NotBlank(message = "公告标题不能为空") @Size(min = 0, max = 50, message = "公告标题不能超过50个字符") diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java index ff081ce90..775da2ba8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOssConfig.java @@ -22,7 +22,7 @@ public class SysOssConfig extends BaseEntity { * 主建 */ @TableId(value = "oss_config_id") - private Integer ossConfigId; + private Long ossConfigId; /** * 配置key diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java index f2770abd3..c48ae5b8e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java @@ -16,28 +16,6 @@ @ApiModel("OSS对象存储分页查询对象") public class SysOssBo extends BaseEntity { - /** - * 分页大小 - */ - @ApiModelProperty("分页大小") - private Integer pageSize; - /** - * 当前页数 - */ - @ApiModelProperty("当前页数") - private Integer pageNum; - /** - * 排序列 - */ - @ApiModelProperty("排序列") - private String orderByColumn; - /** - * 排序的方向desc或者asc - */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - - /** * 文件名 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java index 9b8b3784c..9a66e384b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/bo/SysOssConfigBo.java @@ -102,29 +102,4 @@ public class SysOssConfigBo extends BaseEntity { @ApiModelProperty(value = "扩展字段") private String ext1; - - /** - * 分页大小 - */ - @ApiModelProperty("分页大小") - private Integer pageSize; - - /** - * 当前页数 - */ - @ApiModelProperty("当前页数") - private Integer pageNum; - - /** - * 排序列 - */ - @ApiModelProperty("排序列") - private String orderByColumn; - - /** - * 排序的方向desc或者asc - */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java index d0fd7d0e6..3b700d48c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java @@ -9,6 +9,7 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.ValidatorUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.system.domain.vo.SysUserImportVo; import com.ruoyi.system.service.ISysConfigService; @@ -39,9 +40,9 @@ public class SysUserImportListener extends AnalysisEventListener").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); } else if (isUpdateSupport) { + ValidatorUtils.validate(user); user.setUpdateBy(operName); userService.updateUser(user); successNum++; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java index 051085c3e..317be7e3c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java @@ -1,5 +1,7 @@ package com.ruoyi.system.mapper; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -19,6 +21,9 @@ public interface SysDeptMapper extends BaseMapperPlus { * @param dept 部门信息 * @return 部门信息集合 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) List selectDeptList(SysDept dept); /** @@ -28,7 +33,7 @@ public interface SysDeptMapper extends BaseMapperPlus { * @param deptCheckStrictly 部门树选择项是否关联显示 * @return 选中部门列表 */ - List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); /** * 修改子元素关系 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java index 50a5c752c..2e305cf05 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java @@ -18,7 +18,7 @@ public interface SysPostMapper extends BaseMapperPlus { * @param userId 用户ID * @return 选中岗位ID列表 */ - List selectPostListByUserId(Long userId); + List selectPostListByUserId(Long userId); /** * 查询用户所属岗位组 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java index eb440065f..d2721ee4d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java @@ -1,6 +1,8 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -14,6 +16,9 @@ */ public interface SysRoleMapper extends BaseMapperPlus { + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) Page selectPageRoleList(@Param("page") Page page, @Param("role") SysRole role); /** @@ -22,6 +27,9 @@ public interface SysRoleMapper extends BaseMapperPlus { * @param role 角色信息 * @return 角色数据集合信息 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) List selectRoleList(SysRole role); /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java index e930d879a..1a07f7f92 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java @@ -1,6 +1,8 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.annotation.DataColumn; +import com.ruoyi.common.annotation.DataPermission; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -14,6 +16,10 @@ */ public interface SysUserMapper extends BaseMapperPlus { + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) Page selectPageUserList(@Param("page") Page page, @Param("user") SysUser user); /** @@ -22,6 +28,10 @@ public interface SysUserMapper extends BaseMapperPlus { * @param sysUser 用户信息 * @return 用户信息集合信息 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) List selectUserList(SysUser sysUser); /** @@ -30,6 +40,10 @@ public interface SysUserMapper extends BaseMapperPlus { * @param user 用户信息 * @return 用户信息集合信息 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) Page selectAllocatedList(@Param("page") Page page, @Param("user") SysUser user); /** @@ -38,6 +52,10 @@ public interface SysUserMapper extends BaseMapperPlus { * @param user 用户信息 * @return 用户信息集合信息 */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) Page selectUnallocatedList(@Param("page") Page page, @Param("user") SysUser user); /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java index fe283876f..b7233896e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysConfig; @@ -14,7 +15,7 @@ public interface ISysConfigService extends IService { - TableDataInfo selectPageConfigList(SysConfig config); + TableDataInfo selectPageConfigList(SysConfig config, PageQuery pageQuery); /** * 查询参数配置信息 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index bd8c5ffbf..292d43c7b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -34,7 +34,7 @@ public interface ISysDeptService extends IService { * @param roleId 角色ID * @return 选中部门列表 */ - List selectDeptListByRoleId(Long roleId); + List selectDeptListByRoleId(Long roleId); /** * 根据部门ID查询信息 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java index ce6898ecf..22259c39e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.page.TableDataInfo; @@ -14,7 +15,7 @@ public interface ISysDictDataService extends IService { - TableDataInfo selectPageDictDataList(SysDictData dictData); + TableDataInfo selectPageDictDataList(SysDictData dictData, PageQuery pageQuery); /** * 根据条件分页查询字典数据 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java index 9599c4f1a..ba2739835 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.page.TableDataInfo; @@ -15,7 +16,7 @@ public interface ISysDictTypeService extends IService { - TableDataInfo selectPageDictTypeList(SysDictType dictType); + TableDataInfo selectPageDictTypeList(SysDictType dictType, PageQuery pageQuery); /** * 根据条件分页查询字典类型 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java index 5d4a66e24..892a5afbc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysLogininfor; @@ -14,7 +15,7 @@ public interface ISysLogininforService extends IService { - TableDataInfo selectPageLogininforList(SysLogininfor logininfor); + TableDataInfo selectPageLogininforList(SysLogininfor logininfor, PageQuery pageQuery); /** * 新增系统登录日志 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java index 7db68daea..6cd946824 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysNotice; @@ -14,7 +15,7 @@ public interface ISysNoticeService extends IService { - TableDataInfo selectPageNoticeList(SysNotice notice); + TableDataInfo selectPageNoticeList(SysNotice notice, PageQuery pageQuery); /** * 查询公告信息 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java index 531f6390f..b23f129ec 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysOperLog; @@ -13,7 +14,7 @@ */ public interface ISysOperLogService extends IService { - TableDataInfo selectPageOperLogList(SysOperLog operLog); + TableDataInfo selectPageOperLogList(SysOperLog operLog, PageQuery pageQuery); /** * 新增操作日志 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java index 9d9fd5341..f29b65d66 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysOssConfig; @@ -30,7 +31,7 @@ public interface ISysOssConfigService extends IServicePlus queryPageList(SysOssConfigBo bo); + TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery); /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssService.java index 948e8f762..866f2c4bd 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssService.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysOss; @@ -16,7 +17,7 @@ */ public interface ISysOssService extends IServicePlus { - TableDataInfo queryPageList(SysOssBo sysOss); + TableDataInfo queryPageList(SysOssBo sysOss, PageQuery pageQuery); SysOss upload(MultipartFile file); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java index a049928ce..97a0e0621 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysPost; @@ -14,7 +15,7 @@ public interface ISysPostService extends IService { - TableDataInfo selectPagePostList(SysPost post); + TableDataInfo selectPagePostList(SysPost post, PageQuery pageQuery); /** * 查询岗位信息集合 @@ -45,7 +46,7 @@ public interface ISysPostService extends IService { * @param userId 用户ID * @return 选中岗位ID列表 */ - List selectPostListByUserId(Long userId); + List selectPostListByUserId(Long userId); /** * 校验岗位名称 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java index d5838a846..37f007174 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysUserRole; @@ -16,7 +17,7 @@ public interface ISysRoleService extends IService { - TableDataInfo selectPageRoleList(SysRole role); + TableDataInfo selectPageRoleList(SysRole role, PageQuery pageQuery); /** * 根据条件分页查询角色数据 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index a901e0abe..508f3c44b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -1,6 +1,7 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.UserService; @@ -15,7 +16,7 @@ public interface ISysUserService extends IService, UserService { - TableDataInfo selectPageUserList(SysUser user); + TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery); /** * 根据条件分页查询用户列表 @@ -31,7 +32,7 @@ public interface ISysUserService extends IService, UserService { * @param user 用户信息 * @return 用户信息集合信息 */ - TableDataInfo selectAllocatedList(SysUser user); + TableDataInfo selectAllocatedList(SysUser user, PageQuery pageQuery); /** * 根据条件分页查询未分配用户角色列表 @@ -39,7 +40,7 @@ public interface ISysUserService extends IService, UserService { * @param user 用户信息 * @return 用户信息集合信息 */ - TableDataInfo selectUnallocatedList(SysUser user); + TableDataInfo selectUnallocatedList(SysUser user, PageQuery pageQuery); /** * 通过用户名查询用户 @@ -203,13 +204,4 @@ public interface ISysUserService extends IService, UserService { */ int deleteUserByIds(Long[] userIds); - /** - * 导入用户数据 - * - * @param userList 用户数据列表 - * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 - * @param operName 操作用户 - * @return 结果 - */ - String importUser(List userList, Boolean isUpdateSupport, String operName); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java new file mode 100644 index 000000000..34e2ea33c --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysDataScopeService.java @@ -0,0 +1,24 @@ +package com.ruoyi.system.service; + +/** + * 通用 数据权限 服务 + * + * @author Lion Li + */ +public interface SysDataScopeService { + + /** + * 获取角色自定义权限 + * @param roleId 角色id + * @return 部门id组 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门及以下权限 + * @param deptId 部门id + * @return 部门id组 + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java index 70f66019f..6add556fe 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysLoginService.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service; +import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; @@ -8,7 +9,7 @@ import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.user.CaptchaException; import com.ruoyi.common.exception.user.CaptchaExpireException; -import com.ruoyi.common.exception.user.UserPasswordNotMatchException; +import com.ruoyi.common.exception.user.UserException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.RedisUtils; @@ -22,6 +23,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.util.concurrent.TimeUnit; /** * 登录校验方法 @@ -62,6 +64,13 @@ public String login(String username, String password, String code, String uuid) if (captchaOnOff) { validateCaptcha(username, code, uuid, request); } + // 获取用户登录错误次数(可自定义限制策略 例如: key + username + ip) + Integer errorNumber = RedisUtils.getCacheObject(Constants.LOGIN_ERROR + username); + // 锁定时间内登录 则踢出 + if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); + throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); + } // 用户验证 Authentication authentication = null; try { @@ -70,13 +79,26 @@ public String login(String username, String password, String code, String uuid) .authenticate(new UsernamePasswordAuthenticationToken(username, password)); } catch (Exception e) { if (e instanceof BadCredentialsException) { - asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"), request); - throw new UserPasswordNotMatchException(); + // 是否第一次 + errorNumber = ObjectUtil.isNull(errorNumber) ? 1 : errorNumber + 1; + // 达到规定错误次数 则锁定登录 + if (errorNumber.equals(Constants.LOGIN_ERROR_NUMBER)) { + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber, Constants.LOGIN_ERROR_LIMIT_TIME, TimeUnit.MINUTES); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME), request); + throw new UserException("user.password.retry.limit.exceed", Constants.LOGIN_ERROR_LIMIT_TIME); + } else { + // 未达到规定错误次数 则递增 + RedisUtils.setCacheObject(Constants.LOGIN_ERROR + username, errorNumber); + asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.retry.limit.count", errorNumber), request); + throw new UserException("user.password.retry.limit.count", errorNumber); + } } else { asyncService.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage(), request); throw new ServiceException(e.getMessage()); } } + // 登录成功 清空错误次数 + RedisUtils.deleteObject(Constants.LOGIN_ERROR + username); asyncService.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"), request); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); recordLoginInfo(loginUser.getUserId(), username); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index bbd09a1d7..0b16029e1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -1,16 +1,16 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.convert.Convert; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.annotation.DataSource; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.ConfigService; -import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysConfig; @@ -32,7 +32,7 @@ public class SysConfigServiceImpl extends ServicePlusImpl implements ISysConfigService, ConfigService { @Override - public TableDataInfo selectPageConfigList(SysConfig config) { + public TableDataInfo selectPageConfigList(SysConfig config, PageQuery pageQuery) { Map params = config.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) @@ -40,7 +40,8 @@ public TableDataInfo selectPageConfigList(SysConfig config) { .like(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); - return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** @@ -50,7 +51,7 @@ public TableDataInfo selectPageConfigList(SysConfig config) { * @return 参数配置信息 */ @Override - @DataSource(DataSourceType.MASTER) + @DS("master") public SysConfig selectConfigById(Long configId) { return baseMapper.selectById(configId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java new file mode 100644 index 000000000..84399585b --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDataScopeServiceImpl.java @@ -0,0 +1,50 @@ +package com.ruoyi.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.system.domain.SysRoleDept; +import com.ruoyi.system.mapper.SysDeptMapper; +import com.ruoyi.system.mapper.SysRoleDeptMapper; +import com.ruoyi.system.service.SysDataScopeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service("sdss") +public class SysDataScopeServiceImpl implements SysDataScopeService { + + @Autowired + private SysRoleDeptMapper roleDeptMapper; + @Autowired + private SysDeptMapper deptMapper; + + @Override + public String getRoleCustom(Long roleId) { + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return list.stream().map(rd -> Convert.toStr(rd.getDeptId())).collect(Collectors.joining(",")); + } + return null; + } + + @Override + public String getDeptAndChild(Long deptId) { + List list = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .eq(SysDept::getDeptId, deptId) + .or() + .apply("find_in_set({0},ancestors)", deptId)); + if (CollUtil.isNotEmpty(list)) { + return list.stream().map(d -> Convert.toStr(d.getDeptId())).collect(Collectors.joining(",")); + } + return null; + } + +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 995bd2d60..0f8897fe4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -1,10 +1,10 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; @@ -46,8 +46,9 @@ public class SysDeptServiceImpl extends ServicePlusImpl selectDeptList(SysDept dept) { +// return baseMapper.selectList(); +// return baseMapper.selectList(new LambdaQueryWrapper<>()); return baseMapper.selectDeptList(dept); } @@ -59,7 +60,11 @@ public List selectDeptList(SysDept dept) { */ @Override public List> buildDeptTreeSelect(List depts) { - return TreeBuildUtils.build(depts, (dept, tree) -> + if (CollUtil.isEmpty(depts)) { + return CollUtil.newArrayList(); + } + Long parentId = depts.get(0).getParentId(); + return TreeBuildUtils.build(depts, parentId, (dept, tree) -> tree.setId(dept.getDeptId()) .setParentId(dept.getParentId()) .setName(dept.getDeptName()) @@ -73,7 +78,7 @@ public List> buildDeptTreeSelect(List depts) { * @return 选中部门列表 */ @Override - public List selectDeptListByRoleId(Long roleId) { + public List selectDeptListByRoleId(Long roleId) { SysRole role = roleMapper.selectById(roleId); return baseMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java index d2ac2a02e..7726ee010 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java @@ -1,11 +1,12 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDictDataMapper; @@ -23,13 +24,14 @@ public class SysDictDataServiceImpl extends ServicePlusImpl implements ISysDictDataService { @Override - public TableDataInfo selectPageDictDataList(SysDictData dictData) { + public TableDataInfo selectPageDictDataList(SysDictData dictData, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) .orderByAsc(SysDictData::getDictSort); - return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index b520d4188..1934f2085 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -3,15 +3,16 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.DictService; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.mapper.SysDictDataMapper; @@ -38,7 +39,7 @@ public class SysDictTypeServiceImpl extends ServicePlusImpl selectPageDictTypeList(SysDictType dictType) { + public TableDataInfo selectPageDictTypeList(SysDictType dictType, PageQuery pageQuery) { Map params = dictType.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) @@ -46,7 +47,8 @@ public TableDataInfo selectPageDictTypeList(SysDictType dictType) { .like(StringUtils.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); - return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** @@ -189,7 +191,7 @@ public int insertDictType(SysDictType dict) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int updateDictType(SysDictType dict) { SysDictType oldDict = getById(dict.getDictId()); dictDataMapper.update(null, new LambdaUpdateWrapper() diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java index 0ce33be0f..487e811ea 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -3,11 +3,12 @@ import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.LogininforService; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.AddressUtils; @@ -87,7 +88,7 @@ private String getBlock(Object msg) { } @Override - public TableDataInfo selectPageLogininforList(SysLogininfor logininfor) { + public TableDataInfo selectPageLogininforList(SysLogininfor logininfor, PageQuery pageQuery) { Map params = logininfor.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) @@ -95,7 +96,11 @@ public TableDataInfo selectPageLogininforList(SysLogininfor login .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysLogininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); - return PageUtils.buildDataInfo(page(PageUtils.buildPage("info_id", "desc"), lqw)); + if(StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("info_id").setIsAsc("desc"); + } + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index 9c3bfeb77..a604a12b7 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.constant.Constants; @@ -157,7 +158,7 @@ public List buildMenus(List menus) { router.setPath("/inner"); List childrenList = new ArrayList(); RouterVo children = new RouterVo(); - String routerPath = StringUtils.replaceEach(menu.getPath(), new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""}); + String routerPath = innerLinkReplaceEach(menu.getPath()); children.setPath(routerPath); children.setComponent(UserConstants.INNER_LINK); children.setName(StringUtils.capitalize(routerPath)); @@ -178,7 +179,11 @@ public List buildMenus(List menus) { */ @Override public List> buildMenuTreeSelect(List menus) { - return TreeBuildUtils.build(menus, (menu, tree) -> + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + Long parentId = menus.get(0).getParentId(); + return TreeBuildUtils.build(menus, parentId, (menu, tree) -> tree.setId(menu.getMenuId()) .setParentId(menu.getParentId()) .setName(menu.getMenuName()) @@ -297,7 +302,7 @@ public String getRouterPath(SysMenu menu) { String routerPath = menu.getPath(); // 内链打开外网方式 if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) { - routerPath = StringUtils.replaceEach(routerPath, new String[]{Constants.HTTP, Constants.HTTPS}, new String[]{"", ""}); + routerPath = innerLinkReplaceEach(routerPath); } // 非外链并且是一级目录(类型为目录) if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) @@ -415,4 +420,15 @@ private List getChildList(List list, SysMenu t) { private boolean hasChild(List list, SysMenu t) { return getChildList(list, t).size() > 0; } + + /** + * 内链域名特殊字符替换 + * + * @return + */ + public String innerLinkReplaceEach(String path) + { + return StringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS }, + new String[] { "", "" }); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java index b4f70d7c6..16bc8525e 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java @@ -1,9 +1,10 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysNotice; import com.ruoyi.system.mapper.SysNoticeMapper; @@ -22,12 +23,13 @@ public class SysNoticeServiceImpl extends ServicePlusImpl implements ISysNoticeService { @Override - public TableDataInfo selectPageNoticeList(SysNotice notice) { + public TableDataInfo selectPageNoticeList(SysNotice notice, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()); - return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java index c08b634ad..9371d5a2a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -3,11 +3,12 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.dto.OperLogDTO; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.OperLogService; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.AddressUtils; import com.ruoyi.system.domain.SysOperLog; @@ -44,7 +45,7 @@ public void recordOper(final OperLogDTO operLogDTO) { } @Override - public TableDataInfo selectPageOperLogList(SysOperLog operLog) { + public TableDataInfo selectPageOperLogList(SysOperLog operLog, PageQuery pageQuery) { Map params = operLog.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) @@ -60,7 +61,11 @@ public TableDataInfo selectPageOperLogList(SysOperLog operLog) { .like(StringUtils.isNotBlank(operLog.getOperName()), SysOperLog::getOperName, operLog.getOperName()) .between(params.get("beginTime") != null && params.get("endTime") != null, SysOperLog::getOperTime, params.get("beginTime"), params.get("endTime")); - return PageUtils.buildDataInfo(page(PageUtils.buildPage("oper_id", "desc"), lqw)); + if(StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("oper_id").setIsAsc("desc"); + } + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java index 9940beaeb..9c2830108 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java @@ -5,14 +5,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; -import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.JsonUtils; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.RedisUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.constant.OssConstant; @@ -67,9 +67,10 @@ public SysOssConfigVo queryById(Integer ossConfigId) { } @Override - public TableDataInfo queryPageList(SysOssConfigBo bo) { - PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); - return PageUtils.buildDataInfo(result); + public TableDataInfo queryPageList(SysOssConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = pageVo(pageQuery.build(), lqw); + return TableDataInfo.build(result); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index c20cc4b76..e062fbcf2 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -2,11 +2,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; -import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.factory.OssFactory; @@ -33,9 +33,10 @@ public class SysOssServiceImpl extends ServicePlusImpl implements ISysOssService { @Override - public TableDataInfo queryPageList(SysOssBo bo) { - PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); - return PageUtils.buildDataInfo(result); + public TableDataInfo queryPageList(SysOssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = pageVo(pageQuery.build(), lqw); + return TableDataInfo.build(result); } private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index 4e04f3a19..058d7edd4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -1,11 +1,12 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysUserPost; @@ -30,12 +31,13 @@ public class SysPostServiceImpl extends ServicePlusImpl selectPagePostList(SysPost post) { + public TableDataInfo selectPagePostList(SysPost post, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()); - return PageUtils.buildDataInfo(page(PageUtils.buildPage(), lqw)); + Page page = page(pageQuery.build(), lqw); + return TableDataInfo.build(page); } /** @@ -80,7 +82,7 @@ public SysPost selectPostById(Long postId) { * @return 选中岗位ID列表 */ @Override - public List selectPostListByUserId(Long userId) { + public List selectPostListByUserId(Long userId) { return baseMapper.selectPostListByUserId(userId); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index 7bad29746..514afb13c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -1,14 +1,14 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.annotation.DataScope; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -44,9 +44,9 @@ public class SysRoleServiceImpl extends ServicePlusImpl selectPageRoleList(SysRole role) { - return PageUtils.buildDataInfo(baseMapper.selectPageRoleList(PageUtils.buildPage(), role)); + public TableDataInfo selectPageRoleList(SysRole role, PageQuery pageQuery) { + Page page = baseMapper.selectPageRoleList(pageQuery.build(), role); + return TableDataInfo.build(page); } /** @@ -56,7 +56,6 @@ public TableDataInfo selectPageRoleList(SysRole role) { * @return 角色数据集合信息 */ @Override - @DataScope(deptAlias = "d") public List selectRoleList(SysRole role) { return baseMapper.selectRoleList(role); } @@ -215,7 +214,7 @@ public long countUserRoleByRoleId(Long roleId) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int insertRole(SysRole role) { // 新增角色信息 baseMapper.insert(role); @@ -229,7 +228,7 @@ public int insertRole(SysRole role) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int updateRole(SysRole role) { // 修改角色信息 baseMapper.updateById(role); @@ -256,7 +255,7 @@ public int updateRoleStatus(SysRole role) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int authDataScope(SysRole role) { // 修改角色信息 baseMapper.updateById(role); @@ -315,7 +314,7 @@ public int insertRoleDept(SysRole role) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int deleteRoleById(Long roleId) { // 删除角色与菜单关联 roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, roleId)); @@ -331,7 +330,7 @@ public int deleteRoleById(Long roleId) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int deleteRoleByIds(Long[] roleIds) { for (Long roleId : roleIds) { checkRoleAllowed(new SysRole(roleId)); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 86f4642ba..a31b43a4d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,16 +1,17 @@ package com.ruoyi.system.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.ruoyi.common.annotation.DataScope; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.service.UserService; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.spring.SpringUtils; @@ -18,7 +19,6 @@ import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.mapper.*; -import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -50,13 +51,10 @@ public class SysUserServiceImpl extends ServicePlusImpl selectPageUserList(SysUser user) { - return PageUtils.buildDataInfo(baseMapper.selectPageUserList(PageUtils.buildPage(), user)); + public TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), user); + return TableDataInfo.build(page); } /** @@ -66,7 +64,6 @@ public TableDataInfo selectPageUserList(SysUser user) { * @return 用户信息集合信息 */ @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) public List selectUserList(SysUser user) { return baseMapper.selectUserList(user); } @@ -78,9 +75,9 @@ public List selectUserList(SysUser user) { * @return 用户信息集合信息 */ @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) - public TableDataInfo selectAllocatedList(SysUser user) { - return PageUtils.buildDataInfo(baseMapper.selectAllocatedList(PageUtils.buildPage(), user)); + public TableDataInfo selectAllocatedList(SysUser user, PageQuery pageQuery) { + Page page = baseMapper.selectAllocatedList(pageQuery.build(), user); + return TableDataInfo.build(page); } /** @@ -90,9 +87,9 @@ public TableDataInfo selectAllocatedList(SysUser user) { * @return 用户信息集合信息 */ @Override - @DataScope(deptAlias = "d", userAlias = "u", isUser = true) - public TableDataInfo selectUnallocatedList(SysUser user) { - return PageUtils.buildDataInfo(baseMapper.selectUnallocatedList(PageUtils.buildPage(), user)); + public TableDataInfo selectUnallocatedList(SysUser user, PageQuery pageQuery) { + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), user); + return TableDataInfo.build(page); } /** @@ -126,14 +123,10 @@ public SysUser selectUserById(Long userId) { @Override public String selectUserRoleGroup(String userName) { List list = roleMapper.selectRolesByUserName(userName); - StringBuilder idsStr = new StringBuilder(); - for (SysRole role : list) { - idsStr.append(role.getRoleName()).append(","); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; } - if (StringUtils.isNotEmpty(idsStr.toString())) { - return idsStr.substring(0, idsStr.length() - 1); - } - return idsStr.toString(); + return list.stream().map(SysRole::getRoleName).collect(Collectors.joining(",")); } /** @@ -145,14 +138,10 @@ public String selectUserRoleGroup(String userName) { @Override public String selectUserPostGroup(String userName) { List list = postMapper.selectPostsByUserName(userName); - StringBuilder idsStr = new StringBuilder(); - for (SysPost post : list) { - idsStr.append(post.getPostName()).append(","); - } - if (StringUtils.isNotEmpty(idsStr.toString())) { - return idsStr.substring(0, idsStr.length() - 1); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; } - return idsStr.toString(); + return list.stream().map(SysPost::getPostName).collect(Collectors.joining(",")); } /** @@ -242,7 +231,7 @@ public void checkUserDataScope(Long userId) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int insertUser(SysUser user) { // 新增用户信息 int rows = baseMapper.insert(user); @@ -271,7 +260,7 @@ public boolean registerUser(SysUser user) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int updateUser(SysUser user) { Long userId = user.getUserId(); // 删除用户与角色关联 @@ -292,7 +281,7 @@ public int updateUser(SysUser user) { * @param roleIds 角色组 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public void insertUserAuth(Long userId, Long[] roleIds) { userRoleMapper.delete(new LambdaQueryWrapper() .eq(SysUserRole::getUserId, userId)); @@ -435,7 +424,7 @@ public void insertUserRole(Long userId, Long[] roleIds) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int deleteUserById(Long userId) { // 删除用户与角色关联 userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); @@ -451,7 +440,7 @@ public int deleteUserById(Long userId) { * @return 结果 */ @Override - @Transactional + @Transactional(rollbackFor = Exception.class) public int deleteUserByIds(Long[] userIds) { for (Long userId : userIds) { checkUserAllowed(new SysUser(userId)); @@ -464,56 +453,4 @@ public int deleteUserByIds(Long[] userIds) { return baseMapper.deleteBatchIds(ids); } - /** - * 导入用户数据 - * - * @param userList 用户数据列表 - * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 - * @param operName 操作用户 - * @return 结果 - */ - @Override - public String importUser(List userList, Boolean isUpdateSupport, String operName) { - if (StringUtils.isNull(userList) || userList.size() == 0) { - throw new ServiceException("导入用户数据不能为空!"); - } - int successNum = 0; - int failureNum = 0; - StringBuilder successMsg = new StringBuilder(); - StringBuilder failureMsg = new StringBuilder(); - String password = configService.selectConfigByKey("sys.user.initPassword"); - for (SysUser user : userList) { - try { - // 验证是否存在这个用户 - SysUser u = baseMapper.selectUserByUserName(user.getUserName()); - if (StringUtils.isNull(u)) { - user.setPassword(SecurityUtils.encryptPassword(password)); - user.setCreateBy(operName); - this.insertUser(user); - successNum++; - successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); - } else if (isUpdateSupport) { - user.setUpdateBy(operName); - this.updateUser(user); - successNum++; - successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); - } else { - failureNum++; - failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); - } - } catch (Exception e) { - failureNum++; - String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; - failureMsg.append(msg + e.getMessage()); - log.error(msg, e); - } - } - if (failureNum > 0) { - failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); - throw new ServiceException(failureMsg.toString()); - } else { - successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); - } - return successMsg.toString(); - } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java index 15b9759b8..eaf878650 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TokenServiceImpl.java @@ -3,6 +3,10 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.jwt.JWTUtil; +import cn.hutool.jwt.signers.JWTSigner; +import cn.hutool.jwt.signers.JWTSignerUtil; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.service.TokenService; @@ -11,9 +15,6 @@ import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.ip.AddressUtils; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -50,9 +51,9 @@ public LoginUser getLoginUser(HttpServletRequest request) { String token = getToken(request); if (StringUtils.isNotEmpty(token)) { try { - Claims claims = parseToken(token); + JSONObject claims = parseToken(token); // 解析对应的权限以及用户信息 - String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String uuid = claims.getStr(Constants.LOGIN_USER_KEY); String userKey = getTokenKey(uuid); LoginUser user = RedisUtils.getCacheObject(userKey); return user; @@ -153,9 +154,8 @@ public void setUserAgent(LoginUser loginUser) { * @return 令牌 */ private String createToken(Map claims) { - String token = Jwts.builder() - .setClaims(claims) - .signWith(SignatureAlgorithm.HS512, tokenProperties.getSecret()).compact(); + JWTSigner signer = JWTSignerUtil.hs512(tokenProperties.getSecret().getBytes()); + String token = JWTUtil.createToken(claims, signer); return token; } @@ -165,11 +165,9 @@ private String createToken(Map claims) { * @param token 令牌 * @return 数据声明 */ - private Claims parseToken(String token) { - return Jwts.parser() - .setSigningKey(tokenProperties.getSecret()) - .parseClaimsJws(token) - .getBody(); + private JSONObject parseToken(String token) { + JWTSigner signer = JWTSignerUtil.hs512(tokenProperties.getSecret().getBytes()); + return JWTUtil.parseToken(token).setSigner(signer).getPayload().getClaimsJson(); } /** @@ -180,8 +178,8 @@ private Claims parseToken(String token) { */ @Override public String getUsernameFromToken(String token) { - Claims claims = parseToken(token); - return claims.getSubject(); + JSONObject claims = parseToken(token); + return claims.getStr("sub"); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java index 14801e9dc..d4e30958d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserDetailsServiceImpl.java @@ -3,7 +3,7 @@ import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.UserStatus; -import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.exception.user.UserException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysPermissionService; @@ -34,19 +34,25 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx SysUser user = userService.selectUserByUserName(username); if (StringUtils.isNull(user)) { log.info("登录用户:{} 不存在.", username); - throw new ServiceException("登录用户:" + username + " 不存在"); + throw new UserException("user.not.exists", username); } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { log.info("登录用户:{} 已被删除.", username); - throw new ServiceException("对不起,您的账号:" + username + " 已被删除"); + throw new UserException("user.password.delete", username); } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { log.info("登录用户:{} 已被停用.", username); - throw new ServiceException("对不起,您的账号:" + username + " 已停用"); + throw new UserException("user.blocked", username); } return createLoginUser(user); } public UserDetails createLoginUser(SysUser user) { - return new LoginUser(user.getUserId(), user.getDeptId(), user.getUserName(), user.getPassword(), permissionService.getMenuPermission(user)); + return new LoginUser() + .setUserId(user.getUserId()) + .setDeptId(user.getDeptId()) + .setUsername(user.getUserName()) + .setPassword(user.getPassword()) + .setMenuPermissions(permissionService.getMenuPermission(user)) + .setRolePermissions(permissionService.getRolePermission(user)); } } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index 889982aad..8e9d1d758 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -42,17 +42,17 @@ AND status = #{status} - - - AND ( ${params.dataScope} ) - + + + + order by d.parent_id, d.order_num - select d.dept_id from sys_dept d - left join sys_role_dept rd on d.dept_id = rd.dept_id + left join sys_role_dept rd on d.dept_id = rd.dept_id where rd.role_id = #{roleId} and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId}) diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index bfb543673..d441c73af 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -27,33 +27,13 @@ - - select menu_id, - menu_name, - parent_id, - order_num, - path, - component, - query, - is_frame, - is_cache, - menu_type, - visible, - status, - ifnull(perms, '') as perms, - icon, - create_time - from sys_menu - - - + - \ No newline at end of file + diff --git a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index 94b161b3b..c13bd68bb 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -60,10 +60,10 @@ and date_format(r.create_time,'%y%m%d') <= date_format(#{role.params.endTime},'%y%m%d') - - - AND ( ${role.params.dataScope} ) - + + + + order by r.role_sort @@ -88,10 +88,10 @@ and date_format(r.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d') - - - AND ( ${params.dataScope} ) - + + + + order by r.role_sort diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index 5d9a18568..d9a927fb2 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -108,10 +108,10 @@ AND (u.dept_id = #{user.deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{user.deptId}, ancestors) )) - - - AND ( ${user.params.dataScope} ) - + + + +