diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml index a043f277f..84ea53276 100644 --- a/.run/ruoyi-monitor-admin.run.xml +++ b/.run/ruoyi-monitor-admin.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-admin.run.xml b/.run/ruoyi-server.run.xml similarity index 87% rename from .run/ruoyi-admin.run.xml rename to .run/ruoyi-server.run.xml index e4f77c7a7..ea1fcfda5 100644 --- a/.run/ruoyi-admin.run.xml +++ b/.run/ruoyi-server.run.xml @@ -2,7 +2,7 @@ - diff --git a/.run/ruoyi-xxl-job-admin.run.xml b/.run/ruoyi-xxl-job-admin.run.xml index 4a77b863e..92cbdf6fd 100644 --- a/.run/ruoyi-xxl-job-admin.run.xml +++ b/.run/ruoyi-xxl-job-admin.run.xml @@ -2,7 +2,7 @@ - diff --git a/README.md b/README.md index 88a388b47..7b0724c44 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-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-4.3.1-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 beeada161..d128d6bf2 100644 --- a/pom.xml +++ b/pom.xml @@ -6,46 +6,48 @@ com.ruoyi ruoyi-vue-plus - 4.3.0 + 4.3.1 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 4.3.0 - 2.7.3 + 4.3.1 + 2.7.5 UTF-8 UTF-8 1.8 3.2.2 2.2.2 1.2.12 - 1.6.11 - 5.2.2 + 1.6.12 + 5.2.3 3.1.1 2.3 - 1.30.0 + 1.31.0 3.5.2 3.9.1 - 5.8.6 + 5.8.8 4.10.0 - 2.7.4 - 3.17.6 + 2.7.6 + 3.17.7 2.2.2 3.5.2 - 1.4.3 + 1.5.0 2.3.1 1.18.24 31.1-jre + + 1.32 - 1.12.300 + 1.12.324 - 2.0.18 - 3.1.591 + 2.0.22 + 3.1.611 @@ -254,6 +256,13 @@ ${guava.version} + + + org.yaml + snakeyaml + ${snakeyaml.version} + + com.ruoyi @@ -434,3 +443,4 @@ + diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index be5e8ea3d..0691a6462 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 jar diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java index 60c632a92..94630e2e9 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java @@ -1,11 +1,11 @@ package com.ruoyi.web.controller.common; +import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.captcha.AbstractCaptcha; import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; -import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.R; @@ -35,7 +35,7 @@ import java.util.Map; * * @author Lion Li */ -@Anonymous +@SaIgnore @Slf4j @Validated @RequiredArgsConstructor 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 c43055f45..01a4a82c1 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 @@ -42,12 +42,12 @@ public class SysUserOnlineController extends BaseController { @GetMapping("/list") public TableDataInfo list(String ipaddr, String userName) { // 获取所有未过期的 token - List keys = StpUtil.searchTokenValue("", -1, 0); + List keys = StpUtil.searchTokenValue("", -1, 0, false); List userOnlineDTOList = new ArrayList<>(); for (String key : keys) { String token = key.replace(CacheConstants.LOGIN_TOKEN_KEY, ""); // 如果已经过期则跳过 - if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < 0) { + if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { continue; } userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java index 1d9889239..698257406 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Anonymous; +import cn.dev33.satoken.annotation.SaIgnore; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.utils.StringUtils; import lombok.RequiredArgsConstructor; @@ -24,7 +24,7 @@ public class SysIndexController { /** * 访问首页,提示语 */ - @Anonymous + @SaIgnore @GetMapping("/") public String index() { return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index d4d0570fc..a65cb6252 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -1,11 +1,12 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Anonymous; +import cn.dev33.satoken.annotation.SaIgnore; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginBody; +import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.domain.model.SmsLoginBody; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.system.domain.vo.RouterVo; @@ -24,7 +25,6 @@ import javax.validation.constraints.NotBlank; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; /** * 登录验证 @@ -47,7 +47,7 @@ public class SysLoginController { * @param loginBody 登录信息 * @return 结果 */ - @Anonymous + @SaIgnore @PostMapping("/login") public R> login(@Validated @RequestBody LoginBody loginBody) { Map ajax = new HashMap<>(); @@ -64,7 +64,7 @@ public class SysLoginController { * @param smsLoginBody 登录信息 * @return 结果 */ - @Anonymous + @SaIgnore @PostMapping("/smsLogin") public R> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { Map ajax = new HashMap<>(); @@ -80,7 +80,7 @@ public class SysLoginController { * @param xcxCode 小程序code * @return 结果 */ - @Anonymous + @SaIgnore @PostMapping("/xcxLogin") public R> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) { Map ajax = new HashMap<>(); @@ -93,7 +93,7 @@ public class SysLoginController { /** * 退出登录 */ - @Anonymous + @SaIgnore @PostMapping("/logout") public R logout() { loginService.logout(); @@ -107,15 +107,12 @@ public class SysLoginController { */ @GetMapping("getInfo") public R> getInfo() { - SysUser user = userService.selectUserById(LoginHelper.getUserId()); - // 角色集合 - Set roles = permissionService.getRolePermission(user); - // 权限集合 - Set permissions = permissionService.getMenuPermission(user); + LoginUser loginUser = LoginHelper.getLoginUser(); + SysUser user = userService.selectUserById(loginUser.getUserId()); Map ajax = new HashMap<>(); ajax.put("user", user); - ajax.put("roles", roles); - ajax.put("permissions", permissions); + ajax.put("roles", loginUser.getRolePermission()); + ajax.put("permissions", loginUser.getMenuPermission()); return R.ok(ajax); } 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 d15a13d35..fac5ddef6 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 @@ -100,7 +100,6 @@ public class SysOssController extends BaseController { if (ObjectUtil.isNull(sysOss)) { throw new ServiceException("文件数据不存在!"); } - response.reset(); FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); long data; diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java index 5c3a67712..26445820e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java @@ -1,6 +1,6 @@ package com.ruoyi.web.controller.system; -import com.ruoyi.common.annotation.Anonymous; +import cn.dev33.satoken.annotation.SaIgnore; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.model.RegisterBody; @@ -28,7 +28,7 @@ public class SysRegisterController extends BaseController { /** * 用户注册 */ - @Anonymous + @SaIgnore @PostMapping("/register") public R register(@Validated @RequestBody RegisterBody user) { if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { 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 d1c6c576b..7e358d511 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 @@ -136,7 +136,7 @@ public class SysUserController extends BaseController { @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping public R add(@Validated @RequestBody SysUser user) { - if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) { + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) { return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { @@ -158,7 +158,9 @@ public class SysUserController extends BaseController { public R edit(@Validated @RequestBody SysUser user) { userService.checkUserAllowed(user); userService.checkUserDataScope(user.getUserId()); - if (StringUtils.isNotEmpty(user.getPhonenumber()) + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user))) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); } else if (StringUtils.isNotEmpty(user.getEmail()) diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index e671d689e..ee2698647 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -108,7 +108,7 @@ sa-token: # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) is-share: false # 是否尝试从header里读取token - is-read-head: true + is-read-header: true # 是否尝试从cookie里读取token is-read-cookie: false # token前缀 diff --git a/ruoyi-admin/src/main/resources/spy.properties b/ruoyi-admin/src/main/resources/spy.properties index 918f1cb5e..bee2392d1 100644 --- a/ruoyi-admin/src/main/resources/spy.properties +++ b/ruoyi-admin/src/main/resources/spy.properties @@ -14,6 +14,8 @@ useprefix=true excludecategories=info,debug,result,commit,resultset # 日期格式 dateformat=yyyy-MM-dd HH:mm:ss +# SQL语句打印时间格式 +databaseDialectTimestampFormat=yyyy-MM-dd HH:mm:ss # 实际驱动可多个 #driverlist=org.h2.Driver # 是否开启慢SQL记录 diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 4c8833fe0..9560b7f94 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java index fe2810083..51eaf082d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java @@ -1,5 +1,7 @@ package com.ruoyi.common.annotation; +import cn.dev33.satoken.annotation.SaIgnore; + import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -10,7 +12,9 @@ import java.lang.annotation.Target; * 匿名访问不鉴权注解 * * @author ruoyi + * @deprecated 将在后续版本使用Sa-Token注解 {@link SaIgnore} 代替 */ +@Deprecated @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented 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 index f3e2c4a56..60abde623 100644 --- 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 @@ -1,13 +1,17 @@ package com.ruoyi.common.core.domain; +import cn.hutool.core.collection.CollUtil; 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.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.sql.SqlUtil; import lombok.Data; import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; /** * 分页查询实体类 @@ -57,30 +61,52 @@ public class PageQuery implements Serializable { pageNum = DEFAULT_PAGE_NUM; } Page page = new Page<>(pageNum, pageSize); - OrderItem orderItem = buildOrderItem(); - if (ObjectUtil.isNotNull(orderItem)) { - page.addOrder(orderItem); + List orderItems = buildOrderItem(); + if (CollUtil.isNotEmpty(orderItems)) { + page.addOrder(orderItems); } return page; } - private OrderItem buildOrderItem() { - // 兼容前端排序类型 - if ("ascending".equals(isAsc)) { - isAsc = "asc"; - } else if ("descending".equals(isAsc)) { - isAsc = "desc"; + /** + * 构建排序 + * + * 支持的用法如下: + * {isAsc:"asc",orderByColumn:"id"} order by id asc + * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc + * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc + * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc + */ + private List buildOrderItem() { + if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) { + return null; } - 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); + String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); + orderBy = StringUtils.toUnderScoreCase(orderBy); + + // 兼容前端排序类型 + isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"}); + + String[] orderByArr = orderBy.split(","); + String[] isAscArr = isAsc.split(","); + if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) { + throw new ServiceException("排序参数有误"); + } + + List list = new ArrayList<>(); + // 每个字段各自排序 + for (int i = 0; i < orderByArr.length; i++) { + String orderByStr = orderByArr[i]; + String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i]; + if ("asc".equals(isAscStr)) { + list.add(OrderItem.asc(orderByStr)); + } else if ("desc".equals(isAscStr)) { + list.add(OrderItem.desc(orderByStr)); + } else { + throw new ServiceException("排序参数有误"); } } - return null; + return list; } } 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 12dc16cb4..1c7b1d865 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,11 +75,11 @@ public class R implements Serializable { return r; } - public Boolean isError() { - return !isSuccess(); + public static Boolean isError(R ret) { + return !isSuccess(ret); } - public Boolean isSuccess() { - return R.SUCCESS == getCode(); + public static Boolean isSuccess(R ret) { + return R.SUCCESS == ret.getCode(); } } 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 e6a67b26b..3ff8fec40 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 @@ -194,7 +194,6 @@ public class ExcelUtil { */ private static void resetResponse(String sheetName, HttpServletResponse response) throws UnsupportedEncodingException { String filename = encodingFilename(sheetName); - response.reset(); FileUtils.setAttachmentResponseHeader(response, filename); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); } diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index 565e39c1a..88147724a 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index a44051d7b..99750547a 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index 6b189aaab..5a0cb6476 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 + 4.3.1 4.0.0 jar diff --git a/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml b/ruoyi-extend/ruoyi-xxl-job-admin/pom.xml index ff164369c..837f8bda3 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 + 4.3.1 ruoyi-xxl-job-admin jar diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 58b4dc452..b6b9784f8 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 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 f43ecab7d..9ef6737ff 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 @@ -4,6 +4,7 @@ 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; +import org.springframework.http.CacheControl; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java index a5be2678e..a7c51fa69 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java @@ -1,7 +1,6 @@ package com.ruoyi.framework.config; -import cn.dev33.satoken.interceptor.SaAnnotationInterceptor; -import cn.dev33.satoken.interceptor.SaRouteInterceptor; +import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.jwt.StpLogicJwtForSimple; import cn.dev33.satoken.router.SaRouter; import cn.dev33.satoken.stp.StpLogic; @@ -34,14 +33,14 @@ public class SaTokenConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册路由拦截器,自定义验证规则 - registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { + registry.addInterceptor(new SaInterceptor(handler -> { + // 自定义注解 @Anonymous 匿名访问配置,后续版本将删除 ExcludeUrlProperties excludeUrlProperties = SpringUtils.getBean(ExcludeUrlProperties.class); // 登录验证 -- 排除多个路径 SaRouter // 获取所有的 .match("/**") - // 排除下不需要拦截的 - .notMatch(securityProperties.getExcludes()) + // 排除下不需要拦截的(每次匹配) .notMatch(excludeUrlProperties.getExcludes()) // 对未排除的路径进行检查 .check(() -> { @@ -55,8 +54,9 @@ public class SaTokenConfig implements WebMvcConfigurer { // } }); - })).addPathPatterns("/**"); - registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**"); + })).addPathPatterns("/**") + // 排除不需要拦截的路径 + .excludePathPatterns(securityProperties.getExcludes()); } @Bean diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java index b77f2377b..99d2eae81 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java @@ -1,5 +1,7 @@ package com.ruoyi.framework.config.properties; +import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.interceptor.SaInterceptor; import cn.hutool.core.util.ReUtil; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.utils.spring.SpringUtils; @@ -13,6 +15,8 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.util.pattern.PathPattern; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.util.*; import java.util.regex.Pattern; @@ -20,7 +24,10 @@ import java.util.regex.Pattern; * 设置注解允许匿名访问的url * * @author Lion Li + * @deprecated 将在后续版本使用Sa-Token注解 {@link SaIgnore} 代替, + * 底层过滤方法详见 {@link SaInterceptor#preHandle(HttpServletRequest, HttpServletResponse, Object)} */ +@Deprecated @Lazy @Component public class ExcludeUrlProperties implements InitializingBean { 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 1e3c22c35..9c48c135d 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 @@ -50,7 +50,11 @@ public class UserActionListener implements SaTokenListener { dto.setTokenId(tokenValue); dto.setUserName(user.getUsername()); dto.setDeptName(user.getDeptName()); - RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto, Duration.ofSeconds(tokenConfig.getTimeout())); + if(tokenConfig.getTimeout() == -1) { + RedisUtils.setCacheObject(CacheConstants.ONLINE_TOKEN_KEY + tokenValue, dto); + } else { + 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端 自行根据业务编写 @@ -88,14 +92,14 @@ public class UserActionListener implements SaTokenListener { * 每次被封禁时触发 */ @Override - public void doDisable(String loginType, Object loginId, long disableTime) { + public void doDisable(String loginType, Object loginId, String service, int level, long disableTime) { } /** * 每次被解封时触发 */ @Override - public void doUntieDisable(String loginType, Object loginId) { + public void doUntieDisable(String loginType, Object loginId, String service) { } /** @@ -112,5 +116,10 @@ public class UserActionListener implements SaTokenListener { public void doLogoutSession(String id) { } - + /** + * 每次Token续期时触发 + */ + @Override + public void doRenewTimeout(String tokenValue, Object loginId, long timeout) { + } } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java index 68df5a646..83c3d5455 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java @@ -170,10 +170,9 @@ public class PlusSaTokenDao implements SaTokenDao { * 搜索数据 */ @Override - public List searchData(String prefix, String keyword, int start, int size) { + public List searchData(String prefix, String keyword, int start, int size, boolean sortType) { Collection keys = RedisUtils.keys(prefix + "*" + keyword + "*"); List list = new ArrayList<>(keys); - return SaFoxUtil.searchList(list, start, size); + return SaFoxUtil.searchList(list, start, size, sortType); } - } diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index caabbeee6..9363bfb84 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 diff --git a/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt b/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt index 99239bb53..e6dc758af 100644 --- a/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt +++ b/ruoyi-generator/src/main/resources/vm/vue/v3/readme.txt @@ -1 +1 @@ -ʹõRuoYi-Vue3ǰˣôҪһ´Ŀ¼ģindex.vue.vmindex-tree.vue.vmļϼvueĿ¼ \ No newline at end of file +如果使用的是Vue3前端,那么需要覆盖一下此目录的模板index.vue.vm、index-tree.vue.vm文件到上级vue目录。 diff --git a/ruoyi-job/pom.xml b/ruoyi-job/pom.xml index 4665e47be..0445066cb 100644 --- a/ruoyi-job/pom.xml +++ b/ruoyi-job/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 jar @@ -37,3 +37,4 @@ + diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml index 7cd39435e..d7ec74a5b 100644 --- a/ruoyi-oss/pom.xml +++ b/ruoyi-oss/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 diff --git a/ruoyi-sms/pom.xml b/ruoyi-sms/pom.xml index ea3201ac4..45e5c80dd 100644 --- a/ruoyi-sms/pom.xml +++ b/ruoyi-sms/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index 67a9fec0e..5fca4c72d 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 4.3.0 + 4.3.1 4.0.0 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 c53bebc19..b883dae93 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 @@ -66,6 +66,8 @@ public class SysUserImportListener extends AnalysisEventListener datas = selectDictDataByType(dictType); + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) { for (SysDictData dict : datas) { @@ -265,7 +266,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService @Override public String getDictValue(String dictType, String dictLabel, String separator) { StringBuilder propertyString = new StringBuilder(); - List datas = selectDictDataByType(dictType); + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) { for (SysDictData dict : datas) { 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 a573fdac7..ea6c604a7 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 @@ -443,11 +443,9 @@ public class SysMenuServiceImpl implements ISysMenuService { /** * 内链域名特殊字符替换 - * - * @return */ public String innerLinkReplaceEach(String path) { - return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "." }, - new String[]{"", ""}); + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "."}, + new String[]{"", "", "", "/"}); } } 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 514e68efb..6c63821f1 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 @@ -9,6 +9,7 @@ import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.oss.core.OssClient; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.factory.OssFactory; @@ -50,7 +51,7 @@ public class SysOssServiceImpl implements ISysOssService { public List listByIds(Collection ossIds) { List list = new ArrayList<>(); for (Long id : ossIds) { - SysOssVo vo = getById(id); + SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); if (ObjectUtil.isNotNull(vo)) { list.add(vo); } 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 39ad7273f..4e63f17ea 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 @@ -193,12 +193,14 @@ public class SysUserServiceImpl implements ISysUserService { /** * 校验用户名称是否唯一 * - * @param userName 用户名称 + * @param user 用户信息 * @return 结果 */ @Override - public String checkUserNameUnique(String userName) { - boolean exist = baseMapper.exists(new LambdaQueryWrapper().eq(SysUser::getUserName, userName)); + public String checkUserNameUnique(SysUser user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysUser::getUserName, user.getUserName()) + .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); if (exist) { return UserConstants.NOT_UNIQUE; } diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 645d3007e..a8cdc8fe5 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi-vue-plus", - "version": "4.3.0", + "version": "4.3.1", "description": "RuoYi-Vue-Plus后台管理系统", "author": "LionLi", "license": "MIT", @@ -38,9 +38,9 @@ "@riophae/vue-treeselect": "0.4.0", "axios": "0.24.0", "clipboard": "2.0.8", - "core-js": "3.19.1", + "core-js": "3.25.3", "echarts": "4.9.0", - "element-ui": "2.15.8", + "element-ui": "2.15.10", "file-saver": "2.0.5", "fuse.js": "6.4.3", "highlight.js": "9.18.5", diff --git a/ruoyi-ui/src/App.vue b/ruoyi-ui/src/App.vue index 391d951c4..29de49f15 100644 --- a/ruoyi-ui/src/App.vue +++ b/ruoyi-ui/src/App.vue @@ -1,12 +1,16 @@ + diff --git a/ruoyi-ui/src/assets/styles/ruoyi.scss b/ruoyi-ui/src/assets/styles/ruoyi.scss index e9608771a..ca7c6f964 100644 --- a/ruoyi-ui/src/assets/styles/ruoyi.scss +++ b/ruoyi-ui/src/assets/styles/ruoyi.scss @@ -264,9 +264,10 @@ } .avatar-upload-preview { - position: absolute; + position: relative; top: 50%; - transform: translate(50%, -50%); + left: 50%; + transform: translate(-50%, -50%); width: 200px; height: 200px; border-radius: 50%; diff --git a/ruoyi-ui/src/components/FileUpload/index.vue b/ruoyi-ui/src/components/FileUpload/index.vue index 1095824b5..2e33c1b77 100644 --- a/ruoyi-ui/src/components/FileUpload/index.vue +++ b/ruoyi-ui/src/components/FileUpload/index.vue @@ -74,7 +74,7 @@ export default { number: 0, uploadList: [], baseUrl: process.env.VUE_APP_BASE_API, - uploadFileUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 上传的图片服务器地址 + uploadFileUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 上传文件服务器地址 headers: { Authorization: "Bearer " + getToken(), }, @@ -124,15 +124,9 @@ export default { handleBeforeUpload(file) { // 校检文件类型 if (this.fileType) { - let fileExtension = ""; - if (file.name.lastIndexOf(".") > -1) { - fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1); - } - const isTypeOk = this.fileType.some((type) => { - if (file.type.indexOf(type) > -1) return true; - if (fileExtension && fileExtension.indexOf(type) > -1) return true; - return false; - }); + const fileName = file.name.split('.'); + const fileExt = fileName[fileName.length - 1]; + const isTypeOk = this.fileType.indexOf(fileExt) >= 0; if (!isTypeOk) { this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`); return false; @@ -156,7 +150,7 @@ export default { }, // 上传失败 handleUploadError(err) { - this.$modal.msgError("上传图片失败,请重试"); + this.$modal.msgError("上传文件失败,请重试"); this.$modal.closeLoading(); }, // 上传成功回调 diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 3c3a65a39..2473bc133 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -132,12 +132,13 @@ service.interceptors.response.use(res => { ) // 通用下载方法 -export function download(url, params, filename) { +export function download(url, params, filename, config) { downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) return service.post(url, params, { transformRequest: [(params) => { return tansParams(params) }], headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - responseType: 'blob' + responseType: 'blob', + ...config }).then(async (data) => { const isLogin = await blobValidate(data); if (isLogin) { diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index 3446bd133..5b056a39c 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", + version: "4.3.1", }; }, methods: { diff --git a/ruoyi-ui/src/views/monitor/logininfor/index.vue b/ruoyi-ui/src/views/monitor/logininfor/index.vue index c7776f528..8a9b17abf 100644 --- a/ruoyi-ui/src/views/monitor/logininfor/index.vue +++ b/ruoyi-ui/src/views/monitor/logininfor/index.vue @@ -189,8 +189,8 @@ export default { resetQuery() { this.dateRange = []; this.resetForm("queryForm"); + this.queryParams.pageNum = 1; this.$refs.tables.sort(this.defaultSort.prop, this.defaultSort.order) - this.handleQuery(); }, /** 多选框选中数据 */ handleSelectionChange(selection) { diff --git a/ruoyi-ui/src/views/monitor/operlog/index.vue b/ruoyi-ui/src/views/monitor/operlog/index.vue index aa8c3b02b..c1b537789 100644 --- a/ruoyi-ui/src/views/monitor/operlog/index.vue +++ b/ruoyi-ui/src/views/monitor/operlog/index.vue @@ -255,8 +255,8 @@ export default { resetQuery() { this.dateRange = []; this.resetForm("queryForm"); + this.queryParams.pageNum = 1; this.$refs.tables.sort(this.defaultSort.prop, this.defaultSort.order) - this.handleQuery(); }, /** 多选框选中数据 */ handleSelectionChange(selection) { diff --git a/ruoyi-ui/src/views/system/oss/index.vue b/ruoyi-ui/src/views/system/oss/index.vue index ac8b02972..9f8557ca6 100644 --- a/ruoyi-ui/src/views/system/oss/index.vue +++ b/ruoyi-ui/src/views/system/oss/index.vue @@ -118,7 +118,10 @@ - + @@ -135,13 +138,15 @@ v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource"/> - + - +