diff --git a/.editorconfig b/.editorconfig index 672defc11..25b312ef3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,7 +10,7 @@ end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true -[*.{json,yml}] +[*.{json,yml,yaml}] indent_size = 2 [*.md] diff --git a/.run/ruoyi-admin.run.xml b/.run/ruoyi-admin.run.xml new file mode 100644 index 000000000..e4f77c7a7 --- /dev/null +++ b/.run/ruoyi-admin.run.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml new file mode 100644 index 000000000..a043f277f --- /dev/null +++ b/.run/ruoyi-monitor-admin.run.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/.run/ruoyi-xxl-job-admin.run.xml b/.run/ruoyi-xxl-job-admin.run.xml new file mode 100644 index 000000000..4a77b863e --- /dev/null +++ b/.run/ruoyi-xxl-job-admin.run.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/README.md b/README.md index 6b05e91cb..88a388b47 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![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-4.3.0_beta2-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-4.3.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.7-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() diff --git a/pom.xml b/pom.xml index bd179ca7a..beeada161 100644 --- a/pom.xml +++ b/pom.xml @@ -6,34 +6,34 @@ com.ruoyi ruoyi-vue-plus - 4.3.0-beta2 + 4.3.0 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 4.3.0-beta2 - 2.7.2 + 4.3.0 + 2.7.3 UTF-8 UTF-8 1.8 3.2.2 2.2.2 - 1.2.11 - 1.6.9 + 1.2.12 + 1.6.11 5.2.2 3.1.1 2.3 1.30.0 3.5.2 3.9.1 - 5.8.5 + 5.8.6 4.10.0 - 2.7.3 - 3.17.5 + 2.7.4 + 3.17.6 2.2.2 - 3.5.1 + 3.5.2 1.4.3 2.3.1 1.18.24 @@ -42,17 +42,10 @@ 31.1-jre - 1.12.264 + 1.12.300 - 2.0.16 - 3.1.555 - - - localhost - http://${docker.registry.url}:2375 - ruoyi - 1.2.2 - + 2.0.18 + 3.1.591 @@ -142,6 +135,12 @@ cn.dev33 sa-token-jwt ${satoken.version} + + + cn.hutool + hutool-all + + @@ -342,7 +341,7 @@ com.github.therapi therapi-runtime-javadoc-scribe - 0.13.0 + 0.15.0 org.projectlombok @@ -434,3 +433,4 @@ + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 9c3ba1506..be5e8ea3d 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 jar @@ -107,25 +107,6 @@ ${project.artifactId} - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - ${docker.namespace}/ruoyi-server:${project.version} - ${project.basedir} - ${docker.registry.host} - ${docker.registry.url} - ${docker.registry.url} - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java index 5490837be..74585fc48 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java @@ -34,7 +34,7 @@ public class CacheController { static { CACHES.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息")); - CACHES.add(new SysCache(CacheNames.ONLINE_TOKEN, "在线用户")); + CACHES.add(new SysCache(CacheConstants.ONLINE_TOKEN_KEY, "在线用户")); CACHES.add(new SysCache(CacheNames.SYS_CONFIG, "配置信息")); CACHES.add(new SysCache(CacheNames.SYS_DICT, "数据字典")); CACHES.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码")); 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 a8ad8efff..c43055f45 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 @@ -6,7 +6,6 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.CacheConstants; -import com.ruoyi.common.constant.CacheNames; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.dto.UserOnlineDTO; @@ -14,7 +13,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StreamUtils; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.redis.CacheUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import com.ruoyi.system.domain.SysUserOnline; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -51,8 +50,7 @@ public class SysUserOnlineController extends BaseController { if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) { continue; } - UserOnlineDTO dto = CacheUtils.get(CacheNames.ONLINE_TOKEN, token); - userOnlineDTOList.add(dto); + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); } if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java index 2980e646c..411eee9e6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java @@ -1,7 +1,6 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.constant.UserConstants; @@ -15,9 +14,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 部门信息 @@ -68,29 +65,6 @@ public class SysDeptController extends BaseController { return R.ok(deptService.selectDeptById(deptId)); } - /** - * 获取部门下拉树列表 - */ - @GetMapping("/treeselect") - public R>> treeselect(SysDept dept) { - List depts = deptService.selectDeptList(dept); - return R.ok(deptService.buildDeptTreeSelect(depts)); - } - - /** - * 加载对应角色部门列表树 - * - * @param roleId 角色ID - */ - @GetMapping(value = "/roleDeptTreeselect/{roleId}") - public R> roleDeptTreeselect(@PathVariable("roleId") Long roleId) { - List depts = deptService.selectDeptList(new SysDept()); - Map ajax = new HashMap<>(); - ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); - ajax.put("depts", deptService.buildDeptTreeSelect(depts)); - return R.ok(ajax); - } - /** * 新增部门 */ 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 1fcd599d4..5c331681e 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 @@ -68,6 +68,8 @@ public class SysProfileController extends BaseController { user.setUserId(getUserId()); user.setUserName(null); user.setPassword(null); + user.setAvatar(null); + user.setDeptId(null); if (userService.updateUserProfile(user) > 0) { return R.ok(); } 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 08aeb2d73..5768806c2 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 @@ -7,6 +7,7 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginUser; @@ -15,6 +16,7 @@ import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.SysUserRole; +import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.SysPermissionService; @@ -23,7 +25,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 角色信息 @@ -38,6 +42,7 @@ public class SysRoleController extends BaseController { private final ISysRoleService roleService; private final ISysUserService userService; + private final ISysDeptService deptService; private final SysPermissionService permissionService; /** @@ -215,4 +220,18 @@ public class SysRoleController extends BaseController { roleService.checkRoleDataScope(roleId); return toAjax(roleService.insertAuthUsers(roleId, userIds)); } + + /** + * 获取对应角色部门树列表 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:list") + @GetMapping(value = "/deptTree/{roleId}") + public R> roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + Map ajax = new HashMap<>(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); + return R.ok(ajax); + } } 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 8a65b6920..d1c6c576b 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 @@ -3,6 +3,7 @@ package com.ruoyi.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.Log; @@ -23,6 +24,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.system.domain.vo.SysUserExportVo; import com.ruoyi.system.domain.vo.SysUserImportVo; import com.ruoyi.system.listener.SysUserImportListener; +import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysPostService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; @@ -52,6 +54,7 @@ public class SysUserController extends BaseController { private final ISysUserService userService; private final ISysRoleService roleService; private final ISysPostService postService; + private final ISysDeptService deptService; /** * 获取用户列表 @@ -235,4 +238,14 @@ public class SysUserController extends BaseController { userService.insertUserAuth(userId, roleIds); return R.ok(); } + + /** + * 获取部门树列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/deptTree") + public R>> deptTree(SysDept dept) { + return R.ok(deptService.selectDeptTreeList(dept)); + } + } diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index aef309ee3..e671d689e 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -237,7 +237,7 @@ thread-pool: lock4j: # 获取分布式锁超时时间,默认为 3000 毫秒 acquire-timeout: 3000 - # 分布式锁的超时时间,默认为 30 毫秒 + # 分布式锁的超时时间,默认为 30 秒 expire: 30000 --- # Actuator 监控端点的配置项 diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties index 1645af347..e1423a8fd 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages.properties @@ -1,45 +1,45 @@ -#\u9519\u8BEF\u6D88\u606F -not.null=* \u5FC5\u987B\u586B\u5199 -user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF -user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 -user.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u8D26\u53F7\uFF1A{0} \u4E0D\u5B58\u5728. -user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF -user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u88AB\u5220\u9664 -user.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -user.logout.success=\u9000\u51FA\u6210\u529F -length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.username.not.blank=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A -user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 -user.username.length.valid=\u8D26\u6237\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.blank=\u7528\u6237\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A -user.password.length.valid=\u7528\u6237\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 -user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF -user.phonenumber.not.blank=\u7528\u6237\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A -user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF -user.login.success=\u767B\u5F55\u6210\u529F -user.register.success=\u6CE8\u518C\u6210\u529F -user.register.save.error=\u4FDD\u5B58\u7528\u6237 {0} \u5931\u8D25\uFF0C\u6CE8\u518C\u8D26\u53F7\u5DF2\u5B58\u5728 -user.register.error=\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u4EBA\u5458 -user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 -user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F -upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 -upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 -##\u6743\u9650 -no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A -sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{0}\u5206\u949F -xcx.code.not.blank=\u5C0F\u7A0B\u5E8Fcode\u4E0D\u80FD\u4E3A\u7A7A +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=对不起, 您的账号:{0} 不存在. +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号:{0} 已被删除 +user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 +length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.blank=用户名不能为空 +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.username.length.valid=账户长度必须在{min}到{max}个字符之间 +user.password.not.blank=用户密码不能为空 +user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 +user.password.not.valid=* 5-50个字符 +user.email.not.valid=邮箱格式错误 +user.phonenumber.not.blank=用户手机号不能为空 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.register.save.error=保存用户 {0} 失败,注册账号已存在 +user.register.error=注册失败,请联系系统管理人员 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 +sms.code.not.blank=短信验证码不能为空 +sms.code.retry.limit.count=短信验证码输入错误{0}次 +sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{0}分钟 +xcx.code.not.blank=小程序code不能为空 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 92d8185d3..04a4aa372 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_en_US.properties @@ -1,4 +1,4 @@ -#\u9519\u8BEF\u6D88\u606F +#错误消息 not.null=* Required fill in user.jcaptcha.error=Captcha error user.jcaptcha.expire=Captcha invalid @@ -6,9 +6,9 @@ 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 {1} minutes -user.password.delete=Sorry, your account\uFF1A{0} has been deleted +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\uFF0Cplease contact administrators +role.blocked=Role disabled,please contact administrators user.logout.success=Exit successful length.not.valid=The length must be between {min} and {max} characters user.username.not.blank=Username cannot be blank @@ -25,18 +25,18 @@ user.register.success=Register successful user.register.save.error=Failed to save user {0}, The registered account already exists user.register.error=Register failed, please contact system administrator user.notfound=Please login again -user.forcelogout=The administrator is forced to exit\uFF0Cplease login again +user.forcelogout=The administrator is forced to exit,please login again user.unknown.error=Unknown error, please login again -##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F -upload.exceed.maxSize=The uploaded file size exceeds the limit file size\uFF01
the maximum allowed file size is\uFF1A{0}MB\uFF01 +##文件上传消息 +upload.exceed.maxSize=The uploaded file size exceeds the limit file size!
the maximum allowed file size is:{0}MB! upload.filename.exceed.length=The maximum length of uploaded file name is {0} characters -##\u6743\u9650 -no.permission=You do not have permission to the data\uFF0Cplease contact your administrator to add permissions [{0}] -no.create.permission=You do not have permission to create data\uFF0Cplease contact your administrator to add permissions [{0}] -no.update.permission=You do not have permission to modify data\uFF0Cplease contact your administrator to add permissions [{0}] -no.delete.permission=You do not have permission to delete data\uFF0Cplease contact your administrator to add permissions [{0}] -no.export.permission=You do not have permission to export data\uFF0Cplease contact your administrator to add permissions [{0}] -no.view.permission=You do not have permission to view data\uFF0Cplease contact your administrator to add permissions [{0}] +##权限 +no.permission=You do not have permission to the data,please contact your administrator to add permissions [{0}] +no.create.permission=You do not have permission to create data,please contact your administrator to add permissions [{0}] +no.update.permission=You do not have permission to modify data,please contact your administrator to add permissions [{0}] +no.delete.permission=You do not have permission to delete data,please contact your administrator to add permissions [{0}] +no.export.permission=You do not have permission to export data,please contact your administrator to add permissions [{0}] +no.view.permission=You do not have permission to view data,please contact your administrator to add permissions [{0}] repeat.submit.message=Repeat submit is not allowed, please try again later rate.limiter.message=Visit too frequently, please try again later sms.code.not.blank=Sms code cannot be blank 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 1645af347..e1423a8fd 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -1,45 +1,45 @@ -#\u9519\u8BEF\u6D88\u606F -not.null=* \u5FC5\u987B\u586B\u5199 -user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF -user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 -user.not.exists=\u5BF9\u4E0D\u8D77, \u60A8\u7684\u8D26\u53F7\uFF1A{0} \u4E0D\u5B58\u5728. -user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF -user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F -user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u88AB\u5220\u9664 -user.blocked=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\uFF1A{0} \u5DF2\u7981\u7528\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 -user.logout.success=\u9000\u51FA\u6210\u529F -length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.username.not.blank=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A -user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 -user.username.length.valid=\u8D26\u6237\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.blank=\u7528\u6237\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A -user.password.length.valid=\u7528\u6237\u5BC6\u7801\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 -user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 -user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF -user.phonenumber.not.blank=\u7528\u6237\u624B\u673A\u53F7\u4E0D\u80FD\u4E3A\u7A7A -user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF -user.login.success=\u767B\u5F55\u6210\u529F -user.register.success=\u6CE8\u518C\u6210\u529F -user.register.save.error=\u4FDD\u5B58\u7528\u6237 {0} \u5931\u8D25\uFF0C\u6CE8\u518C\u8D26\u53F7\u5DF2\u5B58\u5728 -user.register.error=\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7CFB\u7EDF\u7BA1\u7406\u4EBA\u5458 -user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 -user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 -##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F -upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01
\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 -upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 -##\u6743\u9650 -no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] -repeat.submit.message=\u4E0D\u5141\u8BB8\u91CD\u590D\u63D0\u4EA4\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -rate.limiter.message=\u8BBF\u95EE\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u5019\u518D\u8BD5 -sms.code.not.blank=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u4E0D\u80FD\u4E3A\u7A7A -sms.code.retry.limit.count=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 -sms.code.retry.limit.exceed=\u77ED\u4FE1\u9A8C\u8BC1\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{0}\u5206\u949F -xcx.code.not.blank=\u5C0F\u7A0B\u5E8Fcode\u4E0D\u80FD\u4E3A\u7A7A +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=对不起, 您的账号:{0} 不存在. +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 +user.password.delete=对不起,您的账号:{0} 已被删除 +user.blocked=对不起,您的账号:{0} 已禁用,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 +length.not.valid=长度必须在{min}到{max}个字符之间 +user.username.not.blank=用户名不能为空 +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.username.length.valid=账户长度必须在{min}到{max}个字符之间 +user.password.not.blank=用户密码不能为空 +user.password.length.valid=用户密码长度必须在{min}到{max}个字符之间 +user.password.not.valid=* 5-50个字符 +user.email.not.valid=邮箱格式错误 +user.phonenumber.not.blank=用户手机号不能为空 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.register.success=注册成功 +user.register.save.error=保存用户 {0} 失败,注册账号已存在 +user.register.error=注册失败,请联系系统管理人员 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] +repeat.submit.message=不允许重复提交,请稍候再试 +rate.limiter.message=访问过于频繁,请稍候再试 +sms.code.not.blank=短信验证码不能为空 +sms.code.retry.limit.count=短信验证码输入错误{0}次 +sms.code.retry.limit.exceed=短信验证码输入错误{0}次,帐户锁定{0}分钟 +xcx.code.not.blank=小程序code不能为空 diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index bf946925e..4c8833fe0 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 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 9df3a4acd..e634ed297 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 @@ -17,6 +17,11 @@ public interface Constants { */ String GBK = "GBK"; + /** + * www主域 + */ + String WWW = "www."; + /** * http请求 */ diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java index 70584c6d3..12dc16cb4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java @@ -75,4 +75,11 @@ public class R implements Serializable { return r; } + public Boolean isError() { + return !isSuccess(); + } + + public Boolean isSuccess() { + return R.SUCCESS == getCode(); + } } 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 6e366a753..201605f96 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 @@ -80,7 +80,7 @@ public class SysMenu extends TreeEntity { private String visible; /** - * 菜单状态(0显示 1隐藏) + * 菜单状态(0正常 1停用) */ private String status; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java index b7caaea3e..52682894a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java @@ -17,6 +17,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import java.util.Set; /** * 角色表 sys_role @@ -82,7 +83,7 @@ public class SysRole extends BaseEntity { * 角色状态(0正常 1停用) */ @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") + @ExcelDictFormat(dictType = "sys_normal_disable") private String status; /** @@ -114,6 +115,12 @@ public class SysRole extends BaseEntity { @TableField(exist = false) private Long[] deptIds; + /** + * 角色菜单权限 + */ + @TableField(exist = false) + private Set permissions; + public SysRole(Long roleId) { this.roleId = roleId; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java index 7850e016d..7a4bce4b3 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/redis/QueueUtils.java @@ -5,7 +5,6 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.redisson.api.*; -import java.util.Comparator; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -30,6 +29,43 @@ public class QueueUtils { return CLIENT; } + /** + * 添加普通队列数据 + * + * @param queueName 队列名 + * @param data 数据 + */ + public static boolean addQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.offer(data); + } + + /** + * 通用获取一个队列数据 没有数据返回 null(不支持延迟队列) + * + * @param queueName 队列名 + */ + public static T getQueueObject(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.poll(); + } + + /** + * 通用删除队列数据(不支持延迟队列) + */ + public static boolean removeQueueObject(String queueName, T data) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.remove(data); + } + + /** + * 通用销毁队列 所有阻塞监听 报错(不支持延迟队列) + */ + public static boolean destroyQueue(String queueName) { + RBlockingQueue queue = CLIENT.getBlockingQueue(queueName); + return queue.delete(); + } + /** * 添加延迟队列数据 默认毫秒 * @@ -84,32 +120,6 @@ public class QueueUtils { delayedQueue.destroy(); } - /** - * 尝试设置 优先队列比较器 用于排序优先级 - * - * @param queueName 队列名 - * @param comparator 比较器 - */ - public static boolean trySetPriorityQueueComparator(String queueName, Comparator comparator) { - RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); - return priorityBlockingQueue.trySetComparator(comparator); - } - - /** - * 尝试设置 优先队列比较器 用于排序优先级 - * - * @param queueName 队列名 - * @param comparator 比较器 - * @param destroy 已存在是否销毁 - */ - public static boolean trySetPriorityQueueComparator(String queueName, Comparator comparator, boolean destroy) { - RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); - if (priorityBlockingQueue.isExists() && destroy) { - destroyPriorityQueueObject(queueName); - } - return priorityBlockingQueue.trySetComparator(comparator); - } - /** * 添加优先队列数据 * @@ -121,32 +131,6 @@ public class QueueUtils { return priorityBlockingQueue.offer(data); } - /** - * 获取一个优先队列数据 没有数据返回 null - * - * @param queueName 队列名 - */ - public static T getPriorityQueueObject(String queueName) { - RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); - return priorityBlockingQueue.poll(); - } - - /** - * 删除优先队列数据 - */ - public static boolean removePriorityQueueObject(String queueName, T data) { - RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); - return priorityBlockingQueue.remove(data); - } - - /** - * 销毁优先队列 - */ - public static boolean destroyPriorityQueueObject(String queueName) { - RPriorityBlockingQueue priorityBlockingQueue = CLIENT.getPriorityBlockingQueue(queueName); - return priorityBlockingQueue.delete(); - } - /** * 尝试设置 有界队列 容量 用于限制数量 * @@ -168,7 +152,7 @@ public class QueueUtils { public static boolean trySetBoundedQueueCapacity(String queueName, int capacity, boolean destroy) { RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); if (boundedBlockingQueue.isExists() && destroy) { - destroyBoundedQueueObject(queueName); + destroyQueue(queueName); } return boundedBlockingQueue.trySetCapacity(capacity); } @@ -185,32 +169,6 @@ public class QueueUtils { return boundedBlockingQueue.offer(data); } - /** - * 获取一个有界队列数据 没有数据返回 null - * - * @param queueName 队列名 - */ - public static T getBoundedQueueObject(String queueName) { - RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); - return boundedBlockingQueue.poll(); - } - - /** - * 删除有界队列数据 - */ - public static boolean removeBoundedQueueObject(String queueName, T data) { - RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); - return boundedBlockingQueue.remove(data); - } - - /** - * 销毁有界队列 - */ - public static boolean destroyBoundedQueueObject(String queueName) { - RBoundedBlockingQueue boundedBlockingQueue = CLIENT.getBoundedBlockingQueue(queueName); - return boundedBlockingQueue.delete(); - } - /** * 订阅阻塞队列(可订阅所有实现类 例如: 延迟 优先 有界 等) */ diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index d221f70f4..565e39c1a 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java index 50c361b1c..968a4193f 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/BoundedQueueController.java @@ -35,7 +35,7 @@ public class BoundedQueueController { @GetMapping("/add") public R add(String queueName, int capacity) { // 用完了一定要销毁 否则会一直存在 - boolean b = QueueUtils.destroyBoundedQueueObject(queueName); + boolean b = QueueUtils.destroyQueue(queueName); log.info("通道: {} , 删除: {}", queueName, b); // 初始化设置一次即可 if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) { @@ -64,7 +64,7 @@ public class BoundedQueueController { @GetMapping("/remove") public R remove(String queueName) { String data = "data-" + 5; - if (QueueUtils.removeBoundedQueueObject(queueName, data)) { + if (QueueUtils.removeQueueObject(queueName, data)) { log.info("通道: {} , 删除数据: {}", queueName, data); } else { return R.fail("操作失败"); @@ -81,7 +81,7 @@ public class BoundedQueueController { public R get(String queueName) { String data; do { - data = QueueUtils.getBoundedQueueObject(queueName); + data = QueueUtils.getQueueObject(queueName); log.info("通道: {} , 获取数据: {}", queueName, data); } while (data != null); return R.ok("操作成功"); diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java index 80f1b1155..320a640da 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemo.java @@ -2,6 +2,7 @@ package com.ruoyi.demo.controller.queue; import lombok.Data; import lombok.NoArgsConstructor; +import org.jetbrains.annotations.NotNull; /** * 实体类 注意不允许使用内部类 否则会找不到类 @@ -11,7 +12,12 @@ import lombok.NoArgsConstructor; */ @Data @NoArgsConstructor -public class PriorityDemo { +public class PriorityDemo implements Comparable { private String name; private Integer orderNum; + + @Override + public int compareTo(@NotNull PriorityDemo other) { + return Integer.compare(getOrderNum(), other.getOrderNum()); + } } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java deleted file mode 100644 index f72e6950d..000000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityDemoComparator.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.ruoyi.demo.controller.queue; - -import java.util.Comparator; - -/** - * 比较器 注意不允许使用 内部类或匿名类或lambda表达式 会找不到类 - * - * @author Lion Li - * @version 3.6.0 - */ -public class PriorityDemoComparator implements Comparator { - @Override - public int compare(PriorityDemo pd1, PriorityDemo pd2) { - return Integer.compare(pd1.getOrderNum(), pd2.getOrderNum()); - } -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java index ba6c340b6..4a60232c7 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/queue/PriorityQueueController.java @@ -34,16 +34,9 @@ public class PriorityQueueController { @GetMapping("/add") public R add(String queueName) { // 用完了一定要销毁 否则会一直存在 - boolean b = QueueUtils.destroyPriorityQueueObject(queueName); + boolean b = QueueUtils.destroyQueue(queueName); log.info("通道: {} , 删除: {}", queueName, b); - // 初始化设置一次即可 此处注意 不允许用内部类或匿名类 - boolean flag = QueueUtils.trySetPriorityQueueComparator(queueName, new PriorityDemoComparator()); - if (flag) { - log.info("通道: {} , 设置比较器成功", queueName); - } else { - log.info("通道: {} , 设置比较器失败", queueName); - return R.fail("操作失败"); - } + for (int i = 0; i < 10; i++) { int randomNum = RandomUtil.randomInt(10); PriorityDemo data = new PriorityDemo(); @@ -70,7 +63,7 @@ public class PriorityQueueController { PriorityDemo data = new PriorityDemo(); data.setName(name); data.setOrderNum(orderNum); - if (QueueUtils.removePriorityQueueObject(queueName, data)) { + if (QueueUtils.removeQueueObject(queueName, data)) { log.info("通道: {} , 删除数据: {}", queueName, data); } else { return R.fail("操作失败"); @@ -87,7 +80,7 @@ public class PriorityQueueController { public R get(String queueName) { PriorityDemo data; do { - data = QueueUtils.getPriorityQueueObject(queueName); + data = QueueUtils.getQueueObject(queueName); log.info("通道: {} , 获取数据: {}", queueName, data); } while (data != null); return R.ok("操作成功"); diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index aea86a664..a44051d7b 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.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 2893a2960..6b189aaab 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 - 4.3.0-beta2 + 4.3.0 4.0.0 jar @@ -59,25 +59,6 @@ - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - ${docker.namespace}/${project.artifactId}:${project.version} - ${project.basedir} - ${docker.registry.host} - ${docker.registry.url} - ${docker.registry.url} - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml index d0a867373..ff164369c 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 - 4.3.0-beta2 + 4.3.0 ruoyi-xxl-job-admin jar @@ -96,27 +96,6 @@ - - - com.spotify - docker-maven-plugin - ${docker.plugin.version} - - - ${docker.namespace}/${project.artifactId}:${project.version} - ${project.basedir} - ${docker.registry.host} - ${docker.registry.url} - ${docker.registry.url} - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index e28511c00..58b4dc452 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java index 551a1ece3..0159bc3cc 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java @@ -1,5 +1,7 @@ package com.ruoyi.framework.aspectj; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.domain.dto.OperLogDTO; @@ -36,6 +38,11 @@ import java.util.Map; @Component public class LogAspect { + /** + * 排除敏感属性字段 + */ + public static final String[] EXCLUDE_PROPERTIES = { "password", "oldPassword", "newPassword", "confirmPassword" }; + /** * 处理完请求后执行 * @@ -66,7 +73,7 @@ public class LogAspect { // 请求的地址 String ip = ServletUtils.getClientIP(); operLog.setOperIp(ip); - operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); + operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); operLog.setOperName(LoginHelper.getUsername()); if (e != null) { @@ -142,7 +149,13 @@ public class LogAspect { for (Object o : paramsArray) { if (ObjectUtil.isNotNull(o) && !isFilterObject(o)) { try { - params.append(JsonUtils.toJsonString(o)).append(" "); + String str = JsonUtils.toJsonString(o); + Dict dict = JsonUtils.parseMap(str); + if (MapUtil.isNotEmpty(dict)) { + MapUtil.removeAny(dict, EXCLUDE_PROPERTIES); + str = JsonUtils.toJsonString(dict); + } + params.append(str).append(" "); } catch (Exception e) { e.printStackTrace(); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java index 204195b4a..7107661cb 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java @@ -95,10 +95,25 @@ public class SwaggerConfig { // 对所有路径增加前置上下文路径 return openApi -> { Paths oldPaths = openApi.getPaths(); - Paths newPaths = new Paths(); + if (oldPaths instanceof PlusPaths) { + return; + } + PlusPaths newPaths = new PlusPaths(); oldPaths.forEach((k,v) -> newPaths.addPathItem(finalContextPath + k, v)); openApi.setPaths(newPaths); }; } + /** + * 单独使用一个类便于判断 解决springdoc路径拼接重复问题 + * + * @author Lion Li + */ + static class PlusPaths extends Paths { + + public PlusPaths() { + super(); + } + } + } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java index d6268eb8a..1e3c22c35 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/listener/UserActionListener.java @@ -5,18 +5,20 @@ import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.stp.SaLoginModel; import cn.hutool.http.useragent.UserAgent; import cn.hutool.http.useragent.UserAgentUtil; -import com.ruoyi.common.constant.CacheNames; +import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.domain.dto.UserOnlineDTO; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.enums.UserType; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.ServletUtils; -import com.ruoyi.common.utils.redis.CacheUtils; import com.ruoyi.common.utils.ip.AddressUtils; +import com.ruoyi.common.utils.redis.RedisUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.time.Duration; + /** * 用户行为 侦听器的实现 * @@ -48,12 +50,7 @@ public class UserActionListener implements SaTokenListener { dto.setTokenId(tokenValue); dto.setUserName(user.getUsername()); dto.setDeptName(user.getDeptName()); - String cacheNames = CacheNames.ONLINE_TOKEN; - if (tokenConfig.getTimeout() > 0) { - // 增加 ttl 过期时间 单位秒 - cacheNames = CacheNames.ONLINE_TOKEN + "#" + tokenConfig.getTimeout() + "s"; - } - CacheUtils.put(cacheNames, tokenValue, dto); + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout())); log.info("user doLogin, userId:{}, token:{}", loginId, tokenValue); } else if (userType == UserType.APP_USER) { // app端 自行根据业务编写 @@ -65,7 +62,7 @@ public class UserActionListener implements SaTokenListener { */ @Override public void doLogout(String loginType, Object loginId, String tokenValue) { - CacheUtils.evict(CacheNames.ONLINE_TOKEN, tokenValue); + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); log.info("user doLogout, userId:{}, token:{}", loginId, tokenValue); } @@ -74,7 +71,7 @@ public class UserActionListener implements SaTokenListener { */ @Override public void doKickout(String loginType, Object loginId, String tokenValue) { - CacheUtils.evict(CacheNames.ONLINE_TOKEN, tokenValue); + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); log.info("user doLogoutByLoginId, userId:{}, token:{}", loginId, tokenValue); } @@ -83,7 +80,7 @@ public class UserActionListener implements SaTokenListener { */ @Override public void doReplaced(String loginType, Object loginId, String tokenValue) { - CacheUtils.evict(CacheNames.ONLINE_TOKEN, tokenValue); + RedisUtils.deleteObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue); log.info("user doReplaced, userId:{}, token:{}", loginId, tokenValue); } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index ef7f43ee8..caabbeee6 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 diff --git a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm index ac0c2b2c8..4ad96df33 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -504,6 +504,7 @@ export default { this.loading = false; this.getList(); this.#[[$modal]]#.msgSuccess("删除成功"); + }).catch(() => { }).finally(() => { this.loading = false; }); diff --git a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm index 7a597f389..7a57c7fde 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/index.vue.vm @@ -561,6 +561,7 @@ export default { this.loading = false; this.getList(); this.#[[$modal]]#.msgSuccess("删除成功"); + }).catch(() => { }).finally(() => { this.loading = false; }); 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 index 5db196710..d44e082f5 100644 --- 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 @@ -487,6 +487,7 @@ function handleDelete(row) { loading.value = false; getList(); proxy.#[[$modal]]#.msgSuccess("删除成功"); + }).catch(() => { }).finally(() => { loading.value = false; }); 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 index 64adcb497..f7c1bd02f 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/index.vue.vm @@ -553,6 +553,7 @@ function handleDelete(row) { loading.value = true; getList(); proxy.#[[$modal]]#.msgSuccess("删除成功"); + }).catch(() => { }).finally(() => { loading.value = false; }); diff --git a/ruoyi-job/pom.xml b/ruoyi-job/pom.xml index 37b4e71ec..4665e47be 100644 --- a/ruoyi-job/pom.xml +++ b/ruoyi-job/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 jar diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml index ed8a3899e..7cd39435e 100644 --- a/ruoyi-oss/pom.xml +++ b/ruoyi-oss/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java index 0f9a0528c..ff88c1172 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/OssConstant.java @@ -23,7 +23,7 @@ public interface OssConstant { /** * 系统数据ids */ - List SYSTEM_DATA_IDS = Arrays.asList(1, 2, 3, 4); + List SYSTEM_DATA_IDS = Arrays.asList(1L, 2L, 3L, 4L); /** * 云服务商 diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java index cc79a6bb9..15833d3cd 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/core/OssClient.java @@ -10,6 +10,7 @@ import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; @@ -51,12 +52,16 @@ public class OssClient { } else { clientConfig.setProtocol(Protocol.HTTP); } - this.client = AmazonS3Client.builder() + AmazonS3ClientBuilder build = AmazonS3Client.builder() .withEndpointConfiguration(endpointConfig) .withClientConfiguration(clientConfig) .withCredentials(credentialsProvider) - .disableChunkedEncoding() - .build(); + .disableChunkedEncoding(); + if (!StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE)){ + // minio 使用https限制使用域名访问 需要此配置 站点填域名 + build.enablePathStyleAccess(); + } + this.client = build.build(); createBucket(); } catch (Exception e) { diff --git a/ruoyi-sms/pom.xml b/ruoyi-sms/pom.xml index 50e82b020..ea3201ac4 100644 --- a/ruoyi-sms/pom.xml +++ b/ruoyi-sms/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index 481825d93..67a9fec0e 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0-beta2 + 4.3.0 4.0.0 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java index 2fde8fcdb..1edabf509 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java @@ -61,7 +61,7 @@ public class SysPost extends BaseEntity { * 状态(0正常 1停用) */ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_common_status") + @ExcelDictFormat(dictType = "sys_normal_disable") private String status; /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java index 8844f2798..00439032c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java @@ -40,6 +40,14 @@ public interface SysMenuMapper extends BaseMapperPlus selectMenuPermsByUserId(Long userId); + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + /** * 根据用户ID查询菜单 * 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 8508d4f86..d821a4ab3 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 @@ -19,6 +19,14 @@ public interface ISysDeptService { */ List selectDeptList(SysDept dept); + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + List> selectDeptTreeList(SysDept dept); + /** * 构建前端所需要下拉树结构 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java index e7b5c9b37..813b1e282 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java @@ -39,6 +39,14 @@ public interface ISysMenuService { */ Set selectMenuPermsByUserId(Long userId); + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + /** * 根据用户ID查询菜单树信息 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java index a255fe818..97ff4801a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/SysPermissionService.java @@ -1,10 +1,12 @@ package com.ruoyi.system.service; +import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -48,7 +50,17 @@ public class SysPermissionService { if (user.isAdmin()) { perms.add("*:*:*"); } else { - perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + List roles = user.getRoles(); + if (!roles.isEmpty() && roles.size() > 1) { + // 多角色设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } else { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } } return perms; } 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 32e06d3d4..00b402467 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 @@ -58,6 +58,18 @@ public class SysDeptServiceImpl implements ISysDeptService { return baseMapper.selectDeptList(lqw); } + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + @Override + public List> selectDeptTreeList(SysDept dept) { + List depts = this.selectDeptList(dept); + return buildDeptTreeSelect(depts); + } + /** * 构建前端所需要下拉树结构 * @@ -96,7 +108,11 @@ public class SysDeptServiceImpl implements ISysDeptService { */ @Override public SysDept selectDeptById(Long deptId) { - return baseMapper.selectById(deptId); + SysDept dept = baseMapper.selectById(deptId); + SysDept parentDept = baseMapper.selectOne(new LambdaQueryWrapper() + .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); + dept.setParentName(ObjectUtil.isNotNull(parentDept) ? parentDept.getDeptName() : null); + return dept; } /** 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 6525d31e9..a573fdac7 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 @@ -97,6 +97,24 @@ public class SysMenuServiceImpl implements ISysMenuService { return permsSet; } + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = baseMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + /** * 根据用户ID查询菜单 * @@ -429,7 +447,7 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return */ public String innerLinkReplaceEach(String path) { - return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS}, + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "." }, new String[]{"", ""}); } } diff --git a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index 2f69197b3..d308d8d0b 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -95,4 +95,11 @@ and sur.user_id = #{userId} + + diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 64840dc23..645d3007e 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi-vue-plus", - "version": "4.3.0-beta2", + "version": "4.3.0", "description": "RuoYi-Vue-Plus后台管理系统", "author": "LionLi", "license": "MIT", diff --git a/ruoyi-ui/src/api/system/dept.js b/ruoyi-ui/src/api/system/dept.js index 2804676ff..331c4b2c1 100644 --- a/ruoyi-ui/src/api/system/dept.js +++ b/ruoyi-ui/src/api/system/dept.js @@ -25,22 +25,6 @@ export function getDept(deptId) { }) } -// 查询部门下拉树结构 -export function treeselect() { - return request({ - url: '/system/dept/treeselect', - method: 'get' - }) -} - -// 根据角色ID查询部门树结构 -export function roleDeptTreeselect(roleId) { - return request({ - url: '/system/dept/roleDeptTreeselect/' + roleId, - method: 'get' - }) -} - // 新增部门 export function addDept(data) { return request({ @@ -65,4 +49,4 @@ export function delDept(deptId) { url: '/system/dept/' + deptId, method: 'delete' }) -} \ No newline at end of file +} diff --git a/ruoyi-ui/src/api/system/ossConfig.js b/ruoyi-ui/src/api/system/ossConfig.js index 175325e87..f29076283 100644 --- a/ruoyi-ui/src/api/system/ossConfig.js +++ b/ruoyi-ui/src/api/system/ossConfig.js @@ -43,7 +43,7 @@ export function delOssConfig(ossConfigId) { }) } -// 用户状态修改 +// 对象存储状态修改 export function changeOssConfigStatus(ossConfigId, status, configKey) { const data = { ossConfigId, diff --git a/ruoyi-ui/src/api/system/role.js b/ruoyi-ui/src/api/system/role.js index 888538e55..f13e6f404 100644 --- a/ruoyi-ui/src/api/system/role.js +++ b/ruoyi-ui/src/api/system/role.js @@ -109,3 +109,11 @@ export function authUserSelectAll(data) { params: data }) } + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId) { + return request({ + url: '/system/role/deptTree/' + roleId, + method: 'get' + }) +} diff --git a/ruoyi-ui/src/api/system/user.js b/ruoyi-ui/src/api/system/user.js index 4fd752b4b..f2f76ef9f 100644 --- a/ruoyi-ui/src/api/system/user.js +++ b/ruoyi-ui/src/api/system/user.js @@ -125,3 +125,11 @@ export function updateAuthRole(data) { params: data }) } + +// 查询部门下拉树结构 +export function deptTreeSelect() { + return request({ + url: '/system/user/deptTree', + method: 'get' + }) +} diff --git a/ruoyi-ui/src/assets/styles/transition.scss b/ruoyi-ui/src/assets/styles/transition.scss index 4cb27cc81..eb4989554 100644 --- a/ruoyi-ui/src/assets/styles/transition.scss +++ b/ruoyi-ui/src/assets/styles/transition.scss @@ -12,11 +12,16 @@ } /* fade-transform */ +.fade-transform--move, .fade-transform-leave-active, .fade-transform-enter-active { transition: all .5s; } +.fade-transform-leave-active { + position: absolute; +} + .fade-transform-enter { opacity: 0; transform: translateX(-30px); diff --git a/ruoyi-ui/src/components/FileUpload/index.vue b/ruoyi-ui/src/components/FileUpload/index.vue index e999f14f8..1095824b5 100644 --- a/ruoyi-ui/src/components/FileUpload/index.vue +++ b/ruoyi-ui/src/components/FileUpload/index.vue @@ -12,7 +12,7 @@ :show-file-list="false" :headers="headers" class="upload-file-uploader" - ref="upload" + ref="fileUpload" > 选取文件 @@ -157,22 +157,19 @@ export default { // 上传失败 handleUploadError(err) { this.$modal.msgError("上传图片失败,请重试"); - this.$modal.closeLoading() + this.$modal.closeLoading(); }, // 上传成功回调 handleUploadSuccess(res, file) { if (res.code === 200) { this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); - if (this.uploadList.length === this.number) { - this.fileList = this.fileList.concat(this.uploadList); - this.uploadList = []; - this.number = 0; - this.$emit("input", this.listToString(this.fileList)); - this.$modal.closeLoading(); - } + this.uploadedSuccessfully(); } else { - this.$modal.msgError(res.msg); + this.number--; this.$modal.closeLoading(); + this.$modal.msgError(res.msg); + this.$refs.fileUpload.handleRemove(file); + this.uploadedSuccessfully(); } }, // 删除文件 @@ -182,6 +179,16 @@ export default { this.fileList.splice(index, 1); this.$emit("input", this.listToString(this.fileList)); }, + // 上传结束处理 + uploadedSuccessfully() { + if (this.number > 0 && this.uploadList.length === this.number) { + this.fileList = this.fileList.concat(this.uploadList); + this.uploadList = []; + this.number = 0; + this.$emit("input", this.listToString(this.fileList)); + this.$modal.closeLoading(); + } + }, // 获取文件名称 getFileName(name) { // 如果是url那么取最后的名字 如果不是直接返回 diff --git a/ruoyi-ui/src/components/ImagePreview/index.vue b/ruoyi-ui/src/components/ImagePreview/index.vue index 671eda323..cd996262a 100644 --- a/ruoyi-ui/src/components/ImagePreview/index.vue +++ b/ruoyi-ui/src/components/ImagePreview/index.vue @@ -18,7 +18,7 @@ export default { props: { src: { type: String, - required: true + default: "" }, width: { type: [Number, String], @@ -31,10 +31,16 @@ export default { }, computed: { realSrc() { + if (!this.src) { + return; + } let real_src = this.src.split(",")[0]; return real_src; }, realSrcList() { + if (!this.src) { + return; + } let real_src_list = this.src.split(","); let srcList = []; real_src_list.forEach(item => { diff --git a/ruoyi-ui/src/components/ImageUpload/index.vue b/ruoyi-ui/src/components/ImageUpload/index.vue index 62199795d..9c92e86bc 100644 --- a/ruoyi-ui/src/components/ImageUpload/index.vue +++ b/ruoyi-ui/src/components/ImageUpload/index.vue @@ -9,8 +9,8 @@ :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" - name="file" - :on-remove="handleRemove" + ref="imageUpload" + :on-remove="handleDelete" :show-file-list="true" :headers="headers" :file-list="fileList" @@ -120,32 +120,6 @@ export default { }, }, methods: { - // 删除图片 - handleRemove(file, fileList) { - const findex = this.fileList.map(f => f.name).indexOf(file.name); - if(findex > -1) { - let ossId = this.fileList[findex].ossId; - delOss(ossId); - this.fileList.splice(findex, 1); - this.$emit("input", this.listToString(this.fileList)); - } - }, - // 上传成功回调 - handleUploadSuccess(res) { - if (res.code == 200) { - this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); - if (this.uploadList.length === this.number) { - this.fileList = this.fileList.concat(this.uploadList); - this.uploadList = []; - this.number = 0; - this.$emit("input", this.listToString(this.fileList)); - this.$modal.closeLoading(); - } - } else { - this.$modal.msgError(res.msg); - this.$modal.closeLoading(); - } - }, // 上传前loading加载 handleBeforeUpload(file) { let isImg = false; @@ -181,11 +155,44 @@ export default { handleExceed() { this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`); }, + // 上传成功回调 + handleUploadSuccess(res, file) { + if (res.code === 200) { + this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); + this.uploadedSuccessfully(); + } else { + this.number--; + this.$modal.closeLoading(); + this.$modal.msgError(res.msg); + this.$refs.imageUpload.handleRemove(file); + this.uploadedSuccessfully(); + } + }, + // 删除图片 + handleDelete(file) { + const findex = this.fileList.map(f => f.name).indexOf(file.name); + if(findex > -1) { + let ossId = this.fileList[findex].ossId; + delOss(ossId); + this.fileList.splice(findex, 1); + this.$emit("input", this.listToString(this.fileList)); + } + }, // 上传失败 handleUploadError(res) { this.$modal.msgError("上传图片失败,请重试"); this.$modal.closeLoading(); }, + // 上传结束处理 + uploadedSuccessfully() { + if (this.number > 0 && this.uploadList.length === this.number) { + this.fileList = this.fileList.concat(this.uploadList); + this.uploadList = []; + this.number = 0; + this.$emit("input", this.listToString(this.fileList)); + this.$modal.closeLoading(); + } + }, // 预览 handlePictureCardPreview(file) { this.dialogImageUrl = file.url; @@ -196,10 +203,12 @@ export default { let strs = ""; separator = separator || ","; for (let i in list) { - strs += list[i].ossId + separator; + if (list[i].ossId) { + strs += list[i].ossId + separator; + } } return strs != "" ? strs.substr(0, strs.length - 1) : ""; - }, + } } }; diff --git a/ruoyi-ui/src/layout/components/AppMain.vue b/ruoyi-ui/src/layout/components/AppMain.vue index 0c6f4b784..f4e74dbdb 100644 --- a/ruoyi-ui/src/layout/components/AppMain.vue +++ b/ruoyi-ui/src/layout/components/AppMain.vue @@ -2,15 +2,19 @@
- + +
diff --git a/ruoyi-ui/src/layout/components/InnerLink/index.vue b/ruoyi-ui/src/layout/components/InnerLink/index.vue index 227ff2a70..6edcdec6a 100644 --- a/ruoyi-ui/src/layout/components/InnerLink/index.vue +++ b/ruoyi-ui/src/layout/components/InnerLink/index.vue @@ -1,27 +1,47 @@ + + diff --git a/ruoyi-ui/src/layout/components/TagsView/index.vue b/ruoyi-ui/src/layout/components/TagsView/index.vue index 20c4b55e6..cc980717e 100644 --- a/ruoyi-ui/src/layout/components/TagsView/index.vue +++ b/ruoyi-ui/src/layout/components/TagsView/index.vue @@ -133,6 +133,9 @@ export default { const { name } = this.$route if (name) { this.$store.dispatch('tagsView/addView', this.$route) + if (this.$route.meta.link) { + this.$store.dispatch('tagsView/addIframeView', this.$route) + } } return false }, @@ -153,6 +156,9 @@ export default { }, refreshSelectedTag(view) { this.$tab.refreshPage(view); + if (this.$route.meta.link) { + this.$store.dispatch('tagsView/delIframeView', this.$route) + } }, closeSelectedTag(view) { this.$tab.closePage(view).then(({ visitedViews }) => { diff --git a/ruoyi-ui/src/store/modules/tagsView.js b/ruoyi-ui/src/store/modules/tagsView.js index 002c1d099..5fc011ca8 100644 --- a/ruoyi-ui/src/store/modules/tagsView.js +++ b/ruoyi-ui/src/store/modules/tagsView.js @@ -1,9 +1,18 @@ const state = { visitedViews: [], - cachedViews: [] + cachedViews: [], + iframeViews: [] } const mutations = { + ADD_IFRAME_VIEW: (state, view) => { + if (state.iframeViews.some(v => v.path === view.path)) return + state.iframeViews.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + }, ADD_VISITED_VIEW: (state, view) => { if (state.visitedViews.some(v => v.path === view.path)) return state.visitedViews.push( @@ -18,7 +27,6 @@ const mutations = { state.cachedViews.push(view.name) } }, - DEL_VISITED_VIEW: (state, view) => { for (const [i, v] of state.visitedViews.entries()) { if (v.path === view.path) { @@ -26,6 +34,10 @@ const mutations = { break } } + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) + }, + DEL_IFRAME_VIEW: (state, view) => { + state.iframeViews = state.iframeViews.filter(item => item.path !== view.path) }, DEL_CACHED_VIEW: (state, view) => { const index = state.cachedViews.indexOf(view.name) @@ -36,6 +48,7 @@ const mutations = { state.visitedViews = state.visitedViews.filter(v => { return v.meta.affix || v.path === view.path }) + state.iframeViews = state.iframeViews.filter(item => item.path === view.path) }, DEL_OTHERS_CACHED_VIEWS: (state, view) => { const index = state.cachedViews.indexOf(view.name) @@ -45,16 +58,15 @@ const mutations = { state.cachedViews = [] } }, - DEL_ALL_VISITED_VIEWS: state => { // keep affix tags const affixTags = state.visitedViews.filter(tag => tag.meta.affix) state.visitedViews = affixTags + state.iframeViews = [] }, DEL_ALL_CACHED_VIEWS: state => { state.cachedViews = [] }, - UPDATE_VISITED_VIEW: (state, view) => { for (let v of state.visitedViews) { if (v.path === view.path) { @@ -63,7 +75,6 @@ const mutations = { } } }, - DEL_RIGHT_VIEWS: (state, view) => { const index = state.visitedViews.findIndex(v => v.path === view.path) if (index === -1) { @@ -77,10 +88,13 @@ const mutations = { if (i > -1) { state.cachedViews.splice(i, 1) } + if(item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } return false }) }, - DEL_LEFT_VIEWS: (state, view) => { const index = state.visitedViews.findIndex(v => v.path === view.path) if (index === -1) { @@ -94,6 +108,10 @@ const mutations = { if (i > -1) { state.cachedViews.splice(i, 1) } + if(item.meta.link) { + const fi = state.iframeViews.findIndex(v => v.path === item.path) + state.iframeViews.splice(fi, 1) + } return false }) } @@ -104,13 +122,15 @@ const actions = { dispatch('addVisitedView', view) dispatch('addCachedView', view) }, + addIframeView({ commit }, view) { + commit('ADD_IFRAME_VIEW', view) + }, addVisitedView({ commit }, view) { commit('ADD_VISITED_VIEW', view) }, addCachedView({ commit }, view) { commit('ADD_CACHED_VIEW', view) }, - delView({ dispatch, state }, view) { return new Promise(resolve => { dispatch('delVisitedView', view) @@ -127,13 +147,18 @@ const actions = { resolve([...state.visitedViews]) }) }, + delIframeView({ commit, state }, view) { + return new Promise(resolve => { + commit('DEL_IFRAME_VIEW', view) + resolve([...state.iframeViews]) + }) + }, delCachedView({ commit, state }, view) { return new Promise(resolve => { commit('DEL_CACHED_VIEW', view) resolve([...state.cachedViews]) }) }, - delOthersViews({ dispatch, state }, view) { return new Promise(resolve => { dispatch('delOthersVisitedViews', view) @@ -156,7 +181,6 @@ const actions = { resolve([...state.cachedViews]) }) }, - delAllViews({ dispatch, state }, view) { return new Promise(resolve => { dispatch('delAllVisitedViews', view) @@ -179,18 +203,15 @@ const actions = { resolve([...state.cachedViews]) }) }, - updateVisitedView({ commit }, view) { commit('UPDATE_VISITED_VIEW', view) }, - delRightTags({ commit }, view) { return new Promise(resolve => { commit('DEL_RIGHT_VIEWS', view) resolve([...state.visitedViews]) }) }, - delLeftTags({ commit }, view) { return new Promise(resolve => { commit('DEL_LEFT_VIEWS', view) diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index ba0fa778a..3446bd133 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -114,7 +114,7 @@ export default { data() { return { // 版本号 - version: "4.3.0-beta2", + version: "4.3.0", }; }, methods: { diff --git a/ruoyi-ui/src/views/system/dept/index.vue b/ruoyi-ui/src/views/system/dept/index.vue index 5b898a2ee..e502b4ea7 100644 --- a/ruoyi-ui/src/views/system/dept/index.vue +++ b/ruoyi-ui/src/views/system/dept/index.vue @@ -297,9 +297,13 @@ export default { this.form = response.data; this.open = true; this.title = "修改部门"; - }); - listDeptExcludeChild(row.deptId).then(response => { - this.deptOptions = this.handleTree(response.data, "deptId"); + listDeptExcludeChild(row.deptId).then(response => { + this.deptOptions = this.handleTree(response.data, "deptId"); + if (this.deptOptions.length == 0) { + const noResultsOptions = { deptId: this.form.parentId, deptName: this.form.parentName, children: [] }; + this.deptOptions.push(noResultsOptions); + } + }); }); }, /** 提交按钮 */ diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/ruoyi-ui/src/views/system/menu/index.vue index 67d7e1731..52eb8b956 100644 --- a/ruoyi-ui/src/views/system/menu/index.vue +++ b/ruoyi-ui/src/views/system/menu/index.vue @@ -107,7 +107,7 @@ - + - + @@ -195,7 +195,7 @@ - + @@ -206,7 +206,7 @@ - + @@ -217,7 +217,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -248,7 +248,7 @@ - + diff --git a/ruoyi-ui/src/views/system/role/index.vue b/ruoyi-ui/src/views/system/role/index.vue index b08cf3474..77d1d6a1f 100644 --- a/ruoyi-ui/src/views/system/role/index.vue +++ b/ruoyi-ui/src/views/system/role/index.vue @@ -254,9 +254,8 @@ + diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index 7b79ac876..72bb9423f 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -342,9 +342,8 @@