diff --git a/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java b/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java index 022180c4b3..78ff0a82f2 100644 --- a/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/F2CDocFilter.java @@ -1,26 +1,99 @@ package io.dataease.auth.filter; -import org.apache.shiro.web.filter.authc.AnonymousFilter; +import cn.hutool.core.util.ArrayUtil; +import io.dataease.auth.entity.SysUserEntity; +import io.dataease.auth.entity.TokenInfo; +import io.dataease.auth.service.AuthUserService; +import io.dataease.auth.util.JWTUtils; +import io.dataease.commons.license.DefaultLicenseService; +import io.dataease.commons.license.F2CLicenseResponse; +import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.commons.utils.LogUtil; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.web.filter.AccessControlFilter; -import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; -import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; + +import static io.dataease.commons.license.F2CLicenseResponse.Status; + +public class F2CDocFilter extends AccessControlFilter { + + private static final String RESULT_URI_KEY = "result_uri_key"; + private static final String NOLIC_PAGE = "nolic.html"; + private static final String NO_LOGIN_PAGE = "/nologin.html"; + private static final String DEFAULT_FAILED_PAGE = "/"; -public class F2CDocFilter extends AnonymousFilter { @Override - protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) { - HttpServletRequest req = (HttpServletRequest) request; - String path = "/deApi"; + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { + HttpServletRequest request = (HttpServletRequest) servletRequest; try { - req.getRequestDispatcher(path).forward(req, response); - } catch (ServletException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); + DefaultLicenseService defaultLicenseService = CommonBeanFactory.getBean(DefaultLicenseService.class); + F2CLicenseResponse f2CLicenseResponse = defaultLicenseService.validateLicense(); + Status status = f2CLicenseResponse.getStatus(); + if (status != Status.valid) { + request.setAttribute(RESULT_URI_KEY, NOLIC_PAGE); + return false; + } + } catch (Exception e) { + request.setAttribute(RESULT_URI_KEY, NOLIC_PAGE); + LogUtil.error(e.getMessage(), e); + return false; } + + try { + Boolean isLogin = validateLogin(request); + if (!isLogin) { + request.setAttribute(RESULT_URI_KEY, NO_LOGIN_PAGE); + return false; + } + } catch (Exception e) { + request.setAttribute(RESULT_URI_KEY, NO_LOGIN_PAGE); + LogUtil.error(e.getMessage(), e); + return false; + } + return true; } + + private Boolean validateLogin(HttpServletRequest request) throws Exception{ + String authorization = request.getHeader("Authorization"); + if (StringUtils.isBlank(authorization)) { + Cookie[] cookies = request.getCookies(); + if (ArrayUtil.isNotEmpty(cookies)) { + Cookie cookie = Arrays.stream(cookies).filter(item -> StringUtils.equals(item.getName(), "Authorization")).findFirst().orElse(null); + if (ObjectUtils.isNotEmpty(cookie) && StringUtils.isNotBlank(cookie.getValue())) { + authorization = cookie.getValue(); + } + } + } + if (StringUtils.isBlank(authorization)) { + return false; + } + TokenInfo tokenInfo = JWTUtils.tokenInfoByToken(authorization); + AuthUserService authUserService = CommonBeanFactory.getBean(AuthUserService.class); + SysUserEntity user = authUserService.getUserById(tokenInfo.getUserId()); + if (user == null) { + return false; + } + String password = user.getPassword(); + boolean verify = JWTUtils.verify(authorization, tokenInfo, password); + return verify; + } + + @Override + protected boolean onAccessDenied(ServletRequest req, ServletResponse res) throws Exception { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + Object attribute = request.getAttribute(RESULT_URI_KEY); + String path = ObjectUtils.isNotEmpty(attribute) ? attribute.toString() : DEFAULT_FAILED_PAGE; + request.getRequestDispatcher(path).forward(request, response); + return false; + } } 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 a68673c3c1..2d60576759 100644 --- a/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java +++ b/backend/src/main/java/io/dataease/auth/filter/JWTFilter.java @@ -1,5 +1,6 @@ package io.dataease.auth.filter; +import cn.hutool.core.util.URLUtil; import com.auth0.jwt.algorithms.Algorithm; import io.dataease.auth.entity.ASKToken; import io.dataease.auth.entity.JWTToken; @@ -23,8 +24,10 @@ import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.nio.charset.Charset; public class JWTFilter extends BasicHttpAuthenticationFilter { @@ -158,4 +161,18 @@ public class JWTFilter extends BasicHttpAuthenticationFilter { httpServletResponse.setHeader("authentication-status", "login_expire"); } + @Override + protected boolean onAccessDenied(ServletRequest req, ServletResponse res, Object mappedValue) throws Exception { + HttpServletResponse response = (HttpServletResponse) res; + HttpServletRequest request = (HttpServletRequest) req; + String requestURI = request.getRequestURI(); + String msg = requestURI + " has been denied"; + String encode = URLUtil.encode(msg, Charset.forName("UTF-8")); + Cookie cookie_error = new Cookie("onAccessDeniedMsg", encode); + cookie_error.setPath("/"); + response.addCookie(cookie_error); + response.sendRedirect("/"); + return false; + } + } 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 e86731d06f..4455484c75 100644 --- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java +++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java @@ -168,13 +168,14 @@ public class AuthServer implements AuthApi { String token = ServletUtils.getToken(); Long userId = JWTUtils.tokenInfoByToken(token).getUserId(); SysUserEntity user = authUserService.getUserById(userId); - CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user); + CurrentUserDto currentUserDto = BeanUtils.copyBean(new CurrentUserDto(), user, "password"); List currentRoleDtos = authUserService.roleInfos(user.getUserId()); List permissions = authUserService.permissions(user.getUserId()); currentUserDto.setRoles(currentRoleDtos); currentUserDto.setPermissions(permissions); return currentUserDto; } + userDto.setPassword(null); return userDto; } 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 c90acdab05..d6b7c60896 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 @@ -11,6 +11,7 @@ import java.util.Map; public class ShiroServiceImpl implements ShiroService { private final static String ANON = "anon"; + private final static String DOC = "doc"; @Override public Map loadFilterChainDefinitionMap() { @@ -20,15 +21,18 @@ public class ShiroServiceImpl implements ShiroService { // ---------------------------------------------------------- // 放行Swagger2页面,需要放行这些 - filterChainDefinitionMap.put("/doc.html**", "doc"); - filterChainDefinitionMap.put("/deApi**", ANON); + filterChainDefinitionMap.put("/doc.html**", DOC); + filterChainDefinitionMap.put("/deApi**", DOC); filterChainDefinitionMap.put("/swagger-ui.html", ANON); filterChainDefinitionMap.put("/swagger-ui/**", ANON); filterChainDefinitionMap.put("/swagger/**", ANON); filterChainDefinitionMap.put("/webjars/**", ANON); - filterChainDefinitionMap.put("/swagger-resources/**", ANON); - filterChainDefinitionMap.put("/v2/**", ANON); - filterChainDefinitionMap.put("/v3/**", ANON); + filterChainDefinitionMap.put("/swagger-resources/**", DOC); + filterChainDefinitionMap.put("/v2/**", DOC); + filterChainDefinitionMap.put("/v3/**", DOC); + + filterChainDefinitionMap.put("/**.gif", ANON); + filterChainDefinitionMap.put("/**.png", ANON); filterChainDefinitionMap.put("/static/**", ANON); filterChainDefinitionMap.put("/css/**", ANON); @@ -108,6 +112,8 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/plugin/larksuite/getQrParam", ANON); filterChainDefinitionMap.put("/cas/reset/**", ANON); filterChainDefinitionMap.put("/cas/loginPage", ANON); + filterChainDefinitionMap.put("/pdf-template/queryAll", ANON); + filterChainDefinitionMap.put("/unauth", ANON); filterChainDefinitionMap.put("/display/**", ANON); @@ -122,6 +128,7 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/panel/group/exportDetails", ANON); filterChainDefinitionMap.put("/dataset/field/linkMultFieldValues", "link"); filterChainDefinitionMap.put("/dataset/field/linkMappingFieldValues", "link"); + filterChainDefinitionMap.put("/systemInfo/proxyUserLoginInfo/**", ANON); filterChainDefinitionMap.put("/**", "authc"); diff --git a/backend/src/main/java/io/dataease/commons/utils/CronUtils.java b/backend/src/main/java/io/dataease/commons/utils/CronUtils.java index 26a3c203cc..c35aecdee1 100644 --- a/backend/src/main/java/io/dataease/commons/utils/CronUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/CronUtils.java @@ -21,6 +21,7 @@ public class CronUtils { /** * 解析表达式,获取CronTrigger + * * @param cron * @return */ @@ -33,6 +34,7 @@ public class CronUtils { /** * 获取以指定时间为开始时间的下一次执行时间 + * * @param cron * @param start * @return @@ -40,7 +42,7 @@ public class CronUtils { public static Date getNextTriggerTime(String cron, Date start) { if (start == null) { return getNextTriggerTime(cron); - }else{ + } else { CronTrigger trigger = getCronTrigger(cron); return trigger.getFireTimeAfter(start); } @@ -48,19 +50,20 @@ public class CronUtils { /** * 获取以当前日期为准的下一次执行时间 + * * @param cron * @return */ public static Date getNextTriggerTime(String cron) { Date date = null; - try{ + try { CronTrigger trigger = getCronTrigger(cron); Date startDate = trigger.getStartTime(); date = trigger.getFireTimeAfter(startDate); - }catch (Exception e){ + } catch (Exception e) { } - return date; + return date; } public static String cron(GlobalTaskEntity taskEntity) { @@ -98,6 +101,15 @@ public class CronUtils { return null; } + + public static String cron() { + Calendar instance = Calendar.getInstance(); + instance.add(Calendar.SECOND, 5); + return instance.get(Calendar.SECOND) + " " + + instance.get(Calendar.MINUTE) + " " + + instance.get(Calendar.HOUR_OF_DAY) + " * * ?"; + } + private static String getDayOfWeek(Calendar instance) { int index = instance.get(Calendar.DAY_OF_WEEK); index = (index % 7) + 1; diff --git a/backend/src/main/java/io/dataease/controller/IndexController.java b/backend/src/main/java/io/dataease/controller/IndexController.java index aacee431cd..857ab7eadc 100644 --- a/backend/src/main/java/io/dataease/controller/IndexController.java +++ b/backend/src/main/java/io/dataease/controller/IndexController.java @@ -2,17 +2,16 @@ package io.dataease.controller; import io.dataease.commons.exception.DEException; import io.dataease.commons.license.DefaultLicenseService; -import io.dataease.commons.license.F2CLicenseResponse; import io.dataease.commons.utils.CodingUtil; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.service.panel.PanelLinkService; import org.apache.commons.lang3.StringUtils; -import org.springframework.http.HttpRequest; 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.HttpServletRequest; @@ -42,13 +41,7 @@ public class IndexController { @GetMapping("/deApi") public String deApi() { - F2CLicenseResponse f2CLicenseResponse = defaultLicenseService.validateLicense(); - switch (f2CLicenseResponse.getStatus()) { - case valid: - return "doc.html"; - default: - return "nolic.html"; - } + return "doc.html"; } @GetMapping("/link/{index}") @@ -64,8 +57,8 @@ public class IndexController { // TODO 增加仪表板外部参数 HttpServletRequest request = ServletUtils.request(); String attachParams = request.getParameter("attachParams"); - if(StringUtils.isNotEmpty(attachParams)){ - url = url+"&attachParams="+attachParams; + if (StringUtils.isNotEmpty(attachParams)) { + url = url + "&attachParams=" + attachParams; } response.sendRedirect(url); } catch (IOException e) { diff --git a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java index 8d71eaf194..8b3f97c1e2 100644 --- a/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java +++ b/backend/src/main/java/io/dataease/controller/dataset/DataSetTableFieldController.java @@ -16,10 +16,16 @@ import io.dataease.controller.response.DatasetTableField4Type; import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.DatasetTable; import io.dataease.plugins.common.base.domain.DatasetTableField; +import io.dataease.plugins.common.base.domain.Datasource; +import io.dataease.plugins.datasource.entity.Dateformat; +import io.dataease.plugins.datasource.query.QueryProvider; +import io.dataease.provider.ProviderFactory; import io.dataease.service.dataset.DataSetFieldService; import io.dataease.service.dataset.DataSetTableFieldsService; import io.dataease.service.dataset.DataSetTableService; import io.dataease.service.dataset.PermissionService; +import io.dataease.service.datasource.DatasourceService; +import io.dataease.service.engine.EngineService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ObjectUtils; @@ -46,14 +52,16 @@ import java.util.stream.Collectors; public class DataSetTableFieldController { @Resource private DataSetTableFieldsService dataSetTableFieldsService; - @Autowired private DataSetFieldService dataSetFieldService; - @Resource private DataSetTableService dataSetTableService; @Resource private PermissionService permissionService; + @Resource + private EngineService engineService; + @Resource + private DatasourceService datasourceService; @DePermission(type = DePermissionType.DATASET) @ApiOperation("查询表下属字段") @@ -208,4 +216,14 @@ public class DataSetTableFieldController { ArrayList::new)); return list; } + + @DePermission(type = DePermissionType.DATASET) + @ApiOperation("时间格式") + @PostMapping("dateformats/{tableId}") + public List dateformats(@PathVariable String tableId) throws Exception{ + DatasetTable datasetTable = dataSetTableService.get(tableId); + Datasource ds = datasetTable.getMode() == 0 ? datasourceService.get(datasetTable.getDataSourceId()) : engineService.getDeEngine(); + QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); + return qp.dateformat(); + } } diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java index 217ab70c06..28bb812286 100644 --- a/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java +++ b/backend/src/main/java/io/dataease/controller/panel/PanelGroupController.java @@ -5,11 +5,11 @@ import io.dataease.auth.annotation.DePermission; import io.dataease.auth.annotation.DePermissionProxy; import io.dataease.auth.annotation.DePermissions; import io.dataease.auth.service.impl.ExtAuthServiceImpl; -import io.dataease.commons.constants.PanelConstants; -import io.dataease.controller.request.panel.*; import io.dataease.commons.constants.DePermissionType; +import io.dataease.commons.constants.PanelConstants; import io.dataease.commons.constants.ResourceAuthLevel; import io.dataease.controller.handler.annotation.I18n; +import io.dataease.controller.request.panel.*; import io.dataease.dto.PermissionProxy; import io.dataease.dto.authModel.VAuthModelDTO; import io.dataease.dto.panel.PanelExport2App; @@ -17,10 +17,11 @@ import io.dataease.dto.panel.PanelGroupDTO; import io.dataease.service.panel.PanelGroupService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.pentaho.di.core.util.UUIDUtil; -import springfox.documentation.annotations.ApiIgnore; import org.apache.shiro.authz.annotation.Logical; +import org.pentaho.di.core.util.UUIDUtil; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @@ -62,12 +63,12 @@ public class PanelGroupController { @DePermission(type = DePermissionType.PANEL, value = "pid", level = ResourceAuthLevel.PANEL_LEVEL_MANAGE) }, logical = Logical.AND) @I18n - public PanelGroupDTO save(@RequestBody PanelGroupRequest request) throws Exception{ + public PanelGroupDTO save(@RequestBody PanelGroupRequest request) throws Exception { String panelId = panelGroupService.save(request); PanelGroupDTO result = findOne(panelId); // 如果新建来源来自模板市场,在返回数据中加入父级ID便于跳转展开仪表板树 - if(PanelConstants.NEW_PANEL_FROM.NEW_MARKET_TEMPLATE.equals(request.getNewFrom())){ - result.setParents(authService.parentResource(panelId,"panel")); + if (PanelConstants.NEW_PANEL_FROM.NEW_MARKET_TEMPLATE.equals(request.getNewFrom())) { + result.setParents(authService.parentResource(panelId, "panel")); result.setRequestId(UUIDUtil.getUUIDAsString()); } return result; @@ -150,31 +151,33 @@ public class PanelGroupController { public void updatePanelStatus(@PathVariable String panelId, @RequestBody PanelGroupBaseInfoRequest request) { panelGroupService.updatePanelStatus(panelId, request); } + @ApiOperation("自动缓存") @PostMapping("/autoCache") @DePermissions(value = { @DePermission(type = DePermissionType.PANEL, value = "id"), @DePermission(type = DePermissionType.PANEL, value = "pid", level = ResourceAuthLevel.PANEL_LEVEL_MANAGE) }, logical = Logical.AND) - public void autoCache(@RequestBody PanelGroupRequest request){ + public void autoCache(@RequestBody PanelGroupRequest request) { panelGroupService.autoCache(request); } @ApiOperation("查找缓存") @GetMapping("/findUserCache/{panelId}") - public PanelGroupDTO findUserCache(@PathVariable String panelId){ + public PanelGroupDTO findUserCache(@PathVariable String panelId) { return panelGroupService.findUserPanelCache(panelId); } + @ApiOperation("检查缓存") @GetMapping("/checkUserCache/{panelId}") - public Boolean checkUserCache(@PathVariable String panelId){ + public Boolean checkUserCache(@PathVariable String panelId) { return panelGroupService.checkUserCache(panelId); } @ApiOperation("删除缓存") @DeleteMapping("/removePanelCache/{panelId}") - public void removePanelCache(@PathVariable String panelId){ + public void removePanelCache(@PathVariable String panelId) { panelGroupService.removePanelCache(panelId); } @@ -183,39 +186,46 @@ public class PanelGroupController { public void viewLog(@RequestBody PanelViewLogRequest request) { panelGroupService.viewLog(request); } + @ApiOperation("获取仪表板中视图Element信息") @GetMapping("/findPanelElementInfo/{viewId}") @I18n - public Object findPanelElementInfo(@PathVariable String viewId){ - return panelGroupService.findPanelElementInfo(viewId); + public Object findPanelElementInfo(@PathVariable String viewId) { + return panelGroupService.findPanelElementInfo(viewId); } + @GetMapping("/export2AppCheck/{panelId}") @I18n - public PanelExport2App export2AppCheck(@PathVariable String panelId){ - return panelGroupService.panelExport2AppCheck(panelId); + public PanelExport2App export2AppCheck(@PathVariable String panelId) { + return panelGroupService.panelExport2AppCheck(panelId); } @PostMapping("/appApply") - public PanelGroupDTO appApply(@RequestBody PanelAppTemplateApplyRequest request) throws Exception{ + public PanelGroupDTO appApply(@RequestBody PanelAppTemplateApplyRequest request) throws Exception { String panelId = panelGroupService.appApply(request); PanelGroupDTO result = findOne(panelId); - result.setParents(authService.parentResource(panelId,"panel")); + result.setParents(authService.parentResource(panelId, "panel")); result.setRequestId(UUIDUtil.getUUIDAsString()); result.setResponseSource("appApply"); return result; } @PostMapping("/appEdit") - public void appEdit(@RequestBody PanelAppTemplateApplyRequest request) throws Exception{ + public void appEdit(@RequestBody PanelAppTemplateApplyRequest request) throws Exception { panelGroupService.appEdit(request); } @GetMapping("/findOneWithParent/{panelId}") - public PanelGroupDTO findOneWithParent(@PathVariable String panelId) throws Exception{ + public PanelGroupDTO findOneWithParent(@PathVariable String panelId) throws Exception { PanelGroupDTO result = findOne(panelId); - result.setParents(authService.parentResource(panelId,"panel")); + result.setParents(authService.parentResource(panelId, "panel")); result.setRequestId(UUIDUtil.getUUIDAsString()); result.setResponseSource("appApply"); return result; } + + @PostMapping("/toTop/{panelId}") + public void toTop(@PathVariable String panelId) throws Exception { + panelGroupService.toTop(panelId); + } } diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java index 55c24e6ae2..51d5cc3c74 100644 --- a/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartExtRequest.java @@ -44,4 +44,8 @@ public class ChartExtRequest { @ApiModelProperty(hidden = true) private PermissionProxy proxy; + private Long goPage; + + private Long pageSize; + } diff --git a/backend/src/main/java/io/dataease/controller/sys/SystemInfoController.java b/backend/src/main/java/io/dataease/controller/sys/SystemInfoController.java new file mode 100644 index 0000000000..5322ca8e12 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/sys/SystemInfoController.java @@ -0,0 +1,30 @@ +package io.dataease.controller.sys; + +import io.dataease.dto.UserLoginInfoDTO; +import io.dataease.service.SystemInfoService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import javax.annotation.Resource; +import java.io.IOException; + +@ApiIgnore +@RestController +@RequestMapping("systemInfo") +public class SystemInfoController { + @Resource + private SystemInfoService systemInfoService; + + @GetMapping("userLoginInfo") + public UserLoginInfoDTO userLoginInfo() throws IOException { + return systemInfoService.getUserLoginInfo(null); + } + + @GetMapping("proxyUserLoginInfo/{userId}") + public UserLoginInfoDTO proxyUserLoginInfo(@PathVariable String userId) throws IOException { + return systemInfoService.getUserLoginInfo(userId); + } +} 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 dad2258764..63d59752b4 100644 --- a/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java +++ b/backend/src/main/java/io/dataease/controller/sys/SystemParameterController.java @@ -58,7 +58,7 @@ public class SystemParameterController { @GetMapping("/requestTimeOut") public Integer RequestTimeOut() { BasicInfo basicInfo = systemParameterService.basicInfo(); - return StringUtils.isNotBlank(basicInfo.getFrontTimeOut()) ? Integer.parseInt(basicInfo.getFrontTimeOut()) : 10; + return StringUtils.isNotBlank(basicInfo.getFrontTimeOut()) ? Integer.parseInt(basicInfo.getFrontTimeOut()) : 100; } @RequiresPermissions("sysparam:read") diff --git a/backend/src/main/java/io/dataease/dto/UserLoginInfoDTO.java b/backend/src/main/java/io/dataease/dto/UserLoginInfoDTO.java new file mode 100644 index 0000000000..35be339932 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/UserLoginInfoDTO.java @@ -0,0 +1,25 @@ +package io.dataease.dto; + +import io.dataease.auth.api.dto.CurrentUserDto; +import lombok.Data; + +/** + * Author: wangjiahao + * Date: 2022/11/10 + * Description: + */ +@Data +public class UserLoginInfoDTO { + + private CurrentUserDto userInfo; + + private String ip; + + public UserLoginInfoDTO() { + } + + public UserLoginInfoDTO(CurrentUserDto userInfo, String ip) { + this.userInfo = userInfo; + this.ip = ip; + } +} diff --git a/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java b/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java index 2a0fc35736..bf4a027888 100644 --- a/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java +++ b/backend/src/main/java/io/dataease/dto/authModel/VAuthModelDTO.java @@ -18,12 +18,13 @@ public class VAuthModelDTO extends VAuthModelWithBLOBs implements ITreeBase children; - private long allLeafs = 0l; + private long allLeafs = 0L; private String innerId; private Boolean isPlugin = false; + @Override public String toString(){ return this.getName(); } diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java index 2c6da656f9..1b7f75132f 100644 --- a/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java +++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewDTO.java @@ -41,4 +41,8 @@ public class ChartViewDTO extends ChartViewWithBLOBs { private String yAxis; @SerializedName("yaxisExt") private String yAxisExt; + + private long totalPage; + private long totalItems; + private int datasetMode; } diff --git a/backend/src/main/java/io/dataease/dto/panel/PanelGroupDTO.java b/backend/src/main/java/io/dataease/dto/panel/PanelGroupDTO.java index 00b570a236..746f230067 100644 --- a/backend/src/main/java/io/dataease/dto/panel/PanelGroupDTO.java +++ b/backend/src/main/java/io/dataease/dto/panel/PanelGroupDTO.java @@ -2,9 +2,11 @@ package io.dataease.dto.panel; import io.dataease.dto.chart.ChartViewDTO; import io.dataease.plugins.common.base.domain.PanelGroupWithBLOBs; +import io.dataease.plugins.common.base.domain.PanelWatermark; import io.dataease.plugins.common.model.ITreeBase; import io.swagger.annotations.ApiModelProperty; import lombok.Data; + import java.util.List; import java.util.Map; @@ -43,4 +45,7 @@ public class PanelGroupDTO extends PanelGroupWithBLOBs implements ITreeBase select panel_group.*, - panel_group.name as label, + panel_group.name as label, (select nick_name from sys_user where username = panel_group.create_by) as creator_name, (select nick_name from sys_user where username = panel_group.update_by) as update_name, - get_auths(panel_group.id, 'panel', #{userId}) as `privileges` + get_auths(panel_group.id, 'panel', #{userId}) as `privileges` from panel_group where id = #{panelId} - delete from panel_group where FIND_IN_SET(panel_group.id,GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) or FIND_IN_SET(panel_group.source,GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) + delete + from panel_group + where FIND_IN_SET(panel_group.id, GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) + or FIND_IN_SET(panel_group.source, GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) - delete from chart_view where FIND_IN_SET(chart_view.scene_id,GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) + delete + from chart_view + where FIND_IN_SET(chart_view.scene_id, GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) - delete from chart_view_cache where FIND_IN_SET(chart_view_cache.scene_id,GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) + delete + from chart_view_cache + where FIND_IN_SET(chart_view_cache.scene_id, GET_PANEL_GROUP_WITH_CHILDREN(#{pid})) - INSERT INTO panel_view ( id, panel_id, chart_view_id ) SELECT - uuid(), - #{panelId}, - chart_view_id - FROM - panel_view - WHERE - panel_id = #{panelId} + INSERT INTO panel_view (id, panel_id, chart_view_id) + SELECT uuid(), + #{panelId}, + chart_view_id + FROM panel_view + WHERE panel_id = #{panelId} DELETE FROM - chart_view + chart_view WHERE - chart_view.chart_type = 'private' - AND chart_view.scene_id = #{panelId} + chart_view.chart_type = 'private' + AND chart_view.scene_id = #{panelId} AND id NOT IN - + #{viewId} diff --git a/backend/src/main/java/io/dataease/job/sechedule/Schedular.java b/backend/src/main/java/io/dataease/job/sechedule/Schedular.java index c6575cc218..2a1c8d94f3 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/Schedular.java +++ b/backend/src/main/java/io/dataease/job/sechedule/Schedular.java @@ -1,6 +1,8 @@ package io.dataease.job.sechedule; import com.fit2cloud.quartz.anno.QuartzScheduled; +import io.dataease.commons.utils.LogUtil; +import io.dataease.service.CleaningRebotService; import io.dataease.service.datasource.DatasourceService; import io.dataease.service.dataset.DataSetTableService; import io.dataease.service.kettle.KettleService; @@ -17,6 +19,9 @@ public class Schedular { @Resource private KettleService kettleService; + @Resource + private CleaningRebotService cleaningRebotService; + @QuartzScheduled(cron = "0 0/3 * * * ?") public void updateDatasetTableStatus() { dataSetTableService.updateDatasetTableStatus(); @@ -32,4 +37,10 @@ public class Schedular { kettleService.updateKettleStatus(); } + @QuartzScheduled(cron = "0 0 0 ? * *") + public void cheanDisusedData() { + LogUtil.info("start execute clean task..."); + cleaningRebotService.execute(); + } + } diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java index bb5da23d0a..be507d3732 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java @@ -12,6 +12,8 @@ import java.util.Date; public abstract class TaskHandler implements InitializingBean { + protected static final String IS_TEMP_TASK = "isTempTask"; + public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception { // 1。首先看看是否过期 Long endTime = taskEntity.getEndTime(); @@ -24,21 +26,31 @@ public abstract class TaskHandler implements InitializingBean { Date start = new Date(taskEntity.getStartTime()); Date end = null; if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) { - new Date(taskEntity.getEndTime()); + end = new Date(taskEntity.getEndTime()); } Class executor = this.getClass(); String cron = CronUtils.cron(taskEntity); scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(taskEntity)); } + public void addTempTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception { + removeTask(scheduleManager, taskEntity); + JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); + TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString()); + Date start = new Date(taskEntity.getStartTime()); + Class executor = this.getClass(); + String cron = CronUtils.cron(); + JobDataMap jobDataMap = jobDataMap(taskEntity); + jobDataMap.put(IS_TEMP_TASK, true); + scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, null, jobDataMap); + } + protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity); - public abstract void resetRunningInstance(Long taskId); - public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) { JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString()); @@ -51,7 +63,6 @@ public abstract class TaskHandler implements InitializingBean { } - protected abstract Boolean taskIsRunning(Long taskId); @Override diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index d96be6a985..e0ce934228 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -92,13 +92,14 @@ public class EmailTaskHandler extends TaskHandler implements Job { return; JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + Boolean isTempTask = (Boolean) jobDataMap.getOrDefault(IS_TEMP_TASK, false); GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity"); ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class); - if (CronUtils.taskExpire(taskEntity.getEndTime())) { + if (!isTempTask && CronUtils.taskExpire(taskEntity.getEndTime())) { removeTask(scheduleManager, taskEntity); return; } - if (taskIsRunning(taskEntity.getTaskId())) { + if (!isTempTask && taskIsRunning(taskEntity.getTaskId())) { LogUtil.info("Skip synchronization task: {} ,due to task status is {}", taskEntity.getTaskId(), "running"); return; @@ -111,7 +112,10 @@ public class EmailTaskHandler extends TaskHandler implements Job { XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate"); SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator"); LogUtil.info("start execute send panel report task..."); - proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator); + proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator, isTempTask); + if (isTempTask) { + removeTask(scheduleManager, taskEntity); + } } @@ -156,7 +160,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { } @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { + public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); @@ -164,7 +168,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { List files = null; try { XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); - if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { + if (ObjectUtils.isEmpty(taskForm) || (!isTempTask && CronUtils.taskExpire(taskForm.getEndTime()))) { removeInstance(taskInstance); return; } diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java index dbb2cbe65f..5eff2cb4eb 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java @@ -16,9 +16,8 @@ import javax.annotation.Resource; public class EmailTaskViewHandler extends EmailTaskHandler { - @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { - super.sendReport(taskInstance, emailTemplateDTO, user); + public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) { + super.sendReport(taskInstance, emailTemplateDTO, user, isTempTask); } } diff --git a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java index d178f435e7..dc32281171 100644 --- a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.annotations.ApiIgnore; + import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.IOException; @@ -40,20 +41,20 @@ public class PluginCommonServer { BufferedInputStream bis = null; InputStream inputStream = null; OutputStream os = null; //输出流 - try{ + try { inputStream = service.vueResource(jsName); byte[] buffer = new byte[1024]; os = response.getOutputStream(); bis = new BufferedInputStream(inputStream); int i = bis.read(buffer); - while(i != -1){ + while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } os.flush(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - }finally { + } finally { try { bis.close(); inputStream.close(); @@ -69,28 +70,28 @@ public class PluginCommonServer { @GetMapping("/component/{componentName}") public void componentInfo(@PathVariable String componentName) { - Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(PluginComponentService.class); - beansOfType.values().stream().forEach(service -> { + Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(PluginComponentService.class); + beansOfType.values().stream().forEach(service -> { List components = service.components(); if (components.contains(componentName)) { HttpServletResponse response = ServletUtils.response(); BufferedInputStream bis = null; InputStream inputStream = null; OutputStream os = null; //输出流 - try{ + try { inputStream = service.vueResource(componentName); byte[] buffer = new byte[1024]; os = response.getOutputStream(); bis = new BufferedInputStream(inputStream); int i = bis.read(buffer); - while(i != -1){ + while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } os.flush(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - }finally { + } finally { try { bis.close(); inputStream.close(); @@ -101,7 +102,7 @@ public class PluginCommonServer { } return; } - }); + }); } @GetMapping("/staticInfo/{name}/{suffix}") @@ -115,22 +116,24 @@ public class PluginCommonServer { BufferedInputStream bis = null; InputStream inputStream = null; OutputStream os = null; //输出流 - try{ + try { inputStream = service.vueResource(name, suffix); byte[] buffer = new byte[1024]; os = response.getOutputStream(); bis = new BufferedInputStream(inputStream); int i = bis.read(buffer); - while(i != -1){ + while (i != -1) { os.write(buffer, 0, i); i = bis.read(buffer); } if (suffix.indexOf("svg") != -1) response.setContentType("image/svg+xml"); + if (suffix.indexOf("png") != -1) + response.setContentType("image/png"); os.flush(); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); - }finally { + } finally { try { bis.close(); inputStream.close(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index 2378f8854a..1609e13d27 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -56,7 +56,7 @@ public class XEmailTaskServer { @RequiresPermissions("task-email:read") @PostMapping("/queryTasks/{goPage}/{pageSize}") public Pager> queryTask(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody XpackGridRequest request) { + @RequestBody XpackGridRequest request) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); Page page = PageHelper.startPage(goPage, pageSize, true); CurrentUserDto user = AuthUtils.getUser(); @@ -76,17 +76,17 @@ public class XEmailTaskServer { tasks.forEach(item -> { if (CronUtils.taskExpire(item.getEndTime())) { item.setNextExecTime(null); - }else { + } else { GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity(); globalTaskEntity.setRateType(item.getRateType()); globalTaskEntity.setRateVal(item.getRateVal()); - try{ + try { String cron = CronUtils.cron(globalTaskEntity); if (StringUtils.isNotBlank(cron)) { Long nextTime = CronUtils.getNextTriggerTime(cron).getTime(); item.setNextExecTime(nextTime); } - }catch (Exception e) { + } catch (Exception e) { item.setNextExecTime(null); } } @@ -98,6 +98,20 @@ public class XEmailTaskServer { return listPager; } + @RequiresPermissions("task-email:edit") + @PostMapping("/fireNow/{taskId}") + public void fireNow(@PathVariable("taskId") Long taskId) throws Exception { + EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); + XpackEmailTaskRequest request = emailXpackService.taskForm(taskId); + GlobalTaskEntity globalTaskEntity = BeanUtils.copyBean(new GlobalTaskEntity(), request); + if (CronUtils.taskExpire(globalTaskEntity.getEndTime())) { + globalTaskEntity.setEndTime(null); + scheduleService.addTempSchedule(globalTaskEntity); + return; + } + scheduleService.fireNow(globalTaskEntity); + } + @RequiresPermissions("task-email:add") @PostMapping("/save") public void save(@RequestBody XpackEmailCreate param) throws Exception { @@ -210,7 +224,7 @@ public class XEmailTaskServer { @PostMapping("/queryInstancies/{goPage}/{pageSize}") public Pager> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody XpackGridRequest request) { + @RequestBody XpackGridRequest request) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); Page page = PageHelper.startPage(goPage, pageSize, true); List instances = emailXpackService.taskInstanceGrid(request); @@ -227,7 +241,7 @@ public class XEmailTaskServer { @RequiresPermissions("task-email:read") @PostMapping("/export") - public void export(@RequestBody XpackGridRequest request) throws Exception{ + public void export(@RequestBody XpackGridRequest request) throws Exception { Pager> listPager = instancesGrid(0, 0, request); List instanceDTOS = listPager.getListObject(); ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS); @@ -257,7 +271,7 @@ public class XEmailTaskServer { inputStream.close(); } catch (IOException ex) { ex.printStackTrace(); - }finally { + } finally { if (file.exists()) FileUtil.del(file); } @@ -267,7 +281,7 @@ public class XEmailTaskServer { private ExcelSheetModel excelSheetModel(List instanceDTOS) { ExcelSheetModel excelSheetModel = new ExcelSheetModel(); excelSheetModel.setSheetName(Translator.get("I18N_XPACKTASK_FILE_NAME")); - String[] headArr = new String[] {Translator.get("I18N_XPACKTASK_NAME"), Translator.get("I18N_XPACKTASK_EXEC_TIME"), Translator.get("I18N_XPACKTASK_STATUS")}; + String[] headArr = new String[]{Translator.get("I18N_XPACKTASK_NAME"), Translator.get("I18N_XPACKTASK_EXEC_TIME"), Translator.get("I18N_XPACKTASK_STATUS")}; List head = Arrays.asList(headArr); excelSheetModel.setHeads(head); List> data = instanceDTOS.stream().map(this::formatExcelData).collect(Collectors.toList()); diff --git a/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java b/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java new file mode 100644 index 0000000000..0a1740fcb6 --- /dev/null +++ b/backend/src/main/java/io/dataease/plugins/server/XWatermarkServer.java @@ -0,0 +1,33 @@ +package io.dataease.plugins.server; + +import io.dataease.plugins.config.SpringContextUtil; +import io.dataease.plugins.xpack.watermark.WatermarkService; +import io.dataease.plugins.xpack.watermark.dto.PanelWatermarkDTO; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +/** + * Author: wangjiahao + * Date: 2022/11/11 + * Description: + */ +@ApiIgnore +@RequestMapping("/plugin/watermark") +@RestController +public class XWatermarkServer { + + @ApiOperation("查询水印配置") + @GetMapping("/find") + public PanelWatermarkDTO find() { + WatermarkService userXpackService = SpringContextUtil.getBean(WatermarkService.class); + return userXpackService.getWatermarkInfo(); + } + + @ApiOperation("保存水印配置") + @PostMapping("/save") + public void save(@RequestBody PanelWatermarkDTO panelWatermark) { + WatermarkService userXpackService = SpringContextUtil.getBean(WatermarkService.class); + userXpackService.saveWatermarkInfo(panelWatermark); + } +} diff --git a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 8b9a23b56d..03ba7d0460 100644 --- a/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -1,5 +1,6 @@ package io.dataease.provider.engine.doris; +import com.alibaba.fastjson.JSONArray; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -16,6 +17,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.Dateformat; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -1311,4 +1313,15 @@ public class DorisQueryProvider extends QueryProvider { return sql; } } + + public List dateformat() { + return JSONArray.parseArray("[\n" + + "{\"dateformat\": \"%Y-%m-%d\"},\n" + + "{\"dateformat\": \"%Y/%m/%d\"},\n" + + "{\"dateformat\": \"%Y%m%d\"},\n" + + "{\"dateformat\": \"%Y-%m-%d %H:%i:%S\"},\n" + + "{\"dateformat\": \"%Y/%m/%d %H:%i:%S\"},\n" + + "{\"dateformat\": \"%Y%m%d %H:%i:%S\"}\n" + + "]", Dateformat.class); + } } diff --git a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index cb426517e4..8ab3793784 100644 --- a/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -1,5 +1,6 @@ package io.dataease.provider.engine.mysql; +import com.alibaba.fastjson.JSONArray; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -16,6 +17,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.Dateformat; import io.dataease.plugins.datasource.query.QueryProvider; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; @@ -1312,4 +1314,15 @@ public class MysqlQueryProvider extends QueryProvider { return sql; } } + + public List dateformat() { + return JSONArray.parseArray("[\n" + + "{\"dateformat\": \"%Y-%m-%d\"},\n" + + "{\"dateformat\": \"%Y/%m/%d\"},\n" + + "{\"dateformat\": \"%Y%m%d\"},\n" + + "{\"dateformat\": \"%Y-%m-%d %H:%i:%S\"},\n" + + "{\"dateformat\": \"%Y/%m/%d %H:%i:%S\"},\n" + + "{\"dateformat\": \"%Y%m%d %H:%i:%S\"}\n" + + "]", Dateformat.class); + } } 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 0be43013ff..8f2c593918 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 @@ -17,6 +17,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -393,8 +394,22 @@ public class CKQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + @Override public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -466,7 +481,7 @@ public class CKQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); } @Override @@ -1072,10 +1087,14 @@ public class CKQueryProvider extends QueryProvider { if (ObjectUtils.isNotEmpty(datasetTableField) && datasetTableField.getDeType() == DeTypeConstants.DE_TIME && StringUtils.equalsIgnoreCase(request.getOperator(), "between")) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); request.setOperator("ge"); - request.setValue(new ArrayList(){{add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(0)))) + "'"));}}); + request.setValue(new ArrayList() {{ + add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(0)))) + "'")); + }}); ChartExtFilterRequest requestCopy = BeanUtils.copyBean(new ChartExtFilterRequest(), request); requestCopy.setOperator("le"); - requestCopy.setValue(new ArrayList(){{add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(1)))) + "'"));}}); + requestCopy.setValue(new ArrayList() {{ + add(String.format(toDateTime64, "'" + simpleDateFormat.format(new Date(Long.parseLong(requestValue.get(1)))) + "'")); + }}); atomicReference.set(requestCopy); } }); diff --git a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java index 1dd968cbc0..7fad9ee875 100644 --- a/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/db2/Db2QueryProvider.java @@ -19,6 +19,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -376,8 +377,7 @@ public class Db2QueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } - @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(Db2Constants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -451,7 +451,22 @@ public class Db2QueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + "," + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } } @Override 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 index def9bcb0ba..ce089d53c9 100644 --- a/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/hive/HiveQueryProvider.java @@ -16,6 +16,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -346,7 +347,15 @@ public class HiveQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + " , " + pageInfo.getPageSize(): ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, 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)) @@ -418,7 +427,11 @@ public class HiveQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override diff --git a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java index fbaf4631e3..edfd4a8810 100644 --- a/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java +++ b/backend/src/main/java/io/dataease/provider/query/impala/ImpalaQueryProvider.java @@ -16,6 +16,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -343,7 +344,16 @@ public class ImpalaQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " offset " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(ImpalaConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -415,7 +425,11 @@ public class ImpalaQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override 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 3931ed8f9a..1a11a1d232 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 @@ -16,6 +16,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -311,7 +312,16 @@ public class MongoQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() + " , " + pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(MongoConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -385,7 +395,12 @@ public class MongoQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override 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 de53211f92..93e2d2ad59 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 @@ -1,5 +1,6 @@ package io.dataease.provider.query.mysql; +import com.alibaba.fastjson.JSONArray; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; import io.dataease.plugins.common.base.domain.DatasetTableFieldExample; @@ -17,6 +18,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.Dateformat; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -1318,4 +1320,15 @@ public class MysqlQueryProvider extends QueryProvider { public String sqlForPreview(String table, Datasource ds) { return "SELECT * FROM " + String.format(MySQLConstants.KEYWORD_TABLE, table); } + + public List dateformat() { + return JSONArray.parseArray("[\n" + + "{\"dateformat\": \"%Y-%m-%d\"},\n" + + "{\"dateformat\": \"%Y/%m/%d\"},\n" + + "{\"dateformat\": \"%Y%m%d\"},\n" + + "{\"dateformat\": \"%Y-%m-%d %H:%i:%S\"},\n" + + "{\"dateformat\": \"%Y/%m/%d %H:%i:%S\"},\n" + + "{\"dateformat\": \"%Y%m%d %H:%i:%S\"}\n" + + "]", Dateformat.class); + } } 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 38f524f5bf..8d1c685527 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 @@ -19,6 +19,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -402,7 +403,42 @@ public class OracleQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List orgXAxis, List OrgFeldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + List xAxis = new ArrayList<>(); + orgXAxis.forEach(chartViewFieldDTO -> { + xAxis.add(chartViewFieldDTO); + }); + ChartViewFieldDTO chartViewFieldDTO = new ChartViewFieldDTO(); + chartViewFieldDTO.setOriginName("ROWNUM"); + xAxis.add(chartViewFieldDTO); + + + List fieldCustomFilter = new ArrayList<>(); + for (ChartFieldCustomFilterDTO chartFieldCustomFilterDTO : OrgFeldCustomFilter) { + fieldCustomFilter.add(chartFieldCustomFilterDTO); + } + ChartFieldCustomFilterDTO chartFieldCustomFilterDTO = new ChartFieldCustomFilterDTO(); + DatasetTableField datasetTableField = new DatasetTableField(); + datasetTableField.setOriginName("ROWNUM"); + datasetTableField.setDeType(0); + chartFieldCustomFilterDTO.setField(datasetTableField); + + List filterItemDTOS = new ArrayList<>(); + ChartCustomFilterItemDTO itemDTO = new ChartCustomFilterItemDTO(); + itemDTO.setTerm("le"); + itemDTO.setValue(String.valueOf(pageInfo.getGoPage() * pageInfo.getPageSize())); + filterItemDTOS.add(itemDTO); + chartFieldCustomFilterDTO.setFilter(filterItemDTOS); + fieldCustomFilter.add(chartFieldCustomFilterDTO); + + if (isTable) { + return "SELECT * FROM (" + sqlFix(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view)) + ") DE_RESULT_TMP " + " WHERE DE_ROWNUM >= " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize(); + } else { + return "SELECT * FROM (" + sqlFix(originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view)) + ") DE_RESULT_TMP " + " WHERE DE_ROWNUM >= " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize(); + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(OracleConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(OracleConstants.ALIAS_FIX, String.format(TABLE_ALIAS_PREFIX, 0))) @@ -413,6 +449,13 @@ public class OracleQueryProvider extends QueryProvider { if (CollectionUtils.isNotEmpty(xAxis)) { for (int i = 0; i < xAxis.size(); i++) { ChartViewFieldDTO x = xAxis.get(i); + if (x.getOriginName().equalsIgnoreCase("ROWNUM")) { + xFields.add(SQLObj.builder() + .fieldName(x.getOriginName()) + .fieldAlias("DE_ROWNUM") + .build()); + continue; + } String originField; if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) { // 解析origin name中有关联的字段生成sql表达式 @@ -474,7 +517,12 @@ public class OracleQueryProvider extends QueryProvider { .build(); if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders); if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL); - return sqlLimit(st.render(), view); + return st.render(); + } + + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); } @Override @@ -974,6 +1022,8 @@ public class OracleQueryProvider extends QueryProvider { originName = calcFieldRegex(field.getOriginName(), tableObj); } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) { originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); + } else if (field.getOriginName().equalsIgnoreCase("ROWNUM")) { + originName = field.getOriginName(); } else { originName = String.format(OracleConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName()); } 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 40c7c26e40..ead69fa59f 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 @@ -19,6 +19,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -144,7 +145,7 @@ public class PgQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -218,7 +219,7 @@ public class PgQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -373,7 +374,16 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " offset " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { SQLObj tableObj = SQLObj.builder() .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(PgConstants.KEYWORD_TABLE, table)) .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) @@ -448,6 +458,11 @@ public class PgQueryProvider extends QueryProvider { return sqlLimit(st.render(), view); } + @Override + public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + @Override public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view); @@ -823,7 +838,7 @@ public class PgQueryProvider extends QueryProvider { } if (field.getDeType() == 1) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(PgConstants.CAST, originName, "bigint"); @@ -1281,7 +1296,7 @@ public class PgQueryProvider extends QueryProvider { } @Override - public String sqlForPreview(String table, Datasource ds){ + public String sqlForPreview(String table, Datasource ds) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); schema = String.format(PgConstants.KEYWORD_TABLE, schema); return "SELECT * FROM " + schema + "." + String.format(PgConstants.KEYWORD_TABLE, table); 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 f895ca9b42..2ba6bc0e15 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 @@ -17,6 +17,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; import io.dataease.plugins.datasource.entity.JdbcConfiguration; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; import org.apache.commons.collections4.CollectionUtils; @@ -150,7 +151,7 @@ public class RedshiftQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -225,7 +226,7 @@ public class RedshiftQueryProvider extends QueryProvider { } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) { fieldName = String.format(PgConstants.CAST, originField, PgConstants.DEFAULT_FLOAT_FORMAT); } else if (f.getDeType() == DeTypeConstants.DE_TIME) { - fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + fieldName = String.format(PgConstants.STR_TO_DATE, originField, StringUtils.isNotEmpty(f.getDateFormat()) ? f.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } else { fieldName = originField; } @@ -385,14 +386,99 @@ public class RedshiftQueryProvider extends QueryProvider { return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, null, view); } + @Override + public String getSQLWithPage(boolean isTable, String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view, PageInfo pageInfo) { + String limit = ((pageInfo.getGoPage() != null && pageInfo.getPageSize() != null) ? " LIMIT " + pageInfo.getPageSize() + " offset " + (pageInfo.getGoPage() - 1) * pageInfo.getPageSize() : ""); + if (isTable) { + return originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } else { + return originalTableInfo("(" + sqlFix(table) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view) + limit; + } + } + + @Override public String getSQLTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return null; + return sqlLimit(originalTableInfo(table, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, ds, view), view); + } + + private String originalTableInfo(String table, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { + SQLObj tableObj = SQLObj.builder() + .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(RedshiftConstants.KEYWORD_TABLE, table)) + .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0)) + .build(); + List xFields = 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(RedshiftConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()); + } else { + if (x.getDeType() == 2 || x.getDeType() == 3) { + originField = String.format(RedshiftConstants.CAST, String.format(RedshiftConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName()), RedshiftConstants.DEFAULT_FLOAT_FORMAT); + } else { + originField = String.format(RedshiftConstants.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()) && Utils.joinSort(x.getSort())) { + xOrders.add(SQLObj.builder() + .orderField(originField) + .orderAlias(fieldAlias) + .orderDirection(x.getSort()) + .build()); + } + } + } + // 处理视图中字段过滤 + String customWheres = transCustomFilterList(tableObj, fieldCustomFilter); + // 处理仪表板字段过滤 + String extWheres = transExtFilterList(tableObj, extFilterRequestList); + // row permissions tree + String whereTrees = transFilterTrees(tableObj, rowPermissionsTree); + // 构建sql所有参数 + List fields = new ArrayList<>(); + fields.addAll(xFields); + List wheres = new ArrayList<>(); + if (customWheres != null) wheres.add(customWheres); + if (extWheres != null) wheres.add(extWheres); + if (whereTrees != null) wheres.add(whereTrees); + 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(RedshiftConstants.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 st.render(); } @Override public String getSQLAsTmpTableInfo(String sql, List xAxis, List fieldCustomFilter, List rowPermissionsTree, List extFilterRequestList, Datasource ds, ChartViewWithBLOBs view) { - return null; + return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, fieldCustomFilter, rowPermissionsTree, extFilterRequestList, null, view); } @Override @@ -759,7 +845,7 @@ public class RedshiftQueryProvider extends QueryProvider { } if (field.getDeType() == 1) { if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5) { - whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); + whereName = String.format(PgConstants.STR_TO_DATE, originName, StringUtils.isNotEmpty(field.getDateFormat()) ? field.getDateFormat() : PgConstants.DEFAULT_DATE_FORMAT); } if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) { String cast = String.format(PgConstants.CAST, originName, "bigint"); @@ -1195,7 +1281,7 @@ public class RedshiftQueryProvider extends QueryProvider { } @Override - public String sqlForPreview(String table, Datasource ds){ + public String sqlForPreview(String table, Datasource ds) { String schema = new Gson().fromJson(ds.getConfiguration(), JdbcConfiguration.class).getSchema(); schema = String.format(PgConstants.KEYWORD_TABLE, schema); return "SELECT * FROM " + schema + "." + String.format(PgConstants.KEYWORD_TABLE, table); 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 46cc773569..5acfdef48b 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 @@ -1,5 +1,7 @@ package io.dataease.provider.query.sqlserver; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.base.domain.DatasetTableField; @@ -17,6 +19,7 @@ import io.dataease.plugins.common.dto.sqlObj.SQLObj; import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.common.request.permission.DatasetRowPermissionsTreeItem; +import io.dataease.plugins.datasource.entity.Dateformat; import io.dataease.plugins.datasource.entity.JdbcConfiguration; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.datasource.query.Utils; @@ -1331,4 +1334,13 @@ public class SqlserverQueryProvider extends QueryProvider { schema = String.format(SqlServerSQLConstants.KEYWORD_TABLE, schema); return "SELECT * FROM " + schema + "." + String.format(SqlServerSQLConstants.KEYWORD_TABLE, table); } + + public List dateformat() { + return JSONArray.parseArray("[\n" + + "{\"dateformat\": \"102\", \"desc\": \"yyyy.mm.dd\"},\n" + + "{\"dateformat\": \"23\", \"desc\": \"yyyy-mm-dd\"},\n" + + "{\"dateformat\": \"111\", \"desc\": \"yyyy/mm/dd\"},\n" + + "{\"dateformat\": \"120\", \"desc\": \"yyyy-mm-dd hh:mi:ss\"}\n" + + "]", Dateformat.class); + } } diff --git a/backend/src/main/java/io/dataease/service/CleaningRebotService.java b/backend/src/main/java/io/dataease/service/CleaningRebotService.java index fcf44517f5..7b3f501c47 100644 --- a/backend/src/main/java/io/dataease/service/CleaningRebotService.java +++ b/backend/src/main/java/io/dataease/service/CleaningRebotService.java @@ -1,6 +1,7 @@ package io.dataease.service; import io.dataease.ext.CleaningRebotMapper; +import io.dataease.service.message.SysMsgService; import io.dataease.service.sys.log.LogService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -20,6 +21,9 @@ public class CleaningRebotService { @Resource private LogService logService; + @Resource + private SysMsgService sysMsgService; + public void execute() { int floatDept = 0; do { @@ -38,5 +42,6 @@ public class CleaningRebotService { cleaningRebotMapper.delFloatingCreatorLinkMapping(); } logService.cleanDisusedLog(); + sysMsgService.cleanDisusedMsg(); } } diff --git a/backend/src/main/java/io/dataease/service/ScheduleService.java b/backend/src/main/java/io/dataease/service/ScheduleService.java index a579f63609..d3ad79ede5 100644 --- a/backend/src/main/java/io/dataease/service/ScheduleService.java +++ b/backend/src/main/java/io/dataease/service/ScheduleService.java @@ -68,6 +68,11 @@ public class ScheduleService { taskHandler.addTask(scheduleManager, task); } + public void addTempSchedule(GlobalTaskEntity task) throws Exception { + TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType()); + taskHandler.addTempTask(scheduleManager, task); + } + public void deleteSchedule(GlobalTaskEntity task) { TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType()); taskHandler.removeTask(scheduleManager, task); diff --git a/backend/src/main/java/io/dataease/service/SystemInfoService.java b/backend/src/main/java/io/dataease/service/SystemInfoService.java new file mode 100644 index 0000000000..b9d2dfb7e3 --- /dev/null +++ b/backend/src/main/java/io/dataease/service/SystemInfoService.java @@ -0,0 +1,31 @@ +package io.dataease.service; + +import io.dataease.auth.api.dto.CurrentUserDto; +import io.dataease.commons.utils.AuthUtils; +import io.dataease.commons.utils.BeanUtils; +import io.dataease.commons.utils.IPUtils; +import io.dataease.dto.UserLoginInfoDTO; +import io.dataease.plugins.common.base.domain.SysUser; +import io.dataease.plugins.common.base.mapper.SysUserMapper; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + + +@Service +public class SystemInfoService { + @Resource + private SysUserMapper sysUserMapper; + + public UserLoginInfoDTO getUserLoginInfo(String userId) { + if (StringUtils.isNotEmpty(userId)) { + SysUser userInfo = sysUserMapper.selectByPrimaryKey(Long.parseLong(userId)); + CurrentUserDto userDto = new CurrentUserDto(); + BeanUtils.copyBean(userDto, userInfo); + return new UserLoginInfoDTO(userDto, IPUtils.get()); + } + return new UserLoginInfoDTO(AuthUtils.getUser(), IPUtils.get()); + } + +} diff --git a/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java b/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java index 76b15bda06..62522a193a 100644 --- a/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java +++ b/backend/src/main/java/io/dataease/service/authModel/VAuthModelService.java @@ -45,13 +45,10 @@ public class VAuthModelService { return result; } if (request.getPrivileges() != null) { - result = result.stream().filter(vAuthModelDTO -> { - if (vAuthModelDTO.getNodeType().equalsIgnoreCase("spine") || (vAuthModelDTO.getNodeType().equalsIgnoreCase("leaf") && vAuthModelDTO.getPrivileges() != null && vAuthModelDTO.getPrivileges().contains(request.getPrivileges()))) { - return true; - } else { - return false; - } - }).collect(Collectors.toList()); + result = result.stream().filter(vAuthModelDTO -> "spine".equalsIgnoreCase(vAuthModelDTO.getNodeType()) + || ("leaf".equalsIgnoreCase(vAuthModelDTO.getNodeType()) + && vAuthModelDTO.getPrivileges() != null + && vAuthModelDTO.getPrivileges().contains(request.getPrivileges()))).collect(Collectors.toList()); } return result; } @@ -60,10 +57,10 @@ public class VAuthModelService { if (CollectionUtils.isEmpty(result)) { return; } - Iterator iterator = result.listIterator(); + Iterator iterator = result.listIterator(); while (iterator.hasNext()) { - VAuthModelDTO tmp = (VAuthModelDTO) iterator.next(); - if (tmp.getNodeType().equalsIgnoreCase("spine") && tmp.getAllLeafs() == 0) { + VAuthModelDTO tmp = iterator.next(); + if ("spine".equalsIgnoreCase(tmp.getNodeType()) && tmp.getAllLeafs() == 0) { iterator.remove(); } else { removeEmptyDir(tmp.getChildren()); @@ -77,9 +74,9 @@ public class VAuthModelService { vAuthModelDTO.setAllLeafs(0); continue; } - long leafs = 0l; + long leafs = 0L; for (VAuthModelDTO child : vAuthModelDTO.getChildren()) { - if (child.getNodeType().equalsIgnoreCase("leaf")) { + if ("leaf".equalsIgnoreCase(child.getNodeType())) { leafs = leafs + 1; } else { leafs = +leafs + getLeafs(child); @@ -90,13 +87,13 @@ public class VAuthModelService { } private long getLeafs(VAuthModelDTO child) { - long leafs = 0l; + long leafs = 0L; if (CollectionUtils.isEmpty(child.getChildren())) { child.setAllLeafs(0); return leafs; } for (VAuthModelDTO childChild : child.getChildren()) { - if (childChild.getNodeType().equalsIgnoreCase("leaf")) { + if ("leaf".equalsIgnoreCase(childChild.getNodeType())) { leafs = leafs + 1; } else { leafs = +leafs + getLeafs(childChild); 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 1592459766..4ac293ebc8 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -42,6 +42,7 @@ import io.dataease.plugins.common.request.chart.ChartExtFilterRequest; import io.dataease.plugins.common.request.datasource.DatasourceRequest; import io.dataease.plugins.common.request.permission.DataSetRowPermissionsTreeDTO; import io.dataease.plugins.config.SpringContextUtil; +import io.dataease.plugins.datasource.entity.PageInfo; import io.dataease.plugins.datasource.provider.Provider; import io.dataease.plugins.datasource.query.QueryProvider; import io.dataease.plugins.view.entity.*; @@ -297,6 +298,10 @@ public class ChartViewService { public ChartViewDTO getData(String id, ChartExtRequest request) throws Exception { try { ChartViewDTO view = this.getOne(id, request.getQueryFrom()); + DatasetTable datasetTable = dataSetTableService.get(view.getTableId()); + if (ObjectUtils.isNotEmpty(datasetTable)) { + view.setDatasetMode(datasetTable.getMode()); + } // 如果是从仪表板获取视图数据,则仪表板的查询模式,查询结果的数量,覆盖视图对应的属性 if (CommonConstants.VIEW_RESULT_MODE.CUSTOM.equals(request.getResultMode())) { view.setResultMode(request.getResultMode()); @@ -548,7 +553,8 @@ public class ChartViewService { return data; } - public ChartViewDTO calcData(ChartViewDTO view, ChartExtRequest requestList, boolean cache) throws Exception { + public ChartViewDTO calcData(ChartViewDTO view, ChartExtRequest chartExtRequest, boolean cache) throws Exception { + ChartViewDTO chartViewDTO = new ChartViewDTO(); if (ObjectUtils.isEmpty(view)) { throw new RuntimeException(Translator.get("i18n_chart_delete")); } @@ -568,11 +574,12 @@ public class ChartViewService { }); } - List xAxisBase = gson.fromJson(view.getXAxis(), tokenType); List xAxis = gson.fromJson(view.getXAxis(), tokenType); List xAxisExt = gson.fromJson(view.getXAxisExt(), tokenType); - if (StringUtils.equalsIgnoreCase(view.getType(), "table-pivot") || StringUtils.containsIgnoreCase(view.getType(), "group")) { + if (StringUtils.equalsIgnoreCase(view.getType(), "table-pivot") + || StringUtils.containsIgnoreCase(view.getType(), "group") + || ("antv".equalsIgnoreCase(view.getRender()) && "line".equalsIgnoreCase(view.getType()))) { xAxis.addAll(xAxisExt); } List yAxis = gson.fromJson(view.getYAxis(), tokenType); @@ -580,7 +587,7 @@ public class ChartViewService { List yAxisExt = gson.fromJson(view.getYAxisExt(), tokenType); yAxis.addAll(yAxisExt); } - if (StringUtils.equalsIgnoreCase(view.getRender(), "antv") && StringUtils.equalsAnyIgnoreCase(view.getType(), "gauge","liquid")) { + if (StringUtils.equalsIgnoreCase(view.getRender(), "antv") && StringUtils.equalsAnyIgnoreCase(view.getType(), "gauge", "liquid")) { List sizeField = getSizeField(view); yAxis.addAll(sizeField); } @@ -589,27 +596,32 @@ public class ChartViewService { List fieldCustomFilter = gson.fromJson(view.getCustomFilter(), filterTokenType); List drill = gson.fromJson(view.getDrillFields(), tokenType); + // 视图计算字段,用dataeaseName作为唯一标识 + ChartViewField chartViewField = new ChartViewField(); + chartViewField.setChartId(view.getId()); + List chartViewFields = chartViewFieldService.list(chartViewField); + List chartViewFieldNameList = chartViewFields.stream().map(ChartViewField::getDataeaseName).collect(Collectors.toList()); + DatasetTableField datasetTableFieldObj = DatasetTableField.builder().tableId(view.getTableId()).checked(Boolean.TRUE).build(); List fields = dataSetTableFieldsService.list(datasetTableFieldObj); // 获取数据集,需校验权限 - DataSetTableDTO table = dataSetTableService.getWithPermission(view.getTableId(), requestList.getUser()); - checkPermission("use", table, requestList.getUser()); + DataSetTableDTO table = dataSetTableService.getWithPermission(view.getTableId(), chartExtRequest.getUser()); + checkPermission("use", table, chartExtRequest.getUser()); List desensitizationList = new ArrayList<>(); //列权限 - List columnPermissionFields = permissionService.filterColumnPermissions(fields, desensitizationList, table.getId(), requestList.getUser()); + List columnPermissionFields = permissionService.filterColumnPermissions(fields, desensitizationList, table.getId(), chartExtRequest.getUser()); //将没有权限的列删掉 List dataeaseNames = columnPermissionFields.stream().map(DatasetTableField::getDataeaseName).collect(Collectors.toList()); dataeaseNames.add("*"); - fieldCustomFilter = fieldCustomFilter.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - extStack = extStack.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - extBubble = extBubble.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - drill = drill.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - + fieldCustomFilter = fieldCustomFilter.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + extStack = extStack.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + extBubble = extBubble.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + drill = drill.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); //行权限 - List rowPermissionsTree = permissionsTreeService.getRowPermissionsTree(fields, table, requestList.getUser()); + List rowPermissionsTree = permissionsTreeService.getRowPermissionsTree(fields, table, chartExtRequest.getUser()); for (ChartFieldCustomFilterDTO ele : fieldCustomFilter) { ele.setField(dataSetTableFieldsService.get(ele.getId())); @@ -619,9 +631,25 @@ public class ChartViewService { return emptyChartViewDTO(view); } + // 直连明细表分页 + Map mapAttr = gson.fromJson(view.getCustomAttr(), Map.class); + Map mapSize = (Map) mapAttr.get("size"); + if (StringUtils.equalsIgnoreCase(view.getType(), "table-info") && table.getMode() == 0 && StringUtils.equalsIgnoreCase((String) mapSize.get("tablePageMode"), "page")) { + if (chartExtRequest.getGoPage() == null) { + chartExtRequest.setGoPage(1L); + } + if (chartExtRequest.getPageSize() == null) { + String pageSize = (String) mapSize.get("tablePageSize"); + chartExtRequest.setPageSize(Long.parseLong(pageSize)); + } + } else { + chartExtRequest.setGoPage(null); + chartExtRequest.setPageSize(null); + } + switch (view.getType()) { case "label": - xAxis = xAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + xAxis = xAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); yAxis = new ArrayList<>(); if (CollectionUtils.isEmpty(xAxis)) { return emptyChartViewDTO(view); @@ -631,39 +659,39 @@ public class ChartViewService { case "gauge": case "liquid": xAxis = new ArrayList<>(); - yAxis = yAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + yAxis = yAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); if (CollectionUtils.isEmpty(yAxis)) { return emptyChartViewDTO(view); } break; case "table-info": yAxis = new ArrayList<>(); - xAxis = xAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || dataeaseNames.contains(item.getDataeaseName())).collect(Collectors.toList()); + xAxis = xAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || dataeaseNames.contains(item.getDataeaseName())).collect(Collectors.toList()); if (CollectionUtils.isEmpty(xAxis)) { return emptyChartViewDTO(view); } break; case "table-normal": - xAxis = xAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || dataeaseNames.contains(item.getDataeaseName())).collect(Collectors.toList()); - yAxis = yAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || dataeaseNames.contains(item.getDataeaseName())).collect(Collectors.toList()); + xAxis = xAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || dataeaseNames.contains(item.getDataeaseName())).collect(Collectors.toList()); + yAxis = yAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || dataeaseNames.contains(item.getDataeaseName())).collect(Collectors.toList()); break; case "bar-group": case "bar-group-stack": - xAxis = xAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - yAxis = yAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - xAxisBase = xAxisBase.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - xAxisExt = xAxisExt.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + xAxis = xAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + yAxis = yAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + xAxisBase = xAxisBase.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + xAxisExt = xAxisExt.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); break; default: - xAxis = xAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); - yAxis = yAxis.stream().filter(item -> StringUtils.isNotEmpty(item.getChartId()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + xAxis = xAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); + yAxis = yAxis.stream().filter(item -> chartViewFieldNameList.contains(item.getDataeaseName()) || (!desensitizationList.contains(item.getDataeaseName()) && dataeaseNames.contains(item.getDataeaseName()))).collect(Collectors.toList()); } // 过滤来自仪表板的条件 List extFilterList = new ArrayList<>(); //组件过滤条件 - if (ObjectUtils.isNotEmpty(requestList.getFilter())) { - for (ChartExtFilterRequest request : requestList.getFilter()) { + if (ObjectUtils.isNotEmpty(chartExtRequest.getFilter())) { + for (ChartExtFilterRequest request : chartExtRequest.getFilter()) { // 解析多个fieldId,fieldId是一个逗号分隔的字符串 String fieldId = request.getFieldId(); if (request.getIsTree() == null) { @@ -677,7 +705,13 @@ public class ChartViewService { if (sqlVariables.stream().map(SqlVariableDetails::getVariableName).collect(Collectors.toList()).contains(parameter)) { hasParameters = true; } - if (parameter.contains("|DE|") && table.getId().equals(parameter.split("\\|DE\\|")[0]) && sqlVariables.stream().map(SqlVariableDetails::getVariableName).collect(Collectors.toList()).contains(parameter.split("\\|DE\\|")[1])) { + if (parameter.contains("|DE|") + && table.getId().equals(parameter.split("\\|DE\\|")[0]) + && sqlVariables + .stream() + .map(SqlVariableDetails::getVariableName) + .collect(Collectors.toList()) + .contains(parameter.split("\\|DE\\|")[1])) { hasParameters = true; } } @@ -742,13 +776,13 @@ public class ChartViewService { List filters = new ArrayList<>(); // 联动条件 - if (ObjectUtils.isNotEmpty(requestList.getLinkageFilters())) { - filters.addAll(requestList.getLinkageFilters()); + if (ObjectUtils.isNotEmpty(chartExtRequest.getLinkageFilters())) { + filters.addAll(chartExtRequest.getLinkageFilters()); } // 外部参数条件 - if (ObjectUtils.isNotEmpty(requestList.getOuterParamsFilters())) { - filters.addAll(requestList.getOuterParamsFilters()); + if (ObjectUtils.isNotEmpty(chartExtRequest.getOuterParamsFilters())) { + filters.addAll(chartExtRequest.getOuterParamsFilters()); } //联动过滤条件和外部参数过滤条件全部加上 @@ -773,7 +807,7 @@ public class ChartViewService { // 下钻 List drillFilters = new ArrayList<>(); boolean isDrill = false; - List drillRequest = requestList.getDrill(); + List drillRequest = chartExtRequest.getDrill(); if (CollectionUtils.isNotEmpty(drillRequest) && (drill.size() > drillRequest.size())) { for (int i = 0; i < drillRequest.size(); i++) { ChartDrillRequest request = drillRequest.get(i); @@ -856,76 +890,95 @@ public class ChartViewService { // 如果是插件到此结束 } + String querySql = null; + long totalPage = 0l; + long totalItems = 0l; + String totalPageSql = null; + PageInfo pageInfo = new PageInfo(); + pageInfo.setGoPage(chartExtRequest.getGoPage()); + pageInfo.setPageSize(chartExtRequest.getPageSize()); + //如果不是插件视图 走原生逻辑 if (table.getMode() == 0) {// 直连 if (ObjectUtils.isEmpty(ds)) { throw new RuntimeException(Translator.get("i18n_datasource_delete")); } - if (StringUtils.isNotEmpty(ds.getStatus()) && ds.getStatus().equalsIgnoreCase("Error")) { + if (StringUtils.isNotEmpty(ds.getStatus()) && "Error".equalsIgnoreCase(ds.getStatus())) { throw new Exception(Translator.get("i18n_invalid_ds")); } + pageInfo.setDsVersion(datasourceProvider.dsVersion(ds)); datasourceRequest.setDatasource(ds); DataTableInfoDTO dataTableInfoDTO = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.DB.name())) { datasourceRequest.setTable(dataTableInfoDTO.getTable()); - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view, ds)); + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { + querySql = qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view, ds); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); + querySql = qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, ds, view)); + querySql = qp.getSQLScatter(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, ds, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLTableInfo(dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(true, dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(true, dataTableInfoDTO.getTable(), xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQL(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.SQL.name())) { String sql = dataTableInfoDTO.isBase64Encryption() ? new String(java.util.Base64.getDecoder().decode(dataTableInfoDTO.getSql())) : dataTableInfoDTO.getSql(); - sql = handleVariable(sql, requestList, qp, table, ds); - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + sql = handleVariable(sql, chartExtRequest, qp, table, ds); + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { + querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view)); + querySql = qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.CUSTOM.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); List list = dataSetTableUnionService.listByTableId(dt.getList().get(0).getTableId()); String sql = dataSetTableService.getCustomSQLDatasource(dt, list, ds); - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { + querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view)); + querySql = qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } } else if (StringUtils.equalsIgnoreCase(table.getType(), DatasetType.UNION.name())) { DataTableInfoDTO dt = gson.fromJson(table.getInfo(), DataTableInfoDTO.class); Map sqlMap = dataSetTableService.getUnionSQLDatasource(dt, ds); String sql = (String) sqlMap.get("sql"); - - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { - datasourceRequest.setQuery(qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { + querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { - datasourceRequest.setQuery(qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view)); + querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { - datasourceRequest.setQuery(qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view)); + querySql = qp.getSQLAsTmpScatter(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extBubble, view); } else if (StringUtils.equalsIgnoreCase("table-info", view.getType())) { - datasourceRequest.setQuery(qp.getSQLAsTmpTableInfo(sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view)); + querySql = qp.getSQLWithPage(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view, pageInfo); + totalPageSql = qp.getResultCount(false, sql, xAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, ds, view); } else { - datasourceRequest.setQuery(qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view)); + querySql = qp.getSQLAsTmp(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } } + if (StringUtils.isNotEmpty(totalPageSql) && StringUtils.equalsIgnoreCase((String) mapSize.get("tablePageMode"), "page")) { + datasourceRequest.setQuery(totalPageSql); + totalItems = Long.valueOf(datasourceProvider.getData(datasourceRequest).get(0)[0]); + totalPage = (totalItems / pageInfo.getPageSize()) + (totalItems % pageInfo.getPageSize() > 0 ? 1 : 0); + } + + datasourceRequest.setQuery(querySql); data = datasourceProvider.getData(datasourceRequest); if (CollectionUtils.isNotEmpty(assistFields)) { datasourceAssistRequest.setQuery(assistSQL(datasourceRequest.getQuery(), assistFields)); @@ -938,7 +991,7 @@ public class ChartViewService { String tableName = "ds_" + table.getId().replaceAll("-", "_"); datasourceRequest.setTable(tableName); QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType()); - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { datasourceRequest.setQuery(qp.getSQLSummary(tableName, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view, ds)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { datasourceRequest.setQuery(qp.getSQLStack(tableName, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view)); @@ -955,10 +1008,12 @@ public class ChartViewService { assistData = datasourceProvider.getData(datasourceAssistRequest); } // 仪表板有参数不使用缓存 - if (!cache || CollectionUtils.isNotEmpty(requestList.getFilter()) - || CollectionUtils.isNotEmpty(requestList.getLinkageFilters()) - || CollectionUtils.isNotEmpty(requestList.getOuterParamsFilters()) - || CollectionUtils.isNotEmpty(requestList.getDrill()) || CollectionUtils.isNotEmpty(rowPermissionsTree) || fields.size() != columnPermissionFields.size()) { + if (!cache || CollectionUtils.isNotEmpty(chartExtRequest.getFilter()) + || CollectionUtils.isNotEmpty(chartExtRequest.getLinkageFilters()) + || CollectionUtils.isNotEmpty(chartExtRequest.getOuterParamsFilters()) + || CollectionUtils.isNotEmpty(chartExtRequest.getDrill()) + || CollectionUtils.isNotEmpty(rowPermissionsTree) + || fields.size() != columnPermissionFields.size()) { data = datasourceProvider.getData(datasourceRequest); } else { try { @@ -1110,9 +1165,9 @@ public class ChartViewService { mapChart = ChartDataBuild.transChartData(xAxis, yAxis, view, data, isDrill); } } else if (StringUtils.equalsIgnoreCase(view.getRender(), "antv")) { - if (StringUtils.equalsIgnoreCase(view.getType(), "bar-group")) { + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "bar-group", "line")) { mapChart = ChartDataBuild.transBaseGroupDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, view, data, isDrill); - } else if (StringUtils.equalsIgnoreCase(view.getType(),"bar-group-stack")) { + } else if (StringUtils.equalsIgnoreCase(view.getType(), "bar-group-stack")) { mapChart = ChartDataBuild.transGroupStackDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); } else if (StringUtils.containsIgnoreCase(view.getType(), "bar-stack")) { mapChart = ChartDataBuild.transStackChartDataAntV(xAxis, yAxis, view, data, extStack, isDrill); @@ -1136,7 +1191,10 @@ public class ChartViewService { } // table组件,明细表,也用于导出数据 Map mapTableNormal = ChartDataBuild.transTableNormal(xAxis, yAxis, view, data, extStack, desensitizationList); - return uniteViewResult(datasourceRequest.getQuery(), mapChart, mapTableNormal, view, isDrill, drillFilters, dynamicAssistFields, assistData); + chartViewDTO = uniteViewResult(datasourceRequest.getQuery(), mapChart, mapTableNormal, view, isDrill, drillFilters, dynamicAssistFields, assistData); + chartViewDTO.setTotalPage(totalPage); + chartViewDTO.setTotalItems(totalItems); + return chartViewDTO; } // 对结果排序 diff --git a/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java b/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java index 7d570a1a8b..d2351a8a3e 100644 --- a/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java +++ b/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java @@ -158,7 +158,11 @@ public class ChartDataBuild { } catch (Exception e) { axisChartDataDTO.setValue(new BigDecimal(0)); } - axisChartDataDTO.setCategory(b.toString()); + if ("line".equals(view.getType()) && CollectionUtils.isEmpty(xAxisExt)) { + axisChartDataDTO.setCategory(yAxis.get(j).getName()); + } else { + axisChartDataDTO.setCategory(b.toString()); + } dataList.add(axisChartDataDTO); } } 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 d7ddee0749..3e457fd9d2 100644 --- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java +++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java @@ -149,7 +149,7 @@ public class DataSetTableService { @Value("${upload.file.path}") private String path; - private static Logger logger = LoggerFactory.getLogger(ClassloaderResponsity.class); + private static final Logger logger = LoggerFactory.getLogger(ClassloaderResponsity.class); @DeCleaner(value = DePermissionType.DATASET, key = "sceneId") public List batchInsert(List datasetTable) throws Exception { @@ -185,7 +185,7 @@ public class DataSetTableService { @Transactional(propagation = Propagation.NOT_SUPPORTED) @DeCleaner(value = DePermissionType.DATASET, key = "sceneId") - public List saveExcel(DataSetTableRequest datasetTable) throws Exception { + public List saveExcel(DataSetTableRequest datasetTable) { List datasetIdList = new ArrayList<>(); if (StringUtils.isEmpty(datasetTable.getId())) { @@ -234,10 +234,9 @@ public class DataSetTableService { list.add(sheetTable); DeLogUtils.save(SysLogConstants.OPERATE_TYPE.CREATE, SysLogConstants.SOURCE_TYPE.DATASET, datasetTable.getId(), datasetTable.getSceneId(), null, null); } - datasetIdList.forEach(datasetId -> { - commonThreadPool.addTask(() -> extractDataService.extractExcelData(datasetId, "all_scope", "初始导入", - null, datasetIdList)); - }); + datasetIdList.forEach(datasetId -> commonThreadPool.addTask(() -> + extractDataService.extractExcelData(datasetId, "all_scope", "初始导入", + null, datasetIdList))); } else { for (ExcelSheetData sheet : datasetTable.getSheets()) { String[] fieldArray = sheet.getFields().stream().map(TableField::getFieldName) @@ -269,10 +268,9 @@ public class DataSetTableService { list.add(sheetTable); DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, SysLogConstants.SOURCE_TYPE.DATASET, datasetTable.getId(), datasetTable.getSceneId(), null, null); } - datasetIdList.forEach(datasetId -> { - commonThreadPool.addTask(() -> extractDataService.extractExcelData(datasetId, "all_scope", "初始导入", - null, datasetIdList)); - }); + datasetIdList.forEach(datasetId -> commonThreadPool.addTask(() -> + extractDataService.extractExcelData(datasetId, "all_scope", "初始导入", + null, datasetIdList))); } return list; @@ -303,15 +301,15 @@ public class DataSetTableService { DataTableInfoDTO info = new DataTableInfoDTO(); info.setExcelSheetDataList(excelSheetDataList); datasetTable.setInfo(new Gson().toJson(info)); - int update = datasetTableMapper.updateByPrimaryKeySelective(datasetTable); + datasetTableMapper.updateByPrimaryKeySelective(datasetTable); // 替換時,先不刪除旧字段;同步成功后再删除 if (datasetTable.getEditType() == 0) { commonThreadPool.addTask(() -> extractDataService.extractExcelData(datasetTable.getId(), "all_scope", "替换", saveExcelTableField(datasetTable.getId(), datasetTable.getSheets().get(0).getFields(), false), - Arrays.asList(datasetTable.getId()))); + Collections.singletonList(datasetTable.getId()))); } else if (datasetTable.getEditType() == 1) { commonThreadPool.addTask(() -> extractDataService.extractExcelData(datasetTable.getId(), "add_scope", "追加", - null, Arrays.asList(datasetTable.getId()))); + null, Collections.singletonList(datasetTable.getId()))); } DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFY, SysLogConstants.SOURCE_TYPE.DATASET, datasetTable.getId(), datasetTable.getSceneId(), null, null); return Collections.singletonList(datasetTable); @@ -362,12 +360,12 @@ public class DataSetTableService { return datasetTable; } - public void alter(DataSetTableRequest request) throws Exception { + public void alter(DataSetTableRequest request) { checkName(request); datasetTableMapper.updateByPrimaryKeySelective(request); } - public void delete(String id) throws Exception { + public void delete(String id) { DatasetTable table = datasetTableMapper.selectByPrimaryKey(id); SysLogDTO sysLogDTO = DeLogUtils.buildLog(SysLogConstants.OPERATE_TYPE.DELETE, SysLogConstants.SOURCE_TYPE.DATASET, table.getId(), table.getSceneId(), null, null); datasetTableMapper.deleteByPrimaryKey(id); @@ -489,9 +487,8 @@ public class DataSetTableService { List res = new ArrayList<>(); Map map = new TreeMap<>(); group.forEach(ele -> map.put(ele.getId(), ele)); - Iterator> iterator = map.entrySet().iterator(); - while (iterator.hasNext()) { - res.add(iterator.next().getValue()); + for (Map.Entry stringDataSetTableDTOEntry : map.entrySet()) { + res.add(stringDataSetTableDTOEntry.getValue()); } res.sort(Comparator.comparing(DatasetTable::getName)); res.addAll(ds); @@ -521,8 +518,7 @@ public class DataSetTableService { return datasourceProvider.getTableFields(datasourceRequest); } - public Map> getFieldsFromDE(DataSetTableRequest dataSetTableRequest) - throws Exception { + public Map> getFieldsFromDE(DataSetTableRequest dataSetTableRequest) { DatasetTableField datasetTableField = DatasetTableField.builder().build(); datasetTableField.setTableId(dataSetTableRequest.getId()); datasetTableField.setChecked(Boolean.TRUE); @@ -1015,15 +1011,11 @@ public class DataSetTableService { break; case "TEXT": sqlVariableDetails = sqlVariableDetails.stream().filter(item -> item.getType().get(0).contains("TEXT")).collect(Collectors.toList()); - sqlVariableDetails.forEach(item -> { - item.setAlias(item.getVariableName()); - }); + sqlVariableDetails.forEach(item -> item.setAlias(item.getVariableName())); break; case "NUM": sqlVariableDetails = sqlVariableDetails.stream().filter(item -> item.getType().get(0).contains("LONG") || item.getType().get(0).contains("DOUBLE")).collect(Collectors.toList()); - sqlVariableDetails.forEach(item -> { - item.setAlias(item.getVariableName()); - }); + sqlVariableDetails.forEach(item -> item.setAlias(item.getVariableName())); break; } return sqlVariableDetails; @@ -1087,15 +1079,15 @@ public class DataSetTableService { if (select.getSelectBody() instanceof PlainSelect) { return handlePlainSelect((PlainSelect) select.getSelectBody(), select, dsType); } else { - String result = ""; + StringBuilder result = new StringBuilder(); SetOperationList setOperationList = (SetOperationList) select.getSelectBody(); for (int i = 0; i < setOperationList.getSelects().size(); i++) { - result = result + handlePlainSelect((PlainSelect) setOperationList.getSelects().get(i), null, dsType); + result.append(handlePlainSelect((PlainSelect) setOperationList.getSelects().get(i), null, dsType)); if (i < setOperationList.getSelects().size() - 1) { - result = result + " " + setOperationList.getOperations().get(i).toString() + " "; + result.append(" ").append(setOperationList.getOperations().get(i).toString()).append(" "); } } - return result; + return result.toString(); } } @@ -1140,14 +1132,14 @@ public class DataSetTableService { builder.append(" "); for (Iterator iter = select.getWithItemsList().iterator(); iter.hasNext(); ) { WithItem withItem = iter.next(); - builder.append(withItem.getName() + " AS ( " + removeVariables(withItem.getSubSelect().toString(), dsType) + " ) "); + builder.append(withItem.getName()).append(" AS ( ").append(removeVariables(withItem.getSubSelect().toString(), dsType)).append(" ) "); if (iter.hasNext()) { builder.append(","); } } } - builder.append(" " + plainSelect); + builder.append(" ").append(plainSelect); return builder.toString(); } @@ -1230,7 +1222,7 @@ public class DataSetTableService { String sqlAsTable = qp.createSQLPreview(sql, null); datasourceRequest.setQuery(sqlAsTable); - Map result = new HashMap<>(); + Map result; try { datasetSqlLog.setStartTime(System.currentTimeMillis()); result = datasourceProvider.fetchResultAndField(datasourceRequest); @@ -1275,7 +1267,7 @@ public class DataSetTableService { public Map getUnionPreview(DataSetTableRequest dataSetTableRequest) throws Exception { DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(dataSetTableRequest.getInfo(), DataTableInfoDTO.class); - Map sqlMap = new HashMap<>(); + Map sqlMap; DatasourceRequest datasourceRequest = new DatasourceRequest(); Datasource ds; if (dataSetTableRequest.getMode() == 0) { @@ -1289,7 +1281,6 @@ public class DataSetTableService { } String sql = (String) sqlMap.get("sql"); List fieldList = (List) sqlMap.get("field"); - List join = (List) sqlMap.get("join"); Map res = new HashMap<>(); // 处理结果 @@ -1423,9 +1414,7 @@ public class DataSetTableService { DataTableInfoCustomUnion first = dataTableInfoDTO.getList().get(0); if (CollectionUtils.isNotEmpty(list)) { StringBuilder field = new StringBuilder(); - Iterator> iterator = customInfo.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry next = iterator.next(); + for (Map.Entry next : customInfo.entrySet()) { field.append(StringUtils.join(next.getValue(), ",")).append(","); } String f = field.substring(0, field.length() - 1); @@ -1493,9 +1482,7 @@ public class DataSetTableService { String tableName = new Gson().fromJson(table.getInfo(), DataTableInfoDTO.class).getTable(); if (CollectionUtils.isNotEmpty(list)) { StringBuilder field = new StringBuilder(); - Iterator> iterator = customInfo.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry next = iterator.next(); + for (Map.Entry next : customInfo.entrySet()) { field.append(StringUtils.join(next.getValue(), ",")).append(","); } String f = field.substring(0, field.length() - 1); @@ -1601,9 +1588,7 @@ public class DataSetTableService { if (CollectionUtils.isNotEmpty(unionList)) { // field StringBuilder field = new StringBuilder(); - Iterator> iterator = checkedInfo.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry next = iterator.next(); + for (Map.Entry next : checkedInfo.entrySet()) { field.append(StringUtils.join(next.getValue(), ",")).append(","); } String f = subPrefixSuffixChar(field.toString()); @@ -1664,8 +1649,7 @@ public class DataSetTableService { // 递归计算出所有子级的checkedFields和unionParam private void getUnionSQLDorisJoin(List childrenDs, Map checkedInfo, List unionList, List checkedFields) { - for (int i = 0; i < childrenDs.size(); i++) { - UnionDTO unionDTO = childrenDs.get(i); + for (UnionDTO unionDTO : childrenDs) { String tableId = unionDTO.getCurrentDs().getId(); String table = TableUtils.tableName(tableId); DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(tableId); @@ -1752,9 +1736,7 @@ public class DataSetTableService { if (CollectionUtils.isNotEmpty(unionList)) { // field StringBuilder field = new StringBuilder(); - Iterator> iterator = checkedInfo.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry next = iterator.next(); + for (Map.Entry next : checkedInfo.entrySet()) { field.append(StringUtils.join(next.getValue(), ",")).append(","); } String f = subPrefixSuffixChar(field.toString()); @@ -1825,9 +1807,7 @@ public class DataSetTableService { // 递归计算出所有子级的checkedFields和unionParam private void getUnionSQLDatasourceJoin(List childrenDs, Map checkedInfo, List unionList, String keyword, List checkedFields) { - for (int i = 0; i < childrenDs.size(); i++) { - UnionDTO unionDTO = childrenDs.get(i); - + for (UnionDTO unionDTO : childrenDs) { DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(unionDTO.getCurrentDs().getId()); String tableId = unionDTO.getCurrentDs().getId(); if (ObjectUtils.isEmpty(datasetTable)) { @@ -1976,7 +1956,7 @@ public class DataSetTableService { Map sqlMap = getUnionSQLDoris(dataTableInfoDTO); String sql = (String) sqlMap.get("sql"); List fieldList = (List) sqlMap.get("field"); - List join = (List) sqlMap.get("join"); + // custom 创建doris视图 createDorisView(TableUtils.tableName(datasetTable.getId()), sql); @@ -2003,7 +1983,7 @@ public class DataSetTableService { Map sqlMap = getUnionSQLDatasource(dt, ds); String sql = (String) sqlMap.get("sql"); List fieldList = (List) sqlMap.get("field"); - List join = (List) sqlMap.get("join"); + datasourceRequest.setQuery(sql); fields = datasourceProvider.fetchResultField(datasourceRequest); @@ -2157,16 +2137,15 @@ public class DataSetTableService { private void checkColumes(DatasetTableIncrementalConfig datasetTableIncrementalConfig) throws Exception { DatasetTable datasetTable = datasetTableMapper.selectByPrimaryKey(datasetTableIncrementalConfig.getTableId()); List datasetTableFields = dataSetTableFieldsService.getFieldsByTableId(datasetTable.getId()) - .stream().filter(datasetTableField -> datasetTableField.getExtField() == 0).collect(Collectors.toList()); - datasetTableFields.sort((o1, o2) -> { - if (o1.getColumnIndex() == null) { - return -1; - } - if (o2.getColumnIndex() == null) { - return 1; - } - return o1.getColumnIndex().compareTo(o2.getColumnIndex()); - }); + .stream().filter(datasetTableField -> datasetTableField.getExtField() == 0).sorted((o1, o2) -> { + if (o1.getColumnIndex() == null) { + return -1; + } + if (o2.getColumnIndex() == null) { + return 1; + } + return o1.getColumnIndex().compareTo(o2.getColumnIndex()); + }).collect(Collectors.toList()); List originNameFields = datasetTableFields.stream().map(DatasetTableField::getOriginName) .collect(Collectors.toList()); @@ -2184,9 +2163,7 @@ public class DataSetTableService { List sqlFields = new ArrayList<>(); try { datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableField::getFieldName) - .forEach(field -> { - sqlFields.add(field); - }); + .forEach(sqlFields::add); } catch (Exception e) { DataEaseException.throwException(Translator.get("i18n_check_sql_error") + e.getMessage()); } @@ -2204,7 +2181,7 @@ public class DataSetTableService { List sqlFields = new ArrayList<>(); try { datasourceProvider.fetchResultField(datasourceRequest).stream().map(TableField::getFieldName) - .forEach(field -> sqlFields.add(field)); + .forEach(sqlFields::add); } catch (Exception e) { DataEaseException.throwException(Translator.get("i18n_check_sql_error") + e.getMessage()); } @@ -2228,7 +2205,7 @@ public class DataSetTableService { criteria.andNameEqualTo(datasetTable.getName()); } List list = datasetTableMapper.selectByExample(datasetTableExample); - if (list.size() > 0) { + if (!list.isEmpty()) { throw new RuntimeException(Translator.get("i18n_name_cant_repeat_same_group")); } } @@ -2253,7 +2230,7 @@ public class DataSetTableService { criteria.andNameIn(new ArrayList<>(nameSet)); } List list = datasetTableMapper.selectByExample(datasetTableExample); - if (list.size() > 0) { + if (!list.isEmpty()) { throw new RuntimeException(Translator.get("i18n_name_cant_repeat_same_group")); } } @@ -2265,6 +2242,13 @@ public class DataSetTableService { if (ObjectUtils.isNotEmpty(table)) { Datasource datasource = datasourceMapper.selectByPrimaryKey(table.getDataSourceId()); Optional.ofNullable(datasource).orElse(new Datasource()).setConfiguration(null); + Collection types = datasourceService.types(); + for (DataSourceType type : types) { + if (ObjectUtils.isNotEmpty(datasource) && StringUtils.equalsIgnoreCase(datasource.getType(), type.getType())) { + datasource.setType(type.getName()); + break; + } + } dataSetDetail.setDatasource(datasource); } return dataSetDetail; @@ -2278,8 +2262,7 @@ public class DataSetTableService { if (StringUtils.isNotEmpty(tableId)) { List fields = dataSetTableFieldsService.getFieldsByTableId(tableId); - List datasetTableFields = fields.stream().filter(datasetTableField -> datasetTableField.getExtField() == 0).collect(Collectors.toList()); - datasetTableFields.sort((o1, o2) -> { + List datasetTableFields = fields.stream().filter(datasetTableField -> datasetTableField.getExtField() == 0).sorted((o1, o2) -> { if (o1.getColumnIndex() == null) { return -1; } @@ -2287,7 +2270,7 @@ public class DataSetTableService { return 1; } return o1.getColumnIndex().compareTo(o2.getColumnIndex()); - }); + }).collect(Collectors.toList()); List oldFields = datasetTableFields.stream().map(DatasetTableField::getOriginName).collect(Collectors.toList()); @@ -2299,7 +2282,7 @@ public class DataSetTableService { returnSheetDataList.add(excelSheetData); } } - if (returnSheetDataList.size() == 0) { + if (returnSheetDataList.isEmpty()) { DataEaseException.throwException(Translator.get("i18n_excel_column_change")); } } else { @@ -2321,22 +2304,19 @@ public class DataSetTableService { for (ExcelSheetData excelSheetData : excelSheetDataList) { List tableFields = excelSheetData.getFields(); List newFields = tableFields.stream().map(TableField::getRemarks).collect(Collectors.toList()); - if (oldFields.equals(newFields)) { - excelSheetData.setChangeFiled(false); - } else { - excelSheetData.setChangeFiled(true); - } + excelSheetData.setChangeFiled(!oldFields.equals(newFields)); boolean effectExtField = false; for (String extFieldsRefName : extFieldsRefNames) { if (!newFields.contains(extFieldsRefName)) { effectExtField = true; + break; } } excelSheetData.setEffectExtField(effectExtField); returnSheetDataList.add(excelSheetData); } - if (returnSheetDataList.size() == 0) { + if (returnSheetDataList.isEmpty()) { DataEaseException.throwException(Translator.get("i18n_excel_column_change")); } } @@ -2403,7 +2383,7 @@ public class DataSetTableService { } List> data = new ArrayList<>(); int num = 1; - String line = null; + String line; while ((line = reader.readLine()) != null) { if (num > 100) { break; @@ -2450,7 +2430,7 @@ public class DataSetTableService { try { double d = cell.getNumericCellValue(); try { - Double value = new Double(d); + Double value = d; double eps = 1e-10; if (value - Math.floor(value) < eps) { if (cellType) { @@ -2469,7 +2449,7 @@ public class DataSetTableService { return nf.format(value); } } catch (Exception e) { - BigDecimal b = new BigDecimal(d); + BigDecimal b = BigDecimal.valueOf(d); return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + ""; } } catch (IllegalStateException e) { @@ -2502,7 +2482,7 @@ public class DataSetTableService { } else { double d = cell.getNumericCellValue(); try { - Double value = new Double(d); + Double value = d; double eps = 1e-10; if (value - Math.floor(value) < eps) { if (cellType) { @@ -2521,7 +2501,7 @@ public class DataSetTableService { return nf.format(value); } } catch (Exception e) { - BigDecimal b = new BigDecimal(d); + BigDecimal b = BigDecimal.valueOf(d); return b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() + ""; } } @@ -2655,18 +2635,14 @@ public class DataSetTableService { * 判断数组中是否有重复的值 */ public static boolean checkIsRepeat(String[] array) { - HashSet hashSet = new HashSet(); - for (int i = 0; i < array.length; i++) { - if (StringUtils.isEmpty(array[i])) { + HashSet hashSet = new HashSet<>(); + for (String s : array) { + if (StringUtils.isEmpty(s)) { throw new RuntimeException(Translator.get("i18n_excel_empty_column")); } - hashSet.add(array[i]); - } - if (hashSet.size() == array.length) { - return false; - } else { - return true; + hashSet.add(s); } + return hashSet.size() != array.length; } public DatasetTable syncDatasetTableField(String id) throws Exception { @@ -2857,7 +2833,7 @@ public class DataSetTableService { return expressionDeParser; } - static private boolean hasVariable(String sql) { + private static boolean hasVariable(String sql) { return sql.contains(SubstitutedParams); } @@ -2936,7 +2912,7 @@ public class DataSetTableService { //设置列的宽度 detailsSheet.setColumnWidth(j, 255 * 20); } else { - if ((fields.get(j).getDeType() == DeTypeConstants.DE_INT || fields.get(j).getDeType() == DeTypeConstants.DE_FLOAT) && StringUtils.isNotEmpty(rowData.get(j))) { + if ((fields.get(j).getDeType().equals(DeTypeConstants.DE_INT) || fields.get(j).getDeType() == DeTypeConstants.DE_FLOAT) && StringUtils.isNotEmpty(rowData.get(j))) { try { cell.setCellValue(Double.valueOf(rowData.get(j))); } catch (Exception e) { 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 721a466c5b..0d6dadd22a 100644 --- a/backend/src/main/java/io/dataease/service/message/SysMsgService.java +++ b/backend/src/main/java/io/dataease/service/message/SysMsgService.java @@ -55,6 +55,13 @@ public class SysMsgService { @Autowired private SystemParameterService systemParameterService; + public void cleanDisusedMsg() { + Long overTime = overTime(); + SysMsgExample example = new SysMsgExample(); + example.createCriteria().andCreateTimeLessThan(overTime); + sysMsgMapper.deleteByExample(example); + } + public List queryGrid(Long userId, MsgRequest msgRequest, List typeIds, Long startTime) { String orderClause = " create_time desc"; SysMsgExample example = new SysMsgExample(); diff --git a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java index fccd45ab89..5ad6ab684e 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelGroupService.java @@ -29,6 +29,7 @@ import io.dataease.listener.util.CacheUtils; import io.dataease.plugins.common.base.domain.*; import io.dataease.plugins.common.base.mapper.*; import io.dataease.plugins.common.constants.DeTypeConstants; +import io.dataease.service.SystemInfoService; import io.dataease.service.chart.ChartViewService; import io.dataease.service.dataset.DataSetGroupService; import io.dataease.service.dataset.DataSetTableService; @@ -131,6 +132,10 @@ public class PanelGroupService { private DataSetGroupService dataSetGroupService; @Resource private DatasetGroupMapper datasetGroupMapper; + @Resource + private PanelWatermarkMapper panelWatermarkMapper; + @Resource + private SystemInfoService systemInfoService; public List tree(PanelGroupRequest panelGroupRequest) { String userId = String.valueOf(AuthUtils.getUser().getUserId()); @@ -304,6 +309,7 @@ public class PanelGroupService { panelGroup.setPanelStyle(sourcePanel.getPanelStyle()); panelGroup.setSourcePanelName(sourcePanel.getName()); } + panelGroup.setWatermarkInfo(panelWatermarkMapper.selectByPrimaryKey("system_default")); return panelGroup; } @@ -750,7 +756,9 @@ public class PanelGroupService { if (cache == null) { return null; } else { - return (PanelGroupRequest) cache; + PanelGroupDTO result = (PanelGroupRequest) cache; + result.setWatermarkInfo(panelWatermarkMapper.selectByPrimaryKey("system_default")); + return result; } } @@ -939,4 +947,15 @@ public class PanelGroupService { //数据源变更 panelAppTemplateService.editDatasource(request.getDatasourceList()); } + + public void toTop(String panelId) { + Long time = System.currentTimeMillis(); + PanelGroupWithBLOBs request = new PanelGroupWithBLOBs(); + request.setId(panelId); + request.setPanelSort(time); + request.setUpdateTime(time); + request.setUpdateBy(AuthUtils.getUser().getUsername()); + panelGroupMapper.updateByPrimaryKeySelective(request); + + } } 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 0d9283abfd..6caf7c6e57 100644 --- a/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java +++ b/backend/src/main/java/io/dataease/service/panel/PanelLinkService.java @@ -4,26 +4,26 @@ import io.dataease.auth.config.RsaProperties; import io.dataease.auth.util.JWTUtils; import io.dataease.auth.util.RsaUtil; import io.dataease.commons.constants.SysLogConstants; -import io.dataease.commons.utils.AuthUtils; -import io.dataease.commons.utils.CodingUtil; -import io.dataease.commons.utils.DeLogUtils; -import io.dataease.commons.utils.ServletUtils; +import io.dataease.commons.utils.*; 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.dto.panel.PanelGroupDTO; import io.dataease.dto.panel.link.GenerateDto; +import io.dataease.ext.ExtPanelLinkMapper; import io.dataease.plugins.common.base.domain.*; import io.dataease.plugins.common.base.mapper.PanelGroupMapper; import io.dataease.plugins.common.base.mapper.PanelLinkMapper; import io.dataease.plugins.common.base.mapper.PanelLinkMappingMapper; +import io.dataease.plugins.common.base.mapper.PanelWatermarkMapper; 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 io.dataease.ext.ExtPanelLinkMapper; + import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -47,6 +47,8 @@ public class PanelLinkService { private ExtPanelLinkMapper extPanelLinkMapper; @Resource private PanelLinkMappingMapper panelLinkMappingMapper; + @Resource + private PanelWatermarkMapper panelWatermarkMapper; @Transactional public void changeValid(LinkRequest request) { @@ -67,7 +69,7 @@ public class PanelLinkService { if (!request.isValid()) { operateType = SysLogConstants.OPERATE_TYPE.DELETELINK; } - DeLogUtils.save(operateType, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null) ; + DeLogUtils.save(operateType, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null); } private PanelLinkExample example(String panelLinkId, Long userId) { @@ -82,7 +84,7 @@ public class PanelLinkService { po.setEnablePwd(request.isEnablePwd()); mapper.updateByExampleSelective(po, example(request.getResourceId(), AuthUtils.getUser().getUserId())); PanelGroupWithBLOBs panel = panelGroupMapper.selectByPrimaryKey(request.getResourceId()); - DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFYLINK, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null) ; + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFYLINK, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null); } public void password(PasswordRequest request) { @@ -93,14 +95,14 @@ public class PanelLinkService { PanelGroupWithBLOBs panel = panelGroupMapper.selectByPrimaryKey(request.getResourceId()); - DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFYLINK, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null) ; + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFYLINK, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null); } public void overTime(OverTimeRequest request) { request.setUserId(AuthUtils.getUser().getUserId()); extPanelLinkMapper.updateOverTime(request); PanelGroupWithBLOBs panel = panelGroupMapper.selectByPrimaryKey(request.getResourceId()); - DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFYLINK, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null) ; + DeLogUtils.save(SysLogConstants.OPERATE_TYPE.MODIFYLINK, SysLogConstants.SOURCE_TYPE.PANEL, panel.getId(), panel.getPid(), null, null); } private PanelLink findOne(String resourceId) { @@ -232,8 +234,12 @@ public class PanelLinkService { return pass; } - public PanelGroupWithBLOBs resourceInfo(String resourceId) { - return panelGroupMapper.selectByPrimaryKey(resourceId); + public PanelGroupDTO resourceInfo(String resourceId) { + PanelGroupWithBLOBs result = panelGroupMapper.selectByPrimaryKey(resourceId); + PanelGroupDTO panelGroupDTO = new PanelGroupDTO(); + BeanUtils.copyBean(panelGroupDTO, result); + panelGroupDTO.setWatermarkInfo(panelWatermarkMapper.selectByPrimaryKey("system_default")); + return panelGroupDTO; } public String getShortUrl(String resourceId) { 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 466153a885..a29e38c3cd 100644 --- a/backend/src/main/java/io/dataease/service/sys/SysUserService.java +++ b/backend/src/main/java/io/dataease/service/sys/SysUserService.java @@ -74,7 +74,7 @@ public class SysUserService { List lists = extSysUserMapper.query(gridExample); lists.forEach(item -> { List roles = item.getRoles(); - List roleIds = roles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + List roleIds = roles.stream().filter(ObjectUtils::isNotEmpty).map(SysUserRole::getRoleId).collect(Collectors.toList()); item.setRoleIds(roleIds); }); return lists; diff --git a/backend/src/main/resources/db/migration/V44__1.17.sql b/backend/src/main/resources/db/migration/V44__1.17.sql index 13a33cb876..30b3206948 100644 --- a/backend/src/main/resources/db/migration/V44__1.17.sql +++ b/backend/src/main/resources/db/migration/V44__1.17.sql @@ -3,4 +3,39 @@ ALTER TABLE `sys_log` CHANGE COLUMN `login_name` `login_name` VARCHAR (255) NULL COMMENT '登录账号', CHANGE COLUMN `nick_name` `nick_name` VARCHAR (255) NULL COMMENT '姓名'; -UPDATE `sys_menu` SET `component` = 'dataset/Form' WHERE (`menu_id` = '800'); +ALTER TABLE `panel_group` + ADD COLUMN `watermark_open` tinyint(1) NULL DEFAULT 1 COMMENT '是否单独打开水印' AFTER `update_time`; + +DROP TABLE IF EXISTS `panel_watermark`; +CREATE TABLE `panel_watermark` +( + `id` varchar(50) NOT NULL, + `version` varchar(255) DEFAULT NULL COMMENT '版本号', + `setting_content` longtext COMMENT '设置内容', + `create_by` varchar(255) DEFAULT NULL, + `create_time` bigint(13) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci; + +INSERT INTO `panel_watermark` (`id`, `version`, `setting_content`, `create_by`, `create_time`) +VALUES ('system_default', '1.0', + '{\"enable\":false,\"enablePanelCustom\":true,\"type\":\"custom\",\"content\":\"${time}-${nickName}\",\"watermark_color\":\"#999999\",\"watermark_x_space\":20,\"watermark_y_space\":100,\"watermark_fontsize\":20}', + 'admin', NULL); + +SET +FOREIGN_KEY_CHECKS = 1; + +UPDATE `sys_menu` +SET `component` = 'dataset/Form' +WHERE (`menu_id` = '800'); + + +UPDATE `sys_menu` +SET `component` = 'msg/All' +WHERE (`component` = 'msg/all'); +UPDATE `sys_menu` +SET `component` = 'msg/Setting' +WHERE (`component` = 'msg/setting'); + +ALTER TABLE `panel_group` + ADD COLUMN `panel_sort` bigint(13) NULL COMMENT '排序' AFTER `watermark_open`; diff --git a/frontend/pom.xml b/frontend/pom.xml index 11db3e4b63..a7f1541574 100644 --- a/frontend/pom.xml +++ b/frontend/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> dataease-server @@ -44,7 +44,7 @@ - install --force + install @@ -62,4 +62,4 @@ - + \ No newline at end of file diff --git a/frontend/public/dynamic.gif b/frontend/public/dynamic.gif new file mode 100644 index 0000000000..d70762819a Binary files /dev/null and b/frontend/public/dynamic.gif differ diff --git a/frontend/public/lic.png b/frontend/public/lic.png new file mode 100644 index 0000000000..27f6c77607 Binary files /dev/null and b/frontend/public/lic.png differ diff --git a/frontend/public/nolic.html b/frontend/public/nolic.html index fc6f71162b..f7bb622070 100644 --- a/frontend/public/nolic.html +++ b/frontend/public/nolic.html @@ -1,13 +1,46 @@ + DataEase + + + -
缺少许可
+ + - + + + + \ No newline at end of file diff --git a/frontend/public/nologin.html b/frontend/public/nologin.html new file mode 100644 index 0000000000..d173f43855 --- /dev/null +++ b/frontend/public/nologin.html @@ -0,0 +1,50 @@ + + + + + + + + DataEase + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/api/dataset/dataset.js b/frontend/src/api/dataset/dataset.js index c96d1a7bec..fc4c5b7c69 100644 --- a/frontend/src/api/dataset/dataset.js +++ b/frontend/src/api/dataset/dataset.js @@ -136,6 +136,14 @@ export function fieldListDQ(id, showLoading = true) { }) } +export function dateformats(id, showLoading = true) { + return request({ + url: '/dataset/field/dateformats/' + id, + loading: showLoading, + method: 'post' + }) +} + export function batchEdit(data) { return request({ url: '/dataset/field/batchEdit', diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index 9d5d7198c6..6bd6714b92 100644 --- a/frontend/src/api/panel/panel.js +++ b/frontend/src/api/panel/panel.js @@ -66,6 +66,7 @@ export function viewData(id, panelId, data) { data }) } + export function panelSave(data) { return request({ url: 'panel/group/save', @@ -162,6 +163,10 @@ export function initPanelData(panelId, useCache = false, callback) { if (response.data) { // 初始化视图data和style 数据 panelInit(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle)) + const watermarkInfo = { + ...response.data.watermarkInfo, + settingContent: JSON.parse(response.data.watermarkInfo.settingContent) + } // 设置当前仪表板全局信息 store.dispatch('panel/setPanelInfo', { id: response.data.id, @@ -174,7 +179,9 @@ export function initPanelData(panelId, useCache = false, callback) { creatorName: response.data.creatorName, updateBy: response.data.updateBy, updateName: response.data.updateName, - updateTime: response.data.updateTime + updateTime: response.data.updateTime, + watermarkOpen: response.data.watermarkOpen, + watermarkInfo: watermarkInfo }) // 刷新联动信息 getPanelAllLinkageInfo(panelId).then(rsp => { @@ -230,6 +237,7 @@ export function initViewCache(panelId) { loading: false }) } + export function exportDetails(data) { // 初始化仪表板视图缓存 return request({ @@ -268,6 +276,7 @@ export function saveCache(data) { data }) } + export function findUserCacheRequest(panelId) { return request({ url: 'panel/group/findUserCache/' + panelId, @@ -349,3 +358,11 @@ export function findOneWithParent(panelId) { loading: false }) } + +export function panelToTop(panelId) { + return request({ + url: 'panel/group/toTop/' + panelId, + method: 'post', + loading: false + }) +} diff --git a/frontend/src/api/panel/shareProxy.js b/frontend/src/api/panel/shareProxy.js index 2ee5fcab34..10c5853dd7 100644 --- a/frontend/src/api/panel/shareProxy.js +++ b/frontend/src/api/panel/shareProxy.js @@ -10,6 +10,10 @@ export function proxyInitPanelData(panelId, proxy, callback) { if (response.data) { // 初始化视图data和style 数据 panelInit(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle)) + const watermarkInfo = { + ...response.data.watermarkInfo, + settingContent: JSON.parse(response.data.watermarkInfo.settingContent) + } // 设置当前仪表板全局信息 store.dispatch('panel/setPanelInfo', { id: response.data.id, @@ -23,7 +27,9 @@ export function proxyInitPanelData(panelId, proxy, callback) { creatorName: response.data.creatorName, updateBy: response.data.updateBy, updateName: response.data.updateName, - updateTime: response.data.updateTime + updateTime: response.data.updateTime, + watermarkOpen: response.data.watermarkOpen, + watermarkInfo: watermarkInfo }) // 刷新联动信息 getPanelAllLinkageInfo(panelId, proxy).then(rsp => { diff --git a/frontend/src/api/systemInfo/userLogin.js b/frontend/src/api/systemInfo/userLogin.js new file mode 100644 index 0000000000..87ab9fc4af --- /dev/null +++ b/frontend/src/api/systemInfo/userLogin.js @@ -0,0 +1,22 @@ +import request from '@/utils/request' + +export function userLoginInfo() { + return request({ + url: '/systemInfo/userLoginInfo', + method: 'get', + loading: false + }) +} + +export function proxyUserLoginInfo(userId) { + return request({ + url: '/systemInfo/proxyUserLoginInfo/' + userId, + method: 'get', + loading: false + }) +} + +export default { + userLoginInfo, + proxyUserLoginInfo +} diff --git a/frontend/src/components/canvas/DeCanvas.vue b/frontend/src/components/canvas/DeCanvas.vue index e954e3fb4c..4e0eab71aa 100644 --- a/frontend/src/components/canvas/DeCanvas.vue +++ b/frontend/src/components/canvas/DeCanvas.vue @@ -96,7 +96,7 @@ import { mapState } from 'vuex' import DeEditor from '@/components/canvas/components/editor/DeEditor' import elementResizeDetectorMaker from 'element-resize-detector' import bus from '@/utils/bus' -import { deepCopy } from '@/components/canvas/utils/utils' +import { deepCopy, imgUrlTrans } from '@/components/canvas/utils/utils' import { uuid } from 'vue-uuid' import componentList, { BASE_MOBILE_STYLE, @@ -113,6 +113,7 @@ import generateID from '@/components/canvas/utils/generateID' import ButtonDialog from '@/views/panel/filter/ButtonDialog' import ButtonResetDialog from '@/views/panel/filter/ButtonResetDialog' import FilterDialog from '@/views/panel/filter/FilterDialog' +import { uploadFileResult } from '@/api/staticResource/staticResource' export default { components: { FilterDialog, ButtonResetDialog, ButtonDialog, DeEditor }, @@ -147,6 +148,7 @@ export default { }, data() { return { + maxImageSize: 15000000, // 需要展示属性设置的组件类型 showAttrComponent: [ 'custom', @@ -289,6 +291,7 @@ export default { } }, canvasScroll(e) { + this.scrollTop = e.target.scrollTop this.$emit('canvasScroll', { scrollLeft: e.target.scrollLeft, scrollTop: e.target.scrollTop }) bus.$emit('onScroll') }, @@ -411,50 +414,50 @@ export default { goFile() { this.$refs.files.click() }, + sizeMessage() { + this.$notify({ + message: this.$t('panel.image_size_tips'), + position: 'top-left' + }) + }, handleFileChange(e) { const _this = this const file = e.target.files[0] if (!file.type.includes('image')) { - toast('只能插入图片') + toast(this.$t('panel.image_size_tips')) return } - const reader = new FileReader() - reader.onload = (res) => { - const fileResult = res.target.result - const img = new Image() - img.onload = () => { - const component = { - ...commonAttr, - id: generateID(), - component: 'Picture', - type: 'picture-add', - label: '图片', - icon: '', - hyperlinks: HYPERLINKS, - mobileStyle: BASE_MOBILE_STYLE, - propValue: fileResult, - commonBackground: deepCopy(COMMON_BACKGROUND), - style: { - ...PIC_STYLE - } - } - component.auxiliaryMatrix = false - component.style.top = _this.dropComponentInfo.shadowStyle.y - component.style.left = _this.dropComponentInfo.shadowStyle.x - component.style.width = _this.dropComponentInfo.shadowStyle.width - component.style.height = _this.dropComponentInfo.shadowStyle.height - component['canvasId'] = this.canvasId - component['canvasPid'] = this.canvasPid - this.$store.commit('addComponent', { - component: component - }) - this.$store.commit('recordSnapshot', 'handleFileChange') - } - - img.src = fileResult + if (file.size > this.maxImageSize) { + this.sizeMessage() } - - reader.readAsDataURL(file) + uploadFileResult(file, (fileUrl) => { + const component = { + ...commonAttr, + id: generateID(), + component: 'Picture', + type: 'picture-add', + label: '图片', + icon: '', + hyperlinks: HYPERLINKS, + mobileStyle: BASE_MOBILE_STYLE, + propValue: imgUrlTrans(fileUrl), + commonBackground: deepCopy(COMMON_BACKGROUND), + style: { + ...PIC_STYLE + } + } + component.auxiliaryMatrix = false + component.style.top = _this.dropComponentInfo.shadowStyle.y + component.style.left = _this.dropComponentInfo.shadowStyle.x + component.style.width = _this.dropComponentInfo.shadowStyle.width + component.style.height = _this.dropComponentInfo.shadowStyle.height + component['canvasId'] = this.canvasId + component['canvasPid'] = this.canvasPid + this.$store.commit('addComponent', { + component: component + }) + this.$store.commit('recordSnapshot', 'handleFileChange') + }) }, clearCurrentInfo() { this.currentWidget = null diff --git a/frontend/src/components/canvas/components/Toolbar.vue b/frontend/src/components/canvas/components/Toolbar.vue index 31d1992cc5..1ab2995f04 100644 --- a/frontend/src/components/canvas/components/Toolbar.vue +++ b/frontend/src/components/canvas/components/Toolbar.vue @@ -138,6 +138,18 @@ {{ $t('panel.clean_canvas') }} + + + {{ $t('panel.watermark') }} + + @@ -250,6 +262,9 @@ export default { } }, computed: { + showWatermarkSetting() { + return this.panelInfo.watermarkInfo && this.panelInfo.watermarkInfo.settingContent.enable && this.panelInfo.watermarkInfo.settingContent.enablePanelCustom + }, panelInfo() { return this.$store.state.panel.panelInfo }, @@ -428,9 +443,10 @@ export default { if (_this.$store.state.cacheStyleChangeTimes > 0) { const requestInfo = _this.savePrepare() const cacheRequest = { - ...this.panelInfo, + ...deepCopy(this.panelInfo), ...requestInfo } + cacheRequest.watermarkInfo.settingContent = JSON.stringify(this.panelInfo.watermarkInfo.settingContent) saveCache(cacheRequest) _this.$store.state.cacheStyleChangeTimes = 0 } @@ -440,6 +456,7 @@ export default { // 保存到数据库 const requestInfo = { id: this.panelInfo.id, + watermarkOpen: this.panelInfo.watermarkOpen, panelStyle: JSON.stringify(this.canvasStyleData), panelData: JSON.stringify(this.componentData) } @@ -610,6 +627,9 @@ export default { } }) this.cancelMobileLayoutStatue(sourceComponentData) + }, + styleChange() { + this.$store.commit('canvasChange') } } } diff --git a/frontend/src/components/canvas/components/editor/CanvasOptBar.vue b/frontend/src/components/canvas/components/editor/CanvasOptBar.vue index d5643e5c3f..0f174096c0 100644 --- a/frontend/src/components/canvas/components/editor/CanvasOptBar.vue +++ b/frontend/src/components/canvas/components/editor/CanvasOptBar.vue @@ -1,18 +1,43 @@ diff --git a/frontend/src/views/panel/edit/ComponentWaitItem.vue b/frontend/src/views/panel/edit/ComponentWaitItem.vue index 80dda2ac9e..57753a534c 100644 --- a/frontend/src/views/panel/edit/ComponentWaitItem.vue +++ b/frontend/src/views/panel/edit/ComponentWaitItem.vue @@ -163,7 +163,7 @@ export default { position: absolute; top: 0; left: 0; - width: 100%; - height: 100%; + width: 100% !important; + height: 100% !important; } diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index 5aa71b3586..5d4f1914a5 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -251,7 +251,6 @@ @@ -525,6 +524,8 @@ import { adaptCurThemeCommonStyle } from '@/components/canvas/utils/style' import eventBus from '@/components/canvas/utils/eventBus' import DeCanvas from '@/components/canvas/DeCanvas' import TextAttr from '@/components/canvas/components/TextAttr' +import { userLoginInfo } from '@/api/systemInfo/userLogin' +import { activeWatermark } from '@/components/canvas/tools/watermark' export default { name: 'PanelEdit', @@ -680,13 +681,15 @@ export default { mobileCanvasStyle() { let style if (this.canvasStyleData.openCommonStyle) { - if (this.canvasStyleData.panel.backgroundType === 'image' && typeof (this.canvasStyleData.panel.imageUrl) === 'string') { + const styleInfo = this.canvasStyleData.panel.mobileSetting && this.canvasStyleData.panel.mobileSetting.customSetting + ? this.canvasStyleData.panel.mobileSetting : this.canvasStyleData.panel + if (styleInfo.backgroundType === 'image' && typeof (styleInfo.imageUrl) === 'string') { style = { - background: `url(${imgUrlTrans(this.canvasStyleData.panel.imageUrl)}) no-repeat` + background: `url(${imgUrlTrans(styleInfo.imageUrl)}) no-repeat` } - } else if (this.canvasStyleData.panel.backgroundType === 'color') { + } else if (styleInfo.backgroundType === 'color') { style = { - background: this.canvasStyleData.panel.color + background: styleInfo.color } } else { style = { @@ -777,6 +780,12 @@ export default { }, previewVisible(val) { this.$store.commit('setPreviewVisible', val) + }, + panelInfo: { + handler(newVal, oldVla) { + this.initWatermark() + }, + deep: true } }, created() { @@ -784,6 +793,7 @@ export default { listenGlobalKeyDown() }, mounted() { + this.initWatermark() this.initEvents() const _this = this const erd = elementResizeDetectorMaker() @@ -810,6 +820,14 @@ export default { elx && elx.remove() }, methods: { + initWatermark() { + if (this.panelInfo.watermarkInfo) { + userLoginInfo().then(res => { + const userInfo = res.data + activeWatermark(this.panelInfo.watermarkInfo.settingContent, userInfo, 'canvasInfo-main', this.canvasId, this.panelInfo.watermarkOpen) + }) + } + }, componentOnDrag() { this.show = false }, @@ -1537,7 +1555,7 @@ export default { .this_mobile_canvas_wait_cell { background-size: 100% 100% !important; - border: 2px solid #9ea6b2 + border: 1px solid #9ea6b2 } .canvas_main_content { diff --git a/frontend/src/views/panel/filter/FilterDialog.vue b/frontend/src/views/panel/filter/FilterDialog.vue index bf6c0b64ef..800b383913 100644 --- a/frontend/src/views/panel/filter/FilterDialog.vue +++ b/frontend/src/views/panel/filter/FilterDialog.vue @@ -267,7 +267,6 @@
+ + + + + +
@@ -197,9 +210,10 @@ + + diff --git a/frontend/src/views/panel/filter/filterMain/FilterHead.vue b/frontend/src/views/panel/filter/filterMain/FilterHead.vue index 1f9367ab76..3f2431b546 100644 --- a/frontend/src/views/panel/filter/filterMain/FilterHead.vue +++ b/frontend/src/views/panel/filter/filterMain/FilterHead.vue @@ -23,13 +23,10 @@ > @@ -46,7 +43,6 @@ + + diff --git a/frontend/src/views/panel/list/PanelList.vue b/frontend/src/views/panel/list/PanelList.vue index 5d63a8b899..4a77719708 100644 --- a/frontend/src/views/panel/list/PanelList.vue +++ b/frontend/src/views/panel/list/PanelList.vue @@ -67,6 +67,19 @@ :title="data.name" >{{ data.name }} + + + { + this.defaultTree() + }) + }, fromAppActive() { this.activeNodeAndClickOnly(this.lastActiveNode) this.clearLocalStorage.forEach((item) => { @@ -637,7 +667,7 @@ export default { closeEditPanelDialog(panelInfo) { this.editPanel.visible = false if (panelInfo) { - this.defaultTree() + this.defaultTree(false) this.tree() if (this.editPanel.optType === 'rename' && panelInfo.id === this.$store.state.panel.panelInfo.id) { this.$store.state.panel.panelInfo.name = panelInfo.name @@ -809,7 +839,7 @@ export default { showClose: true }) this.tree() - this.defaultTree() + this.defaultTree(false) }) } else { this.$message({ @@ -837,7 +867,7 @@ export default { }) this.clearCanvas() this.tree() - this.defaultTree() + this.defaultTree(false) }) }) .catch(() => { @@ -887,7 +917,7 @@ export default { } }) }, - defaultTree(cache = false) { + defaultTree(cache = false, showFirst = false) { const requestInfo = { panelType: 'system' } @@ -896,21 +926,38 @@ export default { if (userCache) { this.defaultData = JSON.parse(modelInfo) + if (showFirst && this.defaultData.length > 0) { + this.activeDefaultNodeAndClickOnly(this.defaultData[0].id) + } } + const currentKey = this.$refs.default_panel_tree.getCurrentKey() defaultTree(requestInfo, false).then((res) => { localStorage.setItem('panel-default-tree', JSON.stringify(res.data)) if (!userCache) { this.defaultData = res.data + if (showFirst && this.defaultData.length > 0) { + this.activeDefaultNodeAndClickOnly(this.defaultData[0].id) + } } if (this.filterText) { this.$nextTick(() => { this.$refs.default_panel_tree.filter(this.filterText) }) } + if (currentKey) { + this.$nextTick(() => { + this.$refs.default_panel_tree.setCurrentKey(currentKey) + }) + } }) }, nodeClick(data, node) { + if (data.panelType === 'self') { + this.$refs.default_panel_tree.setCurrentKey(null) + } else { + this.$refs.panel_list_tree.setCurrentKey(null) + } this.lastActiveNode = node this.lastActiveNodeData = data this.activeTree = data.panelType @@ -969,7 +1016,8 @@ export default { createBy: data.createBy, createTime: data.createTime, updateBy: data.updateBy, - updateTime: data.updateTime + updateTime: data.updateTime, + watermarkOpen: data.watermarkOpen }) bus.$emit('PanelSwitchComponent', { name: 'PanelEdit' }) }, @@ -1028,6 +1076,20 @@ export default { }) } }, + // 激活当前默认仪表板节点节点 + activeDefaultNodeAndClickOnly(panelId) { + if (panelId) { + const _this = this + _this.$nextTick(() => { + _this.$refs.panel_list_tree.setCurrentKey(null) + // 延迟设置CurrentKey + _this.$refs.default_panel_tree.setCurrentKey(panelId) + _this.$nextTick(() => { + document.querySelector('.is-current').firstChild.click() + }) + }) + } + }, moveTo(data) { const _this = this this.moveInfo = data diff --git a/frontend/src/views/panel/panel.js b/frontend/src/views/panel/panel.js index d7a26c1731..f4cf0e7bc8 100644 --- a/frontend/src/views/panel/panel.js +++ b/frontend/src/views/panel/panel.js @@ -2,6 +2,7 @@ import { DEFAULT_COLOR_CASE, DEFAULT_TITLE_STYLE } from '@/views/chart/chart/chart' import { deepCopy } from '@/components/canvas/utils/utils' import { COMMON_BACKGROUND_BASE } from '@/components/canvas/customComponent/component-list' + export const TAB_COMMON_STYLE = { headFontColor: '#000000', headFontActiveColor: '#000000', @@ -28,7 +29,15 @@ export const FILTER_COMMON_STYLE_DARK = { innerBgColor: '#131E42' } +export const MOBILE_SETTING = { + customSetting: false, + color: '#ffffff', + imageUrl: null, + backgroundType: 'image' +} + export const DEFAULT_PANEL_STYLE = { + mobileSetting: MOBILE_SETTING, themeColor: 'light', color: '#ffffff', imageUrl: null, @@ -60,6 +69,7 @@ export const CANVAS_STYLE = { showGrid: false, matrixBase: 4 // 当前matrix的基数 (是pcMatrixCount的几倍) }, // 辅助设计 + refreshViewEnable: true, // 开启视图刷新(默认开启) refreshViewLoading: true, // 仪表板视图loading提示 refreshUnit: 'minute', // 仪表板刷新时间带外 默认 分钟 refreshTime: 5, // 仪表板刷新时间 默认5分钟 diff --git a/frontend/src/views/panel/subjectSetting/index.vue b/frontend/src/views/panel/subjectSetting/index.vue index 2478507a09..a34dc1606e 100644 --- a/frontend/src/views/panel/subjectSetting/index.vue +++ b/frontend/src/views/panel/subjectSetting/index.vue @@ -21,7 +21,7 @@ @change="handleChange" > @@ -29,31 +29,31 @@ @@ -204,21 +204,21 @@ export default { font-weight: 700 } -.theme-slider-position{ +.theme-slider-position { height: 1px; position: absolute; left: 15px; right: 15px; top: 40px; - box-sizing:border-box; + box-sizing: border-box; border-bottom: 1px solid #e8eaed } -::v-deep .el-collapse-item__header{ - font-weight: 500!important; - font-size: 14px!important; +::v-deep .el-collapse-item__header { + font-weight: 500 !important; + font-size: 14px !important; color: var(--TextPrimary, #1F2329); - padding: 0!important; + padding: 0 !important; } diff --git a/frontend/src/views/panel/subjectSetting/panelStyle/BackgroundSelector.vue b/frontend/src/views/panel/subjectSetting/panelStyle/BackgroundSelector.vue index d9a08df6d4..2e60b5b8ed 100644 --- a/frontend/src/views/panel/subjectSetting/panelStyle/BackgroundSelector.vue +++ b/frontend/src/views/panel/subjectSetting/panelStyle/BackgroundSelector.vue @@ -87,10 +87,9 @@ diff --git a/frontend/src/views/panel/subjectSetting/panelStyle/OverallSetting.vue b/frontend/src/views/panel/subjectSetting/panelStyle/OverallSetting.vue index a4c6f6c625..0f47ffee02 100644 --- a/frontend/src/views/panel/subjectSetting/panelStyle/OverallSetting.vue +++ b/frontend/src/views/panel/subjectSetting/panelStyle/OverallSetting.vue @@ -38,12 +38,20 @@ {{ $t('panel.refresh_frequency') }} + + {{ $t('panel.enable_refresh_view') }} + 视图加载提示 + >{{ $t('panel.enable_view_loading') }} @@ -55,12 +63,14 @@ controls-position="right" :min="1" :max="3600" + :disabled="!overallSettingForm.refreshViewEnable" @change="themeChange" />