diff --git a/backend/src/main/java/io/dataease/auth/config/cas/CasStrategy.java b/backend/src/main/java/io/dataease/auth/config/cas/CasStrategy.java index 7a8693b428..82d5187a82 100644 --- a/backend/src/main/java/io/dataease/auth/config/cas/CasStrategy.java +++ b/backend/src/main/java/io/dataease/auth/config/cas/CasStrategy.java @@ -2,6 +2,7 @@ package io.dataease.auth.config.cas; import io.dataease.auth.service.impl.ShiroServiceImpl; import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.commons.utils.ServletUtils; import io.dataease.service.system.SystemParameterService; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.util.AntPathMatcher; @@ -17,7 +18,7 @@ import java.util.Set; public class CasStrategy implements UrlPatternMatcherStrategy { - private static Set<String> releaseTypes = new HashSet<>(); + private static Set<String> releaseTypes = new HashSet<>(); @PostConstruct public void init() { @@ -25,6 +26,7 @@ public class CasStrategy implements UrlPatternMatcherStrategy { releaseTypes.add("link"); releaseTypes.add("doc"); } + @Override public boolean matches(String s) { SystemParameterService service = CommonBeanFactory.getBean(SystemParameterService.class); @@ -35,10 +37,14 @@ public class CasStrategy implements UrlPatternMatcherStrategy { if ((beginIndex = s.indexOf(serverName)) != -1) { s = s.substring(beginIndex + serverName.length()); } - if (StringUtils.equals("/", s)) return false; + if (StringUtils.equals("/", s)) { + if (fromLink(serverName)) return true; + return false; + } if (StringUtils.equals("/login", s)) return false; if (StringUtils.startsWith(s, "/cas/callBack")) return false; if (StringUtils.equals("/api/auth/deLogout", s)) return true; + if (s.startsWith("/link.html")) return true; AntPathMatcher antPathMatcher = new AntPathMatcher(); ShiroServiceImpl shiroService = CommonBeanFactory.getBean(ShiroServiceImpl.class); Map<String, String> stringStringMap = shiroService.loadFilterChainDefinitionMap(); @@ -57,4 +63,15 @@ public class CasStrategy implements UrlPatternMatcherStrategy { public void setPattern(String s) { } + + private Boolean fromLink(String serverName) { + String referrer = ServletUtils.request().getHeader("referer"); + if (StringUtils.isBlank(referrer)) return false; + int beginIndex = -1; + if ((beginIndex = referrer.indexOf(serverName)) != -1) { + referrer = referrer.substring(beginIndex + serverName.length()); + return referrer.startsWith("/link.html"); + } + return false; + } } diff --git a/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java b/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java index 9554458b8d..a4c686349b 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java @@ -9,6 +9,8 @@ import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.DeLogUtils; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; +import io.dataease.exception.DataEaseException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.dingtalk.dto.response.DingQrResult; @@ -101,6 +103,8 @@ public class XDingtalkServer { sysUserService.validateExistUser(username, dingUserEntity.getName(), email); sysUserService.saveDingtalkCUser(dingUserEntity, email); sysUserEntity = authUserService.getUserByDingtalkId(username); + } else if (sysUserEntity.getEnabled() == 0) { + DataEaseException.throwException(Translator.get("i18n_user_is_disable")); } TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); String realPwd = sysUserEntity.getPassword(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java b/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java index f473c6eed8..a71909fbcb 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java @@ -9,6 +9,8 @@ import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.DeLogUtils; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; +import io.dataease.exception.DataEaseException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; @@ -102,6 +104,8 @@ public class XLarkServer { sysUserService.validateExistUser(username, larkUserInfo.getName(), email); sysUserService.saveLarkCUser(larkUserInfo, email); sysUserEntity = authUserService.getUserByLarkId(username); + } else if (sysUserEntity.getEnabled() == 0) { + DataEaseException.throwException(Translator.get("i18n_user_is_disable")); } TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); String realPwd = sysUserEntity.getPassword(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java b/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java index 64d9506cfb..b4af287f4b 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLarksuiteServer.java @@ -9,6 +9,8 @@ import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.DeLogUtils; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; +import io.dataease.exception.DataEaseException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; @@ -102,6 +104,8 @@ public class XLarksuiteServer { sysUserService.validateExistUser(username, larkUserInfo.getName(), email); sysUserService.saveLarksuiteCUser(larkUserInfo, email); sysUserEntity = authUserService.getUserByLarksuiteId(username); + } else if (sysUserEntity.getEnabled() == 0) { + DataEaseException.throwException(Translator.get("i18n_user_is_disable")); } TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); String realPwd = sysUserEntity.getPassword(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java b/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java index 738f4f73bc..2c3df6f20f 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java @@ -10,6 +10,8 @@ import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.DeLogUtils; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; +import io.dataease.exception.DataEaseException; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.SysUserAssist; import io.dataease.plugins.config.SpringContextUtil; import io.dataease.plugins.xpack.display.dto.response.SysSettingDto; @@ -106,6 +108,8 @@ public class XWecomServer { sysUserService.validateExistUser(userId, userMap.get("name").toString(), email); sysUserService.saveWecomCUser(userMap, userId, email); sysUserEntity = authUserService.getUserByWecomId(userId); + } else if (sysUserEntity.getEnabled() == 0) { + DataEaseException.throwException(Translator.get("i18n_user_is_disable")); } TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build(); String realPwd = sysUserEntity.getPassword(); diff --git a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java index 0a2e7f8800..6468accbd6 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java @@ -689,7 +689,7 @@ public class JdbcProvider extends DefaultJdbcProvider { if (StringUtils.isEmpty(sqlServerConfiguration.getSchema())) { throw new Exception(Translator.get("i18n_schema_is_empty")); } - return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'DS_SCHEMA' ;" + return "SELECT TABLE_NAME FROM \"DATABASE\".INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'DS_SCHEMA' ;" .replace("DATABASE", sqlServerConfiguration.getDataBase()) .replace("DS_SCHEMA", sqlServerConfiguration.getSchema()); case oracle: 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 a3daa200d0..2324f62cb8 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -1054,24 +1054,25 @@ public class DataSetTableService { return sql; } - public String removeVariables(String sql, String dsType) throws Exception { + public String removeVariables(final String sql, String dsType) throws Exception { + String tmpSql = sql; Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(sql); + Matcher matcher = pattern.matcher(tmpSql); boolean hasVariables = false; while (matcher.find()) { hasVariables = true; - sql = sql.replace(matcher.group(), SubstitutedParams); + tmpSql = tmpSql.replace(matcher.group(), SubstitutedParams); } - if (!hasVariables && !sql.contains(SubstitutedParams)) { - return sql; + if (!hasVariables && !tmpSql.contains(SubstitutedParams)) { + return tmpSql; } - CCJSqlParserUtil.parse(sql, parser -> parser.withSquareBracketQuotation(true)); - Statement statement = CCJSqlParserUtil.parse(sql); + CCJSqlParserUtil.parse(tmpSql, parser -> parser.withSquareBracketQuotation(true)); + Statement statement = CCJSqlParserUtil.parse(tmpSql); Select select = (Select) statement; if (select.getSelectBody() instanceof PlainSelect) { return handlePlainSelect((PlainSelect) select.getSelectBody(), select, dsType); - }else { + } else { String result = ""; SetOperationList setOperationList = (SetOperationList) select.getSelectBody(); for (int i = 0; i < setOperationList.getSelects().size(); i++) { @@ -1175,15 +1176,24 @@ public class DataSetTableService { } public Map<String, Object> getSQLPreview(DataSetTableRequest dataSetTableRequest) throws Exception { + DataTableInfoDTO dataTableInfo = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); + String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); if (ds == null) { throw new Exception(Translator.get("i18n_invalid_ds")); } + String tmpSql = removeVariables(sql, ds.getType()); + if (dataSetTableRequest.getMode() == 1 && (tmpSql.contains(SubstitutedParams) || tmpSql.contains(SubstitutedSql.trim()))) { + throw new Exception(Translator.get("I18N_SQL_variable_direct_limit")); + } + if (tmpSql.contains(SubstitutedParams)) { + throw new Exception(Translator.get("I18N_SQL_variable_limit")); + } Provider datasourceProvider = ProviderFactory.getProvider(ds.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); - DataTableInfoDTO dataTableInfo = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); - String sql = dataTableInfo.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfo.getSql())) : dataTableInfo.getSql(); + + sql = handleVariableDefaultValue(sql, dataSetTableRequest.getSqlVariableDetails(), ds.getType()); if (StringUtils.isEmpty(sql)) { DataEaseException.throwException(Translator.get("i18n_sql_not_empty")); diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index d3ba643e92..df1effdcd3 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -194,6 +194,7 @@ I18N_DATASOURCE_LEVEL_GRANT=Grant I18N_NO_PERMISSION=You do not have permission to I18N_PLEASE_CONCAT_ADMIN=Please contact the administrator for authorization I18N_SQL_variable_limit=SQL variables can only be used in where conditions +I18N_SQL_variable_direct_limit=SQL variables can only be used for direct connection I18N_EMAIL_CONFIG_ERROR=Email config error I18N_EMAIL_HOST_ERROR=Email host can not be empty I18N_EMAIL_PORT_ERROR=Email port can not be empty diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index bdaa67a794..a0972f0da7 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -194,6 +194,7 @@ I18N_DATASOURCE_LEVEL_GRANT=\u6388\u6743 I18N_NO_PERMISSION=\u5F53\u524D\u7528\u6237\u6CA1\u6709\u6743\u9650 I18N_PLEASE_CONCAT_ADMIN=\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u5F00\u901A I18N_SQL_variable_limit=SQL \u53D8\u91CF\u53EA\u80FD\u5728 WHERE \u6761\u4EF6\u4E2D\u4F7F\u7528 +I18N_SQL_variable_direct_limit=SQL变量只能用于直连 I18N_EMAIL_CONFIG_ERROR=\u90AE\u4EF6\u914D\u7F6E\u9519\u8BEF I18N_EMAIL_HOST_ERROR=\u90AE\u4EF6\u4E3B\u673A\u4E0D\u80FD\u4E3A\u7A7A I18N_EMAIL_PORT_ERROR=\u90AE\u4EF6\u7AEF\u53E3\u4E0D\u80FD\u4E3A\u7A7A diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 2003f5a638..fb269a8bda 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -190,6 +190,7 @@ I18N_DATASOURCE_LEVEL_GRANT=\u6388\u6B0A I18N_NO_PERMISSION=\u7576\u524D\u7528\u6236\u6C92\u6709\u6B0A\u9650 I18N_PLEASE_CONCAT_ADMIN=\u8ACB\u806F\u7CFB\u7BA1\u7406\u54E1\u958B\u901A I18N_SQL_variable_limit=SQL\u8B8A\u6578\u53EA\u80FD\u5728WHERE\u689D\u4EF6\u4E2D\u4F7F\u7528 +I18N_SQL_variable_direct_limit=SQL變數只能用於直連 I18N_EMAIL_CONFIG_ERROR=\u90F5\u4EF6\u914D\u7F6E\u932F\u8AA4 I18N_EMAIL_HOST_ERROR=\u90F5\u4EF6\u4E3B\u6A5F\u4E0D\u80FD\u70BA\u7A7A I18N_EMAIL_PORT_ERROR=\u90F5\u4EF6\u7AEF\u53E3\u4E0D\u80FD\u70BA\u7A7A diff --git a/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue b/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue index 5c01a443a1..cbdccb70cb 100644 --- a/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue +++ b/frontend/src/views/chart/components/drag-item/QuotaExtItem.vue @@ -385,6 +385,10 @@ export default { this.editCompare() break case 'percent': + // 选择占比,自动将数值格式设置为百分比并保留2位小数 + this.item.formatterCfg.type = 'percent' + this.item.formatterCfg.decimalCount = 2 + this.item.compareCalc.type = 'percent' this.$emit('onQuotaItemChange', this.item) break diff --git a/frontend/src/views/chart/components/drag-item/QuotaItem.vue b/frontend/src/views/chart/components/drag-item/QuotaItem.vue index 2a72ef6f29..5843e847e6 100644 --- a/frontend/src/views/chart/components/drag-item/QuotaItem.vue +++ b/frontend/src/views/chart/components/drag-item/QuotaItem.vue @@ -382,6 +382,10 @@ export default { this.editCompare() break case 'percent': + // 选择占比,自动将数值格式设置为百分比并保留2位小数 + this.item.formatterCfg.type = 'percent' + this.item.formatterCfg.decimalCount = 2 + this.item.compareCalc.type = 'percent' this.$emit('onQuotaItemChange', this.item) break diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index 96f5f73619..209ca9232c 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -2167,9 +2167,6 @@ export default { if (view.type === 'line' && trigger === 'chart') { view.customAttr.size.lineArea = false } - if (view.type === 'treemap' && trigger === 'chart') { - view.customAttr.label.show = true - } if (view.type === 'liquid' || (view.type.includes('table') && view.render === 'echarts') || view.type.includes('text') || diff --git a/frontend/src/views/dataset/add/AddSQL.vue b/frontend/src/views/dataset/add/AddSQL.vue index 9cb78ed6bf..6be3cebd14 100644 --- a/frontend/src/views/dataset/add/AddSQL.vue +++ b/frontend/src/views/dataset/add/AddSQL.vue @@ -702,6 +702,7 @@ export default { post('/dataset/table/sqlPreview', { dataSourceId: this.dataSource, type: 'sql', + mode: parseInt(this.mode), sqlVariableDetails: JSON.stringify(this.variables), info: JSON.stringify({ sql: Base64.encode(this.sql.trim()),