From f9401cabb2afcc9ce69f0ea3aa8a27f6f4284ed1 Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Thu, 9 Feb 2023 18:36:14 +0800
Subject: [PATCH 01/48] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E6=9D=83?=
=?UTF-8?q?=E9=99=90=E7=AE=A1=E7=90=86api=E6=96=87=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dataease/plugins/server/XAuthServer.java | 23 +++++++++++--------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
index 331d6b1c58..1cd27cad47 100644
--- a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
+++ b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
@@ -16,19 +16,20 @@ import io.dataease.plugins.xpack.auth.dto.request.XpackSysAuthRequest;
import io.dataease.plugins.xpack.auth.dto.response.XpackSysAuthDetail;
import io.dataease.plugins.xpack.auth.dto.response.XpackSysAuthDetailDTO;
import io.dataease.plugins.xpack.auth.dto.response.XpackVAuthModelDTO;
+import io.dataease.plugins.xpack.auth.service.AuthXpackService;
import io.dataease.service.datasource.DatasourceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*;
-import io.dataease.plugins.xpack.auth.service.AuthXpackService;
-import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
-@ApiIgnore
+@Api(tags = "权限管理")
@RequestMapping("/plugin/auth")
@RestController
public class XAuthServer {
@@ -41,6 +42,7 @@ public class XAuthServer {
@RequiresPermissions("auth:read")
@PostMapping("/authModels")
@I18n
+ @ApiOperation("根据类型查询权限树")
public List authModels(@RequestBody XpackBaseTreeRequest request) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
CurrentUserDto user = AuthUtils.getUser();
@@ -49,6 +51,7 @@ public class XAuthServer {
@RequiresPermissions("auth:read")
@PostMapping("/authDetails")
+ @ApiOperation("查询权限源目标映射关系")
public Map> authDetails(@RequestBody XpackSysAuthRequest request) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
return sysAuthService.searchAuthDetails(request);
@@ -57,6 +60,7 @@ public class XAuthServer {
@RequiresPermissions("auth:read")
@GetMapping("/authDetailsModel/{authType}/{direction}")
@I18n
+ @ApiOperation("查询授权明细")
public List authDetailsModel(@PathVariable String authType, @PathVariable String direction) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
List authDetails = sysAuthService.searchAuthDetailsModel(authType);
@@ -72,6 +76,7 @@ public class XAuthServer {
@RequiresPermissions("auth:read")
@PostMapping("/authChange")
+ @ApiOperation("变更授权信息")
public void authChange(@RequestBody XpackSysAuthRequest request) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
CurrentUserDto user = AuthUtils.getUser();
@@ -157,17 +162,17 @@ public class XAuthServer {
}
@GetMapping("/getDatasourceTypes")
- public List getDatasourceTypes(){
- Collection activeType = datasourceService.types();
- Map activeTypeMap = activeType.stream().collect(Collectors.toMap(DataSourceType::getType, DataSourceType::getName));
- activeTypeMap.put("all","所有数据源");
+ public List getDatasourceTypes() {
+ Collection activeType = datasourceService.types();
+ Map activeTypeMap = activeType.stream().collect(Collectors.toMap(DataSourceType::getType, DataSourceType::getName));
+ activeTypeMap.put("all", "所有数据源");
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
List presentTypes = sysAuthService.getDatasourceTypes();
presentTypes.stream().forEach(datasourceBaseType -> {
- if(activeTypeMap.get(datasourceBaseType.getType())!=null){
+ if (activeTypeMap.get(datasourceBaseType.getType()) != null) {
datasourceBaseType.setName(activeTypeMap.get(datasourceBaseType.getType()));
}
});
- return presentTypes;
+ return presentTypes;
}
}
From 1b83afc800928f21a46f8dc4c82252103624a250 Mon Sep 17 00:00:00 2001
From: junjun
Date: Thu, 9 Feb 2023 20:18:46 +0800
Subject: [PATCH 02/48] =?UTF-8?q?fix(=E8=A7=86=E5=9B=BE):=20=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8Ddoris=E4=B8=AD=E4=BD=BF=E7=94=A8case=E8=AF=AD=E6=B3=95?=
=?UTF-8?q?=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../engine/doris/DorisQueryProvider.java | 25 +++++++++++++++----
.../src/main/resources/sql/sqlTemplate.stg | 14 +++++++++--
2 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java
index 204a3f73f0..26e12c4b12 100644
--- a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java
+++ b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java
@@ -155,7 +155,10 @@ public class DorisQueryProvider extends QueryProvider {
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
ST st_sql = stg.getInstanceOf("previewSql");
st_sql.add("isGroup", isGroup);
- if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(xFields)) {
+ st_sql.add("useAliasForGroup", true);
+ st_sql.add("groups", xFields);
+ }
if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
String customWheres = transCustomFilterList(tableObj, fieldCustomFilter);
// row permissions tree
@@ -345,7 +348,10 @@ public class DorisQueryProvider extends QueryProvider {
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
ST st_sql = stg.getInstanceOf("querySql");
- if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(xFields)) {
+ st_sql.add("useAliasForGroup", true);
+ st_sql.add("groups", xFields);
+ }
if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
@@ -435,7 +441,10 @@ public class DorisQueryProvider extends QueryProvider {
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
ST st_sql = stg.getInstanceOf("previewSql");
st_sql.add("isGroup", false);
- if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(xFields)) {
+ st_sql.add("useAliasForGroup", true);
+ st_sql.add("groups", xFields);
+ }
if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
String sql = st_sql.render();
@@ -558,7 +567,10 @@ public class DorisQueryProvider extends QueryProvider {
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
ST st_sql = stg.getInstanceOf("querySql");
- if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(xFields)) {
+ st_sql.add("useAliasForGroup", true);
+ st_sql.add("groups", xFields);
+ }
if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
@@ -672,7 +684,10 @@ public class DorisQueryProvider extends QueryProvider {
STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
ST st_sql = stg.getInstanceOf("querySql");
- if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(xFields)) {
+ st_sql.add("useAliasForGroup", true);
+ st_sql.add("groups", xFields);
+ }
if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
diff --git a/backend/src/main/resources/sql/sqlTemplate.stg b/backend/src/main/resources/sql/sqlTemplate.stg
index 41cd934e64..9a0485cd51 100644
--- a/backend/src/main/resources/sql/sqlTemplate.stg
+++ b/backend/src/main/resources/sql/sqlTemplate.stg
@@ -1,4 +1,4 @@
-querySql(limitFiled, groups, aggregators, filters, orders, table, notUseAs)
+querySql(limitFiled, groups, aggregators, filters, orders, table, notUseAs, useAliasForGroup)
::=<<
SELECT
@@ -25,8 +25,13 @@ WHERE
GROUP BY
+
}; separator=",\n">
+
+ }; separator=",\n">
+
+
ORDER BY
}; separator=",\n">
@@ -34,7 +39,7 @@ ORDER BY
>>
-previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup, notUseAs)
+previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup, notUseAs, useAliasForGroup)
::=<<
SELECT
@@ -61,8 +66,13 @@ WHERE
GROUP BY
+
}; separator=",\n">
+
+ }; separator=",\n">
+
+
ORDER BY
}; separator=",\n">
From e41295c36b49b22f6efc927c1f2fd72a69de5c18 Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Fri, 10 Feb 2023 10:01:16 +0800
Subject: [PATCH 03/48] =?UTF-8?q?refactor:=20Api=E6=96=87=E6=A1=A3?=
=?UTF-8?q?=E6=95=B4=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/io/dataease/auth/api/AuthApi.java | 5 ++--
.../io/dataease/auth/api/DynamicMenuApi.java | 4 +++-
.../dataease/config/Knife4jConfiguration.java | 23 +++++++++++--------
.../dataease/plugins/server/XAuthServer.java | 2 +-
4 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/backend/src/main/java/io/dataease/auth/api/AuthApi.java b/backend/src/main/java/io/dataease/auth/api/AuthApi.java
index aeaee10e13..2b15b62e51 100644
--- a/backend/src/main/java/io/dataease/auth/api/AuthApi.java
+++ b/backend/src/main/java/io/dataease/auth/api/AuthApi.java
@@ -6,14 +6,13 @@ import io.dataease.auth.api.dto.LoginDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
-import springfox.documentation.annotations.ApiIgnore;
-
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
+import springfox.documentation.annotations.ApiIgnore;
import java.util.Map;
-@Api(tags = "权限:权限管理")
+@Api(tags = "登录:登录管理")
@ApiSupport(order = 10)
@RequestMapping("/api/auth")
public interface AuthApi {
diff --git a/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java b/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java
index 790c4917bb..9b972800f7 100644
--- a/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java
+++ b/backend/src/main/java/io/dataease/auth/api/DynamicMenuApi.java
@@ -8,15 +8,17 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
+
import java.util.List;
-@Api(tags = "权限:动态菜单")
+@Api(tags = "登录:动态菜单")
@ApiSupport(order = 20)
@RequestMapping("/api/dynamicMenu")
public interface DynamicMenuApi {
/**
* 根据heads中获取的token 获取username 获取对应权限的菜单
+ *
* @return
*/
@ApiOperation("查询")
diff --git a/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java b/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java
index eff1bb147e..c5b13ab877 100644
--- a/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java
+++ b/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java
@@ -7,15 +7,19 @@ import com.google.common.base.Predicate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.context.annotation.*;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.RequestHandler;
-import springfox.documentation.builders.*;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
+
import java.util.ArrayList;
import java.util.List;
@@ -23,7 +27,7 @@ import java.util.List;
@EnableOpenApi
@Configuration
@Import(BeanValidatorPluginsConfiguration.class)
-public class Knife4jConfiguration implements BeanPostProcessor{
+public class Knife4jConfiguration implements BeanPostProcessor {
private static final String splitor = ",";
@@ -33,7 +37,6 @@ public class Knife4jConfiguration implements BeanPostProcessor{
private String version;
-
@Autowired
public Knife4jConfiguration(OpenApiExtensionResolver openApiExtensionResolver) {
this.openApiExtensionResolver = openApiExtensionResolver;
@@ -41,7 +44,7 @@ public class Knife4jConfiguration implements BeanPostProcessor{
@Bean(value = "authApi")
public Docket authApi() {
- return defaultApi("权限管理", "io.dataease.auth");
+ return defaultApi("登录管理", "io.dataease.auth");
}
@Bean(value = "chartApi")
@@ -69,24 +72,24 @@ public class Knife4jConfiguration implements BeanPostProcessor{
return defaultApi("系统管理", "io.dataease.controller.sys,io.dataease.plugins.server");
}
- private ApiInfo apiInfo(){
+ private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("DataEase")
.description("人人可用的开源数据可视化分析工具")
.termsOfServiceUrl("https://dataease.io")
- .contact(new Contact("Dataease","https://www.fit2cloud.com/dataease/index.html","dataease@fit2cloud.com"))
+ .contact(new Contact("Dataease", "https://www.fit2cloud.com/dataease/index.html", "dataease@fit2cloud.com"))
.version(version)
.build();
}
private Docket defaultApi(String groupName, String packageName) {
- List securitySchemes=new ArrayList<>();
+ List securitySchemes = new ArrayList<>();
securitySchemes.add(accessKey());
securitySchemes.add(signature());
List securityContexts = new ArrayList<>();
securityContexts.add(securityContext());
- Docket docket=new Docket(DocumentationType.OAS_30)
+ Docket docket = new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.groupName(groupName)
.select()
@@ -131,7 +134,7 @@ public class Knife4jConfiguration implements BeanPostProcessor{
return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
}
- private static Function, Boolean> handlerPackage(final String basePackage) {
+ private static Function, Boolean> handlerPackage(final String basePackage) {
return input -> {
// 循环判断匹配
for (String strPackage : basePackage.split(splitor)) {
diff --git a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
index 1cd27cad47..7a9952fa61 100644
--- a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
+++ b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
@@ -29,7 +29,7 @@ import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
-@Api(tags = "权限管理")
+@Api(tags = "xpack:权限管理")
@RequestMapping("/plugin/auth")
@RestController
public class XAuthServer {
From 7e01b14c859b2e5bcac618a44f417c1b7526d7cb Mon Sep 17 00:00:00 2001
From: junjun
Date: Fri, 10 Feb 2023 10:02:19 +0800
Subject: [PATCH 04/48] =?UTF-8?q?fix(=E8=A7=86=E5=9B=BE):=20=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8Ddoris=E4=B8=AD=E4=BD=BF=E7=94=A8case=E8=AF=AD=E6=B3=95?=
=?UTF-8?q?=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/src/main/resources/sql/sqlTemplate.stg | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/backend/src/main/resources/sql/sqlTemplate.stg b/backend/src/main/resources/sql/sqlTemplate.stg
index 9a0485cd51..d24d71b521 100644
--- a/backend/src/main/resources/sql/sqlTemplate.stg
+++ b/backend/src/main/resources/sql/sqlTemplate.stg
@@ -23,15 +23,14 @@ FROM
WHERE
}; separator="\nAND ">
-
+
GROUP BY
-
}; separator=",\n">
-
+
+GROUP BY
}; separator=",\n">
-
ORDER BY
}; separator=",\n">
@@ -64,15 +63,14 @@ FROM
WHERE
}; separator="\nAND ">
-
+
GROUP BY
-
}; separator=",\n">
-
+
+GROUP BY
}; separator=",\n">
-
ORDER BY
}; separator=",\n">
From ad8746e1bcd07bae8f5996086947c3d831efbf96 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Fri, 10 Feb 2023 12:54:44 +0800
Subject: [PATCH 05/48] =?UTF-8?q?fix(=E7=99=BB=E5=BD=95):=20=E5=88=B7?=
=?UTF-8?q?=E6=96=B0token=E5=AF=BC=E8=87=B4=E9=80=80=E5=87=BA=E7=99=BB?=
=?UTF-8?q?=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/io/dataease/auth/filter/JWTFilter.java | 3 ++-
.../io/dataease/commons/utils/TokenCacheUtils.java | 10 ++++++++++
backend/src/main/resources/ehcache/ehcache.xml | 12 ++++++++++++
frontend/src/utils/request.js | 3 ++-
4 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index 973b0fced2..24ca87c8d6 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (StringUtils.startsWith(authorization, "Basic")) {
return false;
}
- if (!TokenCacheUtils.validate(authorization)) {
+ if (!TokenCacheUtils.validate(authorization) && TokenCacheUtils.validateDelay(authorization)) {
throw new AuthenticationException(expireMessage);
}
// 当没有出现登录超时 且需要刷新token 则执行刷新token
@@ -75,6 +75,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
throw new AuthenticationException(expireMessage);
}
if (JWTUtils.needRefresh(authorization)) {
+ TokenCacheUtils.addWithTtl(authorization, 1L);
TokenCacheUtils.remove(authorization);
authorization = refreshToken(request, response);
}
diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
index e17f293b51..338adbf2da 100644
--- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
@@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils;
public class TokenCacheUtils {
private static final String KEY = "sys_token_store";
+ private static final String DELAY_KEY = "sys_token_store_delay";
public static void add(String token, Long userId) {
CacheUtils.put(KEY, token, userId, null, null);
@@ -25,4 +26,13 @@ public class TokenCacheUtils {
Object sys_token_store = CacheUtils.get(KEY, token);
return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString());
}
+
+ public static void addWithTtl(String token, Long userId) {
+ CacheUtils.put(DELAY_KEY, token, userId, 3, 5);
+ }
+
+ public static boolean validateDelay(String token) {
+ Object tokenObj = CacheUtils.get(DELAY_KEY, token);
+ return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString());
+ }
}
diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml
index c1fedd7f25..f8d8591b20 100644
--- a/backend/src/main/resources/ehcache/ehcache.xml
+++ b/backend/src/main/resources/ehcache/ehcache.xml
@@ -279,5 +279,17 @@
diskPersistent="false"
/>
+
+
\ No newline at end of file
diff --git a/frontend/src/utils/request.js b/frontend/src/utils/request.js
index 78536360fc..477c20817c 100644
--- a/frontend/src/utils/request.js
+++ b/frontend/src/utils/request.js
@@ -1,7 +1,7 @@
import axios from 'axios'
import store from '@/store'
import { $alert, $error } from './message'
-import { getToken, getIdToken } from '@/utils/auth'
+import { getToken, getIdToken, setToken } from '@/utils/auth'
import Config from '@/settings'
import i18n from '@/lang'
import { tryShowLoading, tryHideLoading } from './loading'
@@ -157,6 +157,7 @@ const checkAuth = response => {
// token到期后自动续命 刷新token
if (response.headers[RefreshTokenKey]) {
const refreshToken = response.headers[RefreshTokenKey]
+ setToken(refreshToken)
store.dispatch('user/refreshToken', refreshToken)
}
From 44978fad4fc98e7001c719551bdbfe38b7b3ee57 Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Fri, 10 Feb 2023 14:12:02 +0800
Subject: [PATCH 06/48] =?UTF-8?q?refactor:=20Api=E6=96=87=E6=A1=A3?=
=?UTF-8?q?=E6=95=B4=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/main/java/io/dataease/plugins/server/XAuthServer.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
index 7a9952fa61..9c1e1efbcd 100644
--- a/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
+++ b/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
@@ -162,6 +162,7 @@ public class XAuthServer {
}
@GetMapping("/getDatasourceTypes")
+ @ApiOperation("查询授权的数据类型")
public List getDatasourceTypes() {
Collection activeType = datasourceService.types();
Map activeTypeMap = activeType.stream().collect(Collectors.toMap(DataSourceType::getType, DataSourceType::getName));
From 67d31c839da8190a3a5e285ed42a73978d500524 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Mon, 13 Feb 2023 11:15:28 +0800
Subject: [PATCH 07/48] =?UTF-8?q?fix(=E7=99=BB=E5=BD=95):=20=E5=88=B7?=
=?UTF-8?q?=E6=96=B0token=E5=AF=BC=E8=87=B4=E7=94=A8=E6=88=B7=E9=A2=91?=
=?UTF-8?q?=E7=B9=81=E6=8E=89=E7=BA=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/src/main/java/io/dataease/auth/filter/JWTFilter.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index 24ca87c8d6..e5bd636789 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (StringUtils.startsWith(authorization, "Basic")) {
return false;
}
- if (!TokenCacheUtils.validate(authorization) && TokenCacheUtils.validateDelay(authorization)) {
+ if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) {
throw new AuthenticationException(expireMessage);
}
// 当没有出现登录超时 且需要刷新token 则执行刷新token
From 82547eb12d47a64887691d201aab5875c288aa0a Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Mon, 13 Feb 2023 14:00:33 +0800
Subject: [PATCH 08/48] =?UTF-8?q?fix(=E8=A7=86=E5=9B=BE):=20=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E5=88=86=E9=A1=B5=E6=98=8E=E7=BB=86=E8=A1=A8=EF=BC=8C?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=AE=BE=E7=BD=AE=E8=B7=B3=E8=BD=AC=E9=93=BE?=
=?UTF-8?q?=E6=8E=A5=EF=BC=8C=E5=8F=AA=E6=9C=89=E7=AC=AC=E4=B8=80=E9=A1=B5?=
=?UTF-8?q?=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98=20#4494?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/views/chart/components/ChartComponentS2.vue | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frontend/src/views/chart/components/ChartComponentS2.vue b/frontend/src/views/chart/components/ChartComponentS2.vue
index 63d8bbd690..deb834afdc 100644
--- a/frontend/src/views/chart/components/ChartComponentS2.vue
+++ b/frontend/src/views/chart/components/ChartComponentS2.vue
@@ -67,8 +67,8 @@
>
{{ $t('chart.total') }}
{{
- (chart.datasetMode === 0 && !not_support_page_dataset.includes(chart.datasourceType)) ? chart.totalItems : ((chart.data && chart.data.tableRow) ? chart.data.tableRow.length : 0)
- }}
+ (chart.datasetMode === 0 && !not_support_page_dataset.includes(chart.datasourceType)) ? chart.totalItems : ((chart.data && chart.data.tableRow) ? chart.data.tableRow.length : 0)
+ }}
{{ $t('chart.items') }}
Date: Tue, 14 Feb 2023 11:40:58 +0800
Subject: [PATCH 09/48] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AEdataease.proper?=
=?UTF-8?q?ties=E9=85=8D=E7=BD=AE=E9=87=8C=E7=9A=84mysql=E9=93=BE=E6=8E=A5?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9D=A5=E6=9B=B4=E6=96=B0demo=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=BA=90=E7=9A=84=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../listener/DataSourceInitStartListener.java | 1 +
.../service/datasource/DatasourceService.java | 20 +++++++++++++++++++
2 files changed, 21 insertions(+)
diff --git a/backend/src/main/java/io/dataease/listener/DataSourceInitStartListener.java b/backend/src/main/java/io/dataease/listener/DataSourceInitStartListener.java
index fed96e7708..157c2f97aa 100644
--- a/backend/src/main/java/io/dataease/listener/DataSourceInitStartListener.java
+++ b/backend/src/main/java/io/dataease/listener/DataSourceInitStartListener.java
@@ -26,6 +26,7 @@ public class DataSourceInitStartListener implements ApplicationListener
Date: Tue, 14 Feb 2023 14:08:37 +0800
Subject: [PATCH 10/48] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E5=8F=B7=E5=88=B01.18.3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/pom.xml | 8 ++++----
backend/src/main/resources/db/migration/V50__1.18.3.sql | 4 ++++
frontend/package.json | 2 +-
frontend/pom.xml | 2 +-
mobile/pom.xml | 2 +-
pom.xml | 2 +-
6 files changed, 12 insertions(+), 8 deletions(-)
create mode 100644 backend/src/main/resources/db/migration/V50__1.18.3.sql
diff --git a/backend/pom.xml b/backend/pom.xml
index f5ece1d4af..039930587b 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -5,7 +5,7 @@
dataease-server
io.dataease
- 1.18.2
+ 1.18.3
4.0.0
@@ -204,7 +204,7 @@
io.dataease
dataease-plugin-interface
- 1.18.2
+ 1.18.3
guava
@@ -215,12 +215,12 @@
io.dataease
dataease-plugin-view
- 1.18.2
+ 1.18.3
io.dataease
dataease-plugin-datasource
- 1.18.2
+ 1.18.3
diff --git a/backend/src/main/resources/db/migration/V50__1.18.3.sql b/backend/src/main/resources/db/migration/V50__1.18.3.sql
new file mode 100644
index 0000000000..f9f320fd3f
--- /dev/null
+++ b/backend/src/main/resources/db/migration/V50__1.18.3.sql
@@ -0,0 +1,4 @@
+UPDATE `my_plugin`
+SET `version` = '1.18.3'
+where `plugin_id` > 0
+ and `version` = '1.18.2';
diff --git a/frontend/package.json b/frontend/package.json
index f312476501..3816f0a7ab 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "dataease",
- "version": "1.18.2",
+ "version": "1.18.3",
"description": "dataease front",
"private": true,
"scripts": {
diff --git a/frontend/pom.xml b/frontend/pom.xml
index d49c6b1aa2..123e82483a 100644
--- a/frontend/pom.xml
+++ b/frontend/pom.xml
@@ -6,7 +6,7 @@
dataease-server
io.dataease
- 1.18.2
+ 1.18.3
4.0.0
diff --git a/mobile/pom.xml b/mobile/pom.xml
index c565ce5e97..063e794c90 100644
--- a/mobile/pom.xml
+++ b/mobile/pom.xml
@@ -6,7 +6,7 @@
dataease-server
io.dataease
- 1.18.2
+ 1.18.3
4.0.0
diff --git a/pom.xml b/pom.xml
index 0fcfa4d2bd..e99f15476b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0
io.dataease
dataease-server
- 1.18.2
+ 1.18.3
pom
From fc60ba441b56bb419bef9e45d37705ceb4c6a8b9 Mon Sep 17 00:00:00 2001
From: taojinlong
Date: Wed, 15 Feb 2023 11:11:04 +0800
Subject: [PATCH 11/48] =?UTF-8?q?feat:=20=E6=A0=B9=E6=8D=AEdataease.proper?=
=?UTF-8?q?ties=E9=85=8D=E7=BD=AE=E9=87=8C=E7=9A=84mysql=E9=93=BE=E6=8E=A5?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9D=A5=E6=9B=B4=E6=96=B0demo=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=BA=90=E7=9A=84=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/io/dataease/service/datasource/DatasourceService.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
index cd8c115e50..80474a31b3 100644
--- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
+++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
@@ -663,7 +663,7 @@ public class DatasourceService {
mysqlConfiguration.setUsername(env.getProperty("spring.datasource.username"));
mysqlConfiguration.setPassword(env.getProperty("spring.datasource.password"));
datasource.setConfiguration(new Gson().toJson(mysqlConfiguration));
- datasourceMapper.updateByPrimaryKey(datasource);
+ datasourceMapper.updateByPrimaryKeyWithBLOBs(datasource);
}
}
From cf2ccfd0dbf08b710880721c0106f15f57257c50 Mon Sep 17 00:00:00 2001
From: zhaoqian
Date: Wed, 15 Feb 2023 11:50:41 +0800
Subject: [PATCH 12/48] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E6=BA=90?=
=?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E8=AF=B7=E6=B1=82=E4=BD=93=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/io/dataease/service/chart/ChartViewService.java | 8 ++++++++
.../io/dataease/service/dataset/DataSetTableService.java | 2 ++
.../service/dataset/impl/direct/DirectFieldService.java | 1 +
3 files changed, 11 insertions(+)
diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
index 582eae1a61..fb4ea88283 100644
--- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
+++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java
@@ -529,6 +529,9 @@ public class ChartViewService {
xAxisForRequest.addAll(xAxis);
xAxisForRequest.addAll(extStack);
datasourceRequest.setXAxis(xAxisForRequest);
+ List yAxisForRequest = new ArrayList<>();
+ yAxisForRequest.addAll(yAxis);
+ datasourceRequest.setYAxis(yAxisForRequest);
data = datasourceProvider.getData(datasourceRequest);
} else if (table.getMode() == 1) {// 抽取
datasourceRequest.setDatasource(ds);
@@ -1037,6 +1040,7 @@ public class ChartViewService {
}
if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase((String) mapSize.get("tablePageMode"), "page")) {
datasourceRequest.setQuery(totalPageSql);
+ datasourceRequest.setTotalPageFlag(true);
java.util.List tmpData = datasourceProvider.getData(datasourceRequest);
totalItems = CollectionUtils.isEmpty(tmpData) ? 0 : Long.valueOf(tmpData.get(0)[0]);
totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0);
@@ -1047,6 +1051,10 @@ public class ChartViewService {
xAxisForRequest.addAll(xAxis);
xAxisForRequest.addAll(extStack);
datasourceRequest.setXAxis(xAxisForRequest);
+ List yAxisForRequest = new ArrayList<>();
+ yAxisForRequest.addAll(yAxis);
+ datasourceRequest.setYAxis(yAxisForRequest);
+ datasourceRequest.setTotalPageFlag(false);
data = datasourceProvider.getData(datasourceRequest);
if (CollectionUtils.isNotEmpty(assistFields)) {
datasourceAssistRequest.setQuery(assistSQL(datasourceRequest.getQuery(), assistFields));
diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
index fd494179ea..2a6ba0f346 100644
--- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
+++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
@@ -34,6 +34,7 @@ import io.dataease.plugins.common.base.mapper.*;
import io.dataease.plugins.common.constants.DatasetType;
import io.dataease.plugins.common.constants.DatasourceTypes;
import io.dataease.plugins.common.constants.DeTypeConstants;
+import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO;
import io.dataease.plugins.common.dto.dataset.SqlVariableDetails;
import io.dataease.plugins.common.dto.datasource.DataSourceType;
import io.dataease.plugins.common.dto.datasource.TableField;
@@ -712,6 +713,7 @@ public class DataSetTableService {
datasourceRequest.setPreviewData(true);
try {
datasourceRequest.setPageable(true);
+ datasourceRequest.setPermissionFields(fields);
data.addAll(datasourceProvider.getData(datasourceRequest));
} catch (Exception e) {
logger.error(e.getMessage());
diff --git a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java
index 4ad4eb61e4..a06283d097 100644
--- a/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java
+++ b/backend/src/main/java/io/dataease/service/dataset/impl/direct/DirectFieldService.java
@@ -195,6 +195,7 @@ public class DirectFieldService implements DataSetFieldService {
datasourceRequest.setQuery(qp.createQuerySQL(tableName, permissionFields, !needSort, null, customFilter, rowPermissionsTree, deSortFields));
}
LogUtil.info(datasourceRequest.getQuery());
+ datasourceRequest.setPermissionFields(permissionFields);
List rows = datasourceProvider.getData(datasourceRequest);
if (!needMapping) {
List
-
- {{ $t('dataset.excel_info_1') }}
- {{ $t('dataset.excel_info_2') }}
- {{ $t('dataset.excel_info_3') }}
-
-
-
+
+ {{ $t('dataset.excel_info_1') }}
+ {{ $t('dataset.excel_info_2') }}
+ {{ $t('dataset.excel_info_3') }}
+
+
+
handleCommand(type, field)"
>
-
+
-
+
{
+ if (!table.id) {
+ updateCacheTree('batchNew', 'dataset-tree', response.data, JSON.parse(localStorage.getItem('dataset-tree')))
+ }
this.openMessageSuccess('deDataset.set_saved_successfully')
this.cancel(response.data)
})
@@ -582,6 +586,9 @@ export default {
this.loading = true
post('/dataset/table/update', table)
.then((response) => {
+ if (!table.id) {
+ updateCacheTree('batchNew', 'dataset-tree', response.data, JSON.parse(localStorage.getItem('dataset-tree')))
+ }
this.openMessageSuccess('deDataset.set_saved_successfully')
this.cancel(response.data)
})
@@ -637,10 +644,12 @@ export default {
border-top-right-radius: 13px;
border-bottom-right-radius: 13px;
}
+
.table-list {
p {
margin: 0;
}
+
height: 100%;
width: 240px;
padding: 16px 12px;
@@ -653,6 +662,7 @@ export default {
display: flex;
justify-content: space-between;
color: var(--deTextPrimary, #1f2329);
+
i {
font-size: 14px;
color: var(--deTextPlaceholder, #8f959e);
@@ -666,10 +676,12 @@ export default {
.table-checkbox-list {
height: calc(100% - 100px);
overflow-y: auto;
+
.custom-tree-node {
position: relative;
width: 80%;
display: flex;
+
.label {
overflow: hidden;
white-space: nowrap;
@@ -677,11 +689,13 @@ export default {
width: 85%;
}
}
+
.error-name-exist {
position: absolute;
top: 0;
right: 0;
}
+
.item {
height: 40px;
width: 215px;
@@ -719,6 +733,7 @@ export default {
display: flex;
align-items: center;
position: relative;
+
.name {
font-size: 14px;
font-weight: 400;
@@ -749,10 +764,12 @@ export default {
padding: 2px 1.5px;
display: inline-block;
cursor: pointer;
+
i {
margin-left: 4px;
font-size: 12px;
}
+
&:hover {
background: rgba(31, 35, 41, 0.1);
border-radius: 4px;
diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue
index d3cef63e5c..fb193a2f0e 100644
--- a/frontend/src/views/dataset/add/AddSQL.vue
+++ b/frontend/src/views/dataset/add/AddSQL.vue
@@ -70,7 +70,7 @@
class="de-text-btn"
@click="dataReference = true"
>
-
+
{{ $t('deDataset.data_reference') }}
-
+
{{ $t('sql_variable.variable_mgm') }}
-
+
-
+
{{ $t('deDataset.run_a_query') }}
@@ -111,7 +111,7 @@
dataTable = ''
;keywords = ''
"
- > {{ $t('chart.back') }}
+ > {{ $t('chart.back') }}
{{ $t('deDataset.data_reference') }}
-
+
{{ (showTable && dataTable) || selectedDatasource.name }}
@@ -146,59 +146,61 @@
v-if="!dataSource"
class="no-select-datasource"
>{{
- $t('deDataset.to_start_using')
- }}
+ $t('deDataset.to_start_using')
+ }}
-
+
-
+
{{ ele.fieldName }}
-
+
+
-
-
+
{{
- `(${$t('dataset.preview_show')} 1000 ${$t(
- 'dataset.preview_item'
- )})`
- }}
+ `(${$t('dataset.preview_show')} 1000 ${$t(
+ 'dataset.preview_item'
+ )})`
+ }}
{{ errMsgCont }}
+ >{{ errMsgCont }}
+
-
+
{{ $t('dataset.sql_variable_limit_1') }}
{{ $t('dataset.sql_variable_limit_2') }}
@@ -451,7 +454,7 @@
:content="$t('commons.parameter_effect')"
placement="top"
>
-
+
@@ -519,14 +522,16 @@
secondary
@click="closeVariableMgm"
>{{
- $t('dataset.cancel')
- }}
+ $t('dataset.cancel')
+ }}
+
{{
- $t('dataset.confirm')
- }}
+ $t('dataset.confirm')
+ }}
+
@@ -536,9 +541,8 @@
+ .oauth-image image {
+ width: 30px;
+ height: 30px;
+ margin: 10px;
+ }
+
+ .oauth-image button {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0;
+ }
+
+ .captcha-view {
+ line-height: 0;
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ position: relative;
+ background-color: #f3f3f3;
+ }
+
+ .welcome {
+ padding-left: 15px;
+ font-size: x-large;
+ font-weight: 500;
+ letter-spacing: 2px;
+ }
+
\ No newline at end of file
From 0e6cb26ba9c9a3aa6647108f95f214da8503ec0b Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Fri, 17 Feb 2023 21:53:57 +0800
Subject: [PATCH 24/48] =?UTF-8?q?perf(token):=20=E7=A6=81=E7=94=A8token?=
=?UTF-8?q?=E5=88=B7=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/auth/filter/JWTFilter.java | 4 +---
.../java/io/dataease/auth/util/JWTUtils.java | 21 +++----------------
.../commons/utils/TokenCacheUtils.java | 9 --------
.../src/main/resources/ehcache/ehcache.xml | 12 +----------
4 files changed, 5 insertions(+), 41 deletions(-)
diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index e5bd636789..db9be9a709 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (StringUtils.startsWith(authorization, "Basic")) {
return false;
}
- if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) {
+ if (!TokenCacheUtils.validate(authorization)) {
throw new AuthenticationException(expireMessage);
}
// 当没有出现登录超时 且需要刷新token 则执行刷新token
@@ -75,8 +75,6 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
throw new AuthenticationException(expireMessage);
}
if (JWTUtils.needRefresh(authorization)) {
- TokenCacheUtils.addWithTtl(authorization, 1L);
- TokenCacheUtils.remove(authorization);
authorization = refreshToken(request, response);
}
JWTToken token = new JWTToken(authorization);
diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
index cebe34c5f5..2c671abda9 100644
--- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
@@ -20,9 +20,6 @@ import java.util.Date;
public class JWTUtils {
- // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token )
- private static final long EXPIRE_TIME = 1 * 60 * 1000;
- // 登录间隔时间10min 超过这个时间强制重新登录
private static long Login_Interval;
/**
@@ -67,9 +64,7 @@ public class JWTUtils {
}
public static boolean needRefresh(String token) {
- Date exp = JWTUtils.getExp(token);
- Long advanceTime = 5000L;
- return (new Date().getTime() + advanceTime) >= exp.getTime();
+ return false;
}
/**
@@ -95,18 +90,9 @@ public class JWTUtils {
return isExpire;
}
- public static Date getExp(String token) {
- try {
- DecodedJWT jwt = JWT.decode(token);
- return jwt.getClaim("exp").asDate();
- } catch (JWTDecodeException e) {
- e.printStackTrace();
- return null;
- }
- }
+
/**
- * 生成签名,5min后过期
*
* @param tokenInfo 用户信息
* @param secret 用户的密码
@@ -114,12 +100,11 @@ public class JWTUtils {
*/
public static String sign(TokenInfo tokenInfo, String secret) {
try {
- Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
Builder builder = JWT.create()
.withClaim("username", tokenInfo.getUsername())
.withClaim("userId", tokenInfo.getUserId());
- String sign = builder.withExpiresAt(date).sign(algorithm);
+ String sign = builder.sign(algorithm);
TokenCacheUtils.add(sign, tokenInfo.getUserId());
return sign;
diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
index 338adbf2da..bc936c3be5 100644
--- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
@@ -7,7 +7,6 @@ import org.apache.commons.lang3.StringUtils;
public class TokenCacheUtils {
private static final String KEY = "sys_token_store";
- private static final String DELAY_KEY = "sys_token_store_delay";
public static void add(String token, Long userId) {
CacheUtils.put(KEY, token, userId, null, null);
@@ -27,12 +26,4 @@ public class TokenCacheUtils {
return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString());
}
- public static void addWithTtl(String token, Long userId) {
- CacheUtils.put(DELAY_KEY, token, userId, 3, 5);
- }
-
- public static boolean validateDelay(String token) {
- Object tokenObj = CacheUtils.get(DELAY_KEY, token);
- return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString());
- }
}
diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml
index f8d8591b20..eccd3b1661 100644
--- a/backend/src/main/resources/ehcache/ehcache.xml
+++ b/backend/src/main/resources/ehcache/ehcache.xml
@@ -277,19 +277,9 @@
maxElementsOnDisk="3000"
overflowToDisk="true"
diskPersistent="false"
- />
-
-
+
\ No newline at end of file
From a34e99d7c1bab3a1555c67e7ed81eae0d571f466 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Fri, 17 Feb 2023 22:05:00 +0800
Subject: [PATCH 25/48] =?UTF-8?q?Revert=20"perf(token):=20=E7=A6=81?=
=?UTF-8?q?=E7=94=A8token=E5=88=B7=E6=96=B0"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit 0e6cb26ba9c9a3aa6647108f95f214da8503ec0b.
---
.../io/dataease/auth/filter/JWTFilter.java | 4 +++-
.../java/io/dataease/auth/util/JWTUtils.java | 21 ++++++++++++++++---
.../commons/utils/TokenCacheUtils.java | 9 ++++++++
.../src/main/resources/ehcache/ehcache.xml | 12 ++++++++++-
4 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index db9be9a709..e5bd636789 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (StringUtils.startsWith(authorization, "Basic")) {
return false;
}
- if (!TokenCacheUtils.validate(authorization)) {
+ if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) {
throw new AuthenticationException(expireMessage);
}
// 当没有出现登录超时 且需要刷新token 则执行刷新token
@@ -75,6 +75,8 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
throw new AuthenticationException(expireMessage);
}
if (JWTUtils.needRefresh(authorization)) {
+ TokenCacheUtils.addWithTtl(authorization, 1L);
+ TokenCacheUtils.remove(authorization);
authorization = refreshToken(request, response);
}
JWTToken token = new JWTToken(authorization);
diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
index 2c671abda9..cebe34c5f5 100644
--- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
@@ -20,6 +20,9 @@ import java.util.Date;
public class JWTUtils {
+ // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token )
+ private static final long EXPIRE_TIME = 1 * 60 * 1000;
+ // 登录间隔时间10min 超过这个时间强制重新登录
private static long Login_Interval;
/**
@@ -64,7 +67,9 @@ public class JWTUtils {
}
public static boolean needRefresh(String token) {
- return false;
+ Date exp = JWTUtils.getExp(token);
+ Long advanceTime = 5000L;
+ return (new Date().getTime() + advanceTime) >= exp.getTime();
}
/**
@@ -90,9 +95,18 @@ public class JWTUtils {
return isExpire;
}
-
+ public static Date getExp(String token) {
+ try {
+ DecodedJWT jwt = JWT.decode(token);
+ return jwt.getClaim("exp").asDate();
+ } catch (JWTDecodeException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
/**
+ * 生成签名,5min后过期
*
* @param tokenInfo 用户信息
* @param secret 用户的密码
@@ -100,11 +114,12 @@ public class JWTUtils {
*/
public static String sign(TokenInfo tokenInfo, String secret) {
try {
+ Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
Builder builder = JWT.create()
.withClaim("username", tokenInfo.getUsername())
.withClaim("userId", tokenInfo.getUserId());
- String sign = builder.sign(algorithm);
+ String sign = builder.withExpiresAt(date).sign(algorithm);
TokenCacheUtils.add(sign, tokenInfo.getUserId());
return sign;
diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
index bc936c3be5..338adbf2da 100644
--- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
@@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils;
public class TokenCacheUtils {
private static final String KEY = "sys_token_store";
+ private static final String DELAY_KEY = "sys_token_store_delay";
public static void add(String token, Long userId) {
CacheUtils.put(KEY, token, userId, null, null);
@@ -26,4 +27,12 @@ public class TokenCacheUtils {
return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString());
}
+ public static void addWithTtl(String token, Long userId) {
+ CacheUtils.put(DELAY_KEY, token, userId, 3, 5);
+ }
+
+ public static boolean validateDelay(String token) {
+ Object tokenObj = CacheUtils.get(DELAY_KEY, token);
+ return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString());
+ }
}
diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml
index eccd3b1661..f8d8591b20 100644
--- a/backend/src/main/resources/ehcache/ehcache.xml
+++ b/backend/src/main/resources/ehcache/ehcache.xml
@@ -277,9 +277,19 @@
maxElementsOnDisk="3000"
overflowToDisk="true"
diskPersistent="false"
+ />
+
+
-
\ No newline at end of file
From 13adc3de0bac706b84940699d649169004e1e372 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Mon, 20 Feb 2023 09:15:14 +0800
Subject: [PATCH 26/48] =?UTF-8?q?perf(token):=20token=E9=80=80=E5=87=BA?=
=?UTF-8?q?=E5=A4=B1=E6=95=88=E9=87=87=E7=94=A8token=E9=BB=91=E5=90=8D?=
=?UTF-8?q?=E5=8D=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/auth/config/F2CRealm.java | 2 +-
.../io/dataease/auth/filter/JWTFilter.java | 4 +-
.../io/dataease/auth/server/AuthServer.java | 6 +-
.../java/io/dataease/auth/util/JWTUtils.java | 2 -
.../commons/utils/TokenCacheUtils.java | 72 ++++++++++++++-----
5 files changed, 61 insertions(+), 25 deletions(-)
diff --git a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java
index 2084145759..504d8cfb6f 100644
--- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java
+++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java
@@ -84,7 +84,7 @@ public class F2CRealm extends AuthorizingRealm {
token = (String) auth.getCredentials();
// 解密获得username,用于和数据库进行对比
tokenInfo = JWTUtils.tokenInfoByToken(token);
- if (!TokenCacheUtils.validate(token)) {
+ if (TokenCacheUtils.invalid(token)) {
throw new AuthenticationException("token invalid");
}
} catch (Exception e) {
diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index e5bd636789..0d70181289 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -66,7 +66,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (StringUtils.startsWith(authorization, "Basic")) {
return false;
}
- if (!TokenCacheUtils.validate(authorization) && !TokenCacheUtils.validateDelay(authorization)) {
+ if (TokenCacheUtils.invalid(authorization)) {
throw new AuthenticationException(expireMessage);
}
// 当没有出现登录超时 且需要刷新token 则执行刷新token
@@ -75,8 +75,6 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
throw new AuthenticationException(expireMessage);
}
if (JWTUtils.needRefresh(authorization)) {
- TokenCacheUtils.addWithTtl(authorization, 1L);
- TokenCacheUtils.remove(authorization);
authorization = refreshToken(request, response);
}
JWTToken token = new JWTToken(authorization);
diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java
index 6e1fdafd57..ed7cdb0328 100644
--- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java
+++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java
@@ -148,7 +148,7 @@ public class AuthServer implements AuthApi {
AccountLockStatus lockStatus = authUserService.recordLoginFail(username, 0);
DataEaseException.throwException(appendLoginErrorMsg(Translator.get("i18n_id_or_pwd_error"), lockStatus));
}
- if(user.getIsAdmin() && user.getPassword().equals("40b8893ea9ebc2d631c4bb42bb1e8996")){
+ if (user.getIsAdmin() && user.getPassword().equals("40b8893ea9ebc2d631c4bb42bb1e8996")) {
result.put("passwordModified", false);
}
}
@@ -237,7 +237,7 @@ public class AuthServer implements AuthApi {
if (StringUtils.isBlank(result)) {
result = "success";
}
- TokenCacheUtils.remove(token);
+ TokenCacheUtils.add(token, userId);
} catch (Exception e) {
LogUtil.error(e);
if (StringUtils.isBlank(result)) {
@@ -291,7 +291,7 @@ public class AuthServer implements AuthApi {
if (StringUtils.isBlank(result)) {
result = "success";
}
- TokenCacheUtils.remove(token);
+ TokenCacheUtils.add(token, userId);
} catch (Exception e) {
LogUtil.error(e);
if (StringUtils.isBlank(result)) {
diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
index cebe34c5f5..fc297d1e17 100644
--- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
@@ -10,7 +10,6 @@ import com.auth0.jwt.interfaces.Verification;
import io.dataease.auth.entity.TokenInfo;
import io.dataease.auth.entity.TokenInfo.TokenInfoBuilder;
import io.dataease.commons.utils.CommonBeanFactory;
-import io.dataease.commons.utils.TokenCacheUtils;
import io.dataease.exception.DataEaseException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
@@ -120,7 +119,6 @@ public class JWTUtils {
.withClaim("username", tokenInfo.getUsername())
.withClaim("userId", tokenInfo.getUserId());
String sign = builder.withExpiresAt(date).sign(algorithm);
- TokenCacheUtils.add(sign, tokenInfo.getUserId());
return sign;
} catch (Exception e) {
diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
index 338adbf2da..0bcec3b8c8 100644
--- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
@@ -3,36 +3,76 @@ package io.dataease.commons.utils;
import io.dataease.listener.util.CacheUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+import java.util.concurrent.TimeUnit;
+
+
+@Component
public class TokenCacheUtils {
+
private static final String KEY = "sys_token_store";
- private static final String DELAY_KEY = "sys_token_store_delay";
+
+ private static String cacheType;
+
+ private static Long expTime;
+
+ @Value("${spring.cache.type:ehcache}")
+ public void setCacheType(String cacheType) {
+ TokenCacheUtils.cacheType = cacheType;
+ }
+
+ @Value("${dataease.login_timeout:480}")
+ public void setExpTime(Long expTime) {
+ TokenCacheUtils.expTime = expTime;
+ }
+
+ private static boolean useRedis() {
+ return StringUtils.equals(cacheType, "redis");
+ }
+
+
+ private static ValueOperations cacheHandler() {
+ RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate");
+ ValueOperations valueOperations = redisTemplate.opsForValue();
+ return valueOperations;
+ }
public static void add(String token, Long userId) {
- CacheUtils.put(KEY, token, userId, null, null);
+ if (useRedis()) {
+ ValueOperations valueOperations = cacheHandler();
+ valueOperations.set(KEY + token, userId, expTime, TimeUnit.MINUTES);
+ return;
+ }
+
+ Long time = expTime * 60;
+ CacheUtils.put(KEY, token, userId, time.intValue(), null);
+
}
public static void remove(String token) {
+ if (useRedis()) {
+ RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate");
+ String key = KEY + token;
+ if (redisTemplate.hasKey(key)) {
+ redisTemplate.delete(key);
+ }
+ return;
+ }
CacheUtils.remove(KEY, token);
}
- public static boolean validate(String token) {
+ public static boolean invalid(String token) {
+ if (useRedis()) {
+ RedisTemplate redisTemplate = (RedisTemplate) CommonBeanFactory.getBean("redisTemplate");
+ return redisTemplate.hasKey(KEY + token);
+ }
Object sys_token_store = CacheUtils.get(KEY, token);
return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString());
}
- public static boolean validate(String token, Long userId) {
- Object sys_token_store = CacheUtils.get(KEY, token);
- return ObjectUtils.isNotEmpty(sys_token_store) && StringUtils.isNotBlank(sys_token_store.toString()) && userId == Long.parseLong(sys_token_store.toString());
- }
-
- public static void addWithTtl(String token, Long userId) {
- CacheUtils.put(DELAY_KEY, token, userId, 3, 5);
- }
-
- public static boolean validateDelay(String token) {
- Object tokenObj = CacheUtils.get(DELAY_KEY, token);
- return ObjectUtils.isNotEmpty(tokenObj) && StringUtils.isNotBlank(tokenObj.toString());
- }
}
From 2a350c61c78643f9418811b3e492fb7f3ccabfee Mon Sep 17 00:00:00 2001
From: taojinlong
Date: Mon, 20 Feb 2023 12:52:08 +0800
Subject: [PATCH 27/48] =?UTF-8?q?revert:=20excel=20=E8=A7=A3=E6=9E=90?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/io/dataease/commons/utils/ExcelXlsxReader.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/backend/src/main/java/io/dataease/commons/utils/ExcelXlsxReader.java b/backend/src/main/java/io/dataease/commons/utils/ExcelXlsxReader.java
index 2300f7dded..15014155a6 100644
--- a/backend/src/main/java/io/dataease/commons/utils/ExcelXlsxReader.java
+++ b/backend/src/main/java/io/dataease/commons/utils/ExcelXlsxReader.java
@@ -359,8 +359,8 @@ public class ExcelXlsxReader extends DefaultHandler {
formatIndex = style.getDataFormat();
formatString = style.getDataFormatString();
short format = this.formatIndex;
- if ((14 <= format && format <= 17) || format == 0 || format == 20 || format == 22 || format == 31 || format == 35 || (45 <= format && format <= 49) || format == 46 || format == 47 || (57 <= format && format <= 59)
- || (59 < format && format <= 76) || (175 < format && format <= 196) || (210 <= format && format <= 213) || (208 == format)) { // 日期
+ if ((14 <= format && format <= 17) || format == 20 || format == 22 || format == 31 || format == 35 || format == 45 || format == 46 || format == 47 || (57 <= format && format <= 59)
+ || (175 < format && format < 178) || (182 <= format && format <= 196) || (210 <= format && format <= 213) || (208 == format)) { // 日期
isDateFormat = true;
}
From dfadeb6dbb6e00871fdcb563d408ab3a6cb70b95 Mon Sep 17 00:00:00 2001
From: taojinlong
Date: Mon, 20 Feb 2023 12:58:32 +0800
Subject: [PATCH 28/48] =?UTF-8?q?fix:=20=E6=8A=BD=E5=8F=96=20oralce=20data?=
=?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/provider/query/oracle/OracleQueryProvider.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java
index e5dada23c6..ebd8846aa9 100644
--- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java
+++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java
@@ -916,6 +916,9 @@ public class OracleQueryProvider extends QueryProvider {
continue;
}
String originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ if(datasetTableField.getType().equals("DATE")){
+ originField = String.format(OracleConstants.TO_CHAR, originField, OracleConstants.DEFAULT_DATE_FORMAT);
+ }
String fieldAlias = String.format(OracleConstants.KEYWORD_TABLE, x.getOriginName());
xFields.add(getXFields(x, originField, fieldAlias));
}
From 67672fbc94e0cca4e2f78214f19f744f016b4c90 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Mon, 20 Feb 2023 13:49:59 +0800
Subject: [PATCH 29/48] =?UTF-8?q?perf(=E7=99=BB=E5=BD=95):=20=E7=A7=BB?=
=?UTF-8?q?=E5=8A=A8=E7=AB=AF=E9=92=89=E9=92=89=E5=B7=A5=E4=BD=9C=E5=8F=B0?=
=?UTF-8?q?=E5=85=8D=E7=99=BB=E4=BD=BF=E7=94=A8DE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/src/main/resources/ehcache/ehcache.xml | 18 ++++--------------
mobile/src/locale/zh-Hans.json | 2 +-
mobile/src/locale/zh-Hant.json | 2 +-
mobile/src/pages.json | 2 +-
mobile/src/pages/login/index.vue | 11 +++++++++--
5 files changed, 16 insertions(+), 19 deletions(-)
diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml
index f8d8591b20..5976911a62 100644
--- a/backend/src/main/resources/ehcache/ehcache.xml
+++ b/backend/src/main/resources/ehcache/ehcache.xml
@@ -273,23 +273,13 @@
-
+
\ No newline at end of file
diff --git a/mobile/src/locale/zh-Hans.json b/mobile/src/locale/zh-Hans.json
index afaed12e0f..3da2e19ea1 100644
--- a/mobile/src/locale/zh-Hans.json
+++ b/mobile/src/locale/zh-Hans.json
@@ -1,5 +1,5 @@
{
- "app.name": "Hello uni-app",
+ "app.name": "DataEase",
"navigate.menuHome": "首页",
"navigate.menuDir": "目录",
diff --git a/mobile/src/locale/zh-Hant.json b/mobile/src/locale/zh-Hant.json
index a3b8f5f97c..ff6fb1f846 100644
--- a/mobile/src/locale/zh-Hant.json
+++ b/mobile/src/locale/zh-Hant.json
@@ -1,5 +1,5 @@
{
- "app.name": "Hello uni-app",
+ "app.name": "DataEase",
"navigate.menuHome": "首頁",
"navigate.menuDir": "目錄",
"navigate.menuMe": "我的",
diff --git a/mobile/src/pages.json b/mobile/src/pages.json
index 1fcfb0dc34..11a720f61d 100644
--- a/mobile/src/pages.json
+++ b/mobile/src/pages.json
@@ -4,7 +4,7 @@
{
"path": "pages/login/index",
"style": {
- "navigationBarTitleText": "%navigate.login%",
+ "navigationBarTitleText": "%app.name%",
"app-plus": {
"titleNView": false
}
diff --git a/mobile/src/pages/login/index.vue b/mobile/src/pages/login/index.vue
index 12b9d94dee..5c68fc6808 100644
--- a/mobile/src/pages/login/index.vue
+++ b/mobile/src/pages/login/index.vue
@@ -69,7 +69,7 @@
title: this.$t('commons.loading')
});
this.loadUiInfo()
- this.loadPublicKey()
+ this.loadPublicKey()
if (!this.autoLogin() && getToken() && getUserInfo()) {
this.toMain()
}
@@ -154,8 +154,15 @@
const url = window.location.href
const param = getUrlParams(url)
if (param?.detoken) {
+ if(param.detoken.endsWith('#/'))
+ param.detoken = param.detoken.substr(0, param.detoken.length - 2)
setToken(param.detoken)
- this.toMain()
+ getInfo().then(res => {
+ setUserInfo(res.data)
+ const redirect = window.location.href.split('?')[0]
+
+ window.location.href = redirect
+ })
return true
}
return false
From d9b664f86db371b19bd1a3142eb17809e44d4880 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Mon, 20 Feb 2023 15:01:22 +0800
Subject: [PATCH 30/48] =?UTF-8?q?perf(=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?=
=?UTF-8?q?):=20=E7=BC=96=E8=BE=91=E9=A1=B5=E9=9D=A2=E4=BF=9D=E5=AD=98?=
=?UTF-8?q?=E6=97=B6=E5=A2=9E=E5=8A=A0=E9=A1=B5=E9=9D=A2=E9=81=AE=E7=BD=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/api/system/user.js | 1 +
frontend/src/views/system/user/UserEditer.vue | 5 ++++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/frontend/src/api/system/user.js b/frontend/src/api/system/user.js
index cdfc543a6d..6b366912e4 100644
--- a/frontend/src/api/system/user.js
+++ b/frontend/src/api/system/user.js
@@ -35,6 +35,7 @@ export const addUser = (data) => {
return request({
url: pathMap.createPath,
method: 'post',
+ loading: true,
data
})
}
diff --git a/frontend/src/views/system/user/UserEditer.vue b/frontend/src/views/system/user/UserEditer.vue
index 5635d732a8..5e58d7b4c8 100644
--- a/frontend/src/views/system/user/UserEditer.vue
+++ b/frontend/src/views/system/user/UserEditer.vue
@@ -1,5 +1,6 @@
{
if (valid) {
- // !this.form.deptId && (this.form.deptId = 0)
+ this.loading = true
const method = this.formType === 'add' ? addUser : editUser
method(this.form).then((res) => {
this.$success(this.$t('commons.save_success'))
this.reset()
this.$emit('saved')
+ this.loading = false
})
} else {
return false
From 7cd63c9131f9eeb8cf34faaf9a77376f1a2b296e Mon Sep 17 00:00:00 2001
From: taojinlong
Date: Mon, 20 Feb 2023 15:16:30 +0800
Subject: [PATCH 31/48] =?UTF-8?q?fix:=20=E6=8A=BD=E5=8F=96=20oralce=20data?=
=?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/provider/query/oracle/OracleQueryProvider.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java
index ebd8846aa9..28e43d0b1d 100644
--- a/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java
+++ b/backend/src/main/java/io/dataease/provider/query/oracle/OracleQueryProvider.java
@@ -880,6 +880,7 @@ public class OracleQueryProvider extends QueryProvider {
ChartViewFieldDTO f = new ChartViewFieldDTO();
f.setOriginName(datasetTableField.getOriginName());
f.setDeType(0);
+ f.setType(datasetTableField.getType());
xAxis.add(f);
});
@@ -916,7 +917,7 @@ public class OracleQueryProvider extends QueryProvider {
continue;
}
String originField = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
- if(datasetTableField.getType().equals("DATE")){
+ if(xAxis.get(i).getType().equals("DATE")){
originField = String.format(OracleConstants.TO_CHAR, originField, OracleConstants.DEFAULT_DATE_FORMAT);
}
String fieldAlias = String.format(OracleConstants.KEYWORD_TABLE, x.getOriginName());
From d0debd5c2201154386a039fe21928c828e99bb59 Mon Sep 17 00:00:00 2001
From: taojinlong
Date: Mon, 20 Feb 2023 15:58:28 +0800
Subject: [PATCH 32/48] =?UTF-8?q?fix:=20mysql=20=E5=90=8C=E4=B8=8D?=
=?UTF-8?q?=E5=87=BA=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/provider/query/mysql/MysqlQueryProvider.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java
index d7bc42a7f2..1ccc4b2893 100644
--- a/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java
+++ b/backend/src/main/java/io/dataease/provider/query/mysql/MysqlQueryProvider.java
@@ -808,7 +808,7 @@ public class MysqlQueryProvider extends QueryProvider {
}
return stringBuilder.toString();
}).toArray(String[]::new);
- return MessageFormat.format("SELECT {0} FROM {1} LIMIT DE_OFFSET, DE_PAGE_SIZE ", StringUtils.join(array, ","), table);
+ return MessageFormat.format("SELECT {0} FROM {1} LIMIT DE_OFFSET, DE_PAGE_SIZE ", StringUtils.join(array, ","), String.format(MySQLConstants.KEYWORD_TABLE, table));
}
public String getTotalCount(boolean isTable, String sql, Datasource ds) {
From 450427d28e762327d0699ba0b578c1f020bd48d8 Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Mon, 20 Feb 2023 16:17:40 +0800
Subject: [PATCH 33/48] =?UTF-8?q?fix:=20=E8=A1=80=E7=BC=98=E5=9B=BE?=
=?UTF-8?q?=E7=89=87=E5=A4=B1=E7=9C=9F=20=E6=9B=B4=E6=8D=A2svg=E5=9B=BE?=
=?UTF-8?q?=E6=A0=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/views/system/relationship/consanguinity.vue | 6 +++---
frontend/static/svg/de-dashboard.svg | 1 +
frontend/static/svg/de-dataset.svg | 1 +
frontend/static/svg/de-datasource.svg | 1 +
4 files changed, 6 insertions(+), 3 deletions(-)
create mode 100644 frontend/static/svg/de-dashboard.svg
create mode 100644 frontend/static/svg/de-dataset.svg
create mode 100644 frontend/static/svg/de-datasource.svg
diff --git a/frontend/src/views/system/relationship/consanguinity.vue b/frontend/src/views/system/relationship/consanguinity.vue
index 769290965e..7d83ab73cd 100644
--- a/frontend/src/views/system/relationship/consanguinity.vue
+++ b/frontend/src/views/system/relationship/consanguinity.vue
@@ -425,9 +425,9 @@ export default {
let height = 22
const imageType = {
- datasource: 'data:image/png;base64,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',
- panel: 'data:image/png;base64,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',
- dataset: 'data:image/png;base64,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',
+ datasource: '/static/svg/de-datasource.svg',
+ panel: '/static/svg/de-dashboard.svg',
+ dataset: '/static/svg/de-dataset.svg'
}
diff --git a/frontend/static/svg/de-dashboard.svg b/frontend/static/svg/de-dashboard.svg
new file mode 100644
index 0000000000..f900aa8174
--- /dev/null
+++ b/frontend/static/svg/de-dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/static/svg/de-dataset.svg b/frontend/static/svg/de-dataset.svg
new file mode 100644
index 0000000000..60b3e4032c
--- /dev/null
+++ b/frontend/static/svg/de-dataset.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/static/svg/de-datasource.svg b/frontend/static/svg/de-datasource.svg
new file mode 100644
index 0000000000..c94abf8f3f
--- /dev/null
+++ b/frontend/static/svg/de-datasource.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
From 44c339e7e72e30a03e92f41cd89a45d276f84acb Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Tue, 21 Feb 2023 11:10:22 +0800
Subject: [PATCH 34/48] =?UTF-8?q?fix:=20=E6=96=B0=E5=BB=BA=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=BA=90=E6=A0=B7=E5=BC=8F=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/views/system/datasource/DsTree.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/views/system/datasource/DsTree.vue b/frontend/src/views/system/datasource/DsTree.vue
index b546ca3449..e3c2be026d 100644
--- a/frontend/src/views/system/datasource/DsTree.vue
+++ b/frontend/src/views/system/datasource/DsTree.vue
@@ -262,7 +262,7 @@
v-dialogDrag
:title="$t('datasource.create')"
:visible.sync="dsTypeRelate"
- width="1005px"
+ width="1010px"
class="de-dialog-form none-scroll-bar"
append-to-body
>
From 7feeed50155bb1efbcf00f466385e6b3dc8fda64 Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Tue, 21 Feb 2023 11:39:46 +0800
Subject: [PATCH 35/48] =?UTF-8?q?fix(=E4=BB=AA=E8=A1=A8=E6=9D=BF):=20?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E6=98=8E=E7=BB=86=E9=A2=84?=
=?UTF-8?q?=E8=A7=88=E6=97=A0=E6=B3=95=E6=BB=9A=E5=8A=A8=E6=9F=A5=E7=9C=8B?=
=?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/components/canvas/customComponent/UserViewDialog.vue | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/frontend/src/components/canvas/customComponent/UserViewDialog.vue b/frontend/src/components/canvas/customComponent/UserViewDialog.vue
index a3a4d023ce..58a4e5fee1 100644
--- a/frontend/src/components/canvas/customComponent/UserViewDialog.vue
+++ b/frontend/src/components/canvas/customComponent/UserViewDialog.vue
@@ -64,7 +64,7 @@
:enable-scroll="false"
:chart="chartTable"
:show-summary="false"
- class="table-class"
+ class="table-class-dialog"
/>
@@ -342,8 +342,9 @@ export default {
height: 100%;
}
-.table-class {
+.table-class-dialog {
height: 100%;
+ overflow-y: auto !important;
}
.canvas-class {
From 2658cc4cef5ede5b6bf0d9c369b244d5c455f531 Mon Sep 17 00:00:00 2001
From: junjun
Date: Tue, 21 Feb 2023 11:58:43 +0800
Subject: [PATCH 36/48] =?UTF-8?q?fix(=E8=A7=86=E5=9B=BE):=20=E4=BF=AE?=
=?UTF-8?q?=E5=A4=8D=E6=98=8E=E7=BB=86=E8=A1=A8=E6=9F=A5=E8=AF=A2=E5=88=86?=
=?UTF-8?q?=E9=A1=B5=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/components/canvas/customComponent/UserView.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/components/canvas/customComponent/UserView.vue b/frontend/src/components/canvas/customComponent/UserView.vue
index da4713b75f..e5de90d083 100644
--- a/frontend/src/components/canvas/customComponent/UserView.vue
+++ b/frontend/src/components/canvas/customComponent/UserView.vue
@@ -759,7 +759,7 @@ export default {
const attrSize = JSON.parse(this.view.customAttr).size
if (this.chart.type === 'table-info' && this.view.datasetMode === 0 && (!attrSize.tablePageMode || attrSize.tablePageMode === 'page')) {
requestInfo.goPage = this.currentPage.page
- requestInfo.pageSize = this.currentPage.pageSize
+ requestInfo.pageSize = this.currentPage.pageSize === parseInt(attrSize.tablePageSize) ? this.currentPage.pageSize : parseInt(attrSize.tablePageSize)
}
}
if (this.isFirstLoad) {
From 203ed10aa393e23bc56ba82fec6337f77e559f2f Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Tue, 21 Feb 2023 12:43:50 +0800
Subject: [PATCH 37/48] =?UTF-8?q?fix(=E7=A7=BB=E5=8A=A8=E7=AB=AF):=20?=
=?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=88=A0=E9=99=A4=E7=BC=93=E5=AD=98=E8=A7=A3?=
=?UTF-8?q?=E5=86=B3=E6=9C=AA=E7=BB=91=E5=AE=9A=E4=B9=9F=E8=83=BD=E4=BB=8E?=
=?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8F=B0=E8=BF=9B=E5=85=A5DE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/permission.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/frontend/src/permission.js b/frontend/src/permission.js
index c612f949c9..96aa5902fd 100644
--- a/frontend/src/permission.js
+++ b/frontend/src/permission.js
@@ -57,7 +57,7 @@ const routeBefore = (callBack) => {
callBack()
}
}
-router.beforeEach(async(to, from, next) => routeBefore(() => {
+router.beforeEach(async (to, from, next) => routeBefore(() => {
// start progress bar
NProgress.start()
const mobileIgnores = ['/delink', '/de-auto-login']
@@ -69,6 +69,9 @@ router.beforeEach(async(to, from, next) => routeBefore(() => {
if (hasToken) {
urlSuffix += ('?detoken=' + hasToken)
}
+ localStorage.removeItem('user-info')
+ localStorage.removeItem('userId')
+ localStorage.removeItem('Authorization')
window.location.href = window.origin + urlSuffix
NProgress.done()
}
From ee6697a5b9c4acea1ff89f99664d531971482a8c Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Tue, 21 Feb 2023 13:57:53 +0800
Subject: [PATCH 38/48] =?UTF-8?q?refactor:=20=E4=BB=AA=E8=A1=A8=E6=9D=BF?=
=?UTF-8?q?=E9=98=B2=E8=8C=83XSS=E6=94=BB=E5=87=BB=20#4585?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/package.json | 3 ++-
.../src/components/canvas/customComponent/DeRichText.vue | 3 ++-
.../components/canvas/customComponent/DeRichTextView.vue | 3 ++-
frontend/src/components/canvas/customComponent/VText.vue | 8 ++++----
frontend/src/main.js | 6 ++++++
5 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index 3816f0a7ab..1a2b29da57 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -88,7 +88,8 @@
"vuedraggable": "^2.24.3",
"vuex": "3.1.0",
"webpack": "^4.46.0",
- "xlsx": "^0.17.0"
+ "xlsx": "^0.17.0",
+ "xss": "^1.0.14"
},
"devDependencies": {
"@babel/core": "^7.4.0-0",
diff --git a/frontend/src/components/canvas/customComponent/DeRichText.vue b/frontend/src/components/canvas/customComponent/DeRichText.vue
index 4e5a76ab38..195a4bc263 100644
--- a/frontend/src/components/canvas/customComponent/DeRichText.vue
+++ b/frontend/src/components/canvas/customComponent/DeRichText.vue
@@ -37,6 +37,7 @@ import 'tinymce/plugins/nonbreaking'
import 'tinymce/plugins/pagebreak'
import { mapState } from 'vuex'
import Vue from 'vue'
+import xssCheck from 'xss'
export default {
name: 'DeRichText',
@@ -77,7 +78,7 @@ export default {
canEdit: false,
// 初始化配置
tinymceId: 'tinymce-' + this.element.id,
- myValue: this.propValue,
+ myValue: xssCheck(this.propValue),
init: {
selector: '#tinymce-' + this.element.id,
toolbar_items_size: 'small',
diff --git a/frontend/src/components/canvas/customComponent/DeRichTextView.vue b/frontend/src/components/canvas/customComponent/DeRichTextView.vue
index 7b5f717876..fe66736ee2 100644
--- a/frontend/src/components/canvas/customComponent/DeRichTextView.vue
+++ b/frontend/src/components/canvas/customComponent/DeRichTextView.vue
@@ -38,6 +38,7 @@ import 'tinymce/plugins/pagebreak'
import { mapState } from 'vuex'
import bus from '@/utils/bus'
import { uuid } from 'vue-uuid'
+import xssCheck from 'xss'
export default {
name: 'DeRichTextView',
@@ -152,7 +153,7 @@ export default {
viewInit() {
bus.$on('fieldSelect-' + this.element.propValue.viewId, this.fieldSelect)
tinymce.init({})
- this.myValue = this.assignment(this.element.propValue.textValue)
+ this.myValue = xssCheck(this.assignment(this.element.propValue.textValue))
bus.$on('initCurFields-' + this.element.id, this.initCurFieldsChange)
this.$nextTick(() => {
this.initReady = true
diff --git a/frontend/src/components/canvas/customComponent/VText.vue b/frontend/src/components/canvas/customComponent/VText.vue
index f23c2ca559..8dbd863c42 100644
--- a/frontend/src/components/canvas/customComponent/VText.vue
+++ b/frontend/src/components/canvas/customComponent/VText.vue
@@ -18,7 +18,7 @@
@mousedown="handleMousedown"
@blur="handleBlur"
@input="handleInput"
- v-html="element.propValue"
+ v-html="$xss(element.propValue)"
/>
@@ -80,7 +80,7 @@ export default {
},
textInfo() {
if (this.element && this.element.hyperlinks && this.element.hyperlinks.enable) {
- return "" + this.element.propValue + ''
+ return '' + this.element.propValue + ''
} else {
return this.element.propValue
}
diff --git a/frontend/src/main.js b/frontend/src/main.js
index 459f66280a..673cf928ec 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -43,6 +43,12 @@ import 'video.js/dist/video-js.css'
// 控制标签宽高成比例的指令
import proportion from 'vue-proportion-directive'
+import xss from 'xss'
+// 定义全局XSS解决方法
+Object.defineProperty(Vue.prototype, '$xss', {
+ value: xss
+})
+
Vue.config.productionTip = false
Vue.use(VueClipboard)
Vue.use(widgets)
From 2a5e9cdf3dd63252f22cd9efd4a7e04949187516 Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Tue, 21 Feb 2023 14:01:58 +0800
Subject: [PATCH 39/48] =?UTF-8?q?fix:=20URL=E9=80=80=E5=87=BA=E5=90=8E?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8URL=E7=99=BB=E9=99=86=E7=B1=BB=E5=9E=8B?=
=?UTF-8?q?=E4=B8=A2=E5=A4=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/permission.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/permission.js b/frontend/src/permission.js
index c612f949c9..afe2e5421e 100644
--- a/frontend/src/permission.js
+++ b/frontend/src/permission.js
@@ -127,7 +127,7 @@ router.beforeEach(async(to, from, next) => routeBefore(() => {
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
- next(`/login?redirect=${to.path}`)
+ next(`/login?redirect=${to.fullPath}`)
NProgress.done()
}
}
From d9cfc4dfc50e0d1676b74db787837860b91d65de Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Tue, 21 Feb 2023 14:05:36 +0800
Subject: [PATCH 40/48] =?UTF-8?q?fix(=E8=B7=AF=E7=94=B1):=20=E6=97=A0?=
=?UTF-8?q?=E6=B3=95=E8=B7=AF=E7=94=B1=E5=88=B0=E8=B5=84=E6=BA=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/permission.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/permission.js b/frontend/src/permission.js
index 96aa5902fd..efcede886b 100644
--- a/frontend/src/permission.js
+++ b/frontend/src/permission.js
@@ -130,7 +130,7 @@ router.beforeEach(async (to, from, next) => routeBefore(() => {
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
- next(`/login?redirect=${to.path}`)
+ next(`/login?redirect=${to.fullPath}`)
NProgress.done()
}
}
From 6bb338a36433a24a9044f2030f445507d65cc4c3 Mon Sep 17 00:00:00 2001
From: wangjiahao <1522128093@qq.com>
Date: Tue, 21 Feb 2023 14:41:22 +0800
Subject: [PATCH 41/48] =?UTF-8?q?fix(=E4=BB=AA=E8=A1=A8=E7=89=88):=20?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=BE=91=E7=8A=B6=E6=80=81=E4=B8=8B?=
=?UTF-8?q?Tab=E7=BB=84=E4=BB=B6=E5=86=85=E9=83=A8=E4=BB=AA=E8=A1=A8?=
=?UTF-8?q?=E6=9D=BF=E6=9D=BF=E5=88=87=E6=8D=A2=E6=97=B6=E5=8F=AF=E8=83=BD?=
=?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84=E9=94=99=E4=BD=8D=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/components/widget/deWidget/DeTabs.vue | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/frontend/src/components/widget/deWidget/DeTabs.vue b/frontend/src/components/widget/deWidget/DeTabs.vue
index 3e9fe23856..786622fa4e 100644
--- a/frontend/src/components/widget/deWidget/DeTabs.vue
+++ b/frontend/src/components/widget/deWidget/DeTabs.vue
@@ -411,6 +411,10 @@ export default {
const _this = this
_this.$nextTick(() => {
try {
+ const targetRef = _this.$refs['canvasTabRef-' + _this.activeTabName]
+ if (targetRef) {
+ targetRef[0].restore()
+ }
_this.$refs[this.activeTabName][0].resizeChart()
} catch (e) {
// ignore
From ac4bf63a8949a92e00cbdf4a8f7651fac7c9ae41 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Tue, 21 Feb 2023 16:35:27 +0800
Subject: [PATCH 42/48] =?UTF-8?q?perf(token):=20=E7=A6=81=E7=94=A8?=
=?UTF-8?q?=E6=AF=8F=E5=88=86=E9=92=9F=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0?=
=?UTF-8?q?token=E6=9C=BA=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../io/dataease/auth/filter/F2CDocFilter.java | 21 +-----
.../io/dataease/auth/filter/JWTFilter.java | 46 ++-----------
.../java/io/dataease/auth/util/JWTUtils.java | 67 ++-----------------
.../commons/utils/TokenCacheUtils.java | 5 +-
.../ApplicationCloseEventListener.java | 24 +++++++
.../io/dataease/listener/util/CacheUtils.java | 6 ++
.../src/main/resources/ehcache/ehcache.xml | 14 ++--
7 files changed, 55 insertions(+), 128 deletions(-)
create mode 100644 backend/src/main/java/io/dataease/listener/ApplicationCloseEventListener.java
diff --git a/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java b/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java
index d5d8438c3a..ef1c304810 100644
--- a/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java
@@ -79,12 +79,7 @@ public class F2CDocFilter extends AccessControlFilter {
if (StringUtils.isBlank(authorization)) {
return false;
}
- if (JWTUtils.loginExpire(authorization)) {
- return false;
- }
- if (JWTUtils.needRefresh(authorization)) {
- authorization = refreshToken(authorization);
- }
+
TokenInfo tokenInfo = JWTUtils.tokenInfoByToken(authorization);
AuthUserService authUserService = CommonBeanFactory.getBean(AuthUserService.class);
SysUserEntity user = authUserService.getUserById(tokenInfo.getUserId());
@@ -96,20 +91,6 @@ public class F2CDocFilter extends AccessControlFilter {
return verify;
}
- private String refreshToken(String token) throws Exception {
- TokenInfo tokenInfo = JWTUtils.tokenInfoByToken(token);
- AuthUserService authUserService = CommonBeanFactory.getBean(AuthUserService.class);
- SysUserEntity user = authUserService.getUserById(tokenInfo.getUserId());
- if (user == null) {
- DataEaseException.throwException(Translator.get("i18n_not_find_user"));
- }
- String password = user.getPassword();
- Algorithm algorithm = Algorithm.HMAC256(password);
- JWTUtils.verifySign(algorithm, token);
- String newToken = JWTUtils.sign(tokenInfo, password);
- return newToken;
- }
-
@Override
protected boolean onAccessDenied(ServletRequest req, ServletResponse res) throws Exception {
HttpServletResponse response = (HttpServletResponse) res;
diff --git a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index 0d70181289..83c73fc1ca 100644
--- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
@@ -1,24 +1,18 @@
package io.dataease.auth.filter;
-import com.auth0.jwt.algorithms.Algorithm;
import io.dataease.auth.entity.ASKToken;
import io.dataease.auth.entity.JWTToken;
-import io.dataease.auth.entity.SysUserEntity;
-import io.dataease.auth.entity.TokenInfo;
+
import io.dataease.auth.handler.ApiKeyHandler;
-import io.dataease.auth.service.AuthUserService;
-import io.dataease.auth.util.JWTUtils;
-import io.dataease.commons.utils.CommonBeanFactory;
+
import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.TokenCacheUtils;
-import io.dataease.exception.DataEaseException;
-import io.dataease.i18n.Translator;
+
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -30,7 +24,6 @@ import javax.servlet.http.HttpServletResponse;
public class JWTFilter extends BasicHttpAuthenticationFilter {
- private Logger LOGGER = LoggerFactory.getLogger(this.getClass());
public final static String expireMessage = "Login token is expire.";
@@ -69,14 +62,7 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
if (TokenCacheUtils.invalid(authorization)) {
throw new AuthenticationException(expireMessage);
}
- // 当没有出现登录超时 且需要刷新token 则执行刷新token
- if (JWTUtils.loginExpire(authorization)) {
- TokenCacheUtils.remove(authorization);
- throw new AuthenticationException(expireMessage);
- }
- if (JWTUtils.needRefresh(authorization)) {
- authorization = refreshToken(request, response);
- }
+
JWTToken token = new JWTToken(authorization);
Subject subject = getSubject(request, response);
// 提交给realm进行登入,如果错误他会抛出异常并被捕获
@@ -110,28 +96,6 @@ public class JWTFilter extends BasicHttpAuthenticationFilter {
}
- private String refreshToken(ServletRequest request, ServletResponse response) throws Exception {
- // 获取AccessToken(Shiro中getAuthzHeader方法已经实现)
- String token = this.getAuthzHeader(request);
- // 获取当前Token的帐号信息
- TokenInfo tokenInfo = JWTUtils.tokenInfoByToken(token);
- AuthUserService authUserService = CommonBeanFactory.getBean(AuthUserService.class);
- SysUserEntity user = authUserService.getUserById(tokenInfo.getUserId());
- if (user == null) {
- DataEaseException.throwException(Translator.get("i18n_not_find_user"));
- }
- String password = user.getPassword();
- Algorithm algorithm = Algorithm.HMAC256(password);
- JWTUtils.verifySign(algorithm, token);
- String newToken = JWTUtils.sign(tokenInfo, password);
- // 设置响应的Header头新Token
- HttpServletResponse httpServletResponse = (HttpServletResponse) response;
- httpServletResponse.addHeader("Access-Control-Expose-Headers", "RefreshAuthorization");
- httpServletResponse.setHeader("RefreshAuthorization", newToken);
- return newToken;
- }
-
-
/**
* 对跨域提供支持
*/
diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
index fc297d1e17..a541433842 100644
--- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
@@ -4,7 +4,6 @@ import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.JWTCreator.Builder;
import com.auth0.jwt.algorithms.Algorithm;
-import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.Verification;
import io.dataease.auth.entity.TokenInfo;
@@ -19,10 +18,8 @@ import java.util.Date;
public class JWTUtils {
- // token过期时间1min (过期会自动刷新续命 目的是避免一直都是同一个token )
- private static final long EXPIRE_TIME = 1 * 60 * 1000;
- // 登录间隔时间10min 超过这个时间强制重新登录
- private static long Login_Interval;
+
+ private static Long expireTime;
/**
* 校验token是否正确
@@ -65,62 +62,24 @@ public class JWTUtils {
return tokenInfoBuilder.build();
}
- public static boolean needRefresh(String token) {
- Date exp = JWTUtils.getExp(token);
- Long advanceTime = 5000L;
- return (new Date().getTime() + advanceTime) >= exp.getTime();
- }
-
/**
- * 当前token是否登录超时
- *
- * @param token
- * @return
- */
- public static boolean loginExpire(String token) {
- if (Login_Interval == 0) {
- // 默认超时时间是8h
- Long minute = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout", Long.class,
- 8 * 60L);
- // 分钟换算成毫秒
- Login_Interval = minute * 1000 * 60;
- }
- Long lastOperateTime = tokenLastOperateTime(token);
- boolean isExpire = true;
- if (lastOperateTime != null) {
- Long now = System.currentTimeMillis();
- isExpire = now - lastOperateTime > Login_Interval;
- }
- return isExpire;
- }
-
- public static Date getExp(String token) {
- try {
- DecodedJWT jwt = JWT.decode(token);
- return jwt.getClaim("exp").asDate();
- } catch (JWTDecodeException e) {
- e.printStackTrace();
- return null;
- }
- }
-
- /**
- * 生成签名,5min后过期
- *
* @param tokenInfo 用户信息
* @param secret 用户的密码
* @return 加密的token
*/
public static String sign(TokenInfo tokenInfo, String secret) {
try {
- Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
+ if (ObjectUtils.isEmpty(expireTime)) {
+ expireTime = CommonBeanFactory.getBean(Environment.class).getProperty("dataease.login_timeout", Long.class, 480L);
+ }
+ long expireTimeMillis = expireTime * 60000L;
+ Date date = new Date(System.currentTimeMillis() + expireTimeMillis);
Algorithm algorithm = Algorithm.HMAC256(secret);
Builder builder = JWT.create()
.withClaim("username", tokenInfo.getUsername())
.withClaim("userId", tokenInfo.getUserId());
String sign = builder.withExpiresAt(date).sign(algorithm);
return sign;
-
} catch (Exception e) {
return null;
}
@@ -143,7 +102,6 @@ public class JWTUtils {
} else {
verifier = JWT.require(algorithm).withClaim("resourceId", resourceId).withClaim("userId", userId).build();
}
-
try {
verifier.verify(token);
return true;
@@ -152,16 +110,5 @@ public class JWTUtils {
}
}
- /**
- * 获取当前token上次操作时间
- *
- * @param token
- * @return
- */
- public static Long tokenLastOperateTime(String token) {
- DecodedJWT jwt = JWT.decode(token);
- Date expiresAt = jwt.getExpiresAt();
- return expiresAt.getTime();
- }
}
diff --git a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
index 0bcec3b8c8..32b68267ab 100644
--- a/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/TokenCacheUtils.java
@@ -50,8 +50,9 @@ public class TokenCacheUtils {
}
Long time = expTime * 60;
- CacheUtils.put(KEY, token, userId, time.intValue(), null);
-
+ Double v = time * 0.6;
+ CacheUtils.put(KEY, token, userId, time.intValue(), v.intValue());
+ CacheUtils.flush(KEY);
}
public static void remove(String token) {
diff --git a/backend/src/main/java/io/dataease/listener/ApplicationCloseEventListener.java b/backend/src/main/java/io/dataease/listener/ApplicationCloseEventListener.java
new file mode 100644
index 0000000000..4fde79311f
--- /dev/null
+++ b/backend/src/main/java/io/dataease/listener/ApplicationCloseEventListener.java
@@ -0,0 +1,24 @@
+package io.dataease.listener;
+
+import io.dataease.commons.utils.LogUtil;
+import net.sf.ehcache.CacheManager;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ApplicationCloseEventListener implements ApplicationListener {
+
+ @Autowired(required = false)
+ CacheManager cacheManager;
+
+ @Override
+ public void onApplicationEvent(ContextClosedEvent event) {
+
+ if (ObjectUtils.isNotEmpty(cacheManager))
+ cacheManager.shutdown();
+ LogUtil.info("DataEase is stopping");
+ }
+}
diff --git a/backend/src/main/java/io/dataease/listener/util/CacheUtils.java b/backend/src/main/java/io/dataease/listener/util/CacheUtils.java
index 22ebed424a..9a4fd3aa88 100644
--- a/backend/src/main/java/io/dataease/listener/util/CacheUtils.java
+++ b/backend/src/main/java/io/dataease/listener/util/CacheUtils.java
@@ -66,6 +66,12 @@ public class CacheUtils {
return cache(cacheName).remove(key);
}
+ public static void flush(String cacheName) {
+ CacheManager manager = getCacheManager();
+ if (manager instanceof RedisCacheManager) return;
+ cache(cacheName).flush();
+ }
+
public static void removeAll(String cacheName) {
if (getCacheManager() instanceof RedisCacheManager) {
org.springframework.cache.Cache cache = getCacheManager().getCache(cacheName);
diff --git a/backend/src/main/resources/ehcache/ehcache.xml b/backend/src/main/resources/ehcache/ehcache.xml
index 5976911a62..144cdb7ad6 100644
--- a/backend/src/main/resources/ehcache/ehcache.xml
+++ b/backend/src/main/resources/ehcache/ehcache.xml
@@ -272,12 +272,16 @@
+ timeToIdleSeconds="28800"
+ timeToLiveSeconds="28800"
+ memoryStoreEvictionPolicy="LRU"
+ diskPersistent="true">
+
+
From 2d18c0aa45511e6b66401d962e9ccfc3c2026e80 Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Wed, 22 Feb 2023 11:58:09 +0800
Subject: [PATCH 43/48] =?UTF-8?q?fix:=20info=20=E5=9B=BE=E6=A0=87=E6=9B=B4?=
=?UTF-8?q?=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/icons/svg/icon_info_filled.svg | 5 +++++
frontend/src/icons/svg/icon_info_outlined.svg | 12 ++++++++++++
.../dragItem/components/FieldErrorTips.vue | 2 +-
frontend/src/views/chart/view/ChartEdit.vue | 6 +-----
frontend/src/views/dataset/add/AddExcel.vue | 2 +-
frontend/src/views/dataset/add/AddSQL.vue | 2 +-
frontend/src/views/dataset/data/ViewTable.vue | 5 +----
frontend/src/views/panel/list/PanelViewShow.vue | 6 +-----
.../src/views/system/datasource/DsConfiguration.vue | 2 +-
frontend/src/views/system/sysParam/BasicSetting.vue | 2 +-
frontend/src/views/system/sysParam/EmailSetting.vue | 6 +++---
frontend/src/views/system/user/index.vue | 2 +-
12 files changed, 29 insertions(+), 23 deletions(-)
create mode 100644 frontend/src/icons/svg/icon_info_filled.svg
create mode 100644 frontend/src/icons/svg/icon_info_outlined.svg
diff --git a/frontend/src/icons/svg/icon_info_filled.svg b/frontend/src/icons/svg/icon_info_filled.svg
new file mode 100644
index 0000000000..34439a4850
--- /dev/null
+++ b/frontend/src/icons/svg/icon_info_filled.svg
@@ -0,0 +1,5 @@
+
diff --git a/frontend/src/icons/svg/icon_info_outlined.svg b/frontend/src/icons/svg/icon_info_outlined.svg
new file mode 100644
index 0000000000..eebdd2f505
--- /dev/null
+++ b/frontend/src/icons/svg/icon_info_outlined.svg
@@ -0,0 +1,12 @@
+
diff --git a/frontend/src/views/chart/components/dragItem/components/FieldErrorTips.vue b/frontend/src/views/chart/components/dragItem/components/FieldErrorTips.vue
index 8f184ef6bc..30e56d3d1c 100644
--- a/frontend/src/views/chart/components/dragItem/components/FieldErrorTips.vue
+++ b/frontend/src/views/chart/components/dragItem/components/FieldErrorTips.vue
@@ -6,7 +6,7 @@
:content="$t('chart.field_error_tips')"
placement="bottom"
>
-
+
diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue
index 48c63a2925..82756d5a20 100644
--- a/frontend/src/views/chart/view/ChartEdit.vue
+++ b/frontend/src/views/chart/view/ChartEdit.vue
@@ -28,11 +28,7 @@
:data="view"
:tab-status="tabStatus"
/>
-
+
{{ $t('dataset.excel_info_3') }}
-
+
-
+
diff --git a/frontend/src/views/dataset/data/ViewTable.vue b/frontend/src/views/dataset/data/ViewTable.vue
index feaf71e105..6d75c04484 100644
--- a/frontend/src/views/dataset/data/ViewTable.vue
+++ b/frontend/src/views/dataset/data/ViewTable.vue
@@ -48,10 +48,7 @@
:data="table"
:tab-status="tabStatus"
/>
-
+
-
+
diff --git a/frontend/src/views/system/datasource/DsConfiguration.vue b/frontend/src/views/system/datasource/DsConfiguration.vue
index 32cefd2a3b..b76c5fbec4 100644
--- a/frontend/src/views/system/datasource/DsConfiguration.vue
+++ b/frontend/src/views/system/datasource/DsConfiguration.vue
@@ -71,7 +71,7 @@
popper-class="api-table-delete"
trigger="click"
>
-
+
{{ $t('datasource.delete_this_item') }}
diff --git a/frontend/src/views/system/sysParam/BasicSetting.vue b/frontend/src/views/system/sysParam/BasicSetting.vue
index 8f1cfa19e5..e544bf03e2 100644
--- a/frontend/src/views/system/sysParam/BasicSetting.vue
+++ b/frontend/src/views/system/sysParam/BasicSetting.vue
@@ -47,7 +47,7 @@
:content="$t('system_parameter_setting.front_time_out')"
placement="top"
>
-
+
-
+
-
+
@@ -118,7 +118,7 @@
:content="$t('system_parameter_setting.to_enable_tsl')"
placement="top"
>
-
+
diff --git a/frontend/src/views/system/user/index.vue b/frontend/src/views/system/user/index.vue
index a45d78fb37..c1f4fc52f2 100644
--- a/frontend/src/views/system/user/index.vue
+++ b/frontend/src/views/system/user/index.vue
@@ -261,7 +261,7 @@
popper-class="reset-pwd"
trigger="click"
>
-
+
{{ $t('user.recover_pwd') }}