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 0fd46ef9a9..c90acdab05 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 @@ -118,6 +118,7 @@ public class ShiroServiceImpl implements ShiroService { filterChainDefinitionMap.put("/api/link/resourceDetail/**", "link"); filterChainDefinitionMap.put("/api/link/viewDetail/**", "link"); + filterChainDefinitionMap.put("/api/link/viewLog", "link"); filterChainDefinitionMap.put("/panel/group/exportDetails", ANON); filterChainDefinitionMap.put("/dataset/field/linkMultFieldValues", "link"); filterChainDefinitionMap.put("/dataset/field/linkMappingFieldValues", "link"); diff --git a/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java b/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java index 9a6489ddc8..2c309f8f09 100644 --- a/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java +++ b/backend/src/main/java/io/dataease/commons/constants/SysLogConstants.java @@ -37,6 +37,7 @@ public class SysLogConstants { UNBIND(17, "OPERATE_TYPE_UNBIND"); private Integer value; private String name; + OPERATE_TYPE(Integer value, String name) { this.value = value; this.name = name; @@ -62,7 +63,7 @@ public class SysLogConstants { DATASET(2, "SOURCE_TYPE_DATASET"), PANEL(3, "SOURCE_TYPE_PANEL"), VIEW(4, "SOURCE_TYPE_VIEW"), - /*LINK(5, "SOURCE_TYPE_LINK"),*/ + LINK(5, "SOURCE_TYPE_LINK"), USER(6, "SOURCE_TYPE_USER"), DEPT(7, "SOURCE_TYPE_DEPT"), ROLE(8, "SOURCE_TYPE_ROLE"), diff --git a/backend/src/main/java/io/dataease/commons/utils/DeLogUtils.java b/backend/src/main/java/io/dataease/commons/utils/DeLogUtils.java index d996a2d7f4..89f58261e2 100644 --- a/backend/src/main/java/io/dataease/commons/utils/DeLogUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/DeLogUtils.java @@ -34,14 +34,14 @@ public class DeLogUtils { DeLogUtils.logService = logService; } - public static SysLogDTO buildLog(OPERATE_TYPE operatetype, SOURCE_TYPE sourcetype, Object sourceIdValue, Object targetId, SOURCE_TYPE target_type ) { + public static SysLogDTO buildLog(OPERATE_TYPE operatetype, SOURCE_TYPE sourcetype, Object sourceIdValue, Object targetId, SOURCE_TYPE target_type) { SysLogDTO sysLogDTO = buildLog(operatetype, sourcetype, sourceIdValue, null, targetId, target_type); if (sourcetype == SysLogConstants.SOURCE_TYPE.DATASOURCE) { FolderItem folderItem = logManager.dsTypeInfoById(sourceIdValue.toString()); List items = new ArrayList<>(); items.add(folderItem); sysLogDTO.setPositions(items); - }else { + } else { List parentsAndSelf = logManager.justParents(sourceIdValue.toString(), sourcetype); sysLogDTO.setPositions(parentsAndSelf); } @@ -66,7 +66,7 @@ public class DeLogUtils { return sysLogDTO; } - public static SysLogDTO buildLog(OPERATE_TYPE operatetype, SOURCE_TYPE sourcetype, Object sourceIdValue, Object positionId, Object targetId, SOURCE_TYPE target_type ) { + public static SysLogDTO buildLog(OPERATE_TYPE operatetype, SOURCE_TYPE sourcetype, Object sourceIdValue, Object positionId, Object targetId, SOURCE_TYPE target_type) { SysLogDTO sysLogDTO = new SysLogDTO(); sysLogDTO.setOperateType(operatetype.getValue()); sysLogDTO.setSourceType(sourcetype.getValue()); @@ -83,14 +83,14 @@ public class DeLogUtils { List items = new ArrayList<>(); items.add(folderItem); sysLogDTO.setPositions(items); - }else { - if(sourcetype == SOURCE_TYPE.DRIVER_FILE){ + } else { + if (sourcetype == SOURCE_TYPE.DRIVER_FILE) { List parentsAndSelf = logManager.parentsAndSelf(positionId.toString(), SOURCE_TYPE.DRIVER); sysLogDTO.setPositions(parentsAndSelf); - }else if(sourcetype == SOURCE_TYPE.VIEW){ + } else if (sourcetype == SOURCE_TYPE.VIEW || sourcetype == SOURCE_TYPE.LINK) { List parentsAndSelf = logManager.parentsAndSelf(positionId.toString(), SOURCE_TYPE.PANEL); sysLogDTO.setPositions(parentsAndSelf); - }else { + } else { List parentsAndSelf = logManager.parentsAndSelf(positionId.toString(), sourcetype); sysLogDTO.setPositions(parentsAndSelf); } diff --git a/backend/src/main/java/io/dataease/commons/utils/IPUtils.java b/backend/src/main/java/io/dataease/commons/utils/IPUtils.java new file mode 100644 index 0000000000..8a9cc8088e --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/utils/IPUtils.java @@ -0,0 +1,45 @@ +package io.dataease.commons.utils; + +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; + +public class IPUtils { + + private static final String HEAD_KEYS = "x-forwarded-for, Proxy-Client-IP, WL-Proxy-Client-IP"; + + private static final String UNKNOWN = "unknown"; + + private static final String LOCAL_IP_KEY = "0:0:0:0:0:0:0:1"; + private static final String LOCAL_IP_VAL = "127.0.0.1"; + + public static String get() { + + String ipStr = null; + boolean isProxy = false; + + HttpServletRequest request = null; + try { + request = ServletUtils.request(); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + return null; + } + String[] keyArr = HEAD_KEYS.split(","); + for (String key : keyArr) { + String header = request.getHeader(key.trim()); + if (StringUtils.isNotBlank(header) && !StringUtils.equalsIgnoreCase(UNKNOWN, header)) { + ipStr = header; + isProxy = true; + break; + } + } + + if (!isProxy) { + ipStr = request.getRemoteAddr(); + } + ipStr = Arrays.stream(ipStr.split(",")).filter(item -> StringUtils.isNotBlank(item) && !StringUtils.equalsIgnoreCase(UNKNOWN, item.trim())).findFirst().orElse(ipStr); + return StringUtils.equals(LOCAL_IP_KEY, ipStr) ? LOCAL_IP_VAL : ipStr; + } +} diff --git a/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java b/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java index 158e0abaca..a27b37eae3 100644 --- a/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java +++ b/backend/src/main/java/io/dataease/controller/panel/api/LinkApi.java @@ -4,12 +4,14 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.auth.annotation.DePermission; import io.dataease.commons.constants.DePermissionType; import io.dataease.controller.request.chart.ChartExtRequest; +import io.dataease.controller.request.panel.PanelViewLogRequest; import io.dataease.controller.request.panel.link.*; import io.dataease.dto.panel.link.GenerateDto; import io.dataease.dto.panel.link.ValidateDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; import java.util.Map; @@ -58,9 +60,15 @@ public interface LinkApi { @ApiOperation("视图详细信息") @PostMapping("/viewDetail/{viewId}/{panelId}") Object viewDetail(@PathVariable("viewId") String viewId, @PathVariable("panelId") String panelId, - @RequestBody ChartExtRequest requestList) throws Exception; + @RequestBody ChartExtRequest requestList) throws Exception; @ApiOperation("压缩链接") @PostMapping("/shortUrl") String shortUrl(@RequestBody Map param); + + @ApiIgnore + @PostMapping("/viewLog") + void viewLinkLog(@RequestBody LinkViewLogRequest request); + + } diff --git a/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java b/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java index d927a86b16..2e0be45aec 100644 --- a/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java +++ b/backend/src/main/java/io/dataease/controller/panel/server/LinkServer.java @@ -3,6 +3,9 @@ package io.dataease.controller.panel.server; import com.auth0.jwt.JWT; import com.auth0.jwt.interfaces.DecodedJWT; import io.dataease.auth.filter.F2CLinkFilter; +import io.dataease.commons.constants.SysLogConstants; +import io.dataease.commons.utils.DeLogUtils; +import io.dataease.plugins.common.base.domain.PanelGroupWithBLOBs; import io.dataease.plugins.common.base.domain.PanelLink; import io.dataease.controller.panel.api.LinkApi; import io.dataease.controller.request.chart.ChartExtRequest; @@ -111,4 +114,19 @@ public class LinkServer implements LinkApi { String resourceId = param.get("resourceId"); return panelLinkService.getShortUrl(resourceId); } + + @Override + public void viewLinkLog(LinkViewLogRequest request) { + String panelId = request.getPanelId(); + Boolean mobile = request.getMobile(); + Long userId = request.getUserId(); + SysLogConstants.OPERATE_TYPE operateType = SysLogConstants.OPERATE_TYPE.PC_VIEW; + if (ObjectUtils.isNotEmpty(mobile) && mobile) { + operateType = SysLogConstants.OPERATE_TYPE.MB_VIEW; + } + if (ObjectUtils.isEmpty(userId)) return; + PanelGroupWithBLOBs panelGroupWithBLOBs = panelLinkService.resourceInfo(panelId); + String pid = panelGroupWithBLOBs.getPid(); + DeLogUtils.save(operateType, SysLogConstants.SOURCE_TYPE.LINK, panelId, pid, userId, SysLogConstants.SOURCE_TYPE.USER); + } } diff --git a/backend/src/main/java/io/dataease/controller/request/panel/link/LinkViewLogRequest.java b/backend/src/main/java/io/dataease/controller/request/panel/link/LinkViewLogRequest.java new file mode 100644 index 0000000000..6844c5a49d --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/panel/link/LinkViewLogRequest.java @@ -0,0 +1,12 @@ +package io.dataease.controller.request.panel.link; + +import io.dataease.controller.request.panel.PanelViewLogRequest; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class LinkViewLogRequest extends PanelViewLogRequest implements Serializable { + + private Long userId; +} 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..4177a004a1 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/sys/SystemInfoController.java @@ -0,0 +1,24 @@ +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.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(); + } +} diff --git a/backend/src/main/java/io/dataease/dto/SysLogGridDTO.java b/backend/src/main/java/io/dataease/dto/SysLogGridDTO.java index 706d4a2762..66a644b2c4 100644 --- a/backend/src/main/java/io/dataease/dto/SysLogGridDTO.java +++ b/backend/src/main/java/io/dataease/dto/SysLogGridDTO.java @@ -22,4 +22,7 @@ public class SysLogGridDTO implements Serializable { @ApiModelProperty("操作时间") private Long time; + + @ApiModelProperty("IP地址") + private String ip; } 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/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 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/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/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/SystemInfoService.java b/backend/src/main/java/io/dataease/service/SystemInfoService.java new file mode 100644 index 0000000000..f696a6fea5 --- /dev/null +++ b/backend/src/main/java/io/dataease/service/SystemInfoService.java @@ -0,0 +1,16 @@ +package io.dataease.service; + +import io.dataease.commons.utils.AuthUtils; +import io.dataease.commons.utils.IPUtils; +import io.dataease.dto.UserLoginInfoDTO; +import org.springframework.stereotype.Service; + + +@Service +public class SystemInfoService { + + public UserLoginInfoDTO getUserLoginInfo() { + 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 d26b54fdba..34b5601182 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -577,7 +577,9 @@ 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); @@ -698,7 +700,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; } } @@ -890,7 +898,7 @@ public class ChartViewService { 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)); @@ -899,8 +907,8 @@ public class ChartViewService { 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())) { - querySql = qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view, ds); + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { + datasourceRequest.setQuery(qp.getSQLSummary(dataTableInfoDTO.getTable(), yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view, ds)); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { querySql = qp.getSQLStack(dataTableInfoDTO.getTable(), xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, ds, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "scatter")) { @@ -914,7 +922,7 @@ public class ChartViewService { } 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, chartExtRequest, qp, table, ds); - if (StringUtils.equalsIgnoreCase("text", view.getType()) || StringUtils.equalsIgnoreCase("gauge", view.getType()) || StringUtils.equalsIgnoreCase("liquid", view.getType())) { + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); @@ -930,7 +938,7 @@ public class ChartViewService { 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())) { + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); @@ -946,8 +954,7 @@ public class ChartViewService { 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())) { + if (StringUtils.equalsAnyIgnoreCase(view.getType(), "text", "gauge", "liquid")) { querySql = qp.getSQLSummaryAsTmp(sql, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, view); } else if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { querySql = qp.getSQLAsTmpStack(sql, xAxis, yAxis, fieldCustomFilter, rowPermissionsTree, extFilterList, extStack, view); @@ -979,7 +986,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)); @@ -999,7 +1006,9 @@ public class ChartViewService { 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()) { + || CollectionUtils.isNotEmpty(chartExtRequest.getDrill()) + || CollectionUtils.isNotEmpty(rowPermissionsTree) + || fields.size() != columnPermissionFields.size()) { data = datasourceProvider.getData(datasourceRequest); } else { try { @@ -1151,7 +1160,7 @@ 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")) { mapChart = ChartDataBuild.transGroupStackDataAntV(xAxisBase, xAxis, xAxisExt, yAxis, extStack, data, view, isDrill); 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 7849c86d69..ea29c59d76 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")); } } @@ -2278,8 +2255,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 +2263,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 +2275,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 +2297,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 +2376,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 +2423,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 +2442,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 +2475,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 +2494,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 +2628,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 +2826,7 @@ public class DataSetTableService { return expressionDeParser; } - static private boolean hasVariable(String sql) { + private static boolean hasVariable(String sql) { return sql.contains(SubstitutedParams); } @@ -2886,6 +2855,7 @@ public class DataSetTableService { if (StringUtils.isNotEmpty(request.getExpressionTree())) { Gson gson = new Gson(); tree = gson.fromJson(request.getExpressionTree(), DatasetRowPermissionsTreeObj.class); + permissionsTreeService.getField(tree); } Map previewData = getPreviewData(request, 1, 100000, null, tree); List fields = (List) previewData.get("fields"); @@ -2935,7 +2905,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/dataset/PermissionsTreeService.java b/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java index 54350dd09b..040e26d6fe 100644 --- a/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java +++ b/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java @@ -153,7 +153,7 @@ public class PermissionsTreeService { return result; } - private void getField(DatasetRowPermissionsTreeObj tree) { + public void getField(DatasetRowPermissionsTreeObj tree) { if (ObjectUtils.isNotEmpty(tree)) { if (ObjectUtils.isNotEmpty(tree.getItems())) { for (DatasetRowPermissionsTreeItem item : tree.getItems()) { 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..ed05bbbf6d 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; } } 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/java/io/dataease/service/sys/log/LogManager.java b/backend/src/main/java/io/dataease/service/sys/log/LogManager.java index 3ee86d0cfb..975a48bf73 100644 --- a/backend/src/main/java/io/dataease/service/sys/log/LogManager.java +++ b/backend/src/main/java/io/dataease/service/sys/log/LogManager.java @@ -28,15 +28,12 @@ public class LogManager { protected static final String contentFormat = "【%s】"; - protected static final String positionFormat = "在【%s】"; - - protected static final String format = "给%s【%s】"; protected Gson gson = new Gson(); - protected Type type = new TypeToken>() {}.getType(); - + protected Type type = new TypeToken>() { + }.getType(); @Resource @@ -47,26 +44,28 @@ public class LogManager { public String detailInfo(SysLogWithBLOBs vo) { - String sourceName = vo.getSourceName(); String position = null; String operateTypeName = SysLogConstants.operateTypeName(vo.getOperateType()); operateTypeName = Translator.get(operateTypeName); String sourceTypeName = SysLogConstants.sourceTypeName(vo.getSourceType()); sourceTypeName = Translator.get(sourceTypeName); - String result = operateTypeName + sourceTypeName + String.format(contentFormat, sourceName) + remarkInfo(vo); - + String result = operateTypeName + sourceTypeName + String.format(contentFormat, vo.getSourceName()); + if (vo.getSourceType() != SysLogConstants.SOURCE_TYPE.LINK.getValue()) { + result += remarkInfo(vo, false); + } if ((position = vo.getPosition()) != null) { List folderItems = gson.fromJson(position, type); String template = folderItems.stream().map(folderItem -> folderItem.getName()).collect(Collectors.joining("/")); - String positionResult = String.format(positionFormat, template); - return positionResult + result; + String positionResult = String.format(Translator.get("I18N_LOG_FORMAT_POSITION"), template); + result = positionResult + result; + } + if (vo.getSourceType() == SysLogConstants.SOURCE_TYPE.LINK.getValue()) { + result = remarkInfo(vo, true) + result; } return result; } - - - public String remarkInfo(SysLogWithBLOBs vo) { + public String remarkInfo(SysLogWithBLOBs vo, Boolean isPrefix) { String remakrk = null; if ((remakrk = vo.getRemark()) != null) { String targetTypeName = null; @@ -77,14 +76,16 @@ public class LogManager { Integer targetType = item.getType(); targetTypeName = SysLogConstants.sourceTypeName(targetType); targetTypeName = Translator.get(targetTypeName); - return String.format(format, targetTypeName, template); + if (isPrefix) { + return String.format(Translator.get("I18N_LOG_FORMAT_PREFIX"), targetTypeName, template); + } + return String.format(Translator.get("I18N_LOG_FORMAT"), targetTypeName, template); } } return ""; } - private LogTypeItem parentIds(String id, Integer value) { LogTypeItem result = new LogTypeItem(); String typeValue = ""; @@ -119,7 +120,7 @@ public class LogManager { } - private List parentInfos(List ids, Integer value){ + private List parentInfos(List ids, Integer value) { List folderItems = extSysLogMapper.idAndName(ids, value); if (value == 3) { folderItems.forEach(item -> { @@ -164,7 +165,7 @@ public class LogManager { ArrayList dataSourceTypes = new ArrayList<>(datasourceService.types()); String name = null; for (int i = 0; i < dataSourceTypes.size(); i++) { - if (dataSourceTypes.get(i).getType().equals(typeId)){ + if (dataSourceTypes.get(i).getType().equals(typeId)) { name = dataSourceTypes.get(i).getName(); break; } diff --git a/backend/src/main/java/io/dataease/service/sys/log/LogService.java b/backend/src/main/java/io/dataease/service/sys/log/LogService.java index c668c57e39..913f1991fa 100644 --- a/backend/src/main/java/io/dataease/service/sys/log/LogService.java +++ b/backend/src/main/java/io/dataease/service/sys/log/LogService.java @@ -9,6 +9,7 @@ import io.dataease.commons.constants.ParamConstants; import io.dataease.commons.constants.SysLogConstants; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.BeanUtils; +import io.dataease.commons.utils.IPUtils; import io.dataease.commons.utils.ServletUtils; import io.dataease.controller.sys.base.ConditionEntity; import io.dataease.controller.sys.request.KeyGridRequest; @@ -28,6 +29,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.*; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -46,6 +48,8 @@ public class LogService { // 仪表板的额外操作 分享以及公共链接 private static Integer[] panel_ext_ope = {4, 5, 8, 9, 10}; + private static Integer[] link_ext_ope = {13, 14}; + // 驱动文件操作 上传, 删除 private static Integer[] driver_file_ope = {11, 3}; @@ -247,6 +251,16 @@ public class LogService { results.add(folderItem); } + for (int i = 0; i < link_ext_ope.length; i++) { + SysLogConstants.SOURCE_TYPE sourceType = SysLogConstants.SOURCE_TYPE.LINK; + FolderItem folderItem = new FolderItem(); + folderItem.setId(link_ext_ope[i] + "-" + sourceType.getValue()); + String operateTypeName = SysLogConstants.operateTypeName(link_ext_ope[i]); + String sourceTypeName = sourceType.getName(); + folderItem.setName(Translator.get(operateTypeName) + Translator.get(sourceTypeName)); + results.add(folderItem); + } + FolderItem userLogin = new FolderItem(); SysLogConstants.OPERATE_TYPE operateTypeLogin = SysLogConstants.OPERATE_TYPE.LOGIN; SysLogConstants.SOURCE_TYPE sourceTypeLogin = SysLogConstants.SOURCE_TYPE.USER; @@ -308,6 +322,7 @@ public class LogService { sysLogGridDTO.setTime(vo.getTime()); sysLogGridDTO.setUser(vo.getNickName()); sysLogGridDTO.setDetail(logManager.detailInfo(vo)); + sysLogGridDTO.setIp(vo.getIp()); return sysLogGridDTO; } @@ -330,12 +345,14 @@ public class LogService { sysLogWithBLOBs.setLoginName(sysLogDTO.getSourceName()); sysLogWithBLOBs.setNickName(sysLogDTO.getSourceName()); } + sysLogWithBLOBs.setIp(IPUtils.get()); sysLogMapper.insert(sysLogWithBLOBs); } public void exportExcel(KeyGridRequest request) throws Exception { + request = logRetentionProxy(request); request = detailRequest(request); String keyWord = request.getKeyWord(); List ids = null; @@ -355,24 +372,25 @@ public class LogService { List details = lists.stream().map(item -> { String operateTypeName = SysLogConstants.operateTypeName(item.getOperateType()); String sourceTypeName = SysLogConstants.sourceTypeName(item.getSourceType()); - String[] row = new String[4]; + String[] row = new String[5]; row[0] = Translator.get(operateTypeName) + " " + Translator.get(sourceTypeName); row[1] = logManager.detailInfo(item); row[2] = item.getNickName(); - row[3] = DateUtil.formatDateTime(new Date(item.getTime())); + row[3] = item.getIp(); + row[4] = DateUtil.formatDateTime(new Date(item.getTime())); return row; }).collect(Collectors.toList()); - String[] headArr = {"操作类型", "详情", "用户", "时间"}; + String[] headArr = {"操作类型", "详情", "用户", "IP地址", "时间"}; details.add(0, headArr); - HSSFWorkbook wb = new HSSFWorkbook(); + XSSFWorkbook wb = new XSSFWorkbook(); //明细sheet - HSSFSheet detailsSheet = wb.createSheet("数据"); + XSSFSheet detailsSheet = wb.createSheet("数据"); //给单元格设置样式 - CellStyle cellStyle = wb.createCellStyle(); - Font font = wb.createFont(); + XSSFCellStyle cellStyle = wb.createCellStyle(); + XSSFFont font = wb.createFont(); //设置字体大小 font.setFontHeightInPoints((short) 12); //设置字体加粗 @@ -386,11 +404,11 @@ public class LogService { if (CollectionUtils.isNotEmpty(details)) { for (int i = 0; i < details.size(); i++) { - HSSFRow row = detailsSheet.createRow(i); + XSSFRow row = detailsSheet.createRow(i); String[] rowData = details.get(i); if (rowData != null) { for (int j = 0; j < rowData.length; j++) { - HSSFCell cell = row.createCell(j); + XSSFCell cell = row.createCell(j); cell.setCellValue(rowData[j]); if (i == 0) {// 头部 cell.setCellStyle(cellStyle); @@ -406,7 +424,7 @@ public class LogService { //文件名称 String fileName = "DataEase操作日志"; String encodeFileName = URLEncoder.encode(fileName, "UTF-8"); - response.setHeader("Content-disposition", "attachment;filename=" + encodeFileName + ".xls"); + response.setHeader("Content-disposition", "attachment;filename=" + encodeFileName + ".xlsx"); wb.write(outputStream); outputStream.flush(); outputStream.close(); diff --git a/backend/src/main/resources/db/migration/V44__1.17.sql b/backend/src/main/resources/db/migration/V44__1.17.sql new file mode 100644 index 0000000000..0726c5ed68 --- /dev/null +++ b/backend/src/main/resources/db/migration/V44__1.17.sql @@ -0,0 +1,38 @@ +ALTER TABLE `sys_log` + CHANGE COLUMN `user_id` `user_id` BIGINT NULL COMMENT '操作人', + CHANGE COLUMN `login_name` `login_name` VARCHAR (255) NULL COMMENT '登录账号', + CHANGE COLUMN `nick_name` `nick_name` VARCHAR (255) NULL COMMENT '姓名'; + +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'); diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index a3faecf6ec..951dca55a6 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -167,6 +167,7 @@ SOURCE_TYPE_ROLE=ROLE SOURCE_TYPE_DRIVER=DRIVER SOURCE_TYPE_DRIVER_FILE=DRIVER FILE SOURCE_TYPE_MENU=MENU +SOURCE_TYPE_LINK=PUBLIC LINK I18N_OPERATE_TYPE=Operation type I18N_DETAIL=Operation details I18N_USER=Operator @@ -241,3 +242,7 @@ I18N_APP_NO_DATASOURCE=This panel don't have datasource I18N_APP_ONE_DATASOURCE_TIPS=This panel should have only one datasource I18N_PROHIBIT_SCANNING_TO_CREATE_USER=Prohibit scanning code to create user +I18N_LOG_FORMAT_POSITION=IN\u3010%s\u3011 +I18N_LOG_FORMAT=TO %s\u3010%s\u3011 +I18N_LOG_FORMAT_PREFIX=With authority of %s\u3010%s\u3011 + diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 329af67e3d..6ec5cc2064 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -167,6 +167,7 @@ SOURCE_TYPE_ROLE=\u89D2\u8272 SOURCE_TYPE_DRIVER=\u9A71\u52A8 SOURCE_TYPE_DRIVER_FILE=\u9A71\u52A8\u6587\u4EF6 SOURCE_TYPE_MENU=\u83DC\u5355 +SOURCE_TYPE_LINK=\u516C\u5171\u94FE\u63A5 I18N_OPERATE_TYPE=\u64CD\u4F5C\u7C7B\u578B I18N_DETAIL=\u64CD\u4F5C\u8BE6\u60C5 I18N_USER=\u64CD\u4F5C\u4EBA @@ -241,3 +242,7 @@ I18N_APP_NO_DATASOURCE=\u6CA1\u6709\u627E\u5230\u6570\u636E\u6E90 I18N_APP_ONE_DATASOURCE_TIPS=\u8BE5\u4EEA\u8868\u677F\u53EA\u80FD\u5B58\u5728\u4E00\u4E2A\u6570\u636E\u6E90 I18N_PROHIBIT_SCANNING_TO_CREATE_USER=\u7981\u6B62\u626B\u7801\u521B\u5EFA\u7528\u6237\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\uFF01 +I18N_LOG_FORMAT_POSITION=\u5728\u3010%s\u3011 +I18N_LOG_FORMAT=\u7ED9%s\u3010%s\u3011 +I18N_LOG_FORMAT_PREFIX=\u4EE5%s\u3010%s\u3011\u6743\u9650 + diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 1bfea65802..0f0c6d30f2 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -167,6 +167,7 @@ SOURCE_TYPE_ROLE=\u89D2\u8272 SOURCE_TYPE_DRIVER=\u9A45\u52D5 SOURCE_TYPE_DRIVER_FILE=\u9A45\u52D5\u6587\u4EF6 SOURCE_TYPE_MENU=\u83DC\u55AE +SOURCE_TYPE_LINK=\u516C\u5171\u93C8\u63A5 I18N_DRIVER_NOT_DELETE=\u4F7F\u7528\u4E2D\u7684\u9A45\u52D5\u4E0D\u5141\u8A31\u5220\u9664 I18N_DRIVER_REPEAT_NAME=\u540D\u7A31\u91CD\u8907 I18N_DRIVER_NOT_FOUND=\u672A\u627E\u5230\u9A45\u52D5 @@ -236,3 +237,7 @@ I18N_APP_ERROR_DATASET=\u5100\u8868\u677F\u4E2D\u4E0D\u80FD\u5B58\u5728API\u6578 I18N_APP_NO_DATASOURCE=\u6C92\u6709\u627E\u5230\u6578\u64DA\u6E90 I18N_APP_ONE_DATASOURCE_TIPS=\u8A72\u5100\u8868\u677F\u53EA\u80FD\u5B58\u5728\u4E00\u500B\u6578\u64DA\u6E90 I18N_PROHIBIT_SCANNING_TO_CREATE_USER=\u7981\u6B62\u6383\u78BC\u5275\u5EFA\u7528\u6236\uFF0C\u8ACB\u806F\u7CFB\u7BA1\u7406\u54E1\uFF01 + +I18N_LOG_FORMAT_POSITION=\u5728\u3010%s\u3011 +I18N_LOG_FORMAT=\u7D66%s\u3010%s\u3011 +I18N_LOG_FORMAT_PREFIX=\u4EE5%s\u3010%s\u3011\u6B0A\u9650 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/src/api/commonAjax.js b/frontend/src/api/commonAjax.js deleted file mode 100644 index ea149fb020..0000000000 --- a/frontend/src/api/commonAjax.js +++ /dev/null @@ -1,38 +0,0 @@ -import request from '@/utils/request' - -export function post(url, data) { - return request({ - url: url, - method: 'post', - loading: true, - data - }) -} - -export function get(url) { - return request({ - url: url, - method: 'get', - loading: true - }) -} - -export function fileUpload(url, file, files, param) { - const formData = new FormData() - if (file) { - formData.append('file', file) - } - if (files) { - files.forEach(f => { - formData.append('files', f) - }) - } - formData.append('request', new Blob([JSON.stringify(param)], { type: 'application/json' })) - return request({ - method: 'POST', - loading: true, - url: url, - data: formData - }) -} -export default { fileUpload } diff --git a/frontend/src/api/link/index.js b/frontend/src/api/link/index.js index eaa5133cfa..1b25ae6822 100644 --- a/frontend/src/api/link/index.js +++ b/frontend/src/api/link/index.js @@ -50,6 +50,15 @@ export function switchEnablePwd(data) { }) } +export function viewLinkLog(data) { + return request({ + url: 'api/link/viewLog', + method: 'post', + loading: true, + data + }) +} + export function loadGenerate(resourceId) { return request({ url: 'api/link/currentGenerate/' + resourceId, diff --git a/frontend/src/api/panel/panel.js b/frontend/src/api/panel/panel.js index 9d5d7198c6..dc41cd5079 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, 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..95add502fb --- /dev/null +++ b/frontend/src/api/systemInfo/userLogin.js @@ -0,0 +1,13 @@ +import request from '@/utils/request' + +export function userLoginInfo() { + return request({ + url: '/systemInfo/userLoginInfo', + method: 'get', + loading: false + }) +} + +export default { + userLoginInfo +} diff --git a/frontend/src/assets/login-desc.png b/frontend/src/assets/login-desc.png index b296cf2574..bf078d5564 100644 Binary files a/frontend/src/assets/login-desc.png and b/frontend/src/assets/login-desc.png differ diff --git a/frontend/src/components/IconSelect/index.vue b/frontend/src/components/IconSelect/index.vue deleted file mode 100644 index 29055d477f..0000000000 --- a/frontend/src/components/IconSelect/index.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - diff --git a/frontend/src/components/IconSelect/requireIcons.js b/frontend/src/components/IconSelect/requireIcons.js deleted file mode 100644 index 8c073d39e1..0000000000 --- a/frontend/src/components/IconSelect/requireIcons.js +++ /dev/null @@ -1,11 +0,0 @@ - -const req = require.context('@/icons/svg', false, /\.svg$/) -const requireAll = requireContext => requireContext.keys() - -const re = /\.\/(.*)\.svg/ - -const icons = requireAll(req).map(i => { - return i.match(re)[1] -}) - -export default icons diff --git a/frontend/src/components/asyncSoltComponent/index.vue b/frontend/src/components/asyncSoltComponent/index.vue deleted file mode 100644 index 4db8a5468c..0000000000 --- a/frontend/src/components/asyncSoltComponent/index.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/frontend/src/components/breadcrumb/index.vue b/frontend/src/components/breadcrumb/index.vue deleted file mode 100644 index c920645c89..0000000000 --- a/frontend/src/components/breadcrumb/index.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/frontend/src/components/business/ElSelectAll/index.vue b/frontend/src/components/business/ElSelectAll/index.vue deleted file mode 100644 index 9254ee3b59..0000000000 --- a/frontend/src/components/business/ElSelectAll/index.vue +++ /dev/null @@ -1,128 +0,0 @@ - - - diff --git a/frontend/src/components/business/complexTable/index.vue b/frontend/src/components/business/complexTable/index.vue deleted file mode 100644 index 57a50c528d..0000000000 --- a/frontend/src/components/business/complexTable/index.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - diff --git a/frontend/src/components/business/conditionTable/index.vue b/frontend/src/components/business/conditionTable/index.vue deleted file mode 100644 index 2d1d535cf7..0000000000 --- a/frontend/src/components/business/conditionTable/index.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - - - diff --git a/frontend/src/components/business/treeTable/index.vue b/frontend/src/components/business/treeTable/index.vue deleted file mode 100644 index 2a07e24da6..0000000000 --- a/frontend/src/components/business/treeTable/index.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - - - diff --git a/frontend/src/components/canvas/DeCanvas.vue b/frontend/src/components/canvas/DeCanvas.vue index d9e6d9a767..9f7dbc68d8 100644 --- a/frontend/src/components/canvas/DeCanvas.vue +++ b/frontend/src/components/canvas/DeCanvas.vue @@ -112,7 +112,9 @@ import toast from '@/components/canvas/utils/toast' 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 FilterDialog from '@/views/panel/filter/FilterDialog' +import { userLoginInfo } from '@/api/systemInfo/userLogin' +import { activeWatermark } from '@/components/canvas/tools/watermark' export default { components: { FilterDialog, ButtonResetDialog, ButtonDialog, DeEditor }, @@ -233,12 +235,19 @@ export default { watch: { mobileLayoutStatus() { this.restore() + }, + panelInfo: { + handler(newVal, oldVla) { + this.initWatermark() + }, + deep: true } }, created() { }, mounted() { const _this = this + this.initWatermark() // 监听div变动事件 const erd = elementResizeDetectorMaker() erd.listenTo(document.getElementById(this.canvasDomId), element => { @@ -252,6 +261,14 @@ export default { bus.$off('button-dialog-edit', this.editButtonDialog) }, methods: { + initWatermark() { + if (this.panelInfo.watermarkInfo) { + userLoginInfo().then(res => { + const userInfo = res.data + activeWatermark(this.panelInfo.watermarkInfo.settingContent, userInfo, this.canvasDomId, this.canvasId, this.panelInfo.watermarkOpen) + }) + } + }, initEvents() { bus.$on('component-dialog-edit', this.editDialog) bus.$on('button-dialog-edit', this.editButtonDialog) @@ -289,6 +306,7 @@ export default { } }, canvasScroll(e) { + this.scrollTop = e.target.scrollTop this.$emit('canvasScroll', { scrollLeft: e.target.scrollLeft, scrollTop: e.target.scrollTop }) bus.$emit('onScroll') }, diff --git a/frontend/src/components/canvas/assets/iconfont/demo.css b/frontend/src/components/canvas/assets/iconfont/demo.css deleted file mode 100644 index b7af3aa35d..0000000000 --- a/frontend/src/components/canvas/assets/iconfont/demo.css +++ /dev/null @@ -1,539 +0,0 @@ -/* Logo 字体 */ -@font-face { - font-family: "iconfont logo"; - src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); - src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); -} - -.logo { - font-family: "iconfont logo"; - font-size: 160px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* tabs */ -.nav-tabs { - position: relative; -} - -.nav-tabs .nav-more { - position: absolute; - right: 0; - bottom: 0; - height: 42px; - line-height: 42px; - color: #666; -} - -#tabs { - border-bottom: 1px solid #eee; -} - -#tabs li { - cursor: pointer; - width: 100px; - height: 40px; - line-height: 40px; - text-align: center; - font-size: 16px; - border-bottom: 2px solid transparent; - position: relative; - z-index: 1; - margin-bottom: -1px; - color: #666; -} - - -#tabs .active { - border-bottom-color: #f00; - color: #222; -} - -.tab-container .content { - display: none; -} - -/* 页面布局 */ -.main { - padding: 30px 100px; - width: 960px; - margin: 0 auto; -} - -.main .logo { - color: #333; - text-align: left; - margin-bottom: 30px; - line-height: 1; - height: 110px; - margin-top: -50px; - overflow: hidden; - *zoom: 1; -} - -.main .logo a { - font-size: 160px; - color: #333; -} - -.helps { - margin-top: 40px; -} - -.helps pre { - padding: 20px; - margin: 10px 0; - border: solid 1px #e7e1cd; - background-color: #fffdef; - overflow: auto; -} - -.icon_lists { - width: 100% !important; - overflow: hidden; - *zoom: 1; -} - -.icon_lists li { - width: 100px; - margin-bottom: 10px; - margin-right: 20px; - text-align: center; - list-style: none !important; - cursor: default; -} - -.icon_lists li .code-name { - line-height: 1.2; -} - -.icon_lists .icon { - display: block; - height: 100px; - line-height: 100px; - font-size: 42px; - margin: 10px auto; - color: #333; - -webkit-transition: font-size 0.25s linear, width 0.25s linear; - -moz-transition: font-size 0.25s linear, width 0.25s linear; - transition: font-size 0.25s linear, width 0.25s linear; -} - -.icon_lists .icon:hover { - font-size: 100px; -} - -.icon_lists .svg-icon { - /* 通过设置 font-size 来改变图标大小 */ - width: 1em; - /* 图标和文字相邻时,垂直对齐 */ - vertical-align: -0.15em; - /* 通过设置 color 来改变 SVG 的颜色/fill */ - fill: currentColor; - /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 - normalize.css 中也包含这行 */ - overflow: hidden; -} - -.icon_lists li .name, -.icon_lists li .code-name { - color: #666; -} - -/* markdown 样式 */ -.markdown { - color: #666; - font-size: 14px; - line-height: 1.8; -} - -.highlight { - line-height: 1.5; -} - -.markdown img { - vertical-align: middle; - max-width: 100%; -} - -.markdown h1 { - color: #404040; - font-weight: 500; - line-height: 40px; - margin-bottom: 24px; -} - -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - color: #404040; - margin: 1.6em 0 0.6em 0; - font-weight: 500; - clear: both; -} - -.markdown h1 { - font-size: 28px; -} - -.markdown h2 { - font-size: 22px; -} - -.markdown h3 { - font-size: 16px; -} - -.markdown h4 { - font-size: 14px; -} - -.markdown h5 { - font-size: 12px; -} - -.markdown h6 { - font-size: 12px; -} - -.markdown hr { - height: 1px; - border: 0; - background: #e9e9e9; - margin: 16px 0; - clear: both; -} - -.markdown p { - margin: 1em 0; -} - -.markdown > p, -.markdown > blockquote, -.markdown > .highlight, -.markdown > ol, -.markdown > ul { - width: 80%; -} - -.markdown ul > li { - list-style: circle; -} - -.markdown > ul li, -.markdown blockquote ul > li { - margin-left: 20px; - padding-left: 4px; -} - -.markdown > ul li p, -.markdown > ol li p { - margin: 0.6em 0; -} - -.markdown ol > li { - list-style: decimal; -} - -.markdown > ol li, -.markdown blockquote ol > li { - margin-left: 20px; - padding-left: 4px; -} - -.markdown code { - margin: 0 3px; - padding: 0 5px; - background: #eee; - border-radius: 3px; -} - -.markdown strong, -.markdown b { - font-weight: 600; -} - -.markdown > table { - border-collapse: collapse; - border-spacing: 0px; - empty-cells: show; - border: 1px solid #e9e9e9; - width: 95%; - margin-bottom: 24px; -} - -.markdown > table th { - white-space: nowrap; - color: #333; - font-weight: 600; -} - -.markdown > table th, -.markdown > table td { - border: 1px solid #e9e9e9; - padding: 8px 16px; - text-align: left; -} - -.markdown > table th { - background: #F7F7F7; -} - -.markdown blockquote { - font-size: 90%; - color: #999; - border-left: 4px solid #e9e9e9; - padding-left: 0.8em; - margin: 1em 0; -} - -.markdown blockquote p { - margin: 0; -} - -.markdown .anchor { - opacity: 0; - transition: opacity 0.3s ease; - margin-left: 8px; -} - -.markdown .waiting { - color: #ccc; -} - -.markdown h1:hover .anchor, -.markdown h2:hover .anchor, -.markdown h3:hover .anchor, -.markdown h4:hover .anchor, -.markdown h5:hover .anchor, -.markdown h6:hover .anchor { - opacity: 1; - display: inline-block; -} - -.markdown > br, -.markdown > p > br { - clear: both; -} - - -.hljs { - display: block; - background: white; - padding: 0.5em; - color: #333333; - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #df5000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #a71d5d; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-title, -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} - -/* 代码高亮 */ -/* PrismJS 1.15.0 -https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ -/** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou - */ -code[class*="language-"], -pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, -pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, -code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, -pre[class*="language-"] ::selection, -code[class*="language-"]::selection, -code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; -} - -:not(pre) > code[class*="language-"], -pre[class*="language-"] { - background: #f5f2f0; -} - -/* Inline code */ -:not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: slategray; -} - -.token.punctuation { - color: #999; -} - -.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #905; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #690; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #9a6e3a; - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function, -.token.class-name { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; -} - -.token.important, -.token.bold { - font-weight: bold; -} - -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} diff --git a/frontend/src/components/canvas/assets/iconfont/demo_index.html b/frontend/src/components/canvas/assets/iconfont/demo_index.html deleted file mode 100644 index 70918ca7c4..0000000000 --- a/frontend/src/components/canvas/assets/iconfont/demo_index.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - IconFont Demo - - - - - - - - - - - -
-

- -
-
-
    - -
  • - -
    向右旋转
    -
    &#xe66a;
    -
  • - -
  • - -
    图片
    -
    &#xe616;
    -
  • - -
  • - -
    -
    &#xe672;
    -
  • - -
  • - -
    矩形
    -
    &#xe790;
    -
  • - -
  • - -
    文本
    -
    &#xe652;
    -
  • - -
  • - -
    按钮
    -
    &#xe648;
    -
  • - -
-
-

Unicode 引用

-
- -

Unicode 是字体在网页端最原始的应用方式,特点是:

-
    -
  • 兼容性最好,支持 IE6+,及所有现代浏览器。
  • -
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • -
  • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
  • -
-
-

注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式

-
-

Unicode 使用步骤如下:

-

第一步:拷贝项目下面生成的 @font-face

-
@font-face {
-  font-family: 'iconfont';
-  src: url('iconfont.eot');
-  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
-      url('iconfont.woff2') format('woff2'),
-      url('iconfont.woff') format('woff'),
-      url('iconfont.ttf') format('truetype');
-}
-
-

第二步:定义使用 iconfont 的样式

-
.iconfont {
-  font-family: "iconfont" !important;
-  font-size: 16px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-

第三步:挑选相应图标并获取字体编码,应用于页面

-
-<span class="iconfont">&#x33;</span>
-
-
-

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

-
-
-
-
-
    - -
  • - -
    - 向右旋转 -
    -
    .icon-xiangyouxuanzhuan -
    -
  • - -
  • - -
    - 图片 -
    -
    .icon-tupian -
    -
  • - -
  • - -
    - 锁 -
    -
    .icon-suo -
    -
  • - -
  • - -
    - 矩形 -
    -
    .icon-juxing -
    -
  • - -
  • - -
    - 文本 -
    -
    .icon-wenben -
    -
  • - -
  • - -
    - 按钮 -
    -
    .icon-button -
    -
  • - -
-
-

font-class 引用

-
- -

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

-

与 Unicode 使用方式相比,具有如下特点:

-
    -
  • 兼容性良好,支持 IE8+,及所有现代浏览器。
  • -
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • -
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • -
  • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
  • -
-

使用步骤如下:

-

第一步:引入项目下面生成的 fontclass 代码:

-
<link rel="stylesheet" href="./iconfont.css">
-
-

第二步:挑选相应图标并获取类名,应用于页面:

-
<span class="iconfont icon-xxx"></span>
-
-
-

" - iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

-
-
-
-
-
    - -
  • - -
    向右旋转
    -
    #icon-xiangyouxuanzhuan
    -
  • - -
  • - -
    图片
    -
    #icon-tupian
    -
  • - -
  • - -
    -
    #icon-suo
    -
  • - -
  • - -
    矩形
    -
    #icon-juxing
    -
  • - -
  • - -
    文本
    -
    #icon-wenben
    -
  • - -
  • - -
    按钮
    -
    #icon-button
    -
  • - -
-
-

Symbol 引用

-
- -

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 - 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

-
    -
  • 支持多色图标了,不再受单色限制。
  • -
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • -
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • -
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • -
-

使用步骤如下:

-

第一步:引入项目下面生成的 symbol 代码:

-
<script src="./iconfont.js"></script>
-
-

第二步:加入通用 CSS 代码(引入一次就行):

-
<style>
-.icon {
-  width: 1em;
-  height: 1em;
-  vertical-align: -0.15em;
-  fill: currentColor;
-  overflow: hidden;
-}
-</style>
-
-

第三步:挑选相应图标并获取类名,应用于页面:

-
<svg class="icon" aria-hidden="true">
-  <use xlink:href="#icon-xxx"></use>
-</svg>
-
-
-
- -
-
- - - diff --git a/frontend/src/components/canvas/components/AnimationList.vue b/frontend/src/components/canvas/components/AnimationList.vue deleted file mode 100644 index a8fe652a1a..0000000000 --- a/frontend/src/components/canvas/components/AnimationList.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - - - diff --git a/frontend/src/components/canvas/components/AttrList.vue b/frontend/src/components/canvas/components/AttrList.vue deleted file mode 100644 index fd5486f318..0000000000 --- a/frontend/src/components/canvas/components/AttrList.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - diff --git a/frontend/src/components/canvas/components/AttrListExtend.vue b/frontend/src/components/canvas/components/AttrListExtend.vue deleted file mode 100644 index deedb76788..0000000000 --- a/frontend/src/components/canvas/components/AttrListExtend.vue +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - diff --git a/frontend/src/components/canvas/components/ComponentList.vue b/frontend/src/components/canvas/components/ComponentList.vue deleted file mode 100644 index ec757d1fa2..0000000000 --- a/frontend/src/components/canvas/components/ComponentList.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - - diff --git a/frontend/src/components/canvas/components/EventList.vue b/frontend/src/components/canvas/components/EventList.vue deleted file mode 100644 index 32d9c200f6..0000000000 --- a/frontend/src/components/canvas/components/EventList.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - - diff --git a/frontend/src/components/canvas/components/Modal.vue b/frontend/src/components/canvas/components/Modal.vue deleted file mode 100644 index 894a51e9cb..0000000000 --- a/frontend/src/components/canvas/components/Modal.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - 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 87a831ab32..d5643e5c3f 100644 --- a/frontend/src/components/canvas/components/editor/CanvasOptBar.vue +++ b/frontend/src/components/canvas/components/editor/CanvasOptBar.vue @@ -3,7 +3,16 @@ v-show="existLinkage" class="bar-main" > -
+
+ {{ $t('chart.back') }} +
+
diff --git a/frontend/src/components/canvas/components/editor/ComponentWrapper.vue b/frontend/src/components/canvas/components/editor/ComponentWrapper.vue index 1750ae9ec6..45a0b017b1 100644 --- a/frontend/src/components/canvas/components/editor/ComponentWrapper.vue +++ b/frontend/src/components/canvas/components/editor/ComponentWrapper.vue @@ -11,6 +11,7 @@ :terminal="terminal" :element="config" :canvas-id="canvasId" + :chart="chart" :show-position="showPosition" @showViewDetails="showViewDetails" /> @@ -65,6 +66,7 @@ :screen-shot="screenShot" :canvas-style-data="canvasStyleData" :show-position="showPosition" + @fill-chart-2-parent="setChartData" />
@@ -146,7 +148,8 @@ export default { }, data() { return { - previewVisible: false + previewVisible: false, + chart: null } }, computed: { @@ -211,6 +214,9 @@ export default { runAnimation(this.$el, this.config.animations) }, methods: { + setChartData(chart) { + this.chart = chart + }, getStyle, getShapeStyleIntDeDrag(style, prop) { if (prop === 'rotate') { @@ -342,7 +348,7 @@ export default { position: absolute; top: 0; left: 0; - width: 100%; - height: 100%; + width: 100% !important; + height: 100% !important; } diff --git a/frontend/src/components/canvas/components/editor/DeEditor.vue b/frontend/src/components/canvas/components/editor/DeEditor.vue index d46ec9c9e9..07d86d0b33 100644 --- a/frontend/src/components/canvas/components/editor/DeEditor.vue +++ b/frontend/src/components/canvas/components/editor/DeEditor.vue @@ -107,6 +107,7 @@ :canvas-style-data="canvasStyleData" @input="handleInput" @trigger-plugin-edit="pluginEditHandler" + @fill-chart-2-parent="setChartData" /> @@ -162,7 +163,7 @@ import UserViewDialog from '@/components/canvas/customComponent/UserViewDialog' import DeOutWidget from '@/components/dataease/DeOutWidget' import DragShadow from '@/components/deDrag/Shadow' import bus from '@/utils/bus' -import LinkJumpSet from '@/views/panel/LinkJumpSet' +import LinkJumpSet from '@/views/panel/linkJumpSet' import { buildFilterMap, buildViewKeyMap, formatCondition, valueValid, viewIdMatch } from '@/utils/conditionUtil' // 挤占式画布 import _ from 'lodash' @@ -931,7 +932,7 @@ export default { return !this.linkageSettingStatus && !this.batchOptStatus }, showGrid() { - if (this.canvasStyleData && this.canvasStyleData.aidedDesign) { + if (this.canvasStyleData && this.canvasStyleData.aidedDesign && this.canvasId === 'canvas-main') { return this.canvasStyleData.aidedDesign.showGrid } else { return false @@ -1096,6 +1097,13 @@ export default { created() { }, methods: { + setChartData(chart) { + this.componentData.forEach((item, index) => { + if (item.type === 'view' && item.component === 'user-view' && item.propValue.viewId === chart.id) { + this.$refs['deDragRef'][index].setChartData(chart) + } + }) + }, triggerResetButton() { this.triggerSearchButton(true) }, diff --git a/frontend/src/components/canvas/components/editor/EditBar.vue b/frontend/src/components/canvas/components/editor/EditBar.vue index b7df7c6e36..c3ae7549bc 100644 --- a/frontend/src/components/canvas/components/editor/EditBar.vue +++ b/frontend/src/components/canvas/components/editor/EditBar.vue @@ -94,7 +94,7 @@ > @@ -140,6 +140,11 @@ + + @@ -182,12 +187,13 @@ import bus from '@/utils/bus' import SettingMenu from '@/components/canvas/components/editor/SettingMenu' import LinkageField from '@/components/canvas/components/editor/LinkageField' import toast from '@/components/canvas/utils/toast' -import FieldsList from '@/components/canvas/components/editor/fieldsList' -import LinkJumpSet from '@/views/panel/LinkJumpSet' +import FieldsList from '@/components/canvas/components/editor/FieldsList' +import LinkJumpSet from '@/views/panel/linkJumpSet' import Background from '@/views/background/index' +import MapLayerController from '@/views/chart/components/map/MapLayerController' export default { - components: { Background, LinkJumpSet, FieldsList, SettingMenu, LinkageField }, + components: { Background, LinkJumpSet, FieldsList, SettingMenu, LinkageField, MapLayerController }, props: { canvasId: { @@ -226,6 +232,10 @@ export default { type: String, required: false, default: 'NotProvided' + }, + chart: { + type: Object, + default: null } }, data() { @@ -249,6 +259,13 @@ export default { }, computed: { + yaxis() { + if (!this.chart) return [] + return JSON.parse(this.chart.yaxis) + }, + showMapLayerController() { + return this.curComponent.type === 'view' && this.terminal === 'pc' && this.curComponent.propValue.innerType === 'map' && this.yaxis.length > 1 + }, detailsShow() { return this.curComponent.type === 'view' && this.terminal === 'pc' && this.curComponent.propValue.innerType !== 'richTextView' }, @@ -519,7 +536,7 @@ export default { background-color: var(--primary, #3370ff); } -.bar-main i { +.bar-main ::v-deep i { color: white; float: right; margin-right: 3px; diff --git a/frontend/src/components/canvas/components/editor/fieldsList.vue b/frontend/src/components/canvas/components/editor/FieldsList.vue similarity index 100% rename from frontend/src/components/canvas/components/editor/fieldsList.vue rename to frontend/src/components/canvas/components/editor/FieldsList.vue diff --git a/frontend/src/components/canvas/components/editor/Hyperlinks.vue b/frontend/src/components/canvas/components/editor/Hyperlinks.vue deleted file mode 100644 index 9751e10900..0000000000 --- a/frontend/src/components/canvas/components/editor/Hyperlinks.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - - - diff --git a/frontend/src/components/canvas/components/editor/Preview.vue b/frontend/src/components/canvas/components/editor/Preview.vue index 063b08b4d2..89c02365f9 100644 --- a/frontend/src/components/canvas/components/editor/Preview.vue +++ b/frontend/src/components/canvas/components/editor/Preview.vue @@ -1,5 +1,6 @@ - - diff --git a/frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue b/frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue deleted file mode 100644 index 73250bd947..0000000000 --- a/frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - - - diff --git a/frontend/src/components/deCustomCm/deBtn.vue b/frontend/src/components/deCustomCm/DeBtn.vue similarity index 100% rename from frontend/src/components/deCustomCm/deBtn.vue rename to frontend/src/components/deCustomCm/DeBtn.vue diff --git a/frontend/src/components/deCustomCm/deDatePick.vue b/frontend/src/components/deCustomCm/DeDatePick.vue similarity index 100% rename from frontend/src/components/deCustomCm/deDatePick.vue rename to frontend/src/components/deCustomCm/DeDatePick.vue diff --git a/frontend/src/components/deCustomCm/dePwd.vue b/frontend/src/components/deCustomCm/DePwd.vue similarity index 100% rename from frontend/src/components/deCustomCm/dePwd.vue rename to frontend/src/components/deCustomCm/DePwd.vue diff --git a/frontend/src/components/deCustomCm/deTextarea.vue b/frontend/src/components/deCustomCm/DeTextarea.vue similarity index 100% rename from frontend/src/components/deCustomCm/deTextarea.vue rename to frontend/src/components/deCustomCm/DeTextarea.vue diff --git a/frontend/src/components/deDrag/index.vue b/frontend/src/components/deDrag/index.vue index 36589b10a1..0c435cd329 100644 --- a/frontend/src/components/deDrag/index.vue +++ b/frontend/src/components/deDrag/index.vue @@ -39,6 +39,7 @@ :active-model="'edit'" :canvas-id="canvasId" :element="element" + :chart="chart" @showViewDetails="showViewDetails" @amRemoveItem="amRemoveItem" @amAddItem="amAddItem" @@ -384,6 +385,7 @@ export default { }, data: function() { return { + chart: null, contentDisplay: true, // 当画布在tab中是 宽度左右拓展的余量 parentWidthTabOffset: 40, @@ -802,6 +804,9 @@ export default { this.beforeDestroyFunction() }, methods: { + setChartData(chart) { + this.chart = chart + }, // 重置边界和鼠标状态 resetBoundsAndMouseState() { this.mouseClickPosition = { mouseX: 0, mouseY: 0, x: 0, y: 0, w: 0, h: 0 } @@ -1929,6 +1934,7 @@ export default { const nodes = this.$el.parentNode.childNodes // 获取当前父节点下所有子节点 for (const item of nodes) { if ( + item.tagName !== 'svg' && item.className !== undefined && !item.className.split(' ').includes(this.classNameActive) && item.getAttribute('tab-is-check') !== null && @@ -2114,8 +2120,8 @@ export default { position: absolute; top: 0; left: 0; - width: 100%; - height: 100%; + width: 100% !important; + height: 100% !important; } .drag-on-tab-collision { diff --git a/frontend/src/components/deViewSelect/dom.js b/frontend/src/components/deViewSelect/dom.js deleted file mode 100644 index 0077c09474..0000000000 --- a/frontend/src/components/deViewSelect/dom.js +++ /dev/null @@ -1,32 +0,0 @@ - -export const on = (function() { - if (document.addEventListener) { - return function(element, event, handler) { - if (element && event && handler) { - element.addEventListener(event, handler, false) - } - } - } else { - return function(element, event, handler) { - if (element && event && handler) { - element.attachEvent('on' + event, handler) - } - } - } -})() -export const off = (function() { - if (document.removeEventListener) { - return function(element, event, handler) { - if (element && event) { - element.removeEventListener(event, handler, false) - } - } - } else { - return function(element, event, handler) { - if (element && event) { - element.detachEvent('on' + event, handler) - } - } - } -})() - diff --git a/frontend/src/components/deViewSelect/index.vue b/frontend/src/components/deViewSelect/index.vue index 2e0c15d0b2..4c749009fe 100644 --- a/frontend/src/components/deViewSelect/index.vue +++ b/frontend/src/components/deViewSelect/index.vue @@ -139,6 +139,10 @@ export default { this.innerValues = this.value this.viewLoaded = false this.panelId && findOne(this.panelId).then(response => { + const watermarkInfo = { + ...response.data.watermarkInfo, + settingContent: JSON.parse(response.data.watermarkInfo.settingContent) + } this.panelInfo = { id: response.data.id, name: response.data.name, @@ -148,7 +152,9 @@ export default { createBy: response.data.createBy, createTime: response.data.createTime, updateBy: response.data.updateBy, - updateTime: response.data.updateTime + updateTime: response.data.updateTime, + watermarkOpen: response.data.watermarkOpen, + watermarkInfo: watermarkInfo } this.$store.dispatch('panel/setPanelInfo', this.panelInfo) panelDataPrepare(JSON.parse(response.data.panelData), JSON.parse(response.data.panelStyle), rsp => { diff --git a/frontend/src/components/doc/index.vue b/frontend/src/components/doc/index.vue deleted file mode 100644 index f39e68135f..0000000000 --- a/frontend/src/components/doc/index.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/frontend/src/components/elVisualSelect/index.vue b/frontend/src/components/elVisualSelect/index.vue index 682115ecca..299c20ad56 100644 --- a/frontend/src/components/elVisualSelect/index.vue +++ b/frontend/src/components/elVisualSelect/index.vue @@ -171,7 +171,7 @@ export default { this.options = this.newList.slice(0, this.maxLength) }, customInputStyle() { - if (!this.$parent.$parent.handlerInputStyle) return + if (!this.$parent.$parent.handlerInputStyle || !this.$refs.visualSelect) return handlerInputStyle(this.$refs.visualSelect.$el.querySelector('.el-input__inner'), this.$parent.element.style) handlerInputStyle(this.$refs.visualSelect.$el.querySelector('.el-select__input'), { wordColor: this.$parent.element.style.wordColor }) }, diff --git a/frontend/src/components/gridButton/index.vue b/frontend/src/components/gridButton/index.vue deleted file mode 100644 index 729d9e47a4..0000000000 --- a/frontend/src/components/gridButton/index.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - diff --git a/frontend/src/components/gridTable/tableBody.vue b/frontend/src/components/gridTable/TableBody.vue similarity index 100% rename from frontend/src/components/gridTable/tableBody.vue rename to frontend/src/components/gridTable/TableBody.vue diff --git a/frontend/src/components/gridTable/index.vue b/frontend/src/components/gridTable/index.vue index 84f780b4d8..9754c48897 100644 --- a/frontend/src/components/gridTable/index.vue +++ b/frontend/src/components/gridTable/index.vue @@ -27,7 +27,7 @@ - - diff --git a/frontend/src/components/pagination/index.vue b/frontend/src/components/pagination/index.vue deleted file mode 100644 index 4e2749b3c2..0000000000 --- a/frontend/src/components/pagination/index.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - - - diff --git a/frontend/src/components/screenfull/index.vue b/frontend/src/components/screenfull/index.vue deleted file mode 100644 index fc970653ca..0000000000 --- a/frontend/src/components/screenfull/index.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - diff --git a/frontend/src/components/sizeSelect/index.vue b/frontend/src/components/sizeSelect/index.vue deleted file mode 100644 index dae9876809..0000000000 --- a/frontend/src/components/sizeSelect/index.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - diff --git a/frontend/src/components/suspensionSelector/index.vue b/frontend/src/components/suspensionSelector/index.vue new file mode 100644 index 0000000000..7182735689 --- /dev/null +++ b/frontend/src/components/suspensionSelector/index.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/frontend/src/components/themePicker/index.vue b/frontend/src/components/themePicker/index.vue deleted file mode 100644 index 1bd21b4364..0000000000 --- a/frontend/src/components/themePicker/index.vue +++ /dev/null @@ -1,169 +0,0 @@ - - - - - diff --git a/frontend/src/components/widget/deWidget/DeTabs.vue b/frontend/src/components/widget/deWidget/DeTabs.vue index e6c1614baa..99d655a4a2 100644 --- a/frontend/src/components/widget/deWidget/DeTabs.vue +++ b/frontend/src/components/widget/deWidget/DeTabs.vue @@ -214,14 +214,14 @@ + + diff --git a/frontend/src/views/chart/components/map/MapLayerController.vue b/frontend/src/views/chart/components/map/MapLayerController.vue new file mode 100644 index 0000000000..5f33a6d5cf --- /dev/null +++ b/frontend/src/views/chart/components/map/MapLayerController.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/frontend/src/views/chart/components/shape-attr/ColorSelector.vue b/frontend/src/views/chart/components/shapeAttr/ColorSelector.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/ColorSelector.vue rename to frontend/src/views/chart/components/shapeAttr/ColorSelector.vue diff --git a/frontend/src/views/chart/components/shape-attr/ColorSelectorExt.vue b/frontend/src/views/chart/components/shapeAttr/ColorSelectorExt.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/ColorSelectorExt.vue rename to frontend/src/views/chart/components/shapeAttr/ColorSelectorExt.vue diff --git a/frontend/src/views/chart/components/shape-attr/LabelSelector.vue b/frontend/src/views/chart/components/shapeAttr/LabelSelector.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/LabelSelector.vue rename to frontend/src/views/chart/components/shapeAttr/LabelSelector.vue diff --git a/frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue b/frontend/src/views/chart/components/shapeAttr/LabelSelectorAntV.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/LabelSelectorAntV.vue rename to frontend/src/views/chart/components/shapeAttr/LabelSelectorAntV.vue diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelector.vue b/frontend/src/views/chart/components/shapeAttr/SizeSelector.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/SizeSelector.vue rename to frontend/src/views/chart/components/shapeAttr/SizeSelector.vue diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue b/frontend/src/views/chart/components/shapeAttr/SizeSelectorAntV.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/SizeSelectorAntV.vue rename to frontend/src/views/chart/components/shapeAttr/SizeSelectorAntV.vue diff --git a/frontend/src/views/chart/components/shape-attr/SizeSelectorCommon.vue b/frontend/src/views/chart/components/shapeAttr/SizeSelectorCommon.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/SizeSelectorCommon.vue rename to frontend/src/views/chart/components/shapeAttr/SizeSelectorCommon.vue diff --git a/frontend/src/views/chart/components/shape-attr/TooltipSelector.vue b/frontend/src/views/chart/components/shapeAttr/TooltipSelector.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/TooltipSelector.vue rename to frontend/src/views/chart/components/shapeAttr/TooltipSelector.vue diff --git a/frontend/src/views/chart/components/shape-attr/TooltipSelectorAntV.vue b/frontend/src/views/chart/components/shapeAttr/TooltipSelectorAntV.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/TooltipSelectorAntV.vue rename to frontend/src/views/chart/components/shapeAttr/TooltipSelectorAntV.vue diff --git a/frontend/src/views/chart/components/shape-attr/TotalCfg.vue b/frontend/src/views/chart/components/shapeAttr/TotalCfg.vue similarity index 100% rename from frontend/src/views/chart/components/shape-attr/TotalCfg.vue rename to frontend/src/views/chart/components/shapeAttr/TotalCfg.vue diff --git a/frontend/src/views/chart/components/TreeSelector/ChartMoveSelector.vue b/frontend/src/views/chart/components/treeSelector/ChartMoveSelector.vue similarity index 100% rename from frontend/src/views/chart/components/TreeSelector/ChartMoveSelector.vue rename to frontend/src/views/chart/components/treeSelector/ChartMoveSelector.vue diff --git a/frontend/src/views/chart/components/TreeSelector/GroupMoveSelector.vue b/frontend/src/views/chart/components/treeSelector/GroupMoveSelector.vue similarity index 100% rename from frontend/src/views/chart/components/TreeSelector/GroupMoveSelector.vue rename to frontend/src/views/chart/components/treeSelector/GroupMoveSelector.vue diff --git a/frontend/src/views/chart/components/TreeSelector/index.vue b/frontend/src/views/chart/components/treeSelector/index.vue similarity index 100% rename from frontend/src/views/chart/components/TreeSelector/index.vue rename to frontend/src/views/chart/components/treeSelector/index.vue diff --git a/frontend/src/views/chart/components/value-formatter/ValueFormatterEdit.vue b/frontend/src/views/chart/components/valueFormatter/ValueFormatterEdit.vue similarity index 100% rename from frontend/src/views/chart/components/value-formatter/ValueFormatterEdit.vue rename to frontend/src/views/chart/components/valueFormatter/ValueFormatterEdit.vue diff --git a/frontend/src/views/chart/group/Group.vue b/frontend/src/views/chart/group/Group.vue index 3efeed18b6..63aa526890 100644 --- a/frontend/src/views/chart/group/Group.vue +++ b/frontend/src/views/chart/group/Group.vue @@ -483,8 +483,8 @@ import { post, chartGroupTree } from '@/api/chart/chart' import { queryAuthModel } from '@/api/authModel/authModel' import TableSelector from '../view/TableSelector' -import GroupMoveSelector from '../components/TreeSelector/GroupMoveSelector' -import ChartMoveSelector from '../components/TreeSelector/ChartMoveSelector' +import GroupMoveSelector from '../components/treeSelector/GroupMoveSelector' +import ChartMoveSelector from '../components/treeSelector/ChartMoveSelector' import ChartType from '@/views/chart/view/ChartType' import { pluginTypes } from '@/api/chart/chart' import { diff --git a/frontend/src/views/chart/view/CalcChartFieldEdit.vue b/frontend/src/views/chart/view/CalcChartFieldEdit.vue index 6f8af6562a..b4fd101f40 100644 --- a/frontend/src/views/chart/view/CalcChartFieldEdit.vue +++ b/frontend/src/views/chart/view/CalcChartFieldEdit.vue @@ -1,29 +1,29 @@ - - diff --git a/frontend/src/views/system/log/FilterUser.vue b/frontend/src/views/system/log/FilterUser.vue index 494e64d8b6..2a3235a6b7 100644 --- a/frontend/src/views/system/log/FilterUser.vue +++ b/frontend/src/views/system/log/FilterUser.vue @@ -88,7 +88,7 @@ import { dateFormat } from '@/views/system/task/options.js' import { opTypes } from '@/api/system/log' import { post } from '@/api/dataset/dataset' -import DeDatePick from '@/components/deCustomCm/deDatePick.vue' +import DeDatePick from '@/components/deCustomCm/DeDatePick.vue' export default { components: { DeDatePick diff --git a/frontend/src/views/system/log/index.vue b/frontend/src/views/system/log/index.vue index 4067f27ee4..9e8c371962 100644 --- a/frontend/src/views/system/log/index.vue +++ b/frontend/src/views/system/log/index.vue @@ -95,7 +95,7 @@ show-overflow-tooltip prop="opType" :label="$t('log.optype')" - width="140" + width="160" >