diff --git a/README.md b/README.md index f5a37f3bab..e193e14cba 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数 ### DataEase 的功能: - 图表展示:支持 PC 端、移动端及大屏; -- 图表制作:支持丰富的图表类型(基于 Apache ECharts 实现)、支持拖拉拽方式快速制作仪表板; +- 图表制作:支持丰富的图表类型(Apache ECharts / AntV)、支持拖拉拽方式快速制作仪表板; - 数据引擎:支持直连模式、本地模式(基于 Apache Doris / Kettle 实现); - 数据连接:支持关系型数据库、Excel 等文件、Hadoop 等大数据平台、NoSQL 等各种数据源。 @@ -35,6 +35,8 @@ DataEase 是开源的数据可视化分析工具,帮助用户快速分析数 - MariaDB - Apache Doris - ClickHouse +- MongoDB +- Amazon Redshift > 更多数据源支持持续增加中... @@ -73,7 +75,7 @@ curl -sSL https://github.com/dataease/dataease/releases/latest/download/quick_st ## 技术栈 - 后端:[Spring Boot](https://spring.io/projects/spring-boot) -- 前端:[Vue.js](https://vuejs.org/)、[Element](https://element.eleme.cn/) +- 前端:[Vue.js](https://vuejs.org/)、[Element](https://element.eleme.cn/)、[Apache ECharts](https://github.com/apache/echarts)、[AntV](https://antv.vision/zh) - 中间件:[MySQL](https://www.mysql.com/) - 数据处理:[Kettle](https://github.com/pentaho/pentaho-kettle)、[Apache Doris](https://github.com/apache/incubator-doris/) - 基础设施:[Docker](https://www.docker.com/) 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 2af165a370..7f2fe37636 100644 --- a/backend/src/main/java/io/dataease/auth/api/AuthApi.java +++ b/backend/src/main/java/io/dataease/auth/api/AuthApi.java @@ -30,8 +30,7 @@ public interface AuthApi { CurrentUserDto userInfo(); - /*@GetMapping("/isLogin") - Boolean isLogin();*/ + @ApiOperation("登出") diff --git a/backend/src/main/java/io/dataease/auth/api/dto/CurrentRoleDto.java b/backend/src/main/java/io/dataease/auth/api/dto/CurrentRoleDto.java index 65660c51d5..2b0635ca42 100644 --- a/backend/src/main/java/io/dataease/auth/api/dto/CurrentRoleDto.java +++ b/backend/src/main/java/io/dataease/auth/api/dto/CurrentRoleDto.java @@ -11,7 +11,6 @@ public class CurrentRoleDto implements Serializable { @ApiModelProperty("ID") private Long id; -// private String code; @ApiModelProperty("名称") private String name; } 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 ca9dd2f013..2c28324d83 100644 --- a/backend/src/main/java/io/dataease/auth/config/F2CRealm.java +++ b/backend/src/main/java/io/dataease/auth/config/F2CRealm.java @@ -94,14 +94,7 @@ public class F2CRealm extends AuthorizingRealm { if (username == null) { throw new AuthenticationException("token invalid"); } - // 使用缓存 - /*SysUserEntity user = authUserService.getUserById(userId); - if (user == null) { - throw new AuthenticationException("User didn't existed!"); - } - if (user.getEnabled()==0) { - throw new AuthenticationException("User is valid!"); - }*/ + SysUserEntity user = userWithId(userId); String pass = null; try { @@ -112,13 +105,7 @@ public class F2CRealm extends AuthorizingRealm { if (! JWTUtils.verify(token, tokenInfo, pass)) { throw new AuthenticationException("Username or password error"); } - /*// 使用缓存 - List currentRoleDtos = authUserService.roleInfos(user.getUserId()); - // 使用缓存 - List permissions = authUserService.permissions(user.getUserId()); - CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user); - currentUserDto.setRoles(currentRoleDtos); - currentUserDto.setPermissions(permissions);*/ + CurrentUserDto currentUserDto = queryCacheUserDto(user); return new SimpleAuthenticationInfo(currentUserDto, token, "f2cReam"); } diff --git a/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java b/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java index e018cca48a..ade63a71ce 100644 --- a/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java +++ b/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java @@ -13,8 +13,6 @@ public class TokenInfo implements Serializable { private Long userId; - /* private String idToken; */ - public String format(){ return username + "," +userId; } diff --git a/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java b/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java index c94900c4fc..47b961fc3a 100644 --- a/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/F2CLinkFilter.java @@ -39,7 +39,6 @@ public class F2CLinkFilter extends AnonymousFilter { panelLink.setPwd("dataease"); pwd = panelLink.getPwd(); }else { - /* pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, panelLink.getPwd()); */ pwd = panelLink.getPwd(); } return JWTUtils.verifyLink(link_token, id, pwd); 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 3077a338a5..5f276d3139 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -53,11 +53,9 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { if (ApiKeyHandler.isApiKeyCall(httpServletRequest)) { - // Long userId = ApiKeyHandler.getUser(httpServletRequest); ASKToken askToken = ApiKeyHandler.buildToken(httpServletRequest); - // UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userId.toString(), ApiKeyHandler.random); getSubject(request, response).login(askToken); return true; } 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 219a9c5a47..96183f4d35 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -71,7 +71,6 @@ public class AuthServer implements AuthApi { LdapAddRequest ldapAddRequest = new LdapAddRequest(); ldapAddRequest.setUsers(new ArrayList(){{add(ldapUserEntity);}}); ldapAddRequest.setEnabled(1L); - // ldapAddRequest.setDeptId(1L); ldapAddRequest.setRoleIds(new ArrayList(){{add(2L);}}); sysUserService.validateExistUser(ldapUserEntity.getUsername(), ldapUserEntity.getNickname(), ldapUserEntity.getEmail()); sysUserService.saveLdapUsers(ldapAddRequest); @@ -191,13 +190,7 @@ public class AuthServer implements AuthApi { @Override public String getPublicKey() { return RsaProperties.publicKey; - } - - - /*@Override - public Boolean isLogin() { - return null; - }*/ + } } diff --git a/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java b/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java index 4ed2eb0270..6d2a02de7f 100644 --- a/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java +++ b/backend/src/main/java/io/dataease/auth/server/DynamicMenuServer.java @@ -14,7 +14,6 @@ public class DynamicMenuServer implements DynamicMenuApi { @Override public List menus() { - //ServletUtils.getToken() return dynamicMenuService.load(null); } } diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java index 4220d88dfc..8b7013c6cb 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ExtAuthServiceImpl.java @@ -2,12 +2,10 @@ package io.dataease.auth.service.impl; import io.dataease.auth.service.ExtAuthService; import io.dataease.base.domain.SysAuth; -import io.dataease.base.mapper.SysAuthMapper; import io.dataease.base.mapper.ext.ExtAuthMapper; import io.dataease.commons.model.AuthURD; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; - import javax.annotation.Resource; import java.util.HashSet; import java.util.List; @@ -21,8 +19,7 @@ public class ExtAuthServiceImpl implements ExtAuthService { @Resource private ExtAuthMapper extAuthMapper; - @Resource - private SysAuthMapper sysAuthMapper; + @Override public Set userIdsByRD(AuthURD request) { @@ -42,9 +39,7 @@ public class ExtAuthServiceImpl implements ExtAuthService { @Override public AuthURD resourceTarget(String resourceId) { AuthURD authURD = new AuthURD(); - /*SysAuthExample example = new SysAuthExample(); - example.createCriteria().andAuthSourceEqualTo(resourceId); - List sysAuths = sysAuthMapper.selectByExample(example);*/ + List sysAuths = extAuthMapper.queryByResource(resourceId); Map> authMap = sysAuths.stream().collect(Collectors.groupingBy(SysAuth::getAuthTargetType)); diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java index 44db0ba932..547d191919 100644 --- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java +++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java @@ -41,6 +41,8 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/link/**", ANON); filterChainDefinitionMap.put("/index.html", ANON); filterChainDefinitionMap.put("/link.html", ANON); + filterChainDefinitionMap.put("/xggznb/**", ANON); + //获取主题信息 filterChainDefinitionMap.put("/plugin/theme/themes", ANON); @@ -52,15 +54,11 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/dataset/field/fieldValues/**", ANON); filterChainDefinitionMap.put("/linkJump/queryPanelJumpInfo/**", ANON); - //未读消息数量 - // filterChainDefinitionMap.put("/api/sys_msg/unReadCount/**", ANON); - filterChainDefinitionMap.put("/**/*.json", ANON); filterChainDefinitionMap.put("/system/ui/**", ANON); filterChainDefinitionMap.put("/**/*.js", ANON); filterChainDefinitionMap.put("/**/*.css", ANON); filterChainDefinitionMap.put("/**/*.map", ANON); - // filterChainDefinitionMap.put("/axios.map", ANON); filterChainDefinitionMap.put("/api/auth/login", ANON); filterChainDefinitionMap.put("/api/auth/isPluginLoaded", ANON); 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 544c7a9cb8..6430011125 100644 --- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java +++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java @@ -39,9 +39,6 @@ public class JWTUtils { Verification verification = JWT.require(algorithm) .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()); - /* if (StringUtils.isNotBlank(tokenInfo.getIdToken())) { - verification.withClaim("idToken", tokenInfo.getIdToken()); - } */ JWTVerifier verifier = verification.build(); verifier.verify(token); return true; @@ -55,22 +52,14 @@ public class JWTUtils { DecodedJWT jwt = JWT.decode(token); String username = jwt.getClaim("username").asString(); Long userId = jwt.getClaim("userId").asLong(); - // String idToken = jwt.getClaim("idToken").asString(); if (StringUtils.isEmpty(username) || ObjectUtils.isEmpty(userId) ){ DataEaseException.throwException("token格式错误!"); } TokenInfoBuilder tokenInfoBuilder = TokenInfo.builder().username(username).userId(userId); - /* if (StringUtils.isNotBlank(idToken)) { - tokenInfoBuilder.idToken(idToken); - } */ TokenInfo tokenInfo = tokenInfoBuilder.build(); return tokenInfo; } - - - - public static boolean needRefresh(String token){ Date exp = JWTUtils.getExp(token); return new Date().getTime() >= exp.getTime(); @@ -120,9 +109,6 @@ public class JWTUtils { Builder builder = JWT.create() .withClaim("username", tokenInfo.getUsername()) .withClaim("userId", tokenInfo.getUserId()); - /* if (StringUtils.isNotBlank(tokenInfo.getIdToken())) { - builder.withClaim("idToken", tokenInfo.getIdToken()); - } */ return builder.withExpiresAt(date).sign(algorithm); } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/auth/util/RsaUtil.java b/backend/src/main/java/io/dataease/auth/util/RsaUtil.java index 46c5ed282a..c810a70ab5 100644 --- a/backend/src/main/java/io/dataease/auth/util/RsaUtil.java +++ b/backend/src/main/java/io/dataease/auth/util/RsaUtil.java @@ -26,7 +26,6 @@ public class RsaUtil { PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); -// byte[] result = cipher.doFinal(Base64.decodeBase64(text)); // 下面该用分段加密 byte[] result = null; byte[] b = Base64.decodeBase64(text); @@ -50,7 +49,6 @@ public class RsaUtil { PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); - /*byte[] result = cipher.doFinal(text.getBytes());*/ // 下面该用分段加密 byte[] result = null; byte[] b = text.getBytes("utf-8"); diff --git a/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java b/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java new file mode 100644 index 0000000000..8af3488aa4 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/PanelLinkMapping.java @@ -0,0 +1,13 @@ +package io.dataease.base.domain; + +import java.io.Serializable; +import lombok.Data; + +@Data +public class PanelLinkMapping implements Serializable { + private Long id; + + private String resourceId; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java b/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java new file mode 100644 index 0000000000..da9e2da4ca --- /dev/null +++ b/backend/src/main/java/io/dataease/base/domain/PanelLinkMappingExample.java @@ -0,0 +1,330 @@ +package io.dataease.base.domain; + +import java.util.ArrayList; +import java.util.List; + +public class PanelLinkMappingExample { + protected String orderByClause; + + protected boolean distinct; + + protected List oredCriteria; + + public PanelLinkMappingExample() { + oredCriteria = new ArrayList(); + } + + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + public String getOrderByClause() { + return orderByClause; + } + + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + public boolean isDistinct() { + return distinct; + } + + public List getOredCriteria() { + return oredCriteria; + } + + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andResourceIdIsNull() { + addCriterion("resource_id is null"); + return (Criteria) this; + } + + public Criteria andResourceIdIsNotNull() { + addCriterion("resource_id is not null"); + return (Criteria) this; + } + + public Criteria andResourceIdEqualTo(String value) { + addCriterion("resource_id =", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotEqualTo(String value) { + addCriterion("resource_id <>", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdGreaterThan(String value) { + addCriterion("resource_id >", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdGreaterThanOrEqualTo(String value) { + addCriterion("resource_id >=", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLessThan(String value) { + addCriterion("resource_id <", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLessThanOrEqualTo(String value) { + addCriterion("resource_id <=", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdLike(String value) { + addCriterion("resource_id like", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotLike(String value) { + addCriterion("resource_id not like", value, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdIn(List values) { + addCriterion("resource_id in", values, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotIn(List values) { + addCriterion("resource_id not in", values, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdBetween(String value1, String value2) { + addCriterion("resource_id between", value1, value2, "resourceId"); + return (Criteria) this; + } + + public Criteria andResourceIdNotBetween(String value1, String value2) { + addCriterion("resource_id not between", value1, value2, "resourceId"); + return (Criteria) this; + } + } + + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/SysMsgChannel.java b/backend/src/main/java/io/dataease/base/domain/SysMsgChannel.java index 4febdde0fb..97a7faedcc 100644 --- a/backend/src/main/java/io/dataease/base/domain/SysMsgChannel.java +++ b/backend/src/main/java/io/dataease/base/domain/SysMsgChannel.java @@ -1,20 +1,15 @@ package io.dataease.base.domain; import java.io.Serializable; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data -@ApiModel("消息渠道") public class SysMsgChannel implements Serializable { - - @ApiModelProperty("消息渠道ID") private Long msgChannelId; - @ApiModelProperty("消息渠道名称") private String channelName; + private String serviceName; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/domain/SysMsgChannelExample.java b/backend/src/main/java/io/dataease/base/domain/SysMsgChannelExample.java index 6c860f8837..05c2da9437 100644 --- a/backend/src/main/java/io/dataease/base/domain/SysMsgChannelExample.java +++ b/backend/src/main/java/io/dataease/base/domain/SysMsgChannelExample.java @@ -233,6 +233,76 @@ public class SysMsgChannelExample { addCriterion("channel_name not between", value1, value2, "channelName"); return (Criteria) this; } + + public Criteria andServiceNameIsNull() { + addCriterion("service_name is null"); + return (Criteria) this; + } + + public Criteria andServiceNameIsNotNull() { + addCriterion("service_name is not null"); + return (Criteria) this; + } + + public Criteria andServiceNameEqualTo(String value) { + addCriterion("service_name =", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameNotEqualTo(String value) { + addCriterion("service_name <>", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameGreaterThan(String value) { + addCriterion("service_name >", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameGreaterThanOrEqualTo(String value) { + addCriterion("service_name >=", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameLessThan(String value) { + addCriterion("service_name <", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameLessThanOrEqualTo(String value) { + addCriterion("service_name <=", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameLike(String value) { + addCriterion("service_name like", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameNotLike(String value) { + addCriterion("service_name not like", value, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameIn(List values) { + addCriterion("service_name in", values, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameNotIn(List values) { + addCriterion("service_name not in", values, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameBetween(String value1, String value2) { + addCriterion("service_name between", value1, value2, "serviceName"); + return (Criteria) this; + } + + public Criteria andServiceNameNotBetween(String value1, String value2) { + addCriterion("service_name not between", value1, value2, "serviceName"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.java b/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.java new file mode 100644 index 0000000000..934de07719 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.java @@ -0,0 +1,30 @@ +package io.dataease.base.mapper; + +import io.dataease.base.domain.PanelLinkMapping; +import io.dataease.base.domain.PanelLinkMappingExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface PanelLinkMappingMapper { + long countByExample(PanelLinkMappingExample example); + + int deleteByExample(PanelLinkMappingExample example); + + int deleteByPrimaryKey(Long id); + + int insert(PanelLinkMapping record); + + int insertSelective(PanelLinkMapping record); + + List selectByExample(PanelLinkMappingExample example); + + PanelLinkMapping selectByPrimaryKey(Long id); + + int updateByExampleSelective(@Param("record") PanelLinkMapping record, @Param("example") PanelLinkMappingExample example); + + int updateByExample(@Param("record") PanelLinkMapping record, @Param("example") PanelLinkMappingExample example); + + int updateByPrimaryKeySelective(PanelLinkMapping record); + + int updateByPrimaryKey(PanelLinkMapping record); +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml b/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml new file mode 100644 index 0000000000..78851fad13 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/PanelLinkMappingMapper.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + id, resource_id + + + + + delete from panel_link_mapping + where id = #{id,jdbcType=BIGINT} + + + delete from panel_link_mapping + + + + + + insert into panel_link_mapping (id, resource_id) + values (#{id,jdbcType=BIGINT}, #{resourceId,jdbcType=VARCHAR}) + + + insert into panel_link_mapping + + + id, + + + resource_id, + + + + + #{id,jdbcType=BIGINT}, + + + #{resourceId,jdbcType=VARCHAR}, + + + + + + update panel_link_mapping + + + id = #{record.id,jdbcType=BIGINT}, + + + resource_id = #{record.resourceId,jdbcType=VARCHAR}, + + + + + + + + update panel_link_mapping + set id = #{record.id,jdbcType=BIGINT}, + resource_id = #{record.resourceId,jdbcType=VARCHAR} + + + + + + update panel_link_mapping + + + resource_id = #{resourceId,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + update panel_link_mapping + set resource_id = #{resourceId,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/SysMsgChannelMapper.xml b/backend/src/main/java/io/dataease/base/mapper/SysMsgChannelMapper.xml index 9e8a89dcdf..90c08ef906 100644 --- a/backend/src/main/java/io/dataease/base/mapper/SysMsgChannelMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/SysMsgChannelMapper.xml @@ -4,6 +4,7 @@ + @@ -64,7 +65,7 @@ - msg_channel_id, channel_name + msg_channel_id, channel_name, service_name @@ -134,6 +143,9 @@ channel_name = #{record.channelName,jdbcType=VARCHAR}, + + service_name = #{record.serviceName,jdbcType=VARCHAR}, + @@ -142,7 +154,8 @@ update sys_msg_channel set msg_channel_id = #{record.msgChannelId,jdbcType=BIGINT}, - channel_name = #{record.channelName,jdbcType=VARCHAR} + channel_name = #{record.channelName,jdbcType=VARCHAR}, + service_name = #{record.serviceName,jdbcType=VARCHAR} @@ -153,12 +166,16 @@ channel_name = #{channelName,jdbcType=VARCHAR}, + + service_name = #{serviceName,jdbcType=VARCHAR}, + where msg_channel_id = #{msgChannelId,jdbcType=BIGINT} update sys_msg_channel - set channel_name = #{channelName,jdbcType=VARCHAR} + set channel_name = #{channelName,jdbcType=VARCHAR}, + service_name = #{serviceName,jdbcType=VARCHAR} where msg_channel_id = #{msgChannelId,jdbcType=BIGINT} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.java index 9e987aa586..40662c1b59 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtAuthMapper.java @@ -14,5 +14,4 @@ public interface ExtAuthMapper { List queryUserIdWithDeptIds(@Param("deptIds") List deptIds); List queryByResource(@Param("resourceId") String resourceId); - // Set queryUserIdWithRD(@Param("roleIds") List roleIds, @Param("deptIds") List deptIds); } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.java index ed9a4085ec..5b337f0fbe 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.java @@ -20,4 +20,6 @@ public interface ExtChartViewMapper { List allViewIds(@Param("tableId") String tableId); String searchAdviceSceneId(@Param("userId") String userId,@Param("panelId") String panelId); + + int checkSameDataSet(@Param("viewIdSource") String viewIdSource,@Param("viewIdTarget") String viewIdTarget); } diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.xml index d755e2dc61..e508578fa4 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtChartViewMapper.xml @@ -150,4 +150,8 @@ chart_group.create_time DESC LIMIT 1 + + diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java index 12fa0e3264..9ce1f02393 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.java @@ -2,6 +2,8 @@ package io.dataease.base.mapper.ext; import io.dataease.base.domain.PanelShare; import io.dataease.base.mapper.ext.query.GridExample; +import io.dataease.controller.request.panel.PanelShareRemoveRequest; +import io.dataease.dto.panel.PanelShareOutDTO; import io.dataease.dto.panel.PanelSharePo; import org.apache.ibatis.annotations.Param; @@ -10,14 +12,20 @@ import java.util.Map; public interface ExtPanelShareMapper { - int batchInsert(@Param("shares") List shares); + int batchInsert(@Param("shares") List shares, @Param("userName") String userName); int batchDelete(@Param("shareIds") List shareIds); List query(Map param); + List queryOut(String userName); + List queryWithResource(GridExample example); + List queryTargets(String panelId); + + void removeShares(@Param("request") PanelShareRemoveRequest request); + List queryUserIdWithRoleIds(Map> param); List queryUserIdWithDeptIds(Map> param); diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml index c260a350ed..d21efce40f 100644 --- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelShareMapper.xml @@ -8,11 +8,20 @@ + + + + + + + + + - INSERT INTO panel_share (panel_group_id,target_id,create_time,type) + INSERT INTO panel_share (panel_group_id,target_id,granter,create_time,type) VALUES - (#{share.panelGroupId}, #{share.targetId}, #{share.createTime}, #{share.type}) + (#{share.panelGroupId}, #{share.targetId}, #{userName}, #{share.createTime}, #{share.type}) @@ -25,7 +34,7 @@ + + + + + + delete from panel_share + where panel_group_id = #{request.panelId} + + and share_id = #{request.shareId} + + + diff --git a/backend/src/main/java/io/dataease/commons/condition/LicStatusCondition.java b/backend/src/main/java/io/dataease/commons/condition/LicStatusCondition.java index 50e906db95..6391e27afc 100644 --- a/backend/src/main/java/io/dataease/commons/condition/LicStatusCondition.java +++ b/backend/src/main/java/io/dataease/commons/condition/LicStatusCondition.java @@ -14,15 +14,10 @@ public class LicStatusCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { - // BeanDefinitionRegistry registry = conditionContext.getRegistry(); - - // DefaultLicenseService defaultLicenseService = conditionContext.getBeanFactory().getBean(DefaultLicenseService.class); DefaultLicenseService defaultLicenseService = CommonBeanFactory.getBean(DefaultLicenseService.class); - /*if (null == defaultLicenseService) { - registry.registerBeanDefinition(); - }*/ + if (ObjectUtils.isNotEmpty(defaultLicenseService)) { F2CLicenseResponse f2CLicenseResponse = defaultLicenseService.validateLicense(); return F2CLicenseResponse.Status.valid == f2CLicenseResponse.getStatus(); diff --git a/backend/src/main/java/io/dataease/commons/constants/DatasourceTypes.java b/backend/src/main/java/io/dataease/commons/constants/DatasourceTypes.java index 7de1c4c638..4e6da058e3 100644 --- a/backend/src/main/java/io/dataease/commons/constants/DatasourceTypes.java +++ b/backend/src/main/java/io/dataease/commons/constants/DatasourceTypes.java @@ -3,6 +3,7 @@ package io.dataease.commons.constants; public enum DatasourceTypes { excel("excel", "excel", "", "", "", "", ""), mysql("mysql", "mysql", "com.mysql.jdbc.Driver", "`", "`", "'", "'"), + hive("hive", "hive", "org.apache.hive.jdbc.HiveDriver", "`", "`", "'", "'"), mariadb("mariadb", "mariadb", "com.mysql.jdbc.Driver", "`", "`", "'", "'"), ds_doris("ds_doris", "ds_doris", "com.mysql.jdbc.Driver", "`", "`", "'", "'"), pg("pg", "pg", "org.postgresql.Driver", "\"", "\"", "\"", "\""), diff --git a/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java b/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java index fd30061367..69113469ae 100644 --- a/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java +++ b/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java @@ -23,7 +23,6 @@ public class DefaultLicenseService { private static final String LICENSE_ID = "fit2cloud_license"; private static final String validatorUtil = "/usr/bin/validator"; private static final String product = "DataEase"; - /*private static final String[] NO_PLU_LIMIT_MODULES = new String[]{"dashboard", "gateway"};*/ public F2CLicenseResponse validateLicense(String product, String licenseKey){ List command = new ArrayList(); @@ -46,11 +45,8 @@ public class DefaultLicenseService { return f2CLicenseResponse; }catch (Exception e){ LogUtil.error(e.getMessage()); - // e.printStackTrace(); - // return F2CLicenseResponse.invalid(e.getMessage()); return F2CLicenseResponse.noRecord(); } - } diff --git a/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java b/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java index 7e3c5ef7aa..de545f89c5 100644 --- a/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java +++ b/backend/src/main/java/io/dataease/commons/utils/CodingUtil.java @@ -153,16 +153,7 @@ public class CodingUtil { } } - /*public static String getSignature(String accessKey, String secretKey) throws Exception { - return aesEncrypt(accessKey + "|" + UUID.randomUUID().toString() + "|" + System.currentTimeMillis(), secretKey, accessKey); - } - public static void main(String[] args) throws Exception{ - String accessKey = "gnPFmtAsdLhUEWPA"; - String secretKey = "TfK5FGUle0KRfJJJ"; - String signature = getSignature(accessKey, secretKey); - System.out.println(signature); - }*/ public static String secretKey() { try { diff --git a/backend/src/main/java/io/dataease/commons/utils/DateUtils.java b/backend/src/main/java/io/dataease/commons/utils/DateUtils.java index 4da7f5721b..d95b7a16c1 100644 --- a/backend/src/main/java/io/dataease/commons/utils/DateUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/DateUtils.java @@ -95,23 +95,6 @@ public class DateUtils { } - /* public static void main(String[] args) throws Exception { -// System.out.println("start:"); - Date paramTime = getTime(getTimeString(new Long("1607672440731"))); - - Map weekDate = getWeedFirstTimeAndLastTime(paramTime); - - for (Map.Entry entry : - weekDate.entrySet()) { -// System.out.println(entry.getKey() + ":" + getTimeString(entry.getValue())+":"+entry.getValue().getTime()); - } - - long countTimeLong = new Long("1607672440731"); - -// System.out.println(getTimeString(--countTimeLong)); - - } */ - /** * 获取当天的起始时间Date diff --git a/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java b/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java index ad23617aa8..9106a22998 100644 --- a/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/DeFileUtils.java @@ -46,14 +46,8 @@ public class DeFileUtils { String path = filePath + fileName; // getCanonicalFile 可解析正确各种路径 File dest = new File(path).getCanonicalFile(); - // 检测是否存在目录 - if (!dest.getParentFile().exists()) { - if (!dest.getParentFile().mkdirs()) { -// System.out.println("was not successful."); - } - } + // 文件写入 - // file.transferTo(dest); FileOutputStream fileOutputStream = new FileOutputStream(dest); fileOutputStream.write(file.getBytes()); fileOutputStream.flush(); diff --git a/backend/src/main/java/io/dataease/commons/utils/LogUtil.java b/backend/src/main/java/io/dataease/commons/utils/LogUtil.java index 2bdaad2a8e..3ee0ebbfea 100644 --- a/backend/src/main/java/io/dataease/commons/utils/LogUtil.java +++ b/backend/src/main/java/io/dataease/commons/utils/LogUtil.java @@ -8,8 +8,6 @@ import java.io.PrintWriter; import java.io.StringWriter; public class LogUtil { - //日志工具类 -// public static final Log Logger = LogFactory.getLog(LogUtil.class); private static final String DEBUG = "DEBUG"; private static final String INFO = "INFO"; diff --git a/backend/src/main/java/io/dataease/commons/wrapper/XssAndSqlHttpServletRequestWrapper.java b/backend/src/main/java/io/dataease/commons/wrapper/XssAndSqlHttpServletRequestWrapper.java index dd0f688bbe..f8eeb778e3 100644 --- a/backend/src/main/java/io/dataease/commons/wrapper/XssAndSqlHttpServletRequestWrapper.java +++ b/backend/src/main/java/io/dataease/commons/wrapper/XssAndSqlHttpServletRequestWrapper.java @@ -124,12 +124,6 @@ public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrappe case '<': sb.append("<");// 转义小于号 break; - // case '\'': - // sb.append("'");// 转义单引号 - // break; - // case '\"': - // sb.append(""");// 转义双引号 - // break; case '&': sb.append("&");// 转义& break; @@ -261,7 +255,6 @@ public class XssAndSqlHttpServletRequestWrapper extends HttpServletRequestWrappe "<[\r\n| | ]*script[\r\n| | ]*>(.*?)", Pattern.CASE_INSENSITIVE); flag = scriptPattern.matcher(value).find(); if (flag) { - // threadLocal.set("包含XSS攻击脚本,请检查参数!"); return flag; } // Avoid anything in a diff --git a/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java b/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java index ffd47c558f..b6e98f027c 100644 --- a/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java +++ b/backend/src/main/java/io/dataease/config/Knife4jConfiguration.java @@ -62,13 +62,6 @@ public class Knife4jConfiguration implements BeanPostProcessor{ return defaultApi("系统管理", "io.dataease.controller.sys"); } - /*@Bean(value = "pluginsApi") - @Conditional(LicStatusCondition.class) - public Docket pluginsApi() { - return defaultApi("插件管理", "io.dataease.plugins.server"); - }*/ - - private ApiInfo apiInfo(){ return new ApiInfoBuilder() .title("DataEase") diff --git a/backend/src/main/java/io/dataease/controller/IndexController.java b/backend/src/main/java/io/dataease/controller/IndexController.java index 3edc80323d..5d7ef017a7 100644 --- a/backend/src/main/java/io/dataease/controller/IndexController.java +++ b/backend/src/main/java/io/dataease/controller/IndexController.java @@ -2,11 +2,15 @@ package io.dataease.controller; import io.dataease.commons.license.DefaultLicenseService; import io.dataease.commons.license.F2CLicenseResponse; +import io.dataease.commons.utils.ServletUtils; +import io.dataease.service.panel.PanelLinkService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; - import javax.annotation.Resource; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; @Controller @RequestMapping @@ -15,6 +19,9 @@ public class IndexController { @Resource private DefaultLicenseService defaultLicenseService; + @Resource + private PanelLinkService panelLinkService; + @GetMapping(value = "/") public String index() { return "index.html"; @@ -42,11 +49,18 @@ public class IndexController { case valid: return "doc.html"; default: - // DataEaseException.throwException("Invalid License."); - /* return "nolic.html"; */ - return "doc.html"; + return "nolic.html"; } - // return "index.html"; + } + + @GetMapping("/xggznb/{index}") + public String xggznb(@PathVariable(value = "index", required = true) Long index) { + String url = panelLinkService.getUrlByIndex(index); + HttpServletResponse response = ServletUtils.response(); + String param = url.substring(url.indexOf("?") + 1); + Cookie cookie = new Cookie("link", param); + response.addCookie(cookie); + return url; } diff --git a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java index 8ce32d17ac..07ff9f45e9 100644 --- a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java +++ b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java @@ -3,6 +3,7 @@ package io.dataease.controller.chart; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.base.domain.ChartViewWithBLOBs; import io.dataease.commons.utils.AuthUtils; +import io.dataease.controller.request.chart.ChartCalRequest; import io.dataease.controller.request.chart.ChartExtRequest; import io.dataease.controller.request.chart.ChartViewRequest; import io.dataease.controller.response.ChartDetail; @@ -100,4 +101,16 @@ public class ChartViewController { public List search(@RequestBody ChartViewRequest chartViewRequest) { return chartViewService.search(chartViewRequest); } + + @ApiOperation("计算结果") + @PostMapping("/calcData") + public ChartViewDTO calcData(@RequestBody ChartCalRequest request) throws Exception { + return chartViewService.calcData(request.getView(), request.getRequestList(), false); + } + + @ApiOperation("验证视图是否使用相同数据集") + @GetMapping("/checkSameDataSet/{viewIdSource}/{viewIdTarget}") + public String checkSameDataSet(@PathVariable String viewIdSource,@PathVariable String viewIdTarget) throws Exception { + return chartViewService.checkSameDataSet(viewIdSource,viewIdTarget); + } } diff --git a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java index 3c489d68f4..df0015db1d 100644 --- a/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java +++ b/backend/src/main/java/io/dataease/controller/datasource/DatasourceController.java @@ -68,7 +68,6 @@ public class DatasourceController { @PostMapping("/list/{goPage}/{pageSize}") public Pager> getDatasourceList(@RequestBody BaseGridRequest request, @PathVariable int goPage, @PathVariable int pageSize) throws Exception { Page page = PageHelper.startPage(goPage, pageSize, true); - // return PageUtils.setPageInfo(page, datasourceService.getDatasourceList(request)); return PageUtils.setPageInfo(page, datasourceService.gridQuery(request)); } diff --git a/backend/src/main/java/io/dataease/controller/handler/RestControllerExceptionHandler.java b/backend/src/main/java/io/dataease/controller/handler/RestControllerExceptionHandler.java deleted file mode 100644 index b0486cba12..0000000000 --- a/backend/src/main/java/io/dataease/controller/handler/RestControllerExceptionHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -/* -package io.dataease.controller.handler; - - -import io.dataease.commons.exception.DEException; -import io.dataease.controller.ResultHolder; -import org.apache.shiro.ShiroException; -import org.apache.shiro.authz.UnauthorizedException; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.sql.SQLException; - - -@RestControllerAdvice -public class RestControllerExceptionHandler { - */ -/*=========== Shiro 异常拦截==============*//* - - @ExceptionHandler(ShiroException.class) - public ResultHolder exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception exception) { - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - return ResultHolder.error(exception.getMessage()); - } - - */ -/*=========== Shiro 异常拦截==============*//* - - @ExceptionHandler(UnauthorizedException.class) - public ResultHolder unauthorizedExceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception exception) { - response.setStatus(HttpStatus.FORBIDDEN.value()); - return ResultHolder.error(exception.getMessage()); - } - - - @ExceptionHandler(SQLException.class) - public ResultHolder sqlExceptionHandler(HttpServletRequest request, HttpServletResponse response, DEException e) { - response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); - return ResultHolder.error("SQL error happened, please check logs."); - } - - @ExceptionHandler(DEException.class) - public ResultHolder msExceptionHandler(HttpServletRequest request, HttpServletResponse response, DEException e) { - response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); - return ResultHolder.error(e.getMessage()); - } -} -*/ diff --git a/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java b/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java index 56a1b0f245..0a8a294fe7 100644 --- a/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java +++ b/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java @@ -4,10 +4,7 @@ package io.dataease.controller.panel.api; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.controller.ResultHolder; import io.dataease.controller.request.chart.ChartExtRequest; -import io.dataease.controller.request.panel.link.EnablePwdRequest; -import io.dataease.controller.request.panel.link.LinkRequest; -import io.dataease.controller.request.panel.link.OverTimeRequest; -import io.dataease.controller.request.panel.link.PasswordRequest; +import io.dataease.controller.request.panel.link.*; import io.dataease.dto.panel.link.GenerateDto; import io.dataease.dto.panel.link.ValidateDto; import io.swagger.annotations.Api; @@ -44,7 +41,7 @@ public interface LinkApi { @ApiOperation("验证访问") @PostMapping("/validate") - ValidateDto validate(Map param) throws Exception; + ValidateDto validate(LinkValidateRequest request) throws Exception; @ApiOperation("验证密码") @PostMapping("/validatePwd") @@ -60,5 +57,5 @@ public interface LinkApi { @ApiOperation("压缩链接") @PostMapping("/shortUrl") - ResultHolder shortUrl(@RequestBody Map param); + String shortUrl(@RequestBody Map param); } diff --git a/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java b/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java index a01dcd4b7e..78b61a962b 100644 --- a/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java +++ b/backend/src/main/java/io/dataease/controller/panel/api/ShareApi.java @@ -3,14 +3,17 @@ package io.dataease.controller.panel.api; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.base.domain.PanelShare; import io.dataease.controller.request.panel.PanelShareFineDto; -import io.dataease.controller.request.panel.PanelShareRequest; +import io.dataease.controller.request.panel.PanelShareRemoveRequest; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.dto.panel.PanelShareDto; +import io.dataease.dto.panel.PanelShareOutDTO; +import io.dataease.dto.panel.PanelSharePo; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -import springfox.documentation.annotations.ApiIgnore; import java.util.List; @@ -22,22 +25,36 @@ import java.util.List; @RequestMapping("/api/share") public interface ShareApi { - @ApiIgnore - @PostMapping("/") - void share(PanelShareRequest request); - @ApiOperation("查询分享") + + @ApiOperation("查询分享给我") @PostMapping("/treeList") List treeList(BaseGridRequest request); + @ApiOperation("查询我分享的") + @PostMapping("/shareOut") + List shareOut(); + + @ApiOperation("根据资源查询分享") @PostMapping("/queryWithResourceId") List queryWithResourceId(BaseGridRequest request); + @ApiOperation("查询分享目标") + @PostMapping("/queryTargets/{panelId}") + @ApiImplicitParam(paramType = "path", value = "仪表板ID", name = "panelId", required = true, dataType = "String") + List queryTargets(@PathVariable("panelId") String panelId); + @ApiOperation("创建分享") @PostMapping("/fineSave") void fineSave(PanelShareFineDto panelShareFineDto); + + + @ApiOperation("删除分享") + @PostMapping("/removeShares") + void removeShares(PanelShareRemoveRequest request); + } diff --git a/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java b/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java index 693bcbbd84..b1042ae8ec 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java @@ -5,10 +5,7 @@ import io.dataease.base.domain.PanelLink; import io.dataease.controller.ResultHolder; import io.dataease.controller.panel.api.LinkApi; import io.dataease.controller.request.chart.ChartExtRequest; -import io.dataease.controller.request.panel.link.EnablePwdRequest; -import io.dataease.controller.request.panel.link.LinkRequest; -import io.dataease.controller.request.panel.link.OverTimeRequest; -import io.dataease.controller.request.panel.link.PasswordRequest; +import io.dataease.controller.request.panel.link.*; import io.dataease.dto.panel.link.GenerateDto; import io.dataease.dto.panel.link.ValidateDto; import io.dataease.service.chart.ChartViewService; @@ -64,15 +61,12 @@ public class LinkServer implements LinkApi { } @Override - public ValidateDto validate(@RequestBody Map param) throws Exception{ - String link = param.get("link"); + public ValidateDto validate(@RequestBody LinkValidateRequest request) throws Exception{ + String link = request.getLink(); String json = panelLinkService.decryptParam(link); - /* Gson gson = new Gson(); - ValidateRequest request = gson.fromJson(json, ValidateRequest.class); */ ValidateDto dto = new ValidateDto(); String resourceId = json; - /* String resourceId = request.getResourceId(); */ PanelLink one = panelLinkService.findOne(resourceId); dto.setResourceId(resourceId); if (ObjectUtils.isEmpty(one)){ @@ -101,9 +95,11 @@ public class LinkServer implements LinkApi { return chartViewService.getData(viewId, requestList); } + + @Override - public ResultHolder shortUrl(Map param) { - String url = param.get("url"); - return panelLinkService.getShortUrl(url); + public String shortUrl(Map param) { + String resourceId = param.get("resourceId"); + return panelLinkService.getShortUrl(resourceId); } } diff --git a/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java b/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java index af2bacbd2a..0179a49c2a 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/ShareServer.java @@ -3,10 +3,14 @@ package io.dataease.controller.panel.server; import io.dataease.base.domain.PanelShare; import io.dataease.controller.panel.api.ShareApi; import io.dataease.controller.request.panel.PanelShareFineDto; +import io.dataease.controller.request.panel.PanelShareRemoveRequest; import io.dataease.controller.request.panel.PanelShareRequest; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.dto.panel.PanelShareDto; +import io.dataease.dto.panel.PanelShareOutDTO; +import io.dataease.dto.panel.PanelSharePo; import io.dataease.service.panel.ShareService; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -18,26 +22,37 @@ public class ShareServer implements ShareApi { @Resource private ShareService shareService; - @Override - public void share(@RequestBody PanelShareRequest request) { - shareService.save(request); - } + @Override public List treeList(@RequestBody BaseGridRequest request) { return shareService.queryTree(request); } + @Override + public List shareOut() { + return shareService.queryShareOut(); + } @Override public List queryWithResourceId(@RequestBody BaseGridRequest request) { return shareService.queryWithResource(request); } + @Override + public List queryTargets(@PathVariable("panelId") String panelId) { + return shareService.queryTargets(panelId); + } + @Override public void fineSave(@RequestBody PanelShareFineDto panelShareFineDto) { shareService.fineSave(panelShareFineDto); } + + @Override + public void removeShares(@RequestBody PanelShareRemoveRequest request) { + shareService.removeShares(request); + } } diff --git a/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java b/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java index 29b2d6b8ca..53bd3126dc 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/ViewServer.java @@ -36,7 +36,6 @@ public class ViewServer implements ViewApi { if(CollectionUtils.isNotEmpty(groups)&&CollectionUtils.isNotEmpty(views)){ groups.addAll(views); } -// List panelViewDtos = panelViewService.buildTree(groups, views); return TreeUtils.mergeTree(groups); } diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartCalRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartCalRequest.java new file mode 100644 index 0000000000..8dd21f144f --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartCalRequest.java @@ -0,0 +1,17 @@ +package io.dataease.controller.request.chart; + +import io.dataease.base.domain.ChartViewWithBLOBs; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author gin + * @Date 2021/11/10 11:27 上午 + */ +@Data +public class ChartCalRequest { + @ApiModelProperty("视图") + private ChartViewWithBLOBs view; + @ApiModelProperty("额外请求参数") + private ChartExtRequest requestList; +} diff --git a/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRemoveRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRemoveRequest.java new file mode 100644 index 0000000000..595b194ec2 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/panel/PanelShareRemoveRequest.java @@ -0,0 +1,18 @@ +package io.dataease.controller.request.panel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("取消分享参数") +public class PanelShareRemoveRequest implements Serializable { + + @ApiModelProperty("仪表板ID") + private String panelId; + + @ApiModelProperty("分享ID") + private String shareId; +} diff --git a/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java new file mode 100644 index 0000000000..8ad50df34f --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/panel/link/LinkValidateRequest.java @@ -0,0 +1,11 @@ +package io.dataease.controller.request.panel.link; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class LinkValidateRequest implements Serializable { + + private String link; +} diff --git a/backend/src/main/java/io/dataease/controller/sys/MsgController.java b/backend/src/main/java/io/dataease/controller/sys/MsgController.java index eddcc18bda..742c88628d 100644 --- a/backend/src/main/java/io/dataease/controller/sys/MsgController.java +++ b/backend/src/main/java/io/dataease/controller/sys/MsgController.java @@ -62,7 +62,6 @@ public class MsgController { if(null == AuthUtils.getUser() || (userId = AuthUtils.getUser().getUserId()) == null) { throw new RuntimeException("缺少用户ID"); } - // Long userId = request.get("userId"); return sysMsgService.queryCount(userId); } diff --git a/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java b/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java index 38ee1745f5..4dc774c9a9 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysDeptController.java @@ -4,14 +4,10 @@ import io.dataease.base.domain.SysDept; import io.dataease.commons.utils.BeanUtils; import io.dataease.controller.ResultHolder; import io.dataease.controller.sys.base.BaseGridRequest; -/*import io.dataease.controller.sys.request.DeptCreateRequest; -import io.dataease.controller.sys.request.DeptDeleteRequest; -import io.dataease.controller.sys.request.DeptStatusRequest;*/ import io.dataease.controller.sys.response.DeptNodeResponse; import io.dataease.controller.sys.response.DeptTreeNode; import io.dataease.service.sys.DeptService; import io.swagger.annotations.Api; -/*import io.swagger.annotations.ApiOperation;*/ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,34 +52,7 @@ public class SysDeptController extends ResultHolder { return nodeResponses; } - /*@ApiOperation("查询部门") - @PostMapping("/root") - public ResultHolder rootData(){ - List root = deptService.nodesByPid(null); - return success(root); - }*/ - /*@ApiOperation("新增部门") - @PostMapping("/create") - public void create(@RequestBody DeptCreateRequest dept){ - deptService.add(dept); - } - - @ApiOperation("删除部门") - @PostMapping("/delete") - public void delete(@RequestBody List requests){ - deptService.batchDelete(requests); - } - @ApiOperation("更新部门") - @PostMapping("/update") - public void update(@RequestBody DeptCreateRequest dept){ - deptService.update(dept); - } - @ApiOperation("更新状态") - @PostMapping("/updateStatus") - public void updateStatus(@RequestBody DeptStatusRequest request){ - deptService.updateStatus(request); - }*/ @PostMapping("/nodesByDeptId/{deptId}") public List nodesByDeptId(@PathVariable("deptId") Long deptId){ diff --git a/backend/src/main/java/io/dataease/controller/sys/SysRoleController.java b/backend/src/main/java/io/dataease/controller/sys/SysRoleController.java deleted file mode 100644 index 5ba5cca08e..0000000000 --- a/backend/src/main/java/io/dataease/controller/sys/SysRoleController.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.dataease.controller.sys; - - -/*import com.github.pagehelper.Page; -import com.github.pagehelper.PageHelper; -import io.dataease.base.domain.SysRole; -import io.dataease.commons.utils.PageUtils; -import io.dataease.commons.utils.Pager; -import io.dataease.controller.sys.base.BaseGridRequest; -import io.dataease.controller.sys.request.RoleMenusRequest;*/ -import io.dataease.controller.sys.response.RoleUserItem; -import io.dataease.service.sys.SysRoleService; -import io.swagger.annotations.Api; -/*import io.swagger.annotations.ApiOperation;*/ -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.annotation.Resource; -import java.util.List; -/*@ApiIgnore -@RestController -@RequiredArgsConstructor -@Api(tags = "系统:角色管理") -@RequestMapping("/api/role") -public class SysRoleController {*/ - /* - @Resource - private SysRoleService sysRoleService; - - - @ApiOperation("新增角色") - @PostMapping("/create") - public void create(@RequestBody SysRole role){ - sysRoleService.add(role); - } - - - @ApiOperation("删除角色") - @PostMapping("/delete/{roleId}") - public void delete(@PathVariable("roleId") Long roleId){ - sysRoleService.delete(roleId); - } - - - @ApiOperation("更新角色") - @PostMapping("/update") - public void update(@RequestBody SysRole role){ - sysRoleService.update(role); - } - - @ApiOperation("查询角色") - @PostMapping("/roleGrid/{goPage}/{pageSize}") - public Pager> roleGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody BaseGridRequest request) { - Page page = PageHelper.startPage(goPage, pageSize, true); - Pager> listPager = PageUtils.setPageInfo(page, sysRoleService.query(request)); - return listPager; - } - - @ApiOperation("查询角色对应的菜单ID") - @PostMapping("/menuIds/{roleId}") - public List menuIdsByRoleId(@PathVariable("roleId") Long roleId){ - return sysRoleService.menuIds(roleId); - } - - - @PostMapping("/saveRolesMenus") - public void saveRolesMenus(@RequestBody RoleMenusRequest request){ - sysRoleService.batchSaveRolesMenus(request); - } - - - @PostMapping("/all") - public List all(){ - return sysRoleService.allRoles(); - } - */ -/*}*/ diff --git a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java index f91d32ef81..63cf1d1ba8 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java @@ -54,10 +54,7 @@ public class SysUserController { Page page = PageHelper.startPage(goPage, pageSize, true); return PageUtils.setPageInfo(page, sysUserService.query(request)); } - /*public Pager> userGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody UserGridRequest request) { - Page page = PageHelper.startPage(goPage, pageSize, true); - return PageUtils.setPageInfo(page, sysUserService.query(request)); - }*/ + @ApiOperation("创建用户") @PostMapping("/create") @@ -146,11 +143,7 @@ public class SysUserController { } - /* @ApiOperation("同步用户") - @PostMapping("/sync") - public void importLdap(@RequestBody LdapAddRequest request) { - sysUserService.saveLdapUsers(request); - } */ + @ApiOperation("已同步用户") @PostMapping("/existLdapUsers") diff --git a/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java b/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java index 799c69e045..6ba2f212bd 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java @@ -6,8 +6,8 @@ import io.dataease.controller.sys.response.BasicInfo; import io.dataease.controller.sys.response.MailInfo; import io.dataease.dto.SystemParameterDTO; import io.dataease.service.FileService; +import io.dataease.service.system.EmailService; import io.dataease.service.system.SystemParameterService; - import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -16,12 +16,12 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import springfox.documentation.annotations.ApiIgnore; - import javax.annotation.Resource; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; + @ApiIgnore @RestController @RequestMapping(value = "/system") @@ -32,10 +32,13 @@ public class SystemParameterController { @Resource private FileService fileService; + @Resource + private EmailService emailService; + @GetMapping("/mail/info") public MailInfo mailInfo() { - return systemParameterService.mailInfo(ParamConstants.Classify.MAIL.getValue()); + return emailService.mailInfo(); } @GetMapping("/basic/info") @@ -51,7 +54,7 @@ public class SystemParameterController { @PostMapping("/edit/email") public void editMail(@RequestBody List systemParameter) { - systemParameterService.editMail(systemParameter); + emailService.editMail(systemParameter); } @PostMapping("/edit/basic") @@ -61,7 +64,7 @@ public class SystemParameterController { @PostMapping("/testConnection") public void testConnection(@RequestBody HashMap hashMap) { - systemParameterService.testConnection(hashMap); + emailService.testConnection(hashMap); } @GetMapping("/version") diff --git a/backend/src/main/java/io/dataease/dto/SysAuthDTO.java b/backend/src/main/java/io/dataease/dto/SysAuthDTO.java index 26132f1b7f..73f7e135b0 100644 --- a/backend/src/main/java/io/dataease/dto/SysAuthDTO.java +++ b/backend/src/main/java/io/dataease/dto/SysAuthDTO.java @@ -15,34 +15,4 @@ import java.util.List; public class SysAuthDTO extends SysAuth { private List sysAuthDetails; - -// private List baseAuthDetails; -// -// private String authDetails; -// -// @Override -// public void setAuthDetails(String authDetails) { -// this.authDetails = authDetails; -// if(StringUtils.isNotEmpty(authDetails)){ -// try{ -// baseAuthDetails = JSON.parseArray(authDetails,BaseAuthDetail.class); -// }catch (Exception e){ -// e.printStackTrace(); -// //ignored -// } -// } -// } -// -// public List getBaseAuthDetails() { -// return baseAuthDetails; -// } -// -// public void setBaseAuthDetails(List baseAuthDetails) { -// this.baseAuthDetails = baseAuthDetails; -// } -// -// @Override -// public String getAuthDetails() { -// return authDetails; -// } } diff --git a/backend/src/main/java/io/dataease/dto/datasource/HiveConfiguration.java b/backend/src/main/java/io/dataease/dto/datasource/HiveConfiguration.java new file mode 100644 index 0000000000..698ada4b0d --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/datasource/HiveConfiguration.java @@ -0,0 +1,28 @@ +package io.dataease.dto.datasource; + +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; + +@Getter +@Setter +public class HiveConfiguration extends JdbcConfiguration { + + private String driver = "org.apache.hive.jdbc.HiveDriver"; + private String extraParams = ""; + + public String getJdbc() { + if(StringUtils.isEmpty(extraParams.trim())){ + return "jdbc:hive2://HOSTNAME:PORT/DATABASE" + .replace("HOSTNAME", getHost().trim()) + .replace("PORT", getPort().toString().trim()) + .replace("DATABASE", getDataBase().trim()); + }else { + return "jdbc:hive2://HOSTNAME:PORT/DATABASE?EXTRA_PARAMS" + .replace("HOSTNAME", getHost().trim()) + .replace("PORT", getPort().toString().trim()) + .replace("DATABASE", getDataBase().trim()) + .replace("EXTRA_PARAMS", getExtraParams().trim()); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/io/dataease/dto/panel/PanelShareOutDTO.java b/backend/src/main/java/io/dataease/dto/panel/PanelShareOutDTO.java new file mode 100644 index 0000000000..5def152616 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/panel/PanelShareOutDTO.java @@ -0,0 +1,30 @@ +package io.dataease.dto.panel; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@ApiModel("仪表板分享目标") +@Data +public class PanelShareOutDTO implements Serializable { + + @ApiModelProperty("仪表板ID") + private String panelId; + + @ApiModelProperty("分享ID") + private Long shareId; + + @ApiModelProperty("分享类型{0:用户,1:角色,2:组织}") + private int type; + + @ApiModelProperty("目标ID") + private String targetId; + + @ApiModelProperty("目标名称") + private String targetName; + + @ApiModelProperty("分享时间") + private Long createTime; +} diff --git a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java index b96488c767..c93e59e11c 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java +++ b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java @@ -75,9 +75,7 @@ public class ScheduleManager { triggerBuilder.withIdentity(triggerKey); Date nTimeByCron = getNTimeByCron(cron, startTime); -// if (startTime.before(new Date())) { triggerBuilder.startAt(nTimeByCron); -// } if (endTime != null) { if (endTime.before(nTimeByCron)) { @@ -160,9 +158,7 @@ public class ScheduleManager { triggerBuilder.withIdentity(triggerKey);// 触发器名,触发器组 Date nTimeByCron = getNTimeByCron(cron, startTime); -// if (startTime.before(new Date())) { triggerBuilder.startAt(nTimeByCron); -// } if (endTime != null) { if (endTime.before(nTimeByCron)) { @@ -179,14 +175,6 @@ public class ScheduleManager { trigger = (CronTrigger) triggerBuilder.build();// 创建Trigger对象 scheduler.rescheduleJob(triggerKey, trigger);// 修改一个任务的触发时间 - /** 方式一 :调用 rescheduleJob 结束 */ - - /** 方式二:先删除,然后在创建一个新的Job */ - // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName)); - // Class jobClass = jobDetail.getJobClass(); - // removeJob(jobName, jobGroupName, triggerName, triggerGroupName); - // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron); - /** 方式二 :先删除,然后在创建一个新的Job */ } catch (Exception e) { DataEaseException.throwException(e); } @@ -227,15 +215,6 @@ public class ScheduleManager { trigger = (SimpleTrigger) triggerBuilder.build();// 创建Trigger对象 scheduler.rescheduleJob(triggerKey, trigger);// 修改一个任务的触发时间 - - /** 方式一 :调用 rescheduleJob 结束 */ - - /** 方式二:先删除,然后在创建一个新的Job */ - // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName)); - // Class jobClass = jobDetail.getJobClass(); - // removeJob(jobName, jobGroupName, triggerName, triggerGroupName); - // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron); - /** 方式二 :先删除,然后在创建一个新的Job */ } } catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/listener/LicCacheEventListener.java b/backend/src/main/java/io/dataease/listener/LicCacheEventListener.java index 94580d548d..cecc692cb2 100644 --- a/backend/src/main/java/io/dataease/listener/LicCacheEventListener.java +++ b/backend/src/main/java/io/dataease/listener/LicCacheEventListener.java @@ -21,20 +21,14 @@ public class LicCacheEventListener extends CacheEventListenerFactory implements @Override public void notifyElementRemoved(Ehcache ehcache, Element element) throws CacheException { - /*System.out.println("notifyElementRemoved");*/ } @Override public void notifyElementPut(Ehcache ehcache, Element element) throws CacheException { - - /*long expirationTime = element.getExpirationTime(); - System.out.println(expirationTime); - System.out.println("notifyElementPut");*/ } @Override public void notifyElementUpdated(Ehcache ehcache, Element element) throws CacheException { - /*System.out.println("notifyElementUpdated");*/ } /** @@ -51,12 +45,10 @@ public class LicCacheEventListener extends CacheEventListenerFactory implements @Override public void notifyElementEvicted(Ehcache ehcache, Element element) { - /*System.out.println("notifyElementEvicted");*/ } @Override public void notifyRemoveAll(Ehcache ehcache) { - /*System.out.println("notifyRemoveAll");*/ } @Override diff --git a/backend/src/main/java/io/dataease/map/server/MapServer.java b/backend/src/main/java/io/dataease/map/server/MapServer.java index ca88e64f55..d3cdc5af3e 100644 --- a/backend/src/main/java/io/dataease/map/server/MapServer.java +++ b/backend/src/main/java/io/dataease/map/server/MapServer.java @@ -28,7 +28,6 @@ public class MapServer implements MapApi { @Override public String asyncGeometry() { try { - // List areaEntities = MapUtils.readAreaEntity(); List areaEntities = mapService.areaEntities(); MapUtils.recursionWriteFull(areaEntities); }catch (Exception e) { diff --git a/backend/src/main/java/io/dataease/map/utils/MapUtils.java b/backend/src/main/java/io/dataease/map/utils/MapUtils.java index 523c6fd447..f3583ef57c 100644 --- a/backend/src/main/java/io/dataease/map/utils/MapUtils.java +++ b/backend/src/main/java/io/dataease/map/utils/MapUtils.java @@ -34,15 +34,10 @@ public class MapUtils { public static String formatCode(String code) { -// return code.substring(3); return code; } - /*public static List> readCodeList( ) { - ExcelReader reader = ExcelUtil.getReader(path); - List> maps = reader.readAll(); - return maps; - }*/ + public static List> readCodeList( ) { AreaMappingExample example = new AreaMappingExample(); List areaMappings = areaMappingMapper.selectByExample(example); @@ -61,7 +56,6 @@ public class MapUtils { public static List readAreaEntity() { List> maps = readCodeList(); - // AreaEntity root = new AreaEntity; Map provinceMap = new ConcurrentHashMap<>(); Map cityMap = new ConcurrentHashMap<>(); @@ -70,7 +64,6 @@ public class MapUtils { AreaEntity china = root(); maps.stream().forEach(map -> { - // maps.stream().forEach(map -> { String province_code = map.get(Constants.PROVINCE_CODE).toString(); String city_code = map.get(Constants.CITY_CODE).toString(); String county_code = map.get(Constants.COUNTY_CODE).toString(); @@ -114,7 +107,6 @@ public class MapUtils { } } }); - // List treeNodes = provinceMap.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()); List result = new ArrayList<>(); result.add(china); return result; @@ -131,10 +123,6 @@ public class MapUtils { if (StrUtil.equals("1", mapResponse.getStatus()) && StrUtil.equalsAnyIgnoreCase("ok", mapResponse.getInfo()) && StrUtil.equalsAnyIgnoreCase("10000", mapResponse.getInfocode())) { List districts = mapResponse.getDistricts(); if (CollectionUtil.isNotEmpty(districts)) { - - /*District district = districts.get(0); - MapResultDto mapResultDto = buildGeometry(district, areaEntity); - writeFeatureFile(mapResultDto, areaEntity.getCode());*/ List kidFeatures = districts.stream().map(district -> buildFeature(district, areaEntity)).collect(Collectors.toList()); MapResultDto mapResultDto = buildGeometry(kidFeatures); writeFeatureFile(mapResultDto, areaEntity.getCode()); @@ -234,15 +222,7 @@ public class MapUtils { - /*public static MapResultDto buildGeometry(District district, AreaEntity areaEntity) { - Feature feature = buildFeature(district, areaEntity); - MapResultDto mapResultDto = new MapResultDto(); - mapResultDto.setType("FeatureCollection"); - List features = new ArrayList<>(); - features.add(feature); - mapResultDto.setFeatures(features); - return mapResultDto; - }*/ + public static MapResultDto buildGeometry(List features) { MapResultDto mapResultDto = new MapResultDto(); diff --git a/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java b/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java index bb91fe21ad..e04cf33318 100644 --- a/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java +++ b/backend/src/main/java/io/dataease/plugins/config/PluginRunner.java @@ -47,7 +47,6 @@ public class PluginRunner implements ApplicationRunner { } } catch (Exception e) { LogUtil.error(e); - //e.printStackTrace(); } }); diff --git a/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java b/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java index 99c5cce463..45d57624bb 100644 --- a/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java +++ b/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java @@ -76,7 +76,6 @@ public class ControllerLoader { try { registerController(name); } catch (Exception e) { - // e.printStackTrace(); LogUtil.error(e); } }); diff --git a/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java b/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java index 5a357ae773..ab29523fe4 100644 --- a/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java +++ b/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java @@ -104,9 +104,6 @@ public class ModuleClassLoader extends URLClassLoader { byte[] classBytes = baos.toByteArray(); classBytesMap.put(className,classBytes); } - /*if (name.endsWith(".xml")) { - loadMapperXml(name); - }*/ } } catch (IOException e) { e.printStackTrace(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java index debb306ccc..becea9e55a 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java @@ -36,7 +36,6 @@ public class XOidcServer { Map authParam = new HashMap<>(); authParam.put("response_type", "code"); authParam.put("state", "state"); - // authParam.put("redirect_uri", "http://localhost:9528"); oidcSettings.forEach(param -> { diff --git a/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java b/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java index e3fb1e4ea6..994eb8aac1 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XUserKeysServer.java @@ -24,7 +24,6 @@ public class XUserKeysServer { @PostMapping("validate") public String validate(ServletRequest request) { - // return ApiKeyHandler.getUser(WebUtils.toHttp(request)); return null; } @@ -47,15 +46,5 @@ public class XUserKeysServer { ukeyXpackService.switchStatus(id); } - /*@GetMapping("active/{id}") - public void activeUserKey(@PathVariable Long id) { - UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); - ukeyXpackService.activeUserKey(id); - } - @GetMapping("disable/{id}") - public void disabledUserKey(@PathVariable Long id) { - UkeyXpackService ukeyXpackService = SpringContextUtil.getBean(UkeyXpackService.class); - ukeyXpackService.disableUserKey(id); - }*/ } diff --git a/backend/src/main/java/io/dataease/provider/ProviderFactory.java b/backend/src/main/java/io/dataease/provider/ProviderFactory.java index 90e82cda7a..4a0f160fa0 100644 --- a/backend/src/main/java/io/dataease/provider/ProviderFactory.java +++ b/backend/src/main/java/io/dataease/provider/ProviderFactory.java @@ -53,6 +53,8 @@ public class ProviderFactory implements ApplicationContextAware { return context.getBean("mongoQuery", QueryProvider.class); case redshift: return context.getBean("redshiftQuery", QueryProvider.class); + case hive: + return context.getBean("hiveQuery", QueryProvider.class); default: return context.getBean("mysqlQuery", QueryProvider.class); } diff --git a/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java b/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java index edc7380136..103a557da2 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java @@ -14,10 +14,6 @@ public abstract class DatasourceProvider { abstract public List getTables(DatasourceRequest datasourceRequest) throws Exception; -// public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception { -// return new ArrayList<>(); -// }; - public void checkStatus(DatasourceRequest datasourceRequest) throws Exception { getData(datasourceRequest); } diff --git a/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java b/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java index 4ea43f9115..90759974c8 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java @@ -194,10 +194,10 @@ public class EsProvider extends DatasourceProvider { } for (String[] row : esReponse.getRows()) { - if(row.length == 3 && row[1].equalsIgnoreCase("TABLE") && row[2].equalsIgnoreCase("INDEX")){ + if(row.length == 3 && row[1].contains("TABLE") && row[2].equalsIgnoreCase("INDEX")){ tables.add(row[0]); } - if(row.length == 2 && row[1].equalsIgnoreCase("BASE TABLE")){ + if(row.length == 2 && row[1].contains("TABLE")){ tables.add(row[0]); } } @@ -209,17 +209,7 @@ public class EsProvider extends DatasourceProvider { return new ArrayList<>(); } -// @Override -// public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception { -// List tableFileds = new ArrayList<>(); -// try { -// String response = exexQuery(datasourceRequest, "desc " + datasourceRequest.getTable(), "?format=json"); -// tableFileds = fetchResultField(response); -// } catch (Exception e) { -// DataEaseException.throwException(e); -// } -// return tableFileds; -// } + @Override public void checkStatus(DatasourceRequest datasourceRequest) throws Exception { 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 06158dfb93..cabe171c32 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java @@ -170,6 +170,9 @@ public class JdbcProvider extends DatasourceProvider { String f = metaData.getColumnName(j + 1); String l = StringUtils.isNotEmpty(metaData.getColumnLabel(j + 1)) ? metaData.getColumnLabel(j + 1) : f; String t = metaData.getColumnTypeName(j + 1); + if(datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.hive.name())){ + l = l.split("\\.")[1]; + } TableFiled field = new TableFiled(); field.setFieldName(l); field.setRemarks(l); @@ -342,14 +345,25 @@ public class JdbcProvider extends DatasourceProvider { password = redshiftConfigration.getPassword(); driver = redshiftConfigration.getDriver(); jdbcurl = redshiftConfigration.getJdbc(); + break; + case hive: + HiveConfiguration hiveConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), HiveConfiguration.class); + username = hiveConfiguration.getUsername(); + password = hiveConfiguration.getPassword(); + driver = hiveConfiguration.getDriver(); + jdbcurl = hiveConfiguration.getJdbc(); + break; default: break; } Driver driverClass = (Driver) extendedJdbcClassLoader.loadClass(driver).newInstance(); - props.setProperty("user", username); - if (StringUtils.isNotBlank(password)) { - props.setProperty("password", password); + + if (StringUtils.isNotBlank(username)) { + props.setProperty("user", username); + if (StringUtils.isNotBlank(password)) { + props.setProperty("password", password); + } } Connection conn = driverClass.connect(jdbcurl, props); @@ -362,7 +376,7 @@ public class JdbcProvider extends DatasourceProvider { druidDataSource.setInitialSize(jdbcConfiguration.getInitialPoolSize());// 初始连接数 druidDataSource.setMinIdle(jdbcConfiguration.getMinPoolSize()); // 最小连接数 druidDataSource.setMaxActive(jdbcConfiguration.getMaxPoolSize()); // 最大连接数 - if(datasourceRequest.getDatasource().getType().equals(DatasourceTypes.mongo.name())){ + if(datasourceRequest.getDatasource().getType().equals(DatasourceTypes.mongo.name()) || datasourceRequest.getDatasource().getType().equals(DatasourceTypes.hive.name())){ WallFilter wallFilter = new WallFilter(); wallFilter.setDbType(DatasourceTypes.mysql.name()); druidDataSource.setProxyFilters(Arrays.asList(new Filter[]{wallFilter})); @@ -424,6 +438,13 @@ public class JdbcProvider extends DatasourceProvider { dataSource.setDriverClassName(redshiftConfigration.getDriver()); dataSource.setUrl(redshiftConfigration.getJdbc()); jdbcConfiguration = redshiftConfigration; + break; + case hive: + HiveConfiguration hiveConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), HiveConfiguration.class); + dataSource.setPassword(hiveConfiguration.getPassword()); + dataSource.setDriverClassName(hiveConfiguration.getDriver()); + dataSource.setUrl(hiveConfiguration.getJdbc()); + jdbcConfiguration = hiveConfiguration; default: break; } @@ -442,7 +463,8 @@ public class JdbcProvider extends DatasourceProvider { case mariadb: case de_doris: case ds_doris: - return "show tables;"; + case hive: + return "show tables"; case sqlServer: SqlServerConfiguration sqlServerConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfiguration.class); if(StringUtils.isEmpty(sqlServerConfiguration.getSchema())){ diff --git a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index 47f29641ca..a2e9738d55 100644 --- a/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -222,8 +222,7 @@ public class CKQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -328,8 +327,7 @@ public class CKQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -414,8 +412,7 @@ public class CKQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -525,8 +522,7 @@ public class CKQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -806,10 +802,8 @@ public class CKQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -1028,10 +1022,8 @@ public class CKQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originField); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; diff --git a/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java index 9fb7b9eac1..ab74c1a3d1 100644 --- a/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/doris/DorisQueryProvider.java @@ -200,8 +200,7 @@ public class DorisQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -306,8 +305,7 @@ public class DorisQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -391,8 +389,7 @@ public class DorisQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -502,8 +499,7 @@ public class DorisQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -787,10 +783,8 @@ public class DorisQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -962,10 +956,8 @@ public class DorisQueryProvider extends QueryProvider { whereName = originField; } if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; @@ -1019,10 +1011,8 @@ public class DorisQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; diff --git a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java index fa3babd645..d376cd3863 100644 --- a/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/es/EsQueryProvider.java @@ -221,8 +221,7 @@ public class EsQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -346,8 +345,7 @@ public class EsQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -457,8 +455,7 @@ public class EsQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); + // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -734,10 +731,8 @@ public class EsQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -923,10 +918,8 @@ public class EsQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originField); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; diff --git a/backend/src/main/java/io/dataease/provider/query/hive/HiveConstants.java b/backend/src/main/java/io/dataease/provider/query/hive/HiveConstants.java new file mode 100644 index 0000000000..4e99ae88e8 --- /dev/null +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveConstants.java @@ -0,0 +1,43 @@ +package io.dataease.provider.query.hive; + +import io.dataease.provider.query.SQLConstants; + +import static io.dataease.commons.constants.DatasourceTypes.mysql; + +/** + * @Author gin + * @Date 2021/7/8 7:22 下午 + */ +public class HiveConstants extends SQLConstants { + public static final String KEYWORD_TABLE = mysql.getKeywordPrefix() + "%s" + mysql.getKeywordSuffix(); + + public static final String KEYWORD_FIX = "%s." + mysql.getKeywordPrefix() + "%s" + mysql.getKeywordSuffix(); + + public static final String UNIX_TIMESTAMP = "unix_timestamp(%s)"; + + public static final String DATE_FORMAT = "DATE_FORMAT(%s,'%s')"; + + public static final String FROM_UNIXTIME = "FROM_UNIXTIME(%s,'%s')"; + + public static final String STR_TO_DATE = "STR_TO_DATE(%s,'%s')"; + + public static final String CAST = "CAST(%s AS %s)"; + + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public static final String DEFAULT_INT_FORMAT = "DECIMAL(20,0)"; + + public static final String DEFAULT_FLOAT_FORMAT = "DECIMAL(20,2)"; + + public static final String WHERE_VALUE_NULL = "(NULL,'')"; + + public static final String WHERE_VALUE_VALUE = "'%s'"; + + public static final String AGG_COUNT = "COUNT(*)"; + + public static final String AGG_FIELD = "%s(%s)"; + + public static final String WHERE_BETWEEN = "'%s' AND '%s'"; + + public static final String BRACKETS = "(%s)"; +} diff --git a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java new file mode 100644 index 0000000000..950f0a2b90 --- /dev/null +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -0,0 +1,1043 @@ +package io.dataease.provider.query.hive; + +import io.dataease.base.domain.ChartViewWithBLOBs; +import io.dataease.base.domain.DatasetTableField; +import io.dataease.base.domain.DatasetTableFieldExample; +import io.dataease.base.domain.Datasource; +import io.dataease.base.mapper.DatasetTableFieldMapper; +import io.dataease.commons.constants.DeTypeConstants; +import io.dataease.controller.request.chart.ChartExtFilterRequest; +import io.dataease.dto.chart.ChartCustomFilterDTO; +import io.dataease.dto.chart.ChartViewFieldDTO; +import io.dataease.dto.sqlObj.SQLObj; +import io.dataease.provider.query.QueryProvider; +import io.dataease.provider.query.SQLConstants; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.stringtemplate.v4.ST; +import org.stringtemplate.v4.STGroup; +import org.stringtemplate.v4.STGroupFile; + +import javax.annotation.Resource; +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static io.dataease.provider.query.SQLConstants.TABLE_ALIAS_PREFIX; + +/** + * @Author gin + * @Date 2021/5/17 2:43 下午 + */ +@Service("hiveQuery") +public class HiveQueryProvider extends QueryProvider { + @Resource + private DatasetTableFieldMapper datasetTableFieldMapper; + + @Override + public Integer transFieldType(String field) { + switch (field) { + case "varchar": + case "string": + case "char": + return 0;// 文本 + case "timestamp": + case "date": + return 1;// 时间 + case "tinyint": + case "int": + case "bigint": + return 2;// 整型 + case "decimal": + case "float": + case "double": + return 3;// 浮点 + case "boolean": + return 4;// 布尔 + default: + return 0; + } + } + + @Override + public String createSQLPreview(String sql, String orderBy) { + return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp " + " LIMIT 0,1000"; + } + + @Override + public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(fields)) { + for (int i = 0; i < fields.size(); i++) { + DatasetTableField f = fields.get(i); + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + String fieldName = ""; + // 处理横轴字段 + if (f.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (f.getDeType() == 2 || f.getDeType() == 3) { + fieldName = String.format(HiveConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else { + fieldName = originField; + } + } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) { + if (f.getDeType() == DeTypeConstants.DE_INT) { + fieldName = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { + fieldName = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_FLOAT_FORMAT); + } else if (f.getDeType() == DeTypeConstants.DE_TIME) { + fieldName = String.format(HiveConstants.DATE_FORMAT, originField, HiveConstants.DEFAULT_DATE_FORMAT); + } else { + fieldName = originField; + } + } else { + if (f.getDeType() == DeTypeConstants.DE_TIME) { + String cast = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + fieldName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } else if (f.getDeType() == 2) { + fieldName = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT); + } else { + fieldName = originField; + } + } + xFields.add(SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build()); + } + } + + 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 (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + return st_sql.render(); + } + + @Override + public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup) { + return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null); + } + + @Override + public String createQueryTableWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds) { + return createQuerySQL(table, fields, isGroup, null) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + } + + @Override + public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds) { + return createQuerySQL(table, fields, isGroup, null) + " LIMIT 0," + limit; + } + + @Override + public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT 0," + limit; + } + + @Override + public String createQuerySQLWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) { + return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT " + (page - 1) * pageSize + "," + realSize; + } + + @Override + public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(yAxis)) { + for (int i = 0; i < yAxis.size(); i++) { + ChartViewFieldDTO y = yAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + 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(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(HiveConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + + 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(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("previewSql"); + st.add("isGroup", false); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(HiveConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null, view); + } + + + @Override + public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null, view); + } + + @Override + public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + List xList = new ArrayList<>(); + xList.addAll(xAxis); + xList.addAll(extStack); + if (CollectionUtils.isNotEmpty(xList)) { + for (int i = 0; i < xList.size(); i++) { + ChartViewFieldDTO x = xList.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(yAxis)) { + for (int i = 0; i < yAxis.size(); i++) { + ChartViewFieldDTO y = yAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + 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(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(HiveConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, ChartViewWithBLOBs view) { + return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null, view); + } + + @Override + public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = new ArrayList<>(); + List xWheres = new ArrayList<>(); + List xOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(xAxis)) { + for (int i = 0; i < xAxis.size(); i++) { + ChartViewFieldDTO x = xAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); + // 处理横轴字段 + xFields.add(getXFields(x, originField, fieldAlias)); + + // 处理横轴排序 + if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + List yList = new ArrayList<>(); + yList.addAll(yAxis); + yList.addAll(extBubble); + if (CollectionUtils.isNotEmpty(yList)) { + for (int i = 0; i < yList.size(); i++) { + ChartViewFieldDTO y = yList.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + wheres.addAll(xWheres); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + groups.addAll(xFields); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(xOrders); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + 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(yFields)) st_sql.add("aggregators", yFields); + if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres); + if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(HiveConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, ChartViewWithBLOBs view) { + return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null, view); + } + + @Override + public String searchTable(String table) { + return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'"; + } + + @Override + public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + // 字段汇总 排序等 + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(HiveConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List yFields = new ArrayList<>(); + List yWheres = new ArrayList<>(); + List yOrders = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(yAxis)) { + for (int i = 0; i < yAxis.size(); i++) { + ChartViewFieldDTO y = yAxis.get(i); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } + String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); + // 处理纵轴字段 + yFields.add(getYFields(y, originField, fieldAlias)); + // 处理纵轴过滤 + yWheres.addAll(getYWheres(y, originField, fieldAlias)); + // 处理纵轴排序 + if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) { + yOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(y.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + List customWheres = transCustomFilterList(tableObj, customFilter); + // 处理仪表板字段过滤 + List extWheres = transExtFilterList(tableObj, extFilterRequestList); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(yFields); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.addAll(customWheres); + if (extWheres != null) wheres.addAll(extWheres); + List groups = new ArrayList<>(); + // 外层再次套sql + List orders = new ArrayList<>(); + orders.addAll(yOrders); + List aggWheres = new ArrayList<>(); + aggWheres.addAll(yWheres); + + STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE); + ST st_sql = stg.getInstanceOf("querySql"); + 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); + String sql = st_sql.render(); + + ST st = stg.getInstanceOf("querySql"); + SQLObj tableSQL = SQLObj.builder() + .tableName(String.format(HiveConstants.BRACKETS, sql)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1)) + .build(); + if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres); + if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); + if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); + return sqlLimit(st.render(), view); + } + + @Override + public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList, ChartViewWithBLOBs view) { + return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList, view); + } + + @Override + public String wrapSql(String sql) { + sql = sql.trim(); + if (sql.lastIndexOf(";") == (sql.length() - 1)) { + sql = sql.substring(0, sql.length() - 1); + } + String tmpSql = "SELECT * FROM (" + sql + ") AS tmp " + " LIMIT 0"; + return tmpSql; + } + + @Override + public String createRawQuerySQL(String table, List fields, Datasource ds) { + String[] array = fields.stream().map(f -> { + StringBuilder stringBuilder = new StringBuilder(); + if (f.getDeExtractType() == 4) { // 处理 tinyint + stringBuilder.append("concat(`").append(f.getOriginName()).append("`,'') AS ").append(f.getDataeaseName()); + } else { + stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName()); + } + return stringBuilder.toString(); + }).toArray(String[]::new); + return MessageFormat.format("SELECT {0} FROM {1}", StringUtils.join(array, ","), table); + } + + @Override + public String createRawQuerySQLAsTmp(String sql, List fields) { + return createRawQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields, null); + } + + @Override + public String convertTableToSql(String tableName, Datasource ds) { + return createSQLPreview("SELECT * FROM " + String.format(HiveConstants.KEYWORD_TABLE, tableName), null); + } + + public String transMysqlFilterTerm(String term) { + switch (term) { + case "eq": + return " = "; + case "not_eq": + return " <> "; + case "lt": + return " < "; + case "le": + return " <= "; + case "gt": + return " > "; + case "ge": + return " >= "; + case "in": + return " IN "; + case "not in": + return " NOT IN "; + case "like": + return " LIKE "; + case "not like": + return " NOT LIKE "; + case "null": + return " IS NULL "; + case "not_null": + return " IS NOT NULL "; + case "empty": + return " = "; + case "not_empty": + return " <> "; + case "between": + return " BETWEEN "; + default: + return ""; + } + } + + public List transCustomFilterList(SQLObj tableObj, List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return null; + } + List list = new ArrayList<>(); + for (ChartCustomFilterDTO request : requestList) { + DatasetTableField field = request.getField(); + if (ObjectUtils.isEmpty(field)) { + continue; + } + String value = request.getValue(); + String whereName = ""; + String whereTerm = transMysqlFilterTerm(request.getTerm()); + String whereValue = ""; + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(HiveConstants.STR_TO_DATE, originName, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else { + whereName = originName; + } + if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) { + whereValue = "'%" + value + "%'"; + } else { + whereValue = String.format(HiveConstants.WHERE_VALUE_VALUE, value); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); + } + return list; + } + + public List transExtFilterList(SQLObj tableObj, List requestList) { + if (CollectionUtils.isEmpty(requestList)) { + return null; + } + List list = new ArrayList<>(); + for (ChartExtFilterRequest request : requestList) { + List value = request.getValue(); + DatasetTableField field = request.getDatasetTableField(); + if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) { + continue; + } + String whereName = ""; + String whereTerm = transMysqlFilterTerm(request.getOperator()); + String whereValue = ""; + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } + + if (field.getDeType() == DeTypeConstants.DE_TIME) { + if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { + whereName = String.format(HiveConstants.STR_TO_DATE, originName, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { + String cast = String.format(HiveConstants.CAST, originName, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } + if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { + whereName = originName; + } + } else { + whereName = originName; + } + + + if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { + whereValue = "('" + StringUtils.join(value, "','") + "')"; + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) { + whereValue = "'%" + value.get(0) + "%'"; + } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) { + if (request.getDatasetTableField().getDeType() == DeTypeConstants.DE_TIME) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(0)))); + String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1)))); + whereValue = String.format(HiveConstants.WHERE_BETWEEN, startTime, endTime); + } else { + whereValue = String.format(HiveConstants.WHERE_BETWEEN, value.get(0), value.get(1)); + } + } else { + whereValue = String.format(HiveConstants.WHERE_VALUE_VALUE, value.get(0)); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereTermAndValue(whereTerm + whereValue) + .build()); + } + return list; + } + + private String sqlFix(String sql) { + if (sql.lastIndexOf(";") == (sql.length() - 1)) { + sql = sql.substring(0, sql.length() - 1); + } + return sql; + } + + private String transDateFormat(String dateStyle, String datePattern) { + String split = "-"; + if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) { + split = "-"; + } else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) { + split = "/"; + } else { + split = "-"; + } + + if (StringUtils.isEmpty(dateStyle)) { + return "yyyy-MM-dd HH:mm:ss"; + } + + switch (dateStyle) { + case "y": + return "yyyy"; + case "y_M": + return "yyyy" + split + "MM"; + case "y_M_d": + return "yyyy" + split + "MM" + split + "dd"; + case "H_m_s": + return "HH:mm:ss"; + case "y_M_d_H_m": + return "yyyy" + split + "MM" + split + "dd" + " HH:mm"; + case "y_M_d_H_m_s": + return "yyyy" + split + "MM" + split + "dd" + " HH:mm:ss"; + default: + return "yyyy-MM-dd HH:mm:ss"; + } + } + + private SQLObj getXFields(ChartViewFieldDTO x, String originField, String fieldAlias) { + String fieldName = ""; + if (x.getDeExtractType() == DeTypeConstants.DE_TIME) { + if (x.getDeType() == 2 || x.getDeType() == 3) { + fieldName = String.format(HiveConstants.UNIX_TIMESTAMP, originField) + "*1000"; + } else if (x.getDeType() == DeTypeConstants.DE_TIME) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + fieldName = String.format(HiveConstants.DATE_FORMAT, originField, format); + } else { + fieldName = originField; + } + } else { + if (x.getDeType() == DeTypeConstants.DE_TIME) { + String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); + if (x.getDeExtractType() == DeTypeConstants.DE_STRING) { + fieldName = String.format(HiveConstants.DATE_FORMAT, originField, format); + } else { + String cast = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + String from_unixtime = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(HiveConstants.DATE_FORMAT, from_unixtime, format); + } + } else { + fieldName = originField; + } + } + return SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build(); + } + + private List getXWheres(ChartViewFieldDTO x, String originField, String fieldAlias) { + List list = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(x.getFilter()) && x.getFilter().size() > 0) { + x.getFilter().forEach(f -> { + String whereName = ""; + String whereTerm = transMysqlFilterTerm(f.getTerm()); + String whereValue = ""; + if (x.getDeType() == DeTypeConstants.DE_TIME && x.getDeExtractType() != 1) { + String cast = String.format(HiveConstants.CAST, originField, HiveConstants.DEFAULT_INT_FORMAT) + "/1000"; + whereName = String.format(HiveConstants.FROM_UNIXTIME, cast, HiveConstants.DEFAULT_DATE_FORMAT); + } else { + whereName = originField; + } + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(f.getValue(), "','") + "')"; + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { + whereValue = "'%" + f.getValue() + "%'"; + } else { + whereValue = String.format(HiveConstants.WHERE_VALUE_VALUE, f.getValue()); + } + list.add(SQLObj.builder() + .whereField(whereName) + .whereAlias(fieldAlias) + .whereTermAndValue(whereTerm + whereValue) + .build()); + }); + } + return list; + } + + private SQLObj getYFields(ChartViewFieldDTO y, String originField, String fieldAlias) { + String fieldName = ""; + if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) { + fieldName = HiveConstants.AGG_COUNT; + } else if (SQLConstants.DIMENSION_TYPE.contains(y.getDeType())) { + fieldName = String.format(HiveConstants.AGG_FIELD, y.getSummary(), originField); + } else { + if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { + String cast = String.format(HiveConstants.CAST, originField, y.getDeType() == 2 ? HiveConstants.DEFAULT_INT_FORMAT : HiveConstants.DEFAULT_FLOAT_FORMAT); + String agg = String.format(HiveConstants.AGG_FIELD, y.getSummary(), cast); + fieldName = String.format(HiveConstants.CAST, agg, HiveConstants.DEFAULT_FLOAT_FORMAT); + } else { + String cast = String.format(HiveConstants.CAST, originField, y.getDeType() == 2 ? HiveConstants.DEFAULT_INT_FORMAT : HiveConstants.DEFAULT_FLOAT_FORMAT); + fieldName = String.format(HiveConstants.AGG_FIELD, y.getSummary(), cast); + } + } + return SQLObj.builder() + .fieldName(fieldName) + .fieldAlias(fieldAlias) + .build(); + } + + private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) { + List list = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) { + y.getFilter().forEach(f -> { + String whereTerm = transMysqlFilterTerm(f.getTerm()); + String whereValue = ""; + // 原始类型不是时间,在de中被转成时间的字段做处理 + if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { + whereValue = ""; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { + whereValue = "''"; + } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_empty")) { + whereValue = "''"; + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) { + whereValue = "('" + StringUtils.join(f.getValue(), "','") + "')"; + } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) { + whereValue = "'%" + f.getValue() + "%'"; + } else { + whereValue = String.format(HiveConstants.WHERE_VALUE_VALUE, f.getValue()); + } + list.add(SQLObj.builder() + .whereField(fieldAlias) + .whereAlias(fieldAlias) + .whereTermAndValue(whereTerm + whereValue) + .build()); + }); + } + return list; + } + + private String calcFieldRegex(String originField, SQLObj tableObj) { + originField = originField.replaceAll("[\\t\\n\\r]]", ""); + // 正则提取[xxx] + String regex = "\\[(.*?)]"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(originField); + Set ids = new HashSet<>(); + while (matcher.find()) { + String id = matcher.group(1); + ids.add(id); + } + if (CollectionUtils.isEmpty(ids)) { + return originField; + } + DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample(); + datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids)); + List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample); + for (DatasetTableField ele : calcFields) { + originField = originField.replaceAll("\\[" + ele.getId() + "]", + String.format(HiveConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName())); + } + return originField; + } + + private String sqlLimit(String sql, ChartViewWithBLOBs view) { + if (StringUtils.equalsIgnoreCase(view.getResultMode(), "custom")) { + return sql + " LIMIT 0," + view.getResultCount(); + } else { + return sql; + } + } +} diff --git a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java index 6ce769efbe..f03a466497 100644 --- a/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/mongodb/MongoQueryProvider.java @@ -166,8 +166,6 @@ public class MongoQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -272,8 +270,6 @@ public class MongoQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -358,8 +354,6 @@ public class MongoQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -469,8 +463,6 @@ public class MongoQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -735,26 +727,10 @@ public class MongoQueryProvider extends QueryProvider { } else { originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } -// if (field.getDeType() == DeTypeConstants.DE_TIME) { -// if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { -// whereName = String.format(MongoConstants.STR_TO_DATE, originName, MongoConstants.DEFAULT_DATE_FORMAT); -// } -// if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { -// String cast = String.format(MongoConstants.CAST, originName, MongoConstants.DEFAULT_INT_FORMAT) + "/1000"; -// whereName = String.format(MongoConstants.FROM_UNIXTIME, cast, MongoConstants.DEFAULT_DATE_FORMAT); -// } -// if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { -// whereName = originName; -// } -// } else { -// whereName = originName; -// } whereName = originName; if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MongoConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -800,20 +776,6 @@ public class MongoQueryProvider extends QueryProvider { originName = String.format(MongoConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } -// if (field.getDeType() == DeTypeConstants.DE_TIME) { -// if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) { -// whereName = String.format(MongoConstants.STR_TO_DATE, originName, MongoConstants.DEFAULT_DATE_FORMAT); -// } -// if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) { -// String cast = String.format(MongoConstants.CAST, originName, MongoConstants.DEFAULT_INT_FORMAT) + "/1000"; -// whereName = String.format(MongoConstants.FROM_UNIXTIME, cast, MongoConstants.DEFAULT_DATE_FORMAT); -// } -// if (field.getDeExtractType() == DeTypeConstants.DE_TIME) { -// whereName = originName; -// } -// } else { -// whereName = originName; -// } whereName = originName; if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) { @@ -882,28 +844,8 @@ public class MongoQueryProvider extends QueryProvider { private SQLObj getXFields(ChartViewFieldDTO x, String originField, String fieldAlias) { String fieldName = ""; if (x.getDeExtractType() == DeTypeConstants.DE_TIME) { -// if (x.getDeType() == DeTypeConstants.DE_INT || x.getDeType() == DeTypeConstants.DE_FLOAT) { -// fieldName = String.format(MongoConstants.UNIX_TIMESTAMP, originField) + "*1000"; -// } else if (x.getDeType() == DeTypeConstants.DE_TIME) { -// String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); -// fieldName = String.format(MongoConstants.DATE_FORMAT, originField, format); -// } else { -// fieldName = originField; -// } fieldName = originField; } else { -// if (x.getDeType() == DeTypeConstants.DE_TIME) { -// String format = transDateFormat(x.getDateStyle(), x.getDatePattern()); -// if (x.getDeExtractType() == DeTypeConstants.DE_STRING) { -// fieldName = String.format(MongoConstants.DATE_FORMAT, originField, format); -// } else { -// String cast = String.format(MongoConstants.CAST, originField, MongoConstants.DEFAULT_INT_FORMAT) + "/1000"; -// String from_unixtime = String.format(MongoConstants.FROM_UNIXTIME, cast, MongoConstants.DEFAULT_DATE_FORMAT); -// fieldName = String.format(MongoConstants.DATE_FORMAT, from_unixtime, format); -// } -// } else { -// fieldName = originField; -// } fieldName = originField; } return SQLObj.builder() @@ -919,14 +861,6 @@ public class MongoQueryProvider extends QueryProvider { } else if (SQLConstants.DIMENSION_TYPE.contains(y.getDeType())) { fieldName = String.format(MongoConstants.AGG_FIELD, y.getSummary(), originField); } else { -// if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) { -// String cast = String.format(MongoConstants.CAST, originField, y.getDeType() == DeTypeConstants.DE_INT ? MongoConstants.DEFAULT_INT_FORMAT : MongoConstants.DEFAULT_FLOAT_FORMAT); -// String agg = String.format(MongoConstants.AGG_FIELD, y.getSummary(), cast); -// fieldName = String.format(MongoConstants.CAST, agg, MongoConstants.DEFAULT_FLOAT_FORMAT); -// } else { -// String cast = String.format(MongoConstants.CAST, originField, y.getDeType() == DeTypeConstants.DE_INT ? MongoConstants.DEFAULT_INT_FORMAT : MongoConstants.DEFAULT_FLOAT_FORMAT); -// fieldName = String.format(MongoConstants.AGG_FIELD, y.getSummary(), cast); -// } fieldName = String.format(MongoConstants.AGG_FIELD, y.getSummary(), originField); } return SQLObj.builder() @@ -943,10 +877,8 @@ public class MongoQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MongoConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originField); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; 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 a6090f85a5..6db5c79d8d 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 @@ -189,8 +189,6 @@ public class MysqlQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -295,8 +293,6 @@ public class MysqlQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -381,8 +377,6 @@ public class MysqlQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -492,8 +486,6 @@ public class MysqlQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -773,10 +765,8 @@ public class MysqlQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -946,10 +936,8 @@ public class MysqlQueryProvider extends QueryProvider { whereName = originField; } if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originField); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; @@ -1002,10 +990,8 @@ public class MysqlQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originField); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; 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 182efce285..42fae9cddf 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 @@ -237,8 +237,6 @@ public class OracleQueryProvider extends QueryProvider { String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i)); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -344,8 +342,6 @@ public class OracleQueryProvider extends QueryProvider { String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i)); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -430,8 +426,6 @@ public class OracleQueryProvider extends QueryProvider { String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i)); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -542,8 +536,6 @@ public class OracleQueryProvider extends QueryProvider { String fieldAlias = String.format(OracleConstants.ALIAS_FIX, String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i)); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -828,10 +820,8 @@ public class OracleQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -1020,10 +1010,8 @@ public class OracleQueryProvider extends QueryProvider { whereName = originField; } if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; @@ -1076,10 +1064,8 @@ public class OracleQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; diff --git a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java index 050dd33baa..a82cbef61b 100644 --- a/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/pg/PgQueryProvider.java @@ -82,7 +82,6 @@ public class PgQueryProvider extends QueryProvider { case "float8": case "money": return DeTypeConstants.DE_FLOAT;// 浮点 -// case "bool": case "TINYINT": return DeTypeConstants.DE_BOOL;// 布尔 case "bytea": @@ -212,8 +211,6 @@ public class PgQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -319,8 +316,6 @@ public class PgQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -406,8 +401,6 @@ public class PgQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -518,8 +511,6 @@ public class PgQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -803,10 +794,8 @@ public class PgQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -991,10 +980,8 @@ public class PgQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; diff --git a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java index 2dda33e3e1..078f443178 100644 --- a/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/redshift/RedshiftQueryProvider.java @@ -91,7 +91,6 @@ public class RedshiftQueryProvider extends QueryProvider { case "float8": case "money": return DeTypeConstants.DE_FLOAT;// 浮点 -// case "bool": case "TINYINT": return DeTypeConstants.DE_BOOL;// 布尔 case "bytea": @@ -221,8 +220,6 @@ public class RedshiftQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -347,8 +344,6 @@ public class RedshiftQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -459,8 +454,6 @@ public class RedshiftQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() diff --git a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java index f07644a423..ae48222945 100644 --- a/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/sqlserver/SqlserverQueryProvider.java @@ -8,9 +8,9 @@ import io.dataease.base.domain.Datasource; import io.dataease.base.mapper.DatasetTableFieldMapper; import io.dataease.commons.constants.DeTypeConstants; import io.dataease.controller.request.chart.ChartExtFilterRequest; -import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.chart.ChartCustomFilterDTO; import io.dataease.dto.chart.ChartViewFieldDTO; +import io.dataease.dto.datasource.JdbcConfiguration; import io.dataease.dto.sqlObj.SQLObj; import io.dataease.provider.query.QueryProvider; import io.dataease.provider.query.SQLConstants; @@ -98,7 +98,15 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(fields)) { for (int i = 0; i < fields.size(); i++) { DatasetTableField f = fields.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(f.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); String fieldName = ""; // 处理横轴字段 @@ -185,12 +193,18 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -207,7 +221,15 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { ChartViewFieldDTO y = yAxis.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); @@ -276,12 +298,18 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -355,12 +383,18 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xList)) { for (int i = 0; i < xList.size(); i++) { ChartViewFieldDTO x = xList.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(x.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -377,7 +411,15 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { ChartViewFieldDTO y = yAxis.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); @@ -482,8 +524,6 @@ public class SqlserverQueryProvider extends QueryProvider { String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i); // 处理横轴字段 xFields.add(getXFields(x, originField, fieldAlias)); - // 处理横轴过滤 -// xWheres.addAll(getXWheres(x, originField, fieldAlias)); // 处理横轴排序 if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) { xOrders.add(SQLObj.builder() @@ -590,7 +630,15 @@ public class SqlserverQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(yAxis)) { for (int i = 0; i < yAxis.size(); i++) { ChartViewFieldDTO y = yAxis.get(i); - String originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + String originField; + if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originField = calcFieldRegex(y.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } else { + originField = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName()); + } String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i); // 处理纵轴字段 yFields.add(getYFields(y, originField, fieldAlias)); @@ -736,8 +784,15 @@ public class SqlserverQueryProvider extends QueryProvider { String whereName = ""; String whereTerm = transMysqlFilterTerm(request.getTerm()); String whereValue = ""; - String originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); - + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } if (field.getDeType() == 1) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { whereName = String.format(SqlServerSQLConstants.STRING_TO_DATE, originName); @@ -753,10 +808,8 @@ public class SqlserverQueryProvider extends QueryProvider { whereName = originName; } if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "empty")) { whereValue = "''"; @@ -791,7 +844,16 @@ public class SqlserverQueryProvider extends QueryProvider { String whereName = ""; String whereTerm = transMysqlFilterTerm(request.getOperator()); String whereValue = ""; - String originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + + String originName; + if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) { + // 解析origin name中有关联的字段生成sql表达式 + originName = calcFieldRegex(field.getOriginName(), tableObj); + } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else { + originName = String.format(SqlServerSQLConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } if (field.getDeType() == 1) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { @@ -948,10 +1010,8 @@ public class SqlserverQueryProvider extends QueryProvider { String whereValue = ""; // 原始类型不是时间,在de中被转成时间的字段做处理 if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) { -// whereValue = MySQLConstants.WHERE_VALUE_NULL; whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) { -// whereTerm = String.format(whereTerm, originName); whereValue = ""; } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "empty")) { whereValue = "''"; diff --git a/backend/src/main/java/io/dataease/service/FileService.java b/backend/src/main/java/io/dataease/service/FileService.java index 4e72f44212..d071b0f74a 100644 --- a/backend/src/main/java/io/dataease/service/FileService.java +++ b/backend/src/main/java/io/dataease/service/FileService.java @@ -43,9 +43,7 @@ public class FileService { example2.createCriteria().andFileIdIn(ids); fileContentMapper.deleteByExample(example2); - /* LoadTestFileExample example3 = new LoadTestFileExample(); - example3.createCriteria().andFileIdIn(ids); - loadTestFileMapper.deleteByExample(example3);*/ + } public void deleteFileRelatedByIds(List ids) { 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 177e9689ea..543e0a60ec 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -78,6 +78,11 @@ public class ChartViewService { Optional.ofNullable(chartView.getId()).ifPresent(id -> { CacheUtils.remove(JdbcConstants.VIEW_CACHE_KEY, id); }); + try { + calcData(chartView, new ChartExtRequest(), true); + } catch (Exception e) { + + } return getOneWithPermission(chartView.getId()); } @@ -179,6 +184,10 @@ public class ChartViewService { public ChartViewDTO getData(String id, ChartExtRequest requestList) throws Exception { ChartViewWithBLOBs view = chartViewMapper.selectByPrimaryKey(id); + return calcData(view, requestList, true); + } + + public ChartViewDTO calcData(ChartViewWithBLOBs view, ChartExtRequest requestList, boolean cache) throws Exception { if (ObjectUtils.isEmpty(view)) { throw new RuntimeException(Translator.get("i18n_chart_delete")); } @@ -371,17 +380,6 @@ public class ChartViewService { } } data = datasourceProvider.getData(datasourceRequest); - /** - * 直连不实用缓存 - String key = "provider_sql_"+datasourceRequest.getDatasource().getId() + "_" + datasourceRequest.getTable() + "_" +datasourceRequest.getQuery(); - Object cache; - if ((cache = CacheUtils.get(JdbcConstants.JDBC_PROVIDER_KEY, key)) == null) { - data = datasourceProvider.getData(datasourceRequest); - CacheUtils.put(JdbcConstants.JDBC_PROVIDER_KEY,key ,data, null, null); - }else { - data = (List) cache; - } - */ } else if (table.getMode() == 1) {// 抽取 // 连接doris,构建doris数据源查询 Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource"); @@ -401,30 +399,14 @@ public class ChartViewService { } else { datasourceRequest.setQuery(qp.getSQL(tableName, xAxis, yAxis, customFilter, extFilterList, ds, view)); } - /*// 定时抽取使用缓存 - Object cache; // 仪表板有参数不实用缓存 - if (CollectionUtils.isNotEmpty(requestList.getFilter())) { - data = datasourceProvider.getData(datasourceRequest); - } - // 仪表板无参数 且 未缓存过该视图 则查询后缓存 - else if ((cache = CacheUtils.get(JdbcConstants.VIEW_CACHE_KEY, id)) == null) { - lock.lock(); - data = datasourceProvider.getData(datasourceRequest); - CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, id, data, null, null); - } - // 仪表板有缓存 使用缓存 - else { - data = (List) cache; - }*/ - // 仪表板有参数不实用缓存 - if (CollectionUtils.isNotEmpty(requestList.getFilter()) + if (!cache || CollectionUtils.isNotEmpty(requestList.getFilter()) || CollectionUtils.isNotEmpty(requestList.getLinkageFilters()) || CollectionUtils.isNotEmpty(requestList.getDrill())) { data = datasourceProvider.getData(datasourceRequest); } else { try { - data = cacheViewData(datasourceProvider, datasourceRequest, id); + data = cacheViewData(datasourceProvider, datasourceRequest, view.getId()); } catch (Exception e) { LogUtil.error(e); } finally { @@ -435,10 +417,6 @@ public class ChartViewService { } } } -// // 返回数据量判定 -// if (StringUtils.equalsIgnoreCase("custom", view.getResultMode()) && data.size() > view.getResultCount()) { -// data = data.subList(0, view.getResultCount()); -// } Map map = new TreeMap<>(); // 图表组件可再扩展 @@ -1294,11 +1272,7 @@ public class ChartViewService { chartQuotaDTO.setId(yAxis.get(j).getId()); quotaList.add(chartQuotaDTO); scatterChartDataDTO.setQuotaList(quotaList); -// try { -// axisChartDataDTO.setValue(new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i])); -// } catch (Exception e) { -// axisChartDataDTO.setValue(new BigDecimal(0)); -// } + if (CollectionUtils.isNotEmpty(extBubble) && extBubble.size() > 0) { try { scatterChartDataDTO.setValue(new Object[]{ @@ -1323,41 +1297,6 @@ public class ChartViewService { } } - /*for (String[] d : data) { - StringBuilder a = new StringBuilder(); - for (int i = 0; i < xAxis.size(); i++) { - if (i == xAxis.size() - 1) { - a.append(d[i]); - } else { - a.append(d[i]).append("\n"); - } - } - x.add(a.toString()); - for (int i = xAxis.size(); i < xAxis.size() + yAxis.size(); i++) { - int j = i - xAxis.size(); - if (CollectionUtils.isNotEmpty(extBubble) && extBubble.size() > 0) { - try { - series.get(j).getData().add(new Object[]{ - a.toString(), - new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i]), - new BigDecimal(StringUtils.isEmpty(d[xAxis.size() + yAxis.size()]) ? "0" : d[xAxis.size() + yAxis.size()]) - }); - } catch (Exception e) { - series.get(j).getData().add(new Object[]{a.toString(), new BigDecimal(0), new BigDecimal(0)}); - } - } else { - try { - series.get(j).getData().add(new Object[]{ - a.toString(), - new BigDecimal(StringUtils.isEmpty(d[i]) ? "0" : d[i]) - }); - } catch (Exception e) { - series.get(j).getData().add(new Object[]{a.toString(), new BigDecimal(0)}); - } - } - } - }*/ - map.put("x", x); map.put("series", series); return map; @@ -1395,9 +1334,6 @@ public class ChartViewService { } private void checkName(ChartViewWithBLOBs chartView) { -// if (StringUtils.isEmpty(chartView.getId())) { -// return; -// } ChartViewExample chartViewExample = new ChartViewExample(); ChartViewExample.Criteria criteria = chartViewExample.createCriteria(); if (StringUtils.isNotEmpty(chartView.getId())) { @@ -1446,4 +1382,12 @@ public class ChartViewService { public String searchAdviceSceneId(String panelId) { return extChartViewMapper.searchAdviceSceneId(AuthUtils.getUser().getUserId().toString(), panelId); } + + public String checkSameDataSet(String viewIdSource,String viewIdTarget) { + if(extChartViewMapper.checkSameDataSet(viewIdSource,viewIdTarget)==1){ + return "YES"; + }else{ + return "NO"; + } + } } 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 493620a248..b6b3cba7c2 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -188,7 +188,7 @@ public class DataSetTableService { if (datasetTable.getEditType() == 0) { List newFields = sheet.getFields().stream().map(TableFiled::getRemarks).collect(Collectors.toList()); if (!oldFields.equals(newFields)) { - DataEaseException.throwException(Translator.get("i18n_excel_colume_change")); + DataEaseException.throwException(Translator.get("i18n_excel_colume_inconsistent")); } oldFields = newFields; } @@ -243,8 +243,6 @@ public class DataSetTableService { // 更新数据和字段 if (update == 1) { if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql") || StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) { - // 删除所有字段,重新抽象 -// dataSetTableFieldsService.deleteByTableId(datasetTable.getId()); saveTableField(datasetTable); } } @@ -735,7 +733,6 @@ public class DataSetTableService { String sql; DatasourceRequest datasourceRequest = new DatasourceRequest(); -// JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class); Datasource ds; if (dataSetTableRequest.getMode() == 0) { ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId()); @@ -746,7 +743,6 @@ public class DataSetTableService { datasourceRequest.setDatasource(ds); sql = getCustomSQLDoris(dataTableInfoDTO, list); } -// String table = DorisTableUtils.dorisName(dataSetTableRequest.getId()); DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType()); // 使用输入的sql先预执行一次,并拿到所有字段 datasourceRequest.setQuery(sql); diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java index 96f44d4c22..651b3eb999 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableTaskService.java @@ -306,8 +306,5 @@ public class DataSetTableTaskService { if(!datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())){ scheduleService.fireNow(datasetTableTask); } -// if(datasetTableTask.getRate().equalsIgnoreCase(ScheduleType.SIMPLE.toString())){ -// scheduleService.addSchedule(datasetTableTask); -// } } } diff --git a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java index 9dd699ab76..628bfcb571 100644 --- a/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java +++ b/backend/src/main/java/io/dataease/service/dataset/ExtractDataService.java @@ -189,7 +189,6 @@ public class ExtractDataService { extractData(datasetTable, "all_scope"); replaceTable(DorisTableUtils.dorisName(datasetTableId)); saveSucessLog(datasetTableTaskLog); -// sendWebMsg(datasetTable, null, true); updateTableStatus(datasetTableId, datasetTable, JobStatus.Completed, execTime); if(ops.equalsIgnoreCase("替换")){ dataSetTableFieldsService.deleteByTableId(datasetTable.getId()); @@ -199,7 +198,6 @@ public class ExtractDataService { } } catch (Exception e) { saveErrorLog(datasetTableId, null, e); -// sendWebMsg(datasetTable, null, false); updateTableStatus(datasetTableId, datasetTable, JobStatus.Error, null); dropDorisTable(DorisTableUtils.dorisTmpName(DorisTableUtils.dorisName(datasetTableId))); } finally { @@ -218,11 +216,9 @@ public class ExtractDataService { Long execTime = System.currentTimeMillis(); extractData(datasetTable, "incremental_add"); saveSucessLog(datasetTableTaskLog); -// sendWebMsg(datasetTable, null, true); updateTableStatus(datasetTableId, datasetTable, JobStatus.Completed, execTime); } catch (Exception e) { saveErrorLog(datasetTableId, null, e); -// sendWebMsg(datasetTable, null, false); updateTableStatus(datasetTableId, datasetTable, JobStatus.Error, null); } finally { deleteFile("incremental_add", datasetTableId); @@ -413,7 +409,7 @@ public class ExtractDataService { if (ObjectUtils.isNotEmpty(datasetTableTask) && ObjectUtils.isNotEmpty(datasetTableTask.getName())) { content += " 任务名称【" + datasetTableTask.getName() + "】"; } - DeMsgutil.sendMsg(userId, typeId, 1L, content, gson.toJson(param)); + DeMsgutil.sendMsg(userId, typeId, content, gson.toJson(param)); }); } @@ -691,20 +687,6 @@ public class ExtractDataService { startEntry.setLocation(100, 100); jobMeta.addJobEntry(startEntry); - //trans -// JobEntryTrans transrans = new JobEntryTrans(); -// transrans.clearResultFiles = true; -// transrans.clearResultRows = true; -// transrans.followingAbortRemotely = true; -// transrans.setTransname(transName); -// transrans.setName("Transformation"); -// JobEntryCopy transEntry = new JobEntryCopy(transrans); -// transEntry.setDrawn(true); -// transEntry.setLocation(300, 100); -// jobMeta.addJobEntry(transEntry); - -// jobMeta.addJobHop(new JobHopMeta(startEntry, transEntry)); - //exec shell JobEntryShell shell = new JobEntryShell(); shell.setScript(script); @@ -807,7 +789,6 @@ public class ExtractDataService { case ck: CHConfiguration chConfiguration = new Gson().fromJson(datasource.getConfiguration(), CHConfiguration.class); dataMeta = new DatabaseMeta("db", "ORACLE", "Native", chConfiguration.getHost().trim(), chConfiguration.getDataBase().trim(), chConfiguration.getPort().toString(), chConfiguration.getUsername(), chConfiguration.getPassword()); -// dataMeta.addExtraOption("MYSQL", "characterEncoding", "UTF-8"); dataMeta.setDatabaseType("Clickhouse"); transMeta.addDatabase(dataMeta); selectSQL = getSelectSQL(extractType, datasetTable, datasource, datasetTableFields, selectSQL); @@ -1010,7 +991,6 @@ public class ExtractDataService { } private StepMeta udjc(List datasetTableFields, DatasourceTypes datasourceType) { -// String needToChangeColumnType = ""; String handleBinaryTypeCode = ""; String excelCompletion = ""; @@ -1129,17 +1109,6 @@ public class ExtractDataService { " get(Fields.Out, filed).getValueMeta().setType(2);\n" + " \t}"; - -// private final static String alterColumnTypeCode = " if(\"FILED\".equalsIgnoreCase(filed)){\n" + -// "\t if(tmp != null && tmp.equalsIgnoreCase(\"Y\")){\n" + -// " get(Fields.Out, filed).setValue(r, 1);\n" + -// " get(Fields.Out, filed).getValueMeta().setType(2);\n" + -// " }else{\n" + -// " get(Fields.Out, filed).setValue(r, 0);\n" + -// " get(Fields.Out, filed).getValueMeta().setType(2);\n" + -// " }\n" + -// " }\n" ; - private final static String handleExcelIntColumn = " \t\tif(tmp != null && tmp.endsWith(\".0\")){\n" + " try {\n" + " Long.valueOf(tmp.substring(0, tmp.length()-2));\n" + 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 d21777cefb..0341b3a6cf 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -264,7 +264,6 @@ public class DatasourceService { public void updateDatasourceStatus(){ List datasources = datasourceMapper.selectByExampleWithBLOBs(new DatasourceExample()); datasources.forEach(datasource -> { - // checkAndUpdateDatasourceStatus(datasource); checkAndUpdateDatasourceStatus(datasource, true); }); } @@ -316,7 +315,7 @@ public class DatasourceService { String content = "数据源【" + datasource.getName() + "】无效"; - DeMsgutil.sendMsg(userId, typeId, 1L, content, gson.toJson(param)); + DeMsgutil.sendMsg(userId, typeId, content, gson.toJson(param)); }); } } diff --git a/backend/src/main/java/io/dataease/service/message/DeMsgutil.java b/backend/src/main/java/io/dataease/service/message/DeMsgutil.java index 8d3e62c527..257f832c2e 100644 --- a/backend/src/main/java/io/dataease/service/message/DeMsgutil.java +++ b/backend/src/main/java/io/dataease/service/message/DeMsgutil.java @@ -18,15 +18,9 @@ public class DeMsgutil { - public static void sendMsg(Long userId, Long typeId, Long channelId, String content, String param) { -// SysMsg sysMsg = new SysMsg(); -// sysMsg.setUserId(userId); -// sysMsg.setTypeId(typeId); -// sysMsg.setContent(content); -// sysMsg.setStatus(false); -// sysMsg.setCreateTime(System.currentTimeMillis()); -// sysMsg.setParam(param); - sysMsgService.sendMsg(userId, typeId, channelId, content, param); + public static void sendMsg(Long userId, Long typeId, String content, String param) { + + sysMsgService.sendMsg(userId, typeId, content, param); } diff --git a/backend/src/main/java/io/dataease/service/message/MsgAop.java b/backend/src/main/java/io/dataease/service/message/MsgAop.java deleted file mode 100644 index a617aab1d5..0000000000 --- a/backend/src/main/java/io/dataease/service/message/MsgAop.java +++ /dev/null @@ -1,60 +0,0 @@ -package io.dataease.service.message; - - -import io.dataease.controller.sys.response.SubscribeNode; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.ObjectUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.springframework.stereotype.Component; -import javax.annotation.Resource; -import java.util.List; - -@Aspect -@Component -public class MsgAop { - - - - - @Resource - private SysMsgService sysMsgService; - - - - - - /** - * 对sendMsg 切面拦截 - * @param point - */ - @Around("(execution(* io.dataease.service.message.SysMsgService.sendMsg(..)))") - public Object cutPoint(ProceedingJoinPoint point) { - - Object[] args = point.getArgs(); - Object arg0 = args[0]; - Object arg1 = args[1]; - Object arg2 = args[2]; - - if (ObjectUtils.isEmpty(arg0) || ObjectUtils.isEmpty(arg1) || ObjectUtils.isEmpty(arg2)) { - return null; - } - Long userId = (Long) arg0; - Long typeId = (Long) arg1; - Long channelId = (Long) arg2; - - List subscribes = sysMsgService.subscribes(userId); - - try { - // 如果已经订阅了这种类型的消息 直接发送 否则直接返回 - if (CollectionUtils.isNotEmpty(subscribes) && subscribes.stream().anyMatch(item -> item.match(typeId, channelId))) - return point.proceed(args); - return null; - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - return null; - - } -} diff --git a/backend/src/main/java/io/dataease/service/message/SysMsgService.java b/backend/src/main/java/io/dataease/service/message/SysMsgService.java index 8766d60b57..5ced46a695 100644 --- a/backend/src/main/java/io/dataease/service/message/SysMsgService.java +++ b/backend/src/main/java/io/dataease/service/message/SysMsgService.java @@ -16,6 +16,7 @@ import io.dataease.controller.sys.request.MsgSettingRequest; import io.dataease.controller.sys.response.MsgGridDto; import io.dataease.controller.sys.response.SettingTreeNode; import io.dataease.controller.sys.response.SubscribeNode; +import io.dataease.service.message.service.SendService; import io.dataease.service.system.SystemParameterService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -55,33 +56,6 @@ public class SysMsgService { @Autowired private SystemParameterService systemParameterService; - /* public List query(Long userId, MsgRequest msgRequest) { - String orderClause = " create_time desc"; - SysMsgExample example = new SysMsgExample(); - SysMsgExample.Criteria criteria = example.createCriteria(); - criteria.andUserIdEqualTo(userId); - - List orders = msgRequest.getOrders(); - - if (CollectionUtils.isNotEmpty(orders)) { - orderClause = String.join(", ", orders); - } - - if (ObjectUtils.isNotEmpty(msgRequest.getType())) { - criteria.andTypeIdEqualTo(msgRequest.getType()); - } - - if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) { - criteria.andStatusEqualTo(msgRequest.getStatus()); - } - - criteria.andCreateTimeGreaterThanOrEqualTo(overTime()); - - example.setOrderByClause(orderClause); - List sysMsgs = sysMsgMapper.selectByExample(example); - return sysMsgs; - } - */ public List queryGrid(Long userId, MsgRequest msgRequest, List typeIds, Long startTime) { String orderClause = " create_time desc"; SysMsgExample example = new SysMsgExample(); @@ -94,14 +68,6 @@ public class SysMsgService { orderClause = String.join(", ", orders); } - /*if (ObjectUtils.isNotEmpty(msgRequest.getType())) { - SysMsgTypeExample sysMsgTypeExample = new SysMsgTypeExample(); - sysMsgTypeExample.createCriteria().andPidEqualTo(msgRequest.getType()); - - List sysMsgTypes = sysMsgTypeMapper.selectByExample(sysMsgTypeExample); - List typeIds = sysMsgTypes.stream().map(SysMsgType::getMsgTypeId).collect(Collectors.toList()); - criteria.andTypeIdIn(typeIds); - }*/ if (CollectionUtils.isNotEmpty(typeIds)){ criteria.andTypeIdIn(typeIds); } @@ -111,7 +77,6 @@ public class SysMsgService { } criteria.andCreateTimeGreaterThanOrEqualTo(startTime); - /* criteria.andCreateTimeGreaterThanOrEqualTo(overTime()); */ example.setOrderByClause(orderClause); List msgGridDtos = extSysMsgMapper.queryGrid(example); @@ -211,12 +176,10 @@ public class SysMsgService { sysMsgSetting1.setTypeId(2L); sysMsgSetting1.setChannelId(1L); sysMsgSetting1.setEnable(true); - // sysMsgSetting1.setUserId(userId); SysMsgSetting sysMsgSetting2 = new SysMsgSetting(); sysMsgSetting2.setTypeId(6L); sysMsgSetting2.setChannelId(1L); sysMsgSetting2.setEnable(true); - //sysMsgSetting2.setUserId(userId); List lists = new ArrayList<>(); lists.add(sysMsgSetting1); lists.add(sysMsgSetting2); @@ -233,7 +196,6 @@ public class SysMsgService { public void updateSetting(MsgSettingRequest request, Long userId) { Long typeId = request.getTypeId(); Long channelId = request.getChannelId(); - // Long userId = AuthUtils.getUser().getUserId(); SysMsgSettingExample example = new SysMsgSettingExample(); example.createCriteria().andUserIdEqualTo(userId).andTypeIdEqualTo(typeId).andChannelIdEqualTo(channelId); List sysMsgSettings = sysMsgSettingMapper.selectByExample(example); @@ -280,15 +242,22 @@ public class SysMsgService { extSysMsgMapper.batchInsert(settings); } - public void sendMsg(Long userId, Long typeId, Long channelId, String content, String param) { - SysMsg sysMsg = new SysMsg(); - sysMsg.setUserId(userId); - sysMsg.setTypeId(typeId); - sysMsg.setContent(content); - sysMsg.setStatus(false); - sysMsg.setCreateTime(System.currentTimeMillis()); - sysMsg.setParam(param); - save(sysMsg); + public void sendMsg(Long userId, Long typeId, String content, String param) { + List subscribes = subscribes(userId); + + if (CollectionUtils.isNotEmpty(subscribes)) { + subscribes.stream().filter(item -> item.getTypeId() == typeId).forEach(sub -> { + SendService sendService = serviceByChannel(sub.getChannelId()); + sendService.sendMsg(userId, typeId, content, param); + }); + + } + + } + + private SendService serviceByChannel(Long channelId){ + String beanName = sysMsgChannelMapper.selectByPrimaryKey(channelId).getServiceName(); + return (SendService)CommonBeanFactory.getBean(beanName); } /** @@ -299,13 +268,11 @@ public class SysMsgService { @Cacheable(value = SysMsgConstants.SYS_MSG_USER_SUBSCRIBE, key = "#userId") public List subscribes(Long userId) { SysMsgSettingExample example = new SysMsgSettingExample(); - /*example.createCriteria().andUserIdEqualTo(userId).andEnableEqualTo(true);*/ example.createCriteria().andUserIdEqualTo(userId); List sysMsgSettings = sysMsgSettingMapper.selectByExample(example); // 添加默认订阅 sysMsgSettings = addDefault(sysMsgSettings); sysMsgSettings = sysMsgSettings.stream().filter(SysMsgSetting::getEnable).collect(Collectors.toList()); - // sysMsgSettings.addAll(defaultSettings()); List resultLists = sysMsgSettings.stream().map(item -> { SubscribeNode subscribeNode = new SubscribeNode(); subscribeNode.setTypeId(item.getTypeId()); diff --git a/backend/src/main/java/io/dataease/service/message/service/SendService.java b/backend/src/main/java/io/dataease/service/message/service/SendService.java new file mode 100644 index 0000000000..1354dbbadb --- /dev/null +++ b/backend/src/main/java/io/dataease/service/message/service/SendService.java @@ -0,0 +1,7 @@ +package io.dataease.service.message.service; + +public interface SendService { + + + void sendMsg(Long userId, Long typeId, String content, String param); +} diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendEmail.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendEmail.java new file mode 100644 index 0000000000..515d85515a --- /dev/null +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendEmail.java @@ -0,0 +1,28 @@ +package io.dataease.service.message.service.strategy; + +import io.dataease.auth.service.AuthUserService; +import io.dataease.service.message.service.SendService; +import io.dataease.service.system.EmailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + + +@Service("sendEmail") +public class SendEmail implements SendService { + + @Autowired + private EmailService emailService; + + @Autowired + private AuthUserService authUserService; + + + @Async + @Override + public void sendMsg(Long userId, Long typeId, String content, String param) { + String email = authUserService.getUserById(userId).getEmail(); + + emailService.send(email, content, content); + } +} diff --git a/backend/src/main/java/io/dataease/service/message/service/strategy/SendStation.java b/backend/src/main/java/io/dataease/service/message/service/strategy/SendStation.java new file mode 100644 index 0000000000..b4404f071e --- /dev/null +++ b/backend/src/main/java/io/dataease/service/message/service/strategy/SendStation.java @@ -0,0 +1,30 @@ +package io.dataease.service.message.service.strategy; + +import io.dataease.base.domain.SysMsg; +import io.dataease.base.mapper.SysMsgMapper; +import io.dataease.service.message.service.SendService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service("sendStation") +public class SendStation implements SendService { + + @Resource + private SysMsgMapper sysMsgMapper; + + @Override + public void sendMsg(Long userId, Long typeId, String content, String param) { + + SysMsg sysMsg = new SysMsg(); + sysMsg.setUserId(userId); + sysMsg.setTypeId(typeId); + sysMsg.setContent(content); + sysMsg.setStatus(false); + sysMsg.setCreateTime(System.currentTimeMillis()); + sysMsg.setParam(param); + + sysMsgMapper.insert(sysMsg); + + } +} diff --git a/backend/src/main/java/io/dataease/service/panel/PanelLinkJumpService.java b/backend/src/main/java/io/dataease/service/panel/PanelLinkJumpService.java index 4bacb27143..441b926d3a 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelLinkJumpService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelLinkJumpService.java @@ -84,10 +84,6 @@ public class PanelLinkJumpService { public PanelLinkJumpDTO queryWithView(String panelId, String viewId) { PanelLinkJumpDTO resultInfo = extPanelLinkJumpMapper.queryWithViewId(panelId, viewId); - // 获取链接类型为仪表板的关联视图fieldId-PanelLinkJumpInfo Map 映射关系 -// Map mapJumpInfoArray = resultInfo.getLinkJumpInfoArray().stream().filter(jumpInfo -> StringUtils.isNotEmpty(jumpInfo.getFieldId())) -// .collect(Collectors.toMap(PanelLinkJumpInfoDTO::getFieldId, PanelViewLinkageDTO->PanelViewLinkageDTO)); -// resultInfo.setMapJumpInfoArray(mapJumpInfoArray); return resultInfo; } diff --git a/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java b/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java index 62220af096..cf693a739a 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java @@ -7,8 +7,11 @@ import io.dataease.auth.util.JWTUtils; import io.dataease.auth.util.RsaUtil; import io.dataease.base.domain.PanelGroupWithBLOBs; import io.dataease.base.domain.PanelLink; +import io.dataease.base.domain.PanelLinkMapping; +import io.dataease.base.domain.PanelLinkMappingExample; import io.dataease.base.mapper.PanelGroupMapper; import io.dataease.base.mapper.PanelLinkMapper; +import io.dataease.base.mapper.PanelLinkMappingMapper; import io.dataease.base.mapper.ext.ExtPanelLinkMapper; import io.dataease.commons.utils.ServletUtils; import io.dataease.controller.ResultHolder; @@ -17,29 +20,28 @@ import io.dataease.controller.request.panel.link.LinkRequest; import io.dataease.controller.request.panel.link.OverTimeRequest; import io.dataease.controller.request.panel.link.PasswordRequest; import io.dataease.dto.panel.link.GenerateDto; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; +import java.util.List; import java.util.Map; @Service public class PanelLinkService { - private static final String baseUrl = "/link.html?link="; + private static final String BASEURL = "/link.html?link="; - @Value("${dataease.public-link-salt:DataEaseLinkSalt}") - private String salt; - @Value("${dataease.short-url-site:https://dh6.ink/}") - private String shortUrlSite; - @Value("${dataease.short-url-api:api/url/add}") - private String shortUrlApi; + private static final String SHORT_URL_PREFIX = "/xggznb/"; @Resource private PanelLinkMapper mapper; @@ -50,6 +52,9 @@ public class PanelLinkService { @Resource private ExtPanelLinkMapper extPanelLinkMapper; + @Resource + private PanelLinkMappingMapper panelLinkMappingMapper; + public void changeValid(LinkRequest request){ PanelLink po = new PanelLink(); po.setResourceId(request.getResourceId()); @@ -72,10 +77,7 @@ public class PanelLinkService { } public void overTime(OverTimeRequest request) { - /* PanelLink po = new PanelLink(); - po.setResourceId(request.getResourceId()); - po.setOverTime(request.getOverTime()); - mapper.updateByPrimaryKeySelective(po); */ + extPanelLinkMapper.updateOverTime(request); } @@ -84,6 +86,7 @@ public class PanelLinkService { return panelLink; } + @Transactional public GenerateDto currentGenerate(String resourceId) { PanelLink one = findOne(resourceId); if (ObjectUtils.isEmpty(one)) { @@ -94,6 +97,16 @@ public class PanelLinkService { one.setEnablePwd(false); mapper.insert(one); } + + + PanelLinkMappingExample example = new PanelLinkMappingExample(); + example.createCriteria().andResourceIdEqualTo(resourceId); + List mappings = panelLinkMappingMapper.selectByExample(example); + if(CollectionUtils.isEmpty(mappings)) { + PanelLinkMapping mapping = new PanelLinkMapping(); + mapping.setResourceId(resourceId); + panelLinkMappingMapper.insert(mapping); + } return convertDto(one); } @@ -116,19 +129,9 @@ public class PanelLinkService { } private String buildLinkParam(String resourceId){ - /* Map map = new HashMap<>(); - map.put("resourceId", resourceId); - map.put("time", System.currentTimeMillis()); - map.put("salt", salt); - Gson gson = new Gson(); - String encrypt = encrypt(gson.toJson(map)); */ + String encrypt = encrypt(resourceId); - /* String s = null; - try { - s = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, encrypt); - } catch (Exception e) { - e.printStackTrace(); - } */ + return encrypt; } private GenerateDto convertDto(PanelLink linl){ @@ -136,7 +139,7 @@ public class PanelLinkService { result.setValid(linl.getValid()); result.setEnablePwd(linl.getEnablePwd()); result.setPwd(linl.getPwd()); - result.setUri(baseUrl+buildLinkParam(linl.getResourceId())); + result.setUri(BASEURL+buildLinkParam(linl.getResourceId())); result.setOverTime(linl.getOverTime()); return result; } @@ -156,7 +159,6 @@ public class PanelLinkService { } if (StringUtils.isEmpty(panelLink.getPwd())) return false; boolean verify = JWTUtils.verifyLink(token, panelLink.getResourceId(), panelLink.getPwd()); - /* boolean verify = JWTUtils.verifyLink(token, panelLink.getResourceId(), decryptParam(panelLink.getPwd())); */ return verify; } @@ -170,11 +172,9 @@ public class PanelLinkService { public boolean validatePwd(PasswordRequest request) throws Exception { String password = request.getPassword(); - /* String password = decryptParam(request.getPassword()); */ String resourceId = request.getResourceId(); PanelLink one = findOne(resourceId); String pwd = one.getPwd(); - /* String pwd = decryptParam(one.getPwd()); */ boolean pass = StringUtils.equals(pwd, password); if (pass){ String token = JWTUtils.signLink(resourceId, password); @@ -190,23 +190,18 @@ public class PanelLinkService { } - public ResultHolder getShortUrl(String url) { - Gson gson = new Gson(); - Map param = new HashMap<>(); - param.put("diy", false); - param.put("link", url); - param.put("sort", ""); - String post = HttpUtil.post(shortUrlSite + shortUrlApi, param); - try{ - Map map = gson.fromJson(post, Map.class); - Map data = (Map) map.get("data"); - String sort = shortUrlSite + data.get("sort").toString(); - ResultHolder success = ResultHolder.success(sort); - return success; - }catch (Exception e) { - ResultHolder error = ResultHolder.error(e.getMessage()); - return error; - } + public String getShortUrl(String resourceId) { + PanelLinkMappingExample example = new PanelLinkMappingExample(); + example.createCriteria().andResourceIdEqualTo(resourceId); + List mappings = panelLinkMappingMapper.selectByExample(example); + PanelLinkMapping mapping = mappings.get(0); + return SHORT_URL_PREFIX + mapping.getId(); + } + public String getUrlByIndex(Long index) { + PanelLinkMapping mapping = panelLinkMappingMapper.selectByPrimaryKey(index); + String resourceId = mapping.getResourceId(); + PanelLink one = findOne(resourceId); + return convertDto(one).getUri(); } } diff --git a/backend/src/main/java/io/dataease/service/panel/ShareService.java b/backend/src/main/java/io/dataease/service/panel/ShareService.java index 7656b61bcf..3ad24a291d 100644 --- a/backend/src/main/java/io/dataease/service/panel/ShareService.java +++ b/backend/src/main/java/io/dataease/service/panel/ShareService.java @@ -15,9 +15,11 @@ import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.controller.request.panel.PanelShareFineDto; +import io.dataease.controller.request.panel.PanelShareRemoveRequest; import io.dataease.controller.request.panel.PanelShareRequest; import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.dto.panel.PanelShareDto; +import io.dataease.dto.panel.PanelShareOutDTO; import io.dataease.dto.panel.PanelSharePo; import io.dataease.service.message.DeMsgutil; import lombok.Data; @@ -74,9 +76,6 @@ public class ShareService { PanelShareExample example = new PanelShareExample(); example.createCriteria().andPanelGroupIdEqualTo(panelGroupId); List panelShares = mapper.selectByExample(example); - /*if (CollectionUtils.isEmpty(panelShares)) { - return; - }*/ Map> typeSharedMap = panelShares.stream().map(this::convertNode).collect(Collectors.groupingBy(TempShareNode::getType)); for (Map.Entry> entry : authURDMap.entrySet()) { @@ -115,7 +114,7 @@ public class ShareService { } if (CollectionUtils.isNotEmpty(addShares)){ - extPanelShareMapper.batchInsert(addShares); + extPanelShareMapper.batchInsert(addShares, AuthUtils.getUser().getUsername()); } // 以上是业务代码 @@ -134,13 +133,13 @@ public class ShareService { msgParam.add(panelGroupId); addUserIdSet.forEach(userId -> { if (!redUserIdSet.contains(userId) && user.getUserId() != userId){ - DeMsgutil.sendMsg(userId, 2L, 1L,user.getNickName()+" 分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam)); + DeMsgutil.sendMsg(userId, 2L,user.getNickName()+" 分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam)); } }); redUserIdSet.forEach(userId -> { if (!addUserIdSet.contains(userId) && user.getUserId() != userId){ - DeMsgutil.sendMsg(userId, 3L, 1L,user.getNickName()+" 取消分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam)); + DeMsgutil.sendMsg(userId, 3L, user.getNickName()+" 取消分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam)); } }); @@ -167,11 +166,6 @@ public class ShareService { private Map filterData(List newTargets, List shareNodes) { Map result = new HashMap<>(); - /*if (null == newTargets) { - result.put("add", new ArrayList<>()); - result.put("red", new ArrayList<>()); - return result; - }*/ List newUserIds = new ArrayList<>(); for (int i = 0; i < newTargets.size(); i++) { Long newTargetId = newTargets.get(i); @@ -241,7 +235,7 @@ public class ShareService { }) ).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(shares)){ - extPanelShareMapper.batchInsert(shares); + extPanelShareMapper.batchInsert(shares, AuthUtils.getUser().getUsername()); } // 下面是发送提醒消息逻辑 @@ -262,8 +256,7 @@ public class ShareService { String msg = StringUtils.joinWith(",", panelGroups.stream().map(PanelGroup::getName).collect(Collectors.toList())); Gson gson = new Gson(); userIdSet.forEach(userId -> { - // DeMsgutil.sendMsg(userId, 0, user.getNickName()+" 分享了仪表板【"+msg+"】给您,请查收!"); - DeMsgutil.sendMsg(userId, 2L,1L, user.getNickName()+" 分享了仪表板【"+msg+"】给您,请查收!", gson.toJson(panelIds)); + DeMsgutil.sendMsg(userId, 2L, user.getNickName()+" 分享了仪表板【"+msg+"】给您,请查收!", gson.toJson(panelIds)); }); } @@ -287,6 +280,15 @@ public class ShareService { mapper.deleteByExample(example); } + public List shareOut() { + return null; + } + + public List queryShareOut() { + String username = AuthUtils.getUser().getUsername(); + List panelSharePos = extPanelShareMapper.queryOut(username); + return panelSharePos; + } public List queryTree(BaseGridRequest request){ CurrentUserDto user = AuthUtils.getUser(); @@ -301,20 +303,7 @@ public class ShareService { List datas = extPanelShareMapper.query(param); - /*List targetIds = new ArrayList<>(); - targetIds.add(userId); - targetIds.add(deptId); - targetIds.addAll(roleIds); - ConditionEntity condition = new ConditionEntity(); - condition.setField("s.target_id"); - condition.setOperator("in"); - condition.setValue(targetIds); - - request.setConditions(new ArrayList(){{add(condition);}}); - - GridExample example = request.convertExample(); - List datas = extPanelShareMapper.query(example);*/ List dtoLists = datas.stream().map(po -> BeanUtils.copyBean(new PanelShareDto(), po)).collect(Collectors.toList()); return convertTree(dtoLists); } @@ -336,5 +325,13 @@ public class ShareService { return extPanelShareMapper.queryWithResource(example); } + public List queryTargets(String panelId) { + return extPanelShareMapper.queryTargets(panelId); + } + + + public void removeShares(PanelShareRemoveRequest removeRequest) { + extPanelShareMapper.removeShares(removeRequest); + } } diff --git a/backend/src/main/java/io/dataease/service/panel/StoreService.java b/backend/src/main/java/io/dataease/service/panel/StoreService.java index de25085f3c..db2e385a46 100644 --- a/backend/src/main/java/io/dataease/service/panel/StoreService.java +++ b/backend/src/main/java/io/dataease/service/panel/StoreService.java @@ -40,9 +40,7 @@ public class StoreService { panelStoreMapper.deleteByExample(panelStoreExample); } - /*public void remove(Long storeId) { - panelStoreMapper.deleteByPrimaryKey(storeId); - }*/ + /** * 按照当前用户ID查询收藏仪表板 diff --git a/backend/src/main/java/io/dataease/service/sys/DeptService.java b/backend/src/main/java/io/dataease/service/sys/DeptService.java index 7eb30ae7c8..a0d0001a08 100644 --- a/backend/src/main/java/io/dataease/service/sys/DeptService.java +++ b/backend/src/main/java/io/dataease/service/sys/DeptService.java @@ -79,8 +79,6 @@ public class DeptService { @Transactional public int batchDelete(List requests){ - /* Integer index = ids.stream().map(sysDeptMapper::deleteByPrimaryKey).reduce(Integer::sum).orElse(-1); - return index;*/ List ids = requests.stream().map(request -> { Long pid = request.getPid(); if (pid != DEPT_ROOT_PID){ @@ -127,7 +125,6 @@ public class DeptService { public List nodesTreeByCondition(BaseGridRequest request){ - //DeptService proxy = proxy(); List allNodes = allNodes(); List targetNodes = nodeByCondition(request); if(CollectionUtils.isEmpty(targetNodes)){ diff --git a/backend/src/main/java/io/dataease/service/sys/PluginService.java b/backend/src/main/java/io/dataease/service/sys/PluginService.java index 880a5df0c9..f38d1f57f6 100644 --- a/backend/src/main/java/io/dataease/service/sys/PluginService.java +++ b/backend/src/main/java/io/dataease/service/sys/PluginService.java @@ -105,9 +105,6 @@ public class PluginService { DeFileUtils.deleteFile(folder); } - //mybatisLoader.loadMybatis(myPlugin); - //5.写表到my_plugin - // myPlugin.setPluginId(0L); return null; } @@ -118,15 +115,7 @@ public class PluginService { - /*private String makeTargetDir(MyPlugin myPlugin) { - String name = myPlugin.getName(); - String dir = pluginDir + name + "/" + myPlugin.getVersion() + "/"; - File fileDir = new File(dir); - if (!fileDir.exists()) { - fileDir.mkdirs(); - } - return dir; - }*/ + private String makeTargetDir(MyPlugin myPlugin) { String store = myPlugin.getStore(); String dir = pluginDir + store + "/"; diff --git a/backend/src/main/java/io/dataease/service/sys/SysRoleService.java b/backend/src/main/java/io/dataease/service/sys/SysRoleService.java index 3747055c9c..39ca36e1c4 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysRoleService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysRoleService.java @@ -1,86 +1,32 @@ package io.dataease.service.sys; -/*import io.dataease.base.domain.SysRole; -import io.dataease.base.domain.SysUsersRolesExample; -import io.dataease.base.mapper.SysRoleMapper; -import io.dataease.base.mapper.SysUsersRolesMapper;*/ import io.dataease.base.domain.SysRole; import io.dataease.base.mapper.ext.ExtSysRoleMapper; -/*import io.dataease.controller.sys.base.BaseGridRequest; -import io.dataease.controller.sys.request.RoleMenusRequest;*/ + import io.dataease.controller.sys.base.BaseGridRequest; import io.dataease.controller.sys.response.RoleUserItem; import org.springframework.stereotype.Service; -/*import org.springframework.transaction.annotation.Transactional;*/ import javax.annotation.Resource; -/*import java.util.HashMap;*/ import java.util.List; -/*import java.util.Map; -import java.util.stream.Collectors;*/ + @Service public class SysRoleService { - /*@Resource - private SysRoleMapper mapper;*/ + @Resource private ExtSysRoleMapper extSysRoleMapper; - /*@Resource - private SysUsersRolesMapper sysUsersRolesMapper;*/ - - - /*public int add(SysRole role){ - Long now = System.currentTimeMillis(); - role.setCreateTime(now); - role.setUpdateTime(now); - return mapper.insert(role); - } - - - public int update(SysRole role){ - Long now = System.currentTimeMillis(); - role.setUpdateTime(now); - return mapper.updateByPrimaryKey(role); - } - - @Transactional - public int delete(Long roleId){ - SysUsersRolesExample example = new SysUsersRolesExample(); - example.createCriteria().andRoleIdEqualTo(roleId); - sysUsersRolesMapper.deleteByExample(example);//删除用户角色关联关系 - extSysRoleMapper.deleteRoleMenu(roleId);//删除菜单角色关联关系 - return mapper.deleteByPrimaryKey(roleId); - } - - */ public List query(BaseGridRequest request){ List result = extSysRoleMapper.query(request.convertExample()); return result; } - /* - public List menuIds(Long roleId){ - return extSysRoleMapper.menuIds(roleId); - } - - - @Transactional - public int batchSaveRolesMenus(RoleMenusRequest request){ - extSysRoleMapper.deleteRoleMenu(request.getRoleId()); - List> maps = request.getMenuIds().stream().map(menuId -> { - Map map = new HashMap<>(); - map.put("roleId", request.getRoleId()); - map.put("menuId", menuId); - return map; - }).collect(Collectors.toList()); - return extSysRoleMapper.batchInsertRoleMenu(maps); - }*/ public List allRoles(){ return extSysRoleMapper.queryAll(); diff --git a/backend/src/main/java/io/dataease/service/sys/SysUserService.java b/backend/src/main/java/io/dataease/service/sys/SysUserService.java index e98ca355f5..fc250894ab 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -41,7 +41,6 @@ import java.util.stream.Collectors; @Service public class SysUserService { - //private final static String DEFAULT_PWD = "DataEase123.."; @Value("${dataease.init_password:DataEase123..}") private String DEFAULT_PWD; @@ -57,25 +56,11 @@ public class SysUserService { public List query(BaseGridRequest request) { - /* List sysUsers = sysUserMapper.selectByExample(new SysUserExample()); - List lists = sysUsers.stream().map(ele -> { - SysUserGridResponse response = new SysUserGridResponse(); - BeanUtils.copyBean(response, ele); - return response; - }).collect(Collectors.toList());*/ + GridExample gridExample = request.convertExample(); List lists = extSysUserMapper.query(gridExample); lists.forEach(item -> { - /*for (SysUserGridResponse response : query) { - if (item.getUserId().equals(response.getUserId())) { - item.setId(response.getId()); - List roles = response.getRoles(); - item.setRoles(roles); - List roleIds = roles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); - item.setRoleIds(roleIds); - item.setDept(response.getDept()); - } - }*/ + List roles = item.getRoles(); List roleIds = roles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); item.setRoleIds(roleIds); diff --git a/backend/src/main/java/io/dataease/service/system/EmailService.java b/backend/src/main/java/io/dataease/service/system/EmailService.java new file mode 100644 index 0000000000..5dcf384616 --- /dev/null +++ b/backend/src/main/java/io/dataease/service/system/EmailService.java @@ -0,0 +1,197 @@ +package io.dataease.service.system; + +import io.dataease.base.domain.SystemParameter; +import io.dataease.base.domain.SystemParameterExample; +import io.dataease.base.mapper.SystemParameterMapper; +import io.dataease.commons.constants.ParamConstants; +import io.dataease.commons.exception.DEException; +import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.commons.utils.EncryptUtils; +import io.dataease.commons.utils.LogUtil; +import io.dataease.controller.sys.response.MailInfo; +import io.dataease.i18n.Translator; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.util.HashMap; +import java.util.List; +import java.util.Properties; + + +@Service +public class EmailService { + + private static final String SSL_CLASS_KEY = "mail.smtp.socketFactory.class"; + + private static final String SSL_CLASS_VAL = "javax.net.ssl.SSLSocketFactory"; + + private static final String TLS_PROP_KEY = "mail.smtp.starttls.enable"; + + private static final String SMTP_TIMEOUT_KEY = "mail.smtp.timeout"; + + private static final String SMTP_TIMEOUT_VAL = "30000"; + + private static final String SMTP_CONNECTIONTIMEOUT_KEY = "mail.smtp.connectiontimeout"; + + private static final String SMTP_CONNECTIONTIMEOUT_VAL = "5000"; + + + + @Resource + private SystemParameterMapper systemParameterMapper; + + /** + * + * @param to 收件人 + * @param title 标题 + * @param content 内容 + */ + public void send(String to, String title, String content) { + if (StringUtils.isBlank(to)) return ; + MailInfo mailInfo = proxy().mailInfo(); + JavaMailSenderImpl driver = driver(mailInfo); + + MimeMessage mimeMessage = driver.createMimeMessage(); + MimeMessageHelper helper = null; + try { + helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(driver.getUsername()); + helper.setSubject(title ); + helper.setText(content, true); + helper.setTo(to); + driver.send(mimeMessage); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(Translator.get("connection_failed")); + } + } + + public JavaMailSenderImpl driver(MailInfo mailInfo) { + JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); + javaMailSender.setDefaultEncoding("UTF-8"); + javaMailSender.setHost(mailInfo.getHost()); + javaMailSender.setPort(Integer.valueOf(mailInfo.getPort())); + javaMailSender.setUsername(mailInfo.getAccount()); + javaMailSender.setPassword(mailInfo.getPassword()); + Properties props = new Properties(); + if (BooleanUtils.toBoolean(mailInfo.getSsl())) { + props.put(SSL_CLASS_KEY, SSL_CLASS_VAL); + } + if (BooleanUtils.toBoolean(mailInfo.getTls())) { + props.put(TLS_PROP_KEY, "true"); + } + props.put(SMTP_TIMEOUT_KEY, SMTP_TIMEOUT_VAL); + props.put(SMTP_CONNECTIONTIMEOUT_KEY, SMTP_CONNECTIONTIMEOUT_VAL); + javaMailSender.setJavaMailProperties(props); + return javaMailSender; + } + + private EmailService proxy() { + return CommonBeanFactory.getBean(EmailService.class); + } + + + public MailInfo mailInfo() { + String type = ParamConstants.Classify.MAIL.getValue(); + List paramList = getParamList(type); + MailInfo mailInfo = new MailInfo(); + if (!CollectionUtils.isEmpty(paramList)) { + for (SystemParameter param : paramList) { + if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.SERVER.getValue())) { + mailInfo.setHost(param.getParamValue()); + } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.PORT.getValue())) { + mailInfo.setPort(param.getParamValue()); + } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.ACCOUNT.getValue())) { + mailInfo.setAccount(param.getParamValue()); + } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.PASSWORD.getValue())) { + String password = EncryptUtils.aesDecrypt(param.getParamValue()).toString(); + mailInfo.setPassword(password); + } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.SSL.getValue())) { + mailInfo.setSsl(param.getParamValue()); + } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.TLS.getValue())) { + mailInfo.setTls(param.getParamValue()); + } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.RECIPIENTS.getValue())) { + mailInfo.setRecipient(param.getParamValue()); + } + } + } + return mailInfo; + } + + + public List getParamList(String type) { + SystemParameterExample example = new SystemParameterExample(); + example.createCriteria().andParamKeyLike(type + "%"); + return systemParameterMapper.selectByExample(example); + } + + + public void editMail(List parameters) { + parameters.forEach(parameter -> { + SystemParameterExample example = new SystemParameterExample(); + if (parameter.getParamKey().equals(ParamConstants.MAIL.PASSWORD.getValue())) { + if (!StringUtils.isBlank(parameter.getParamValue())) { + String string = EncryptUtils.aesEncrypt(parameter.getParamValue()).toString(); + parameter.setParamValue(string); + } + } + example.createCriteria().andParamKeyEqualTo(parameter.getParamKey()); + if (systemParameterMapper.countByExample(example) > 0) { + systemParameterMapper.updateByPrimaryKey(parameter); + } else { + systemParameterMapper.insert(parameter); + } + example.clear(); + + }); + } + + public void testConnection(HashMap hashMap) { + JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); + javaMailSender.setDefaultEncoding("UTF-8"); + javaMailSender.setHost(hashMap.get(ParamConstants.MAIL.SERVER.getValue())); + javaMailSender.setPort(Integer.valueOf(hashMap.get(ParamConstants.MAIL.PORT.getValue()))); + javaMailSender.setUsername(hashMap.get(ParamConstants.MAIL.ACCOUNT.getValue())); + javaMailSender.setPassword(hashMap.get(ParamConstants.MAIL.PASSWORD.getValue())); + Properties props = new Properties(); + String recipients = hashMap.get(ParamConstants.MAIL.RECIPIENTS.getValue()); + if (BooleanUtils.toBoolean(hashMap.get(ParamConstants.MAIL.SSL.getValue()))) { + props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + } + if (BooleanUtils.toBoolean(hashMap.get(ParamConstants.MAIL.TLS.getValue()))) { + props.put("mail.smtp.starttls.enable", "true"); + } + props.put("mail.smtp.timeout", "30000"); + props.put("mail.smtp.connectiontimeout", "5000"); + javaMailSender.setJavaMailProperties(props); + try { + javaMailSender.testConnection(); + } catch (MessagingException e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(Translator.get("connection_failed")); + } + if(!StringUtils.isBlank(recipients)){ + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper helper = null; + try { + helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(javaMailSender.getUsername()); + helper.setSubject("DataEase测试邮件 " ); + helper.setText("这是一封测试邮件,邮件发送成功", true); + helper.setTo(recipients); + javaMailSender.send(mimeMessage); + } catch (MessagingException e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(Translator.get("connection_failed")); + } + } + + + } +} diff --git a/backend/src/main/java/io/dataease/service/system/SystemParameterService.java b/backend/src/main/java/io/dataease/service/system/SystemParameterService.java index 0e3c77a4bc..8660ae17c5 100644 --- a/backend/src/main/java/io/dataease/service/system/SystemParameterService.java +++ b/backend/src/main/java/io/dataease/service/system/SystemParameterService.java @@ -9,24 +9,16 @@ import io.dataease.commons.constants.ParamConstants; import io.dataease.commons.exception.DEException; import io.dataease.commons.utils.BeanUtils; import io.dataease.commons.utils.EncryptUtils; -import io.dataease.commons.utils.LogUtil; import io.dataease.controller.sys.response.BasicInfo; -import io.dataease.controller.sys.response.MailInfo; import io.dataease.dto.SystemParameterDTO; -import io.dataease.i18n.Translator; import io.dataease.service.FileService; import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; -import org.springframework.mail.javamail.JavaMailSenderImpl; -import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.imageio.ImageIO; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; import java.io.IOException; import java.io.InputStream; import java.util.*; @@ -43,7 +35,6 @@ public class SystemParameterService { @Resource private FileService fileService; - public String searchEmail() { return extSystemParameterMapper.email(); } @@ -54,11 +45,9 @@ public class SystemParameterService { if (!CollectionUtils.isEmpty(paramList)) { for (SystemParameter param : paramList) { if (StringUtils.equals(param.getParamKey(), ParamConstants.BASIC.FRONT_TIME_OUT.getValue())) { - /* result.setFrontTimeOut(StringUtils.isBlank(param.getParamValue()) ? 0 : Integer.parseInt(param.getParamValue())); */ result.setFrontTimeOut(param.getParamValue()); } if (StringUtils.equals(param.getParamKey(), ParamConstants.BASIC.MSG_TIME_OUT.getValue())) { - /* result.setMsgTimeOut(StringUtils.isBlank(param.getParamValue()) ? 0 : Integer.parseInt(param.getParamValue())); */ result.setMsgTimeOut(param.getParamValue()); } } @@ -66,34 +55,6 @@ public class SystemParameterService { return result; } - - public MailInfo mailInfo(String type) { - List paramList = this.getParamList(type); - MailInfo mailInfo = new MailInfo(); - if (!CollectionUtils.isEmpty(paramList)) { - for (SystemParameter param : paramList) { - if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.SERVER.getValue())) { - mailInfo.setHost(param.getParamValue()); - } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.PORT.getValue())) { - mailInfo.setPort(param.getParamValue()); - } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.ACCOUNT.getValue())) { - mailInfo.setAccount(param.getParamValue()); - } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.PASSWORD.getValue())) { - String password = EncryptUtils.aesDecrypt(param.getParamValue()).toString(); - mailInfo.setPassword(password); - } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.SSL.getValue())) { - mailInfo.setSsl(param.getParamValue()); - } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.TLS.getValue())) { - mailInfo.setTls(param.getParamValue()); - } else if (StringUtils.equals(param.getParamKey(), ParamConstants.MAIL.RECIPIENTS.getValue())) { - mailInfo.setRecipient(param.getParamValue()); - } - } - } - return mailInfo; - } - - public String getSystemLanguage() { String result = StringUtils.EMPTY; SystemParameterExample example = new SystemParameterExample(); @@ -108,31 +69,6 @@ public class SystemParameterService { return result; } - - - public void editMail(List parameters) { - List paramList = this.getParamList(ParamConstants.Classify.MAIL.getValue()); - boolean empty = paramList.size() <= 0; - - parameters.forEach(parameter -> { - SystemParameterExample example = new SystemParameterExample(); - if (parameter.getParamKey().equals(ParamConstants.MAIL.PASSWORD.getValue())) { - if (!StringUtils.isBlank(parameter.getParamValue())) { - String string = EncryptUtils.aesEncrypt(parameter.getParamValue()).toString(); - parameter.setParamValue(string); - } - } - example.createCriteria().andParamKeyEqualTo(parameter.getParamKey()); - if (systemParameterMapper.countByExample(example) > 0) { - systemParameterMapper.updateByPrimaryKey(parameter); - } else { - systemParameterMapper.insert(parameter); - } - example.clear(); - - }); - } - public void editBasic(List parameters) { parameters.forEach(parameter -> { SystemParameterExample example = new SystemParameterExample(); @@ -154,55 +90,10 @@ public class SystemParameterService { return systemParameterMapper.selectByExample(example); } - public void testConnection(HashMap hashMap) { - JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); - javaMailSender.setDefaultEncoding("UTF-8"); - javaMailSender.setHost(hashMap.get(ParamConstants.MAIL.SERVER.getValue())); - javaMailSender.setPort(Integer.valueOf(hashMap.get(ParamConstants.MAIL.PORT.getValue()))); - javaMailSender.setUsername(hashMap.get(ParamConstants.MAIL.ACCOUNT.getValue())); - javaMailSender.setPassword(hashMap.get(ParamConstants.MAIL.PASSWORD.getValue())); - Properties props = new Properties(); - String recipients = hashMap.get(ParamConstants.MAIL.RECIPIENTS.getValue()); - if (BooleanUtils.toBoolean(hashMap.get(ParamConstants.MAIL.SSL.getValue()))) { - props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - } - if (BooleanUtils.toBoolean(hashMap.get(ParamConstants.MAIL.TLS.getValue()))) { - props.put("mail.smtp.starttls.enable", "true"); - } - props.put("mail.smtp.timeout", "30000"); - props.put("mail.smtp.connectiontimeout", "5000"); - javaMailSender.setJavaMailProperties(props); - try { - javaMailSender.testConnection(); - } catch (MessagingException e) { - LogUtil.error(e.getMessage(), e); - DEException.throwException(Translator.get("connection_failed")); - } - if(!StringUtils.isBlank(recipients)){ - MimeMessage mimeMessage = javaMailSender.createMimeMessage(); - MimeMessageHelper helper = null; - try { - helper = new MimeMessageHelper(mimeMessage, true); - helper.setFrom(javaMailSender.getUsername()); - helper.setSubject("DataEase测试邮件 " ); - helper.setText("这是一封测试邮件,邮件发送成功", true); - helper.setTo(recipients); - javaMailSender.send(mimeMessage); - } catch (MessagingException e) { - LogUtil.error(e.getMessage(), e); - DEException.throwException(Translator.get("connection_failed")); - } - } - - - } - public String getVersion() { return System.getenv("MS_VERSION"); } - - public void saveLdap(List parameters) { SystemParameterExample example = new SystemParameterExample(); parameters.forEach(param -> { @@ -228,7 +119,6 @@ public class SystemParameterService { return param.getParamValue(); } - public List getSystemParameterInfo(String paramConstantsType) { List paramList = this.getParamList(paramConstantsType); List dtoList = new ArrayList<>(); @@ -247,8 +137,6 @@ public class SystemParameterService { return dtoList; } - - public void saveUIInfo(Map> request, List bodyFiles) throws IOException { List parameters = request.get("systemParams"); if (null != bodyFiles) @@ -293,9 +181,5 @@ public class SystemParameterService { } - /* public static void main(String[] args) { - String info="[{\"paramKey\":\"base.url\",\"paramValue\":null,\"type\":\"text\",\"sort\":1,\"file\":null,\"fileName\":null},{\"paramKey\":\"base.title\",\"paramValue\":\"DataEase Title\",\"type\":\"text\",\"sort\":3,\"file\":null,\"fileName\":null},{\"paramKey\":\"base.logo\",\"paramValue\":\"DataEase\",\"type\":\"text\",\"sort\":4,\"file\":null,\"fileName\":\"favicon.icon.png\"}]"; - List temp = JSON.parseArray(info,SystemParameterDTO.class); -// System.out.println("===>"); - } */ + } diff --git a/backend/src/main/java/io/dataease/websocket/ServerEndpointConfigurator.java b/backend/src/main/java/io/dataease/websocket/ServerEndpointConfigurator.java index a8856212b9..4f724135e7 100644 --- a/backend/src/main/java/io/dataease/websocket/ServerEndpointConfigurator.java +++ b/backend/src/main/java/io/dataease/websocket/ServerEndpointConfigurator.java @@ -8,9 +8,7 @@ import javax.websocket.server.ServerEndpointConfig; public class ServerEndpointConfigurator extends ServerEndpointConfig.Configurator { @Override public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { - // 将用户信息存储到socket的配置里 -// System.out.println(SessionUtils.getUser()); -// sec.getUserProperties().put("user", SessionUtils.getUser()); + super.modifyHandshake(sec, request, response); } } diff --git a/backend/src/main/java/io/dataease/websocket/WebSocketServer.java b/backend/src/main/java/io/dataease/websocket/WebSocketServer.java index b8683b4aee..84a992302e 100644 --- a/backend/src/main/java/io/dataease/websocket/WebSocketServer.java +++ b/backend/src/main/java/io/dataease/websocket/WebSocketServer.java @@ -11,27 +11,21 @@ import java.io.IOException; public class WebSocketServer { @OnOpen public void onOpen(Session session) throws IOException { - // Get session and WebSocket connection -// System.out.println("open: " + session.isOpen()); -// System.out.println("open: " + SessionUtils.getUser()); -// System.out.println("open: " + session.getUserProperties().get("user")); + } @OnMessage public void onMessage(Session session, String message) throws IOException { - // Handle new messages -// System.out.println(message); + } @OnClose public void onClose(Session session) throws IOException { - // WebSocket connection closes -// System.out.println("close: " + session.isOpen()); + } @OnError public void onError(Session session, Throwable throwable) { - // Do error handling here throwable.printStackTrace(); } } diff --git a/backend/src/main/resources/db/migration/V28__de1.5.sql b/backend/src/main/resources/db/migration/V28__de1.5.sql new file mode 100644 index 0000000000..d2f69225f7 --- /dev/null +++ b/backend/src/main/resources/db/migration/V28__de1.5.sql @@ -0,0 +1,29 @@ +-- ---------------------------- +-- 新增我分享出去的功能 +-- ---------------------------- +ALTER TABLE `dataease`.`panel_share` +ADD COLUMN `granter` varchar(255) NULL COMMENT '分享人' AFTER `target_id`; + + + + +-- ---------------------------- +-- Table structure for panel_link_mapping +-- ---------------------------- +DROP TABLE IF EXISTS `panel_link_mapping`; +CREATE TABLE `panel_link_mapping` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `resource_id` varchar(255) DEFAULT NULL COMMENT '仪表板ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + + +-- ---------------------------- +-- 策略模式优化发送消息 +-- ---------------------------- +ALTER TABLE `dataease`.`sys_msg_channel` +ADD COLUMN `service_name` varchar(255) NULL COMMENT '策略名称' AFTER `channel_name`; + + +UPDATE `dataease`.`sys_msg_channel` SET `service_name` = 'sendStation' WHERE `msg_channel_id` = 1; +INSERT INTO `dataease`.`sys_msg_channel`(`msg_channel_id`, `channel_name`, `service_name`) VALUES (2, 'webmsg.channel_email_msg', 'sendEmail'); diff --git a/backend/src/main/resources/db/migration/V2__dataease_ddl.sql b/backend/src/main/resources/db/migration/V2__dataease_ddl.sql index c0d973e7e5..a288556c43 100644 --- a/backend/src/main/resources/db/migration/V2__dataease_ddl.sql +++ b/backend/src/main/resources/db/migration/V2__dataease_ddl.sql @@ -25,16 +25,6 @@ CREATE TABLE IF NOT EXISTS `system_parameter` ( )ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; -/*CREATE TABLE IF NOT EXISTS `user_role` ( - `id` varchar(50) NOT NULL COMMENT 'ID of user''s role info', - `user_id` varchar(50) NOT NULL COMMENT 'User ID of this user-role info', - `role_id` varchar(50) NOT NULL COMMENT 'Role ID of this user-role info', - `source_id` varchar(50) DEFAULT NULL COMMENT 'The (system|organization|workspace) ID of this user-role info', - `create_time` bigint(13) NOT NULL COMMENT 'Create timestamp', - `update_time` bigint(13) NOT NULL COMMENT 'Update timestamp', - PRIMARY KEY (`id`) -)ENGINE = InnoDB -DEFAULT CHARSET = utf8mb4;*/ CREATE TABLE `datasource` ( `id` varchar(50) NOT NULL DEFAULT '' COMMENT 'ID', diff --git a/backend/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml index 9cbceb1e76..f2ff9643f9 100644 --- a/backend/src/main/resources/generatorConfig.xml +++ b/backend/src/main/resources/generatorConfig.xml @@ -65,22 +65,7 @@ - - - - - - - - - - - - - - - - +
diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index 1a7a60cf2d..087e57e5cc 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -279,6 +279,7 @@ i18n_msg_type_dataset_sync_success=Dataset synchronization successful i18n_msg_type_dataset_sync_faild=Dataset synchronization failed i18n_data_not_sync=Please sync data first i18n_excel_colume_change=The column name of Excel is inconsistent with the original data set +i18n_excel_colume_inconsistent=The column names of the selected sheet pages are inconsistent i18n_timed_task=Timed Task i18n_datasource_connect_error=Data source connection exception: i18n_check_sql_error=Check incremental SQL exception, diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 8be33cb6ea..a38b6337cc 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -278,6 +278,7 @@ i18n_msg_type_dataset_sync_success=数据集同步成功 i18n_msg_type_dataset_sync_faild=数据集同步失败 i18n_data_not_sync=请先完成数据同步 i18n_excel_colume_change=Excel的列名与原数据集不一致 +i18n_excel_colume_inconsistent=所选sheet页面的列名不一致 i18n_timed_task=定时任务 i18n_datasource_connect_error=数据源连接异常: i18n_check_sql_error=校验增量 SQL 异常, diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 2fe6ca5c5b..e3f8095a6c 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -281,6 +281,7 @@ i18n_msg_type_dataset_sync_success=數據集同步成功 i18n_msg_type_dataset_sync_faild=數據集同步失敗 i18n_data_not_sync=請先完成數據同步 i18n_excel_colume_change=Excel的列名與原數據集不一致 +i18n_excel_colume_inconsistent=所選sheet頁面的列名不一致 i18n_timed_task=定時任務 i18n_datasource_connect_error=數據源連接異常: i18n_check_sql_error=校驗增量SQL異常, diff --git a/drivers/hive-classification-3.1.2.jar b/drivers/hive-classification-3.1.2.jar new file mode 100644 index 0000000000..6202527535 Binary files /dev/null and b/drivers/hive-classification-3.1.2.jar differ diff --git a/drivers/hive-common-3.1.2.jar b/drivers/hive-common-3.1.2.jar new file mode 100644 index 0000000000..f51e9878c3 Binary files /dev/null and b/drivers/hive-common-3.1.2.jar differ diff --git a/drivers/hive-jdbc-3.1.2.jar b/drivers/hive-jdbc-3.1.2.jar new file mode 100644 index 0000000000..32f8ff7285 Binary files /dev/null and b/drivers/hive-jdbc-3.1.2.jar differ diff --git a/drivers/hive-llap-client-3.1.2.jar b/drivers/hive-llap-client-3.1.2.jar new file mode 100644 index 0000000000..30892ab5ec Binary files /dev/null and b/drivers/hive-llap-client-3.1.2.jar differ diff --git a/drivers/hive-llap-common-3.1.2-tests.jar b/drivers/hive-llap-common-3.1.2-tests.jar new file mode 100644 index 0000000000..1b0289e968 Binary files /dev/null and b/drivers/hive-llap-common-3.1.2-tests.jar differ diff --git a/drivers/hive-llap-common-3.1.2.jar b/drivers/hive-llap-common-3.1.2.jar new file mode 100644 index 0000000000..4c7af956ef Binary files /dev/null and b/drivers/hive-llap-common-3.1.2.jar differ diff --git a/drivers/hive-llap-server-3.1.2.jar b/drivers/hive-llap-server-3.1.2.jar new file mode 100644 index 0000000000..8fc308935c Binary files /dev/null and b/drivers/hive-llap-server-3.1.2.jar differ diff --git a/drivers/hive-llap-tez-3.1.2.jar b/drivers/hive-llap-tez-3.1.2.jar new file mode 100644 index 0000000000..e92adab512 Binary files /dev/null and b/drivers/hive-llap-tez-3.1.2.jar differ diff --git a/drivers/hive-metastore-3.1.2.jar b/drivers/hive-metastore-3.1.2.jar new file mode 100644 index 0000000000..4ab0b87eeb Binary files /dev/null and b/drivers/hive-metastore-3.1.2.jar differ diff --git a/drivers/hive-serde-3.1.2.jar b/drivers/hive-serde-3.1.2.jar new file mode 100644 index 0000000000..d3e5ffe58c Binary files /dev/null and b/drivers/hive-serde-3.1.2.jar differ diff --git a/drivers/hive-service-3.1.2.jar b/drivers/hive-service-3.1.2.jar new file mode 100644 index 0000000000..aae921fae6 Binary files /dev/null and b/drivers/hive-service-3.1.2.jar differ diff --git a/drivers/hive-service-rpc-3.1.2.jar b/drivers/hive-service-rpc-3.1.2.jar new file mode 100644 index 0000000000..44ec61b074 Binary files /dev/null and b/drivers/hive-service-rpc-3.1.2.jar differ diff --git a/drivers/hive-shims-0.23-3.1.2.jar b/drivers/hive-shims-0.23-3.1.2.jar new file mode 100644 index 0000000000..8b365ec457 Binary files /dev/null and b/drivers/hive-shims-0.23-3.1.2.jar differ diff --git a/drivers/hive-shims-3.1.2.jar b/drivers/hive-shims-3.1.2.jar new file mode 100644 index 0000000000..a2730756da Binary files /dev/null and b/drivers/hive-shims-3.1.2.jar differ diff --git a/drivers/hive-shims-common-3.1.2.jar b/drivers/hive-shims-common-3.1.2.jar new file mode 100644 index 0000000000..e06ef90916 Binary files /dev/null and b/drivers/hive-shims-common-3.1.2.jar differ diff --git a/drivers/hive-shims-scheduler-3.1.2.jar b/drivers/hive-shims-scheduler-3.1.2.jar new file mode 100644 index 0000000000..c8093e1d67 Binary files /dev/null and b/drivers/hive-shims-scheduler-3.1.2.jar differ diff --git a/drivers/hive-standalone-metastore-3.1.2.jar b/drivers/hive-standalone-metastore-3.1.2.jar new file mode 100644 index 0000000000..350ca10c86 Binary files /dev/null and b/drivers/hive-standalone-metastore-3.1.2.jar differ diff --git a/drivers/hive-storage-api-2.7.0.jar b/drivers/hive-storage-api-2.7.0.jar new file mode 100644 index 0000000000..5999cd909c Binary files /dev/null and b/drivers/hive-storage-api-2.7.0.jar differ diff --git a/drivers/hive-upgrade-acid-3.1.2.jar b/drivers/hive-upgrade-acid-3.1.2.jar new file mode 100644 index 0000000000..f63e67bb46 Binary files /dev/null and b/drivers/hive-upgrade-acid-3.1.2.jar differ diff --git a/drivers/libfb303-0.9.3.jar b/drivers/libfb303-0.9.3.jar new file mode 100644 index 0000000000..07c711b738 Binary files /dev/null and b/drivers/libfb303-0.9.3.jar differ diff --git a/drivers/libthrift-0.9.3.jar b/drivers/libthrift-0.9.3.jar new file mode 100644 index 0000000000..f9221a9f95 Binary files /dev/null and b/drivers/libthrift-0.9.3.jar differ diff --git a/frontend/package.json b/frontend/package.json index 0d9599f1d4..c40395ad4f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -42,6 +42,7 @@ "tinymce": "^5.8.2", "umy-ui": "^1.1.6", "vcolorpicker": "^1.1.0", + "videojs-flash": "^2.2.1", "vue": "2.6.10", "vue-axios": "3.2.4", "vue-clipboard2": "0.3.1", diff --git a/frontend/public/fonts/element-icons.ttf b/frontend/public/fonts/element-icons.ttf new file mode 100644 index 0000000000..91b74de367 Binary files /dev/null and b/frontend/public/fonts/element-icons.ttf differ diff --git a/frontend/public/fonts/element-icons.woff b/frontend/public/fonts/element-icons.woff new file mode 100644 index 0000000000..02b9a2539e Binary files /dev/null and b/frontend/public/fonts/element-icons.woff differ diff --git a/frontend/src/api/chart/chart.js b/frontend/src/api/chart/chart.js index 08e9df093c..5c3f7821f7 100644 --- a/frontend/src/api/chart/chart.js +++ b/frontend/src/api/chart/chart.js @@ -52,3 +52,11 @@ export function searchAdviceSceneId(panelId) { loading: true }) } + +export function checkSameDataSet(viewIdSource, viewIdTarget) { + return request({ + url: '/chart/view/checkSameDataSet/' + viewIdSource + '/' + viewIdTarget, + method: 'get', + loading: false + }) +} diff --git a/frontend/src/api/panel/share.js b/frontend/src/api/panel/share.js index 61c808b476..4382805c70 100644 --- a/frontend/src/api/panel/share.js +++ b/frontend/src/api/panel/share.js @@ -1,12 +1,29 @@ import request from '@/utils/request' -export function saveShare(data) { +/* export function saveShare(data) { return request({ url: '/api/share/', method: 'post', loading: true, data }) +} */ + +export function shareTargets(panelId) { + return request({ + url: '/api/share/queryTargets/' + panelId, + method: 'post', + loading: true + }) +} + +export function removeShares(data) { + return request({ + url: '/api/share/removeShares/', + method: 'post', + loading: true, + data + }) } export function loadShares(data) { @@ -27,6 +44,14 @@ export function loadTree(data) { }) } +export function loadShareOutTree() { + return request({ + url: '/api/share/shareOut', + method: 'post', + loading: true + }) +} + export function fineSave(data) { return request({ url: '/api/share/fineSave', diff --git a/frontend/src/components/AsyncComponent/index.vue b/frontend/src/components/AsyncComponent/index.vue index 114f3c9862..28e60641ed 100644 --- a/frontend/src/components/AsyncComponent/index.vue +++ b/frontend/src/components/AsyncComponent/index.vue @@ -45,8 +45,13 @@ export default { } else { res = await window.SyncComponentCache[this.url] } + const Fn = Function this.mode = new Fn(`return ${res.data || res}`)() + /* if (res && res.data) { + const Fn = Function + this.mode = new Fn(`return ${res.data || res}`)() + } */ } } }, diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index c0277b3f58..49adf6b611 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -3,14 +3,12 @@ :style="style" :class="[ { - [classNameActive]: enabled , [classNameDragging]: dragging, [classNameResizing]: resizing, [classNameDraggable]: draggable, [classNameResizable]: resizable, [classNameRotating]: rotating, [classNameRotatable]: rotatable, - [classNameMouseOn]: mouseOn || active, ['linkageSetting']:linkageActive, ['positionChange']:!(dragging || resizing||rotating) }, @@ -21,19 +19,28 @@ @mouseenter="enter" @mouseleave="leave" > - -
- -
-
+ +
+
+ +
@@ -437,6 +444,7 @@ export default { style() { // console.log('style-top:' + this.y + '--' + this.top) return { + padding: this.curGap + 'px', transform: `translate(${this.left}px, ${this.top}px) rotate(${this.rotate}deg)`, width: this.computedWidth, height: this.computedHeight, @@ -486,9 +494,9 @@ export default { } if (this.element.auxiliaryMatrix) { const width = Math.round(this.width / this.curCanvasScale.matrixStyleWidth) * this.curCanvasScale.matrixStyleWidth - return width + 'px' + return (width - this.curGap * 2) + 'px' } else { - return this.width + 'px' + return (this.width - this.curGap * 2) + 'px' } }, // 根据top bottom 算出元素的宽度 @@ -500,9 +508,9 @@ export default { } if (this.element.auxiliaryMatrix) { const height = Math.round(this.height / this.curCanvasScale.matrixStyleHeight) * this.curCanvasScale.matrixStyleHeight - return height + 'px' + return (height - this.curGap * 2) + 'px' } else { - return this.height + 'px' + return (this.height - this.curGap * 2) + 'px' } }, @@ -518,11 +526,15 @@ export default { curComponent() { return this.$store.state.curComponent }, + curGap() { + return this.canvasStyleData.panel.gap === 'yes' && this.element.auxiliaryMatrix ? this.componentGap : 0 + }, ...mapState([ 'editor', 'curCanvasScale', 'canvasStyleData', - 'linkageSettingStatus' + 'linkageSettingStatus', + 'componentGap' ]) }, watch: { @@ -1792,6 +1804,11 @@ export default { padding:5px; } +.de-drag-active{ + outline: 1px solid #70c0ff; + user-select: none; +} + /*.mouseOn >>> .icon-shezhi{*/ /* z-index: 2;*/ /* display:block!important;*/ diff --git a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue index 3d0b764a8e..84acd7331f 100644 --- a/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/Editor/ComponentWrapper.vue @@ -1,7 +1,6 @@