diff --git a/backend/pom.xml b/backend/pom.xml
index ad2bbb4111..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
@@ -119,7 +119,7 @@
org.apache.commons
commons-text
- [1.10.0,)
+ 1.10.0
commons-codec
@@ -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/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/auth/filter/JWTFilter.java b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java
index 973b0fced2..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,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/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/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 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,18 @@ 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","所有数据源");
+ @ApiOperation("查询授权的数据类型")
+ 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;
}
}
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/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
index 344eb45540..fd494179ea 100644
--- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
+++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
@@ -1147,8 +1147,8 @@ public class DataSetTableService {
subSelect.setAlias(new Alias(rightItem.getAlias().toString(), false));
}
join.setRightItem(subSelect);
- joinsList.add(join);
}
+ joinsList.add(join);
}
plainSelect.setJoins(joinsList);
}
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 76d2f12ef4..80474a31b3 100644
--- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
+++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java
@@ -63,6 +63,8 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Service
@@ -646,4 +648,22 @@ public class DatasourceService {
addJob(basicInfo.getDsCheckIntervalType(), Integer.valueOf(basicInfo.getDsCheckInterval()));
}
+ public void updateDemoDs() {
+ Datasource datasource = datasourceMapper.selectByPrimaryKey("76026997-94f9-4a35-96ca-151084638969");
+ MysqlConfiguration mysqlConfiguration = new Gson().fromJson(datasource.getConfiguration(), MysqlConfiguration.class);
+ Pattern WITH_SQL_FRAGMENT = Pattern.compile("jdbc:mysql://(.*):(\\d+)/(.*)");
+ Matcher matcher = WITH_SQL_FRAGMENT.matcher(env.getProperty("spring.datasource.url"));
+ if (!matcher.find()) {
+ return;
+ }
+ mysqlConfiguration.setHost(matcher.group(1));
+ mysqlConfiguration.setPort(Integer.valueOf(matcher.group(2)));
+ mysqlConfiguration.setDataBase(matcher.group(3).split("\\?")[0]);
+ mysqlConfiguration.setExtraParams(matcher.group(3).split("\\?")[1]);
+ mysqlConfiguration.setUsername(env.getProperty("spring.datasource.username"));
+ mysqlConfiguration.setPassword(env.getProperty("spring.datasource.password"));
+ datasource.setConfiguration(new Gson().toJson(mysqlConfiguration));
+ datasourceMapper.updateByPrimaryKeyWithBLOBs(datasource);
+ }
+
}
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/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/backend/src/main/resources/sql/sqlTemplate.stg b/backend/src/main/resources/sql/sqlTemplate.stg
index 41cd934e64..d24d71b521 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
@@ -23,10 +23,14 @@ FROM
WHERE
}; separator="\nAND ">
-
+
GROUP BY
}; separator=",\n">
+
+GROUP BY
+ }; separator=",\n">
+
ORDER BY
}; separator=",\n">
@@ -34,7 +38,7 @@ ORDER BY
>>
-previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup, notUseAs)
+previewSql(limitFiled, groups, aggregators, filters, orders, table, isGroup, notUseAs, useAliasForGroup)
::=<<
SELECT
@@ -59,10 +63,14 @@ FROM
WHERE
}; separator="\nAND ">
-
+
GROUP BY
}; separator=",\n">
+
+GROUP BY
+ }; separator=",\n">
+
ORDER BY
}; separator=",\n">
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/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)
}
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') }}
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