From 02e9ac799d10a0331b593aba44b1d2980c5a67a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?=
<15040126243@163.com>
Date: Mon, 24 Oct 2022 14:35:07 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=90=AC=E5=8F=91=E5=B8=83=204.3.1=20?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80=E4=BA=9B=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=E5=BB=BA=E8=AE=AE=E5=8D=87=E7=BA=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.run/ruoyi-monitor-admin.run.xml | 12 ++++
.run/ruoyi-server.run.xml | 12 ++++
.run/ruoyi-xxl-job-admin.run.xml | 12 ++++
README.md | 2 +-
pom.xml | 28 +++++----
ruoyi-extend/pom.xml | 2 +-
ruoyi-extend/ruoyi-monitor-admin/pom.xml | 2 +-
ruoyi-extend/ruoyi-xxl-job-admin/pom.xml | 2 +-
ruoyi-ui/package.json | 6 +-
ruoyi-ui/src/App.vue | 15 ++++-
ruoyi-ui/src/assets/styles/ruoyi.scss | 5 +-
ruoyi-ui/src/components/FileUpload/index.vue | 16 ++---
ruoyi-ui/src/utils/request.js | 5 +-
ruoyi-ui/src/views/index.vue | 2 +-
.../src/views/monitor/logininfor/index.vue | 2 +-
ruoyi-ui/src/views/monitor/operlog/index.vue | 2 +-
ruoyi-ui/src/views/system/oss/index.vue | 63 ++++++++++++++++++-
ruoyi-ui/src/views/system/user/index.vue | 4 +-
.../views/system/user/profile/userAvatar.vue | 27 +++++---
ruoyi-ui/src/views/tool/gen/editTable.vue | 10 +--
ruoyi/pom.xml | 2 +-
.../ruoyi/common/annotation/Anonymous.java | 4 ++
.../ruoyi/common/core/domain/PageQuery.java | 60 +++++++++++++-----
.../java/com/ruoyi/common/core/domain/R.java | 8 +--
.../com/ruoyi/common/utils/poi/ExcelUtil.java | 1 -
.../framework/config/ResourcesConfig.java | 1 +
.../ruoyi/framework/config/SaTokenConfig.java | 14 ++---
.../properties/ExcludeUrlProperties.java | 7 +++
.../listener/UserActionListener.java | 17 +++--
.../framework/satoken/dao/PlusSaTokenDao.java | 5 +-
.../listener/SysUserImportListener.java | 2 +
.../ruoyi/system/service/ISysUserService.java | 4 +-
.../ruoyi/system/service/SysLoginService.java | 4 +-
.../system/service/SysRegisterService.java | 8 +--
.../service/impl/SysConfigServiceImpl.java | 5 +-
.../service/impl/SysDictTypeServiceImpl.java | 5 +-
.../service/impl/SysMenuServiceImpl.java | 6 +-
.../service/impl/SysOssServiceImpl.java | 3 +-
.../service/impl/SysUserServiceImpl.java | 8 ++-
.../controller/common/CaptchaController.java | 4 +-
.../monitor/SysUserOnlineController.java | 4 +-
.../controller/system/SysIndexController.java | 4 +-
.../controller/system/SysLoginController.java | 23 +++----
.../controller/system/SysOssController.java | 1 -
.../system/SysRegisterController.java | 4 +-
.../controller/system/SysUserController.java | 6 +-
ruoyi/src/main/resources/application.yml | 2 +-
ruoyi/src/main/resources/spy.properties | 2 +
ruoyi/src/main/resources/vm/vue/v3/readme.txt | 2 +-
script/docker/docker-compose.yml | 8 +--
50 files changed, 308 insertions(+), 145 deletions(-)
create mode 100644 .run/ruoyi-monitor-admin.run.xml
create mode 100644 .run/ruoyi-server.run.xml
create mode 100644 .run/ruoyi-xxl-job-admin.run.xml
diff --git a/.run/ruoyi-monitor-admin.run.xml b/.run/ruoyi-monitor-admin.run.xml
new file mode 100644
index 000000000..84ea53276
--- /dev/null
+++ b/.run/ruoyi-monitor-admin.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.run/ruoyi-server.run.xml b/.run/ruoyi-server.run.xml
new file mode 100644
index 000000000..ea1fcfda5
--- /dev/null
+++ b/.run/ruoyi-server.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..92cbdf6fd
--- /dev/null
+++ b/.run/ruoyi-xxl-job-admin.run.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
index 88a388b47..7b0724c44 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE)
[](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
+[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus)
[]()
[]()
[]()
diff --git a/pom.xml b/pom.xml
index e1c02ede6..6bf911cd9 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
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-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"/>
-
+
{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
-
+
-
+
选择
@@ -32,19 +32,19 @@
-
+
-
+
-
+
-
+
-
+
提 交
@@ -56,6 +56,7 @@
import store from "@/store";
import { VueCropper } from "vue-cropper";
import { uploadAvatar } from "@/api/system/user";
+import { debounce } from '@/utils'
export default {
components: { VueCropper },
@@ -80,7 +81,8 @@ export default {
fixedBox: true, // 固定截图框大小 不允许改变
filename: ''
},
- previews: {}
+ previews: {},
+ resizeHandler: null
};
},
methods: {
@@ -91,6 +93,16 @@ export default {
// 打开弹出层结束时的回调
modalOpened() {
this.visible = true;
+ if (!this.resizeHandler) {
+ this.resizeHandler = debounce(() => {
+ this.refresh()
+ }, 100)
+ }
+ window.addEventListener("resize", this.resizeHandler)
+ },
+ // 刷新组件
+ refresh() {
+ this.$refs.cropper.refresh();
},
// 覆盖默认的上传行为
requestUpload() {
@@ -144,6 +156,7 @@ export default {
closeDialog() {
this.options.img = store.getters.avatar
this.visible = false;
+ window.removeEventListener("resize", this.resizeHandler)
}
}
};
diff --git a/ruoyi-ui/src/views/tool/gen/editTable.vue b/ruoyi-ui/src/views/tool/gen/editTable.vue
index 714e4e7c7..f34327d3c 100644
--- a/ruoyi-ui/src/views/tool/gen/editTable.vue
+++ b/ruoyi-ui/src/views/tool/gen/editTable.vue
@@ -45,22 +45,22 @@
-
+
-
+
-
+
-
+
@@ -79,7 +79,7 @@
-
+
diff --git a/ruoyi/pom.xml b/ruoyi/pom.xml
index c2a5fe402..0d0760d01 100644
--- a/ruoyi/pom.xml
+++ b/ruoyi/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/src/main/java/com/ruoyi/common/annotation/Anonymous.java b/ruoyi/src/main/java/com/ruoyi/common/annotation/Anonymous.java
index fe2810083..51eaf082d 100644
--- a/ruoyi/src/main/java/com/ruoyi/common/annotation/Anonymous.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/common/core/domain/PageQuery.java b/ruoyi/src/main/java/com/ruoyi/common/core/domain/PageQuery.java
index f3e2c4a56..60abde623 100644
--- a/ruoyi/src/main/java/com/ruoyi/common/core/domain/PageQuery.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi/src/main/java/com/ruoyi/common/core/domain/R.java
index 12dc16cb4..1c7b1d865 100644
--- a/ruoyi/src/main/java/com/ruoyi/common/core/domain/R.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
index e6a67b26b..3ff8fec40 100644
--- a/ruoyi/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
index f43ecab7d..9ef6737ff 100644
--- a/ruoyi/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java
index a5be2678e..a7c51fa69 100644
--- a/ruoyi/src/main/java/com/ruoyi/framework/config/SaTokenConfig.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java
index b77f2377b..99d2eae81 100644
--- a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/ExcludeUrlProperties.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/framework/listener/UserActionListener.java b/ruoyi/src/main/java/com/ruoyi/framework/listener/UserActionListener.java
index 1e3c22c35..9c48c135d 100644
--- a/ruoyi/src/main/java/com/ruoyi/framework/listener/UserActionListener.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java b/ruoyi/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java
index 68df5a646..83c3d5455 100644
--- a/ruoyi/src/main/java/com/ruoyi/framework/satoken/dao/PlusSaTokenDao.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java b/ruoyi/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java
index c53bebc19..b883dae93 100644
--- a/ruoyi/src/main/java/com/ruoyi/system/listener/SysUserImportListener.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
index a573fdac7..ea6c604a7 100644
--- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java
index 514e68efb..6c63821f1 100644
--- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
index 39ad7273f..4e63f17ea 100644
--- a/ruoyi/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
index 60c632a92..94630e2e9 100644
--- a/ruoyi/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
index c43055f45..01a4a82c1 100644
--- a/ruoyi/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
index 1d9889239..698257406 100644
--- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
+++ b/ruoyi/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/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index d4d0570fc..a65cb6252 100644
--- a/ruoyi/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi/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