From 1fb9e0e322e5d0feb7be95c524e185e6eb90f3e6 Mon Sep 17 00:00:00 2001 From: root <13910913995@163.com> Date: Mon, 30 Jun 2025 10:17:15 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=A7=86=E5=9B=BE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=88=B02.0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChartDataController.java | 3 +- .../stdproject/controller/UserController.java | 11 ++ .../VisualizationLinkJumpController.java | 68 +++++++++++ .../VisualizationLinkageController.java | 56 +++++++++ .../com/stdproject/entity/vo/CurIpVO.java | 18 +++ .../ExtVisualizationLinkJumpMapper.java | 36 ------ .../mapper/ExtVisualizationLinkageMapper.java | 30 +---- .../service/manage/ChartViewManege.java | 4 +- .../service/manage/DatasetSQLManage.java | 9 +- .../service/provider/CalciteProvider.java | 4 +- .../java/com/stdproject/utils/RsaUtils.java | 69 ++++++++++- .../main/java/com/stdproject/utils/Utils.java | 3 +- backend/src/main/resources/application.yml | 4 +- .../mybatis/ExtDataVisualizationMapper.xml | 2 +- .../ExtVisualizationLinkJumpMapper.xml | 112 ++++++++++++++++++ .../mybatis/ExtVisualizationLinkageMapper.xml | 43 +++++++ 16 files changed, 390 insertions(+), 82 deletions(-) create mode 100644 backend/src/main/java/com/stdproject/controller/VisualizationLinkJumpController.java create mode 100644 backend/src/main/java/com/stdproject/controller/VisualizationLinkageController.java create mode 100644 backend/src/main/java/com/stdproject/entity/vo/CurIpVO.java create mode 100644 backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml create mode 100644 backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml diff --git a/backend/src/main/java/com/stdproject/controller/ChartDataController.java b/backend/src/main/java/com/stdproject/controller/ChartDataController.java index 3720c0d..40b74a5 100644 --- a/backend/src/main/java/com/stdproject/controller/ChartDataController.java +++ b/backend/src/main/java/com/stdproject/controller/ChartDataController.java @@ -17,6 +17,7 @@ import jakarta.annotation.Resource; import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -34,7 +35,7 @@ public class ChartDataController { @Operation(summary = "获取图表数据") @OperationLog(type = "01", module = "数据可视化", description = "获取图表数据") @PostMapping("getData") - public ResponseResult getData(ChartViewDTO chartViewDTO) throws Exception { + public ResponseResult getData(@RequestBody ChartViewDTO chartViewDTO) throws Exception { try { // 从模板数据获取 DatasetUtils.viewDecode(chartViewDTO); diff --git a/backend/src/main/java/com/stdproject/controller/UserController.java b/backend/src/main/java/com/stdproject/controller/UserController.java index 6ebc503..7de06c5 100644 --- a/backend/src/main/java/com/stdproject/controller/UserController.java +++ b/backend/src/main/java/com/stdproject/controller/UserController.java @@ -8,11 +8,13 @@ import com.stdproject.config.WebConfig; import com.stdproject.entity.AppOptLog; import com.stdproject.entity.LoginUser; import com.stdproject.entity.User; +import com.stdproject.entity.vo.CurIpVO; import com.stdproject.service.IAppOptLogService; import com.stdproject.service.IUserService; import com.stdproject.utils.JwtUtils; import com.stdproject.utils.RsaUtils; import com.stdproject.utils.commonUtils; +import io.gisbi.utils.IPUtils; import io.micrometer.common.util.StringUtils; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; @@ -276,4 +278,13 @@ private Long jwtExpirationMs; sysLogService.save(sysLog); return ResponseResult.success(); } + + @GetMapping("/ipInfo") + public CurIpVO ipInfo() { + CurIpVO curIpVO = new CurIpVO(); + curIpVO.setAccount("admin"); + curIpVO.setName("管理员"); + curIpVO.setIp(IPUtils.get()); + return curIpVO; + } } diff --git a/backend/src/main/java/com/stdproject/controller/VisualizationLinkJumpController.java b/backend/src/main/java/com/stdproject/controller/VisualizationLinkJumpController.java new file mode 100644 index 0000000..53eeabd --- /dev/null +++ b/backend/src/main/java/com/stdproject/controller/VisualizationLinkJumpController.java @@ -0,0 +1,68 @@ +package com.stdproject.controller; + +import com.stdproject.common.OperationLog; +import com.stdproject.config.ResponseResult; +import com.stdproject.entity.dto.LinkageInfoDTO; +import com.stdproject.entity.dto.VisualizationLinkJumpDTO; +import com.stdproject.entity.dto.VisualizationLinkJumpInfoDTO; +import com.stdproject.mapper.ExtVisualizationLinkJumpMapper; +import com.stdproject.mapper.ExtVisualizationLinkageMapper; +import com.stdproject.response.VisualizationLinkJumpBaseResponse; +import io.gisbi.constant.CommonConstants; +import io.gisbi.utils.AuthUtils; +import io.gisbi.utils.ModelUtils; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/linkJump") +public class VisualizationLinkJumpController { + + @Resource + private ExtVisualizationLinkJumpMapper extVisualizationLinkJumpMapper; + + @Operation(summary = "根据可视化资源ID查询跳转信息") + @OperationLog(type = "01", module = "数据可视化", description = "根据可视化资源ID查询跳转信息") + @GetMapping("/queryVisualizationJumpInfo/{dvId}/{resourceTable}") + public ResponseResult queryVisualizationJumpInfo(@PathVariable Long dvId,@PathVariable String resourceTable) throws Exception { + Map resultBase = new HashMap<>(); + List resultLinkJumpList = null; +// String userid=com.stdproject.utils.AuthUtils.getUserId(); + String userid="1922852335260831746"; + if (CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(resourceTable)) { + resultLinkJumpList = extVisualizationLinkJumpMapper.queryWithDvIdSnapshot(dvId, Long.parseLong(userid), false); + } else { + resultLinkJumpList = extVisualizationLinkJumpMapper.queryWithDvId(dvId,Long.parseLong(userid), false); + } + Optional.ofNullable(resultLinkJumpList).orElse(new ArrayList<>()).forEach(resultLinkJump -> { + if (resultLinkJump.getChecked()) { + Long sourceViewId = resultLinkJump.getSourceViewId(); + Optional.ofNullable(resultLinkJump.getLinkJumpInfoArray()).orElse(new ArrayList<>()).forEach(linkJumpInfo -> { + if (linkJumpInfo.getChecked()) { + String sourceJumpInfo = sourceViewId + "#" + linkJumpInfo.getSourceFieldId(); + // 内部仪表板跳转 需要设置好仪表板ID + if ("inner".equals(linkJumpInfo.getLinkType())) { + if (linkJumpInfo.getTargetDvId() != null) { + resultBase.put(sourceJumpInfo, linkJumpInfo); + } + } else { + // 外部跳转 + resultBase.put(sourceJumpInfo, linkJumpInfo); + } + } + }); + } + }); + VisualizationLinkJumpBaseResponse result = new VisualizationLinkJumpBaseResponse(resultBase, null); + return ResponseResult.successData(result); + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/stdproject/controller/VisualizationLinkageController.java b/backend/src/main/java/com/stdproject/controller/VisualizationLinkageController.java new file mode 100644 index 0000000..8b82b52 --- /dev/null +++ b/backend/src/main/java/com/stdproject/controller/VisualizationLinkageController.java @@ -0,0 +1,56 @@ +package com.stdproject.controller; + +import com.stdproject.common.OperationLog; +import com.stdproject.config.ResponseResult; +import com.stdproject.entity.dto.LinkageInfoDTO; +import com.stdproject.mapper.ExtVisualizationLinkageMapper; +import com.stdproject.service.manage.ChartDataManage; +import com.stdproject.utils.DatasetUtils; +import io.gisbi.constant.CommonConstants; +import io.gisbi.exception.DEException; +import io.gisbi.extensions.view.dto.ChartViewDTO; +import io.gisbi.result.ResultCode; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.annotation.Resource; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/linkage") +public class VisualizationLinkageController { + + @Resource + private ExtVisualizationLinkageMapper extVisualizationLinkageMapper; + + @Operation(summary = "根据资源ID查询联动信息") + @OperationLog(type = "01", module = "数据可视化", description = "根据资源ID查询联动信息") + @GetMapping("/getVisualizationAllLinkageInfo/{dvId}/{resourceTable}") + public ResponseResult getVisualizationAllLinkageInfo(@PathVariable Long dvId,@PathVariable String resourceTable) throws Exception { + List info = null; + if (CommonConstants.RESOURCE_TABLE.SNAPSHOT.equals(resourceTable)) { + info = extVisualizationLinkageMapper.getPanelAllLinkageInfoSnapshot(dvId); + }else{ + info = extVisualizationLinkageMapper.getPanelAllLinkageInfo(dvId); + } + info = info.stream().map(item -> { + item.setTargetInfoList(item.getTargetInfoList().stream().map(targetInfo -> { + if (targetInfo.contains(".")) { + String[] split = targetInfo.split("\\."); + if (split.length == 2) { + targetInfo = split[1]; + } + } + return targetInfo; + }).collect(Collectors.toList())); + return item; + }).collect(Collectors.toList()); + return ResponseResult.successData( info); + } + + +} \ No newline at end of file diff --git a/backend/src/main/java/com/stdproject/entity/vo/CurIpVO.java b/backend/src/main/java/com/stdproject/entity/vo/CurIpVO.java new file mode 100644 index 0000000..ac83fb4 --- /dev/null +++ b/backend/src/main/java/com/stdproject/entity/vo/CurIpVO.java @@ -0,0 +1,18 @@ +package com.stdproject.entity.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class CurIpVO implements Serializable { + @Serial + private static final long serialVersionUID = -3025566841330382707L; + + private String account; + + private String name; + + private String ip; +} diff --git a/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkJumpMapper.java b/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkJumpMapper.java index 1c28437..84a701c 100644 --- a/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkJumpMapper.java +++ b/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkJumpMapper.java @@ -17,41 +17,5 @@ public interface ExtVisualizationLinkJumpMapper { List queryWithDvIdSnapshot(@Param("dvId") Long dvId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop); - VisualizationLinkJumpDTO queryWithViewId(@Param("dvId") Long dvId,@Param("viewId") Long viewId,@Param("uid") Long uid,@Param("isDesktop") Boolean isDesktop); - void deleteJumpTargetViewInfoSnapshot(@Param("dvId") Long dvId,@Param("viewId") Long viewId); - - void deleteJumpInfoSnapshot(@Param("dvId") Long dvId,@Param("viewId") Long viewId); - - void deleteJumpSnapshot(@Param("dvId") Long dvId,@Param("viewId") Long viewId); - - void deleteJumpTargetViewInfoWithVisualization(@Param("dvId") Long dvId); - - void deleteJumpInfoWithVisualization(@Param("dvId") Long dvId); - - void deleteJumpWithVisualization(@Param("dvId") Long dvId); - - void deleteJumpTargetViewInfoWithVisualizationSnapshot(@Param("dvId") Long dvId); - - void deleteJumpInfoWithVisualizationSnapshot(@Param("dvId") Long dvId); - - void deleteJumpWithVisualizationSnapshot(@Param("dvId") Long dvId); - - List getTargetVisualizationJumpInfo(@Param("request") VisualizationLinkJumpBaseRequest request); - - List getTargetVisualizationJumpInfoSnapshot(@Param("request") VisualizationLinkJumpBaseRequest request); - - void copyLinkJump(@Param("copyId")Long copyId); - - void copyLinkJumpInfo(@Param("copyId")Long copyId); - - void copyLinkJumpTarget(@Param("copyId")Long copyId); - - List findLinkJumpWithDvId(@Param("dvId")Long dvId); - - List findLinkJumpInfoWithDvId(@Param("dvId")Long dvId); - - List getViewTableDetails(@Param("dvId")Long dvId); - - List queryOutParamsTargetWithDvId(@Param("dvId")Long dvId); } diff --git a/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkageMapper.java b/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkageMapper.java index 4d6e6f9..dbad192 100644 --- a/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkageMapper.java +++ b/backend/src/main/java/com/stdproject/mapper/ExtVisualizationLinkageMapper.java @@ -13,32 +13,6 @@ import java.util.List; @Mapper public interface ExtVisualizationLinkageMapper { - - List getViewLinkageGather(@Param("dvId") Long dvId, @Param("sourceViewId") Long sourceViewId, @Param("targetViewIds") List targetViewIds); - - List getPanelAllLinkageInfo(@Param("dvId") Long dvId); - - List getViewLinkageGatherSnapshot(@Param("dvId") Long dvId, @Param("sourceViewId") Long sourceViewId, @Param("targetViewIds") List targetViewIds); - - List getPanelAllLinkageInfoSnapshot(@Param("dvId") Long dvId); - - List queryTableField(@Param("table_id") Long tableId); - - List queryTableFieldWithViewId(@Param("viewId") Long viewId); - - void deleteViewLinkage(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId); - - void deleteViewLinkageField(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId); - - void deleteViewLinkageSnapshot(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId); - - void deleteViewLinkageFieldSnapshot(@Param("dvId") Long dvId,@Param("sourceViewId") Long sourceViewId); - - void copyViewLinkage(@Param("copyId") Long copyId); - - void copyViewLinkageField(@Param("copyId") Long copyId); - - List findLinkageWithDvId(@Param("dvId") Long dvId); - - List findLinkageFieldWithDvId(@Param("dvId") Long dvId); + List getPanelAllLinkageInfo(@Param("dvId") Long dvId); + List getPanelAllLinkageInfoSnapshot(@Param("dvId") Long dvId); } diff --git a/backend/src/main/java/com/stdproject/service/manage/ChartViewManege.java b/backend/src/main/java/com/stdproject/service/manage/ChartViewManege.java index 041cc01..9684f07 100644 --- a/backend/src/main/java/com/stdproject/service/manage/ChartViewManege.java +++ b/backend/src/main/java/com/stdproject/service/manage/ChartViewManege.java @@ -251,9 +251,7 @@ public class ChartViewManege { ChartFieldCompareDTO chartFieldCompareDTO = new ChartFieldCompareDTO(); chartFieldCompareDTO.setType("none"); dto.setCompareCalc(chartFieldCompareDTO); - - dto.setFormatterCfg(new FormatterCfgDTO().setUnitLanguage(Lang.isChinese() ? "ch" : "en")); - + dto.setFormatterCfg(new FormatterCfgDTO()); dto.setSort("none"); dto.setFilter(Collections.emptyList()); return dto; diff --git a/backend/src/main/java/com/stdproject/service/manage/DatasetSQLManage.java b/backend/src/main/java/com/stdproject/service/manage/DatasetSQLManage.java index e86de99..6c54fd5 100644 --- a/backend/src/main/java/com/stdproject/service/manage/DatasetSQLManage.java +++ b/backend/src/main/java/com/stdproject/service/manage/DatasetSQLManage.java @@ -8,10 +8,7 @@ import com.stdproject.entity.CoreDatasource; import com.stdproject.entity.union.*; import com.stdproject.mapper.CoreDatasetGroupMapper; import com.stdproject.mapper.CoreDatasourceMapper; -import com.stdproject.utils.DatasetTableTypeConstants; -import com.stdproject.utils.SqlUtils; -import com.stdproject.utils.SqlparserUtils; -import com.stdproject.utils.TableUtils; +import com.stdproject.utils.*; import io.gisbi.constant.SQLConstants; import io.gisbi.exception.DEException; import io.gisbi.extensions.datasource.api.PluginManageApi; @@ -480,8 +477,8 @@ public class DatasetSQLManage { if (coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.Excel.name()) || coreDatasource.getType().contains(DatasourceConfiguration.DatasourceType.API.name())) { coreDatasource = engineManage.getDeEngine(); } - - Map map = JsonUtil.parseObject(coreDatasource.getConfiguration(), Map.class); + String config= String.valueOf(EncryptUtils.aesDecrypt(coreDatasource.getConfiguration())); + Map map=JsonUtil.parseObject(config, Map.class); if (!isCross && ObjectUtils.isNotEmpty(map.get("schema"))) { schemaAlias = (String) map.get("schema"); } else { diff --git a/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java b/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java index af0eb1c..9136aa2 100644 --- a/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java +++ b/backend/src/main/java/com/stdproject/service/provider/CalciteProvider.java @@ -478,8 +478,8 @@ public class CalciteProvider extends Provider { public Map jdbcFetchResultField(DatasourceRequest datasourceRequest) throws BusinessException { DatasourceSchemaDTO value = datasourceRequest.getDsList().entrySet().iterator().next().getValue(); datasourceRequest.setDatasource(value); - - DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); + String config=String.valueOf(EncryptUtils.aesDecrypt(datasourceRequest.getDatasource().getConfiguration())); + DatasourceConfiguration datasourceConfiguration = JsonUtil.parseObject(config, DatasourceConfiguration.class); Map map = new LinkedHashMap<>(); List fieldList = new ArrayList<>(); diff --git a/backend/src/main/java/com/stdproject/utils/RsaUtils.java b/backend/src/main/java/com/stdproject/utils/RsaUtils.java index 805d29f..00c3e5c 100644 --- a/backend/src/main/java/com/stdproject/utils/RsaUtils.java +++ b/backend/src/main/java/com/stdproject/utils/RsaUtils.java @@ -1,8 +1,14 @@ package com.stdproject.utils; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; @@ -15,8 +21,11 @@ import java.security.spec.X509EncodedKeySpec; * @date 2020-05-18 **/ public class RsaUtils { - + public static final String IV_KEY = "0000000000000000"; private static final String SRC = "123456"; + private static final String ALGORITHM = "AES"; + public static String symmetricKey = null; + private static final int KEY_SIZE = 128; public static void main(String[] args) throws Exception { System.out.println("\n"); @@ -30,6 +39,7 @@ public class RsaUtils { System.out.println("\n"); + } /** @@ -69,6 +79,8 @@ public class RsaUtils { System.out.println("***************** 私钥加密公钥解密结束 *****************"); } + + /** * 公钥解密 * @@ -156,8 +168,61 @@ public class RsaUtils { String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded()); return new RsaKeyPair(publicKeyString, privateKeyString); } + /** + * 生成AES对称加密密钥 + * @return Base64编码的密钥字符串 + */ + public static String generateSymmetricKey() { + try { + if (StringUtils.isEmpty(symmetricKey)) { + KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); + keyGenerator.init(KEY_SIZE, new SecureRandom()); + SecretKey secretKey = keyGenerator.generateKey(); + symmetricKey = java.util.Base64.getEncoder().encodeToString(secretKey.getEncoded()); + } + return symmetricKey; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** + * 使用AES对称密钥进行加密 + * @param data 待加密的数据 + * @return 加密后的Base64编码字符串 + */ + public static String symmetricEncrypt(String data) { + try { + byte[] iv = IV_KEY.getBytes(StandardCharsets.UTF_8); + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + SecretKeySpec secretKeySpec = new SecretKeySpec(java.util.Base64.getDecoder().decode(generateSymmetricKey()), ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); + byte[] ciphertext = cipher.doFinal(data.getBytes("UTF-8")); + return java.util.Base64.getEncoder().encodeToString(ciphertext); + } catch (Exception e) { + throw new RuntimeException(e); + } + } - + /** + * 使用AES对称密钥进行解密 + * @param data 待解密的Base64编码字符串 + * @return 解密后的原始数据 + */ + public static String symmetricDecrypt(String data) { + try { + byte[] iv = IV_KEY.getBytes(StandardCharsets.UTF_8); + IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); + SecretKeySpec secretKeySpec = new SecretKeySpec(java.util.Base64.getDecoder().decode(generateSymmetricKey()), ALGORITHM); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); + byte[] decodedCiphertext = java.util.Base64.getDecoder().decode(data); + byte[] decryptedText = cipher.doFinal(decodedCiphertext); + return new String(decryptedText, "UTF-8"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } /** * RSA密钥对对象 */ diff --git a/backend/src/main/java/com/stdproject/utils/Utils.java b/backend/src/main/java/com/stdproject/utils/Utils.java index 65ad66a..d3e505d 100644 --- a/backend/src/main/java/com/stdproject/utils/Utils.java +++ b/backend/src/main/java/com/stdproject/utils/Utils.java @@ -279,7 +279,8 @@ public class Utils { public static String replaceSchemaAlias(String sql, Map dsMap) { DatasourceSchemaDTO value = dsMap.entrySet().iterator().next().getValue(); - Map map = JsonUtil.parseObject(value.getConfiguration(), Map.class); + String config= String.valueOf(EncryptUtils.aesDecrypt(value.getConfiguration())); + Map map = JsonUtil.parseObject(config, Map.class); if (ObjectUtils.isNotEmpty(map.get("schema"))) { return sql; } diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 11060a5..168beca 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -19,9 +19,9 @@ spring: main: allow-bean-definition-overriding: true datasource: - url: ${DB_URL:jdbc:mysql://121.37.111.42:3306/gisbi-demodb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true} + url: ${DB_URL:jdbc:mysql://192.168.1.58:3306/gisbi-demodb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true} username: ${DB_USERNAME:root} - password: ${DB_PASSWORD:mysql_F8ysiK@2024} + password: ${DB_PASSWORD:123456} driver-class-name: com.mysql.cj.jdbc.Driver # HikariCP连接池配置 hikari: diff --git a/backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml b/backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml index 7bfd40b..b9a300a 100644 --- a/backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml +++ b/backend/src/main/resources/mybatis/ExtDataVisualizationMapper.xml @@ -124,7 +124,7 @@ - + diff --git a/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml b/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml new file mode 100644 index 0000000..458b11b --- /dev/null +++ b/backend/src/main/resources/mybatis/ExtVisualizationLinkJumpMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml b/backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml new file mode 100644 index 0000000..5397083 --- /dev/null +++ b/backend/src/main/resources/mybatis/ExtVisualizationLinkageMapper.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + From 406b0ba5f6a18ef2934341f5431bb6628a6bd45f Mon Sep 17 00:00:00 2001 From: limengnan <420004014@qq.com> Date: Tue, 1 Jul 2025 10:10:18 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/assets/svg/DataEase.svg | 32 +++++++-------- frontend/src/assets/svg/Excel-remote-ds.svg | 6 +++ frontend/src/assets/svg/bullet-graph-dark.svg | 15 +++++++ .../src/assets/svg/bullet-graph-origin.svg | 15 +++++++ frontend/src/assets/svg/bullet-graph.svg | 15 +++++++ frontend/src/assets/svg/dv-cancel-publish.svg | 1 + frontend/src/assets/svg/dv-copy-dark.svg | 4 +- .../svg/dv-dashboard-spine-disabled.svg | 4 ++ .../dv-dashboard-spine-mobile-disabled.svg | 7 ++++ .../src/assets/svg/dv-recover_outlined.svg | 6 +++ frontend/src/assets/svg/dv-share.svg | 4 +- frontend/src/assets/svg/exit-fullscreen.svg | 2 +- frontend/src/assets/svg/icon_excel.svg | 12 ++---- frontend/src/assets/svg/logo.svg | 41 ++++++++++--------- frontend/src/assets/svg/style-underline.svg | 2 +- 15 files changed, 115 insertions(+), 51 deletions(-) create mode 100644 frontend/src/assets/svg/Excel-remote-ds.svg create mode 100644 frontend/src/assets/svg/bullet-graph-dark.svg create mode 100644 frontend/src/assets/svg/bullet-graph-origin.svg create mode 100644 frontend/src/assets/svg/bullet-graph.svg create mode 100644 frontend/src/assets/svg/dv-cancel-publish.svg create mode 100644 frontend/src/assets/svg/dv-dashboard-spine-disabled.svg create mode 100644 frontend/src/assets/svg/dv-dashboard-spine-mobile-disabled.svg create mode 100644 frontend/src/assets/svg/dv-recover_outlined.svg diff --git a/frontend/src/assets/svg/DataEase.svg b/frontend/src/assets/svg/DataEase.svg index aa2b44b..3fe02e0 100644 --- a/frontend/src/assets/svg/DataEase.svg +++ b/frontend/src/assets/svg/DataEase.svg @@ -1,17 +1,17 @@ - - - - Layer 1 - - - - - - - - - - - GIS-BI开发平台 - + + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/svg/Excel-remote-ds.svg b/frontend/src/assets/svg/Excel-remote-ds.svg new file mode 100644 index 0000000..1c9b0b3 --- /dev/null +++ b/frontend/src/assets/svg/Excel-remote-ds.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/src/assets/svg/bullet-graph-dark.svg b/frontend/src/assets/svg/bullet-graph-dark.svg new file mode 100644 index 0000000..69bfd6a --- /dev/null +++ b/frontend/src/assets/svg/bullet-graph-dark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/svg/bullet-graph-origin.svg b/frontend/src/assets/svg/bullet-graph-origin.svg new file mode 100644 index 0000000..69bfd6a --- /dev/null +++ b/frontend/src/assets/svg/bullet-graph-origin.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/svg/bullet-graph.svg b/frontend/src/assets/svg/bullet-graph.svg new file mode 100644 index 0000000..0d54e3d --- /dev/null +++ b/frontend/src/assets/svg/bullet-graph.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/frontend/src/assets/svg/dv-cancel-publish.svg b/frontend/src/assets/svg/dv-cancel-publish.svg new file mode 100644 index 0000000..2fe8923 --- /dev/null +++ b/frontend/src/assets/svg/dv-cancel-publish.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/svg/dv-copy-dark.svg b/frontend/src/assets/svg/dv-copy-dark.svg index 9a1c506..bd8e12a 100644 --- a/frontend/src/assets/svg/dv-copy-dark.svg +++ b/frontend/src/assets/svg/dv-copy-dark.svg @@ -1,3 +1,3 @@ - - + + diff --git a/frontend/src/assets/svg/dv-dashboard-spine-disabled.svg b/frontend/src/assets/svg/dv-dashboard-spine-disabled.svg new file mode 100644 index 0000000..e736673 --- /dev/null +++ b/frontend/src/assets/svg/dv-dashboard-spine-disabled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/src/assets/svg/dv-dashboard-spine-mobile-disabled.svg b/frontend/src/assets/svg/dv-dashboard-spine-mobile-disabled.svg new file mode 100644 index 0000000..9cef1a1 --- /dev/null +++ b/frontend/src/assets/svg/dv-dashboard-spine-mobile-disabled.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/frontend/src/assets/svg/dv-recover_outlined.svg b/frontend/src/assets/svg/dv-recover_outlined.svg new file mode 100644 index 0000000..765f1a0 --- /dev/null +++ b/frontend/src/assets/svg/dv-recover_outlined.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/frontend/src/assets/svg/dv-share.svg b/frontend/src/assets/svg/dv-share.svg index 6f76a9b..6c4ca78 100644 --- a/frontend/src/assets/svg/dv-share.svg +++ b/frontend/src/assets/svg/dv-share.svg @@ -1,3 +1,3 @@ - - + + diff --git a/frontend/src/assets/svg/exit-fullscreen.svg b/frontend/src/assets/svg/exit-fullscreen.svg index 485c128..532662d 100644 --- a/frontend/src/assets/svg/exit-fullscreen.svg +++ b/frontend/src/assets/svg/exit-fullscreen.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/assets/svg/icon_excel.svg b/frontend/src/assets/svg/icon_excel.svg index d215044..ac07bdb 100644 --- a/frontend/src/assets/svg/icon_excel.svg +++ b/frontend/src/assets/svg/icon_excel.svg @@ -1,11 +1,5 @@ - - - - - - - - - + + + diff --git a/frontend/src/assets/svg/logo.svg b/frontend/src/assets/svg/logo.svg index 366fe68..6acaee2 100644 --- a/frontend/src/assets/svg/logo.svg +++ b/frontend/src/assets/svg/logo.svg @@ -1,20 +1,21 @@ - - - - background - - - - Layer 1 - - GIS-BI开发平台 - - \ No newline at end of file + + + diff --git a/frontend/src/assets/svg/style-underline.svg b/frontend/src/assets/svg/style-underline.svg index c8da46f..c676981 100644 --- a/frontend/src/assets/svg/style-underline.svg +++ b/frontend/src/assets/svg/style-underline.svg @@ -1 +1 @@ - \ No newline at end of file + From f88b612191e9dc8c74e9e80247a016e2057a4d9e Mon Sep 17 00:00:00 2001 From: limengnan <420004014@qq.com> Date: Tue, 1 Jul 2025 10:15:07 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/components.d.ts | 44 +++++++++++++++++-- .../data-visualization/canvas/CanvasCore.vue | 2 +- frontend/vite.config.js | 2 +- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/frontend/components.d.ts b/frontend/components.d.ts index c6b7ce9..ec78696 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -9,10 +9,48 @@ export {} declare module '@vue/runtime-core' { export interface GlobalComponents { - ElCard: typeof import('element-plus-secondary/es')['ElCard'] + ElBreadcrumb: typeof import('element-plus-secondary/es')['ElBreadcrumb'] + ElBreadcrumbItem: typeof import('element-plus-secondary/es')['ElBreadcrumbItem'] + ElButton: typeof import('element-plus-secondary/es')['ElButton'] + ElCheckbox: typeof import('element-plus-secondary/es')['ElCheckbox'] + ElCheckboxGroup: typeof import('element-plus-secondary/es')['ElCheckboxGroup'] + ElCol: typeof import('element-plus-secondary/es')['ElCol'] + ElCollapse: typeof import('element-plus-secondary/es')['ElCollapse'] + ElCollapseItem: typeof import('element-plus-secondary/es')['ElCollapseItem'] + ElColorPicker: typeof import('element-plus-secondary/es')['ElColorPicker'] + ElContainer: typeof import('element-plus-secondary/es')['ElContainer'] + ElDatePicker: typeof import('element-plus-secondary/es')['ElDatePicker'] + ElDialog: typeof import('element-plus-secondary/es')['ElDialog'] + ElDivider: typeof import('element-plus-secondary/es')['ElDivider'] + ElDropdown: typeof import('element-plus-secondary/es')['ElDropdown'] + ElDropdownItem: typeof import('element-plus-secondary/es')['ElDropdownItem'] + ElDropdownMenu: typeof import('element-plus-secondary/es')['ElDropdownMenu'] + ElEmpty: typeof import('element-plus-secondary/es')['ElEmpty'] + ElForm: typeof import('element-plus-secondary/es')['ElForm'] + ElFormItem: typeof import('element-plus-secondary/es')['ElFormItem'] + ElHeader: typeof import('element-plus-secondary/es')['ElHeader'] ElIcon: typeof import('element-plus-secondary/es')['ElIcon'] - ElTimeline: typeof import('element-plus-secondary/es')['ElTimeline'] - ElTimelineItem: typeof import('element-plus-secondary/es')['ElTimelineItem'] + ElInput: typeof import('element-plus-secondary/es')['ElInput'] + ElInputNumber: typeof import('element-plus-secondary/es')['ElInputNumber'] + ElMain: typeof import('element-plus-secondary/es')['ElMain'] + ElOption: typeof import('element-plus-secondary/es')['ElOption'] + ElOptionGroup: typeof import('element-plus-secondary/es')['ElOptionGroup'] + ElPopover: typeof import('element-plus-secondary/es')['ElPopover'] + ElRadio: typeof import('element-plus-secondary/es')['ElRadio'] + ElRadioGroup: typeof import('element-plus-secondary/es')['ElRadioGroup'] + ElRow: typeof import('element-plus-secondary/es')['ElRow'] + ElScrollbar: typeof import('element-plus-secondary/es')['ElScrollbar'] + ElSelect: typeof import('element-plus-secondary/es')['ElSelect'] + ElSelectV2: typeof import('element-plus-secondary/es')['ElSelectV2'] + ElSpace: typeof import('element-plus-secondary/es')['ElSpace'] + ElSwitch: typeof import('element-plus-secondary/es')['ElSwitch'] + ElTabPane: typeof import('element-plus-secondary/es')['ElTabPane'] + ElTabs: typeof import('element-plus-secondary/es')['ElTabs'] + ElTimePicker: typeof import('element-plus-secondary/es')['ElTimePicker'] + ElTooltip: typeof import('element-plus-secondary/es')['ElTooltip'] + ElTree: typeof import('element-plus-secondary/es')['ElTree'] + ElTreeSelect: typeof import('element-plus-secondary/es')['ElTreeSelect'] + ElUpload: typeof import('element-plus-secondary/es')['ElUpload'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] } diff --git a/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue b/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue index 1865f98..94140da 100644 --- a/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue +++ b/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue @@ -280,7 +280,7 @@ const initWatermark = (waterDomId = 'editor-canvas-main') => { try { if ( dvInfo.value.watermarkInfo && - dvInfo.value.watermarkInfo.settingContent && + dvInfo.value.watermarkInfo?.settingContent && isMainCanvas(canvasId.value) ) { activeWatermarkCheckUser(waterDomId, canvasId.value, curScale.value) diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 71fe5dd..16a72ff 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -54,7 +54,7 @@ export default defineConfig({ cors: true, proxy: { '/api': { - target: 'http://192.168.1.58:8080', + target: 'http://192.168.1.38:8083', changeOrigin: true, secure: false, rewrite: path => path.replace(/^\/api/, '') From 2564a859f6c519a4c101ac16006c2c5f4dc6cd31 Mon Sep 17 00:00:00 2001 From: limengnan <420004014@qq.com> Date: Tue, 1 Jul 2025 10:28:54 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E6=8F=90=E4=BA=A4API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/data-visualization/chart.ts | 30 +++++++- .../src/api/data-visualization/dataset.ts | 72 +++++++++++++++---- .../visualization/dataVisualization.ts | 33 +++++++-- .../visualization/linkJump.ts | 4 +- .../visualization/linkage.ts | 4 +- .../utils/CalculateFields.ts | 36 ++++++++++ 6 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 frontend/src/data-visualization/utils/CalculateFields.ts diff --git a/frontend/src/api/data-visualization/chart.ts b/frontend/src/api/data-visualization/chart.ts index b1bad2d..b536091 100644 --- a/frontend/src/api/data-visualization/chart.ts +++ b/frontend/src/api/data-visualization/chart.ts @@ -1,4 +1,6 @@ import request from '@/data-visualization/config/axios' +import { originNameHandleWithArr, originNameHandleBackWithArr } from '@/data-visualization/utils/CalculateFields' +import { cloneDeep } from 'lodash-es' export interface Field { id: number | string datasourceId: number | string @@ -6,7 +8,7 @@ export interface Field { datasetGroupId: number | string originName: string name: string - dataeaseName: string + gisbiName: string groupType: string type: string deType: number @@ -27,6 +29,7 @@ export interface ComponentInfo { export const getFieldByDQ = async (id, chartId, data): Promise => { return request.post({ url: `/chart/listByDQ/${id}/${chartId}`, data: data }).then(res => { + originNameHandleBackWithArr(res?.data, ['dimensionList', 'quotaList']) return res?.data }) } @@ -52,10 +55,33 @@ export const deleteChartFieldByChartId = async (chartId): Promise => // 通过图表对象获取数据 export const getData = async (data): Promise => { delete data.data - return request.post({ url: '/chartData/getData', data }).then(res => { + const copyData = cloneDeep(data) + const fields = [ + 'xAxis', + 'xAxisExt', + 'yAxis', + 'yAxisExt', + 'extBubble', + 'extLabel', + 'extStack', + 'extTooltip' + ] + const dataFields = ['fields', 'sourceFields'] + originNameHandleWithArr(copyData, fields) + return request.post({ url: '/chartData/getData', data: copyData }).then(res => { if (res.code === 0) { + originNameHandleBackWithArr(res?.data, fields) + // 动态计算字段在数据中,也需要转码 + originNameHandleWithArr(res?.data?.data, dataFields) + originNameHandleBackWithArr(res?.data?.data, dataFields) + originNameHandleBackWithArr(res?.data?.data?.left, ['fields']) + originNameHandleBackWithArr(res?.data?.data?.right, ['fields']) return res?.data } else { + originNameHandleBackWithArr(res, fields) + originNameHandleBackWithArr(res?.data, dataFields) + originNameHandleBackWithArr(res?.data?.left, ['fields']) + originNameHandleBackWithArr(res?.data?.right, ['fields']) return res } }) diff --git a/frontend/src/api/data-visualization/dataset.ts b/frontend/src/api/data-visualization/dataset.ts index e5babfb..db8c87a 100644 --- a/frontend/src/api/data-visualization/dataset.ts +++ b/frontend/src/api/data-visualization/dataset.ts @@ -1,9 +1,17 @@ import request from '@/utils/request' import { type Field } from '@/api/data-visualization/chart' +import { + originNameHandle, + originNameHandleBack, + originNameHandleBackWithArr +} from '@/data-visualization/utils/CalculateFields' + +import { cloneDeep } from 'lodash-es' import { nameTrim } from '@/data-visualization/utils/utils' export interface DatasetOrFolder { name: string action?: string + isCross?: boolean id?: number | string pid?: number | string appId?: number | string @@ -57,6 +65,7 @@ export interface Dataset { id: string pid: string name: string + isCross?: boolean union?: Array<{}> allFields?: Array<{}> } @@ -72,7 +81,12 @@ export interface Table { // edit export const saveDatasetTree = async (data: DatasetOrFolder): Promise => { nameTrim(data) - return request.post({ url: '/datasetTree/save', data }).then(res => { + const copyData = cloneDeep(data) + originNameHandle(copyData.allFields) + return request.post({ url: '/datasetTree/save', data: copyData }).then(res => { + if (res?.data?.allFields?.length) { + originNameHandleBack(res?.data?.allFields) + } return res?.data }) } @@ -80,7 +94,12 @@ export const saveDatasetTree = async (data: DatasetOrFolder): Promise // create export const createDatasetTree = async (data: DatasetOrFolder): Promise => { nameTrim(data) - return request.post({ url: '/datasetTree/create', data }).then(res => { + const copyData = cloneDeep(data) + originNameHandle(copyData.allFields) + return request.post({ url: '/datasetTree/create', data: copyData }).then(res => { + if (res?.data?.allFields?.length) { + originNameHandleBack(res?.data?.allFields) + } return res?.data }) } @@ -135,7 +154,8 @@ export const exportDatasetData = (data = {}) => { url: '/datasetTree/exportDataset', method: 'post', data: data, - loading: true + loading: true, + responseType: 'blob' }) } @@ -177,7 +197,16 @@ export const getTableField = async (data): Promise => { } export const getPreviewData = async (data): Promise => { - return request.post({ url: '/datasetData/previewData', data }).then(res => { + const copyData = cloneDeep(data) + originNameHandle(copyData.allFields) + return request.post({ url: '/datasetData/previewData', data: copyData }).then(res => { + if (res?.data?.allFields?.length) { + originNameHandleBack(res?.data?.allFields) + } + + if (res?.data?.data?.fields?.length) { + originNameHandleBack(res?.data?.data?.fields) + } return res?.data }) } @@ -196,6 +225,9 @@ export const getDatasetTotal = async (id): Promise => { export const getDatasetDetails = async (id): Promise => { return request.post({ url: `/datasetTree/details/${id}`, data: {} }).then(res => { + if (res?.data?.allFields?.length) { + originNameHandleBack(res?.data?.allFields) + } return res?.data }) } @@ -219,6 +251,9 @@ export const getDsDetails = async (data): Promise => { } export const getDsDetailsWithPerm = async (data): Promise => { return request.post({ url: '/datasetTree/detailWithPerm', data }).then(res => { + ;(res?.data || []).forEach(ele => { + originNameHandleBackWithArr(ele, ['dimensionList', 'quotaList']) + }) return res?.data }) } @@ -236,15 +271,22 @@ export const columnPermissionList = (page: number, limit: number, datasetId: num export const rowPermissionTargetObjList = (datasetId: number, type: string) => request.get({ url: '/dataset/rowPermissions/authObjs/' + datasetId + '/' + type }) -export const listFieldByDatasetGroup = (datasetId: number) => - request.post({ url: '/datasetField/listByDatasetGroup/' + datasetId }) +export const listFieldByDatasetGroup = (datasetId: number) => { + return request.post({ url: '/datasetField/listByDatasetGroup/' + datasetId }).then(res => { + originNameHandleBack(res?.data) + return res + }) +} export const multFieldValuesForPermissions = (data = {}) => { return request.post({ url: '/datasetField/multFieldValuesForPermissions', data }) } export const listFieldsWithPermissions = (datasetId: number) => { - return request.get({ url: '/datasetField/listWithPermissions/' + datasetId }) + return request.get({ url: '/datasetField/listWithPermissions/' + datasetId }).then(res => { + originNameHandleBack(res?.data) + return res + }) } export const copilotFields = (datasetId: number) => { @@ -301,11 +343,11 @@ export const getFunction = async (): Promise => { }) } -export const exportTasks = async (type): Promise => { - return request.post({ url: '/exportCenter/exportTasks/' + type, data: {} }).then(res => { - return res - }) -} +export const exportTasksRecords = () => + request.post({ url: `/exportCenter/exportTasks/records`, data: {} }) + +export const exportTasks = (page: number, limit: number, status: string) => + request.post({ url: `/exportCenter/exportTasks/${status}/${page}/${limit}`, data: {} }) export const exportRetry = async (id): Promise => { return request.post({ url: '/exportCenter/retry/' + id, data: {} }).then(res => { @@ -325,6 +367,12 @@ export const exportDelete = async (id): Promise => { }) } +export const generateDownloadUri = async (id): Promise => { + return request.get({ url: '/exportCenter/generateDownloadUri/' + id }).then(res => { + return res?.data + }) +} + export const exportDeleteAll = async (type, data): Promise => { return request.post({ url: '/exportCenter/deleteAll/' + type, data }).then(res => { return res?.data diff --git a/frontend/src/api/data-visualization/visualization/dataVisualization.ts b/frontend/src/api/data-visualization/visualization/dataVisualization.ts index d959063..a51b548 100644 --- a/frontend/src/api/data-visualization/visualization/dataVisualization.ts +++ b/frontend/src/api/data-visualization/visualization/dataVisualization.ts @@ -1,10 +1,14 @@ import request from '@/data-visualization/config/axios' +import { originNameHandleWithArr } from '@/data-visualization/utils/CalculateFields' +import { cloneDeep } from 'lodash-es' export interface ResourceOrFolder { name: string id?: number | string pid?: number | string nodeType: 'folder' | 'leaf' type: string + mobileLayout: boolean + status: boolean } export interface Panel { @@ -20,11 +24,16 @@ export const findCopyResource = async (dvId, busiFlag): Promise => { } export const findById = async ( - dvId:any, - busiFlag:any, + dvId, + busiFlag, attachInfo = { source: 'main', taskId: null } ): Promise => { let busiFlagResult = busiFlag + if (!busiFlagResult) { + await findDvType(dvId).then(res => { + busiFlagResult = res.data + }) + } const data = { id: dvId, busiFlag: busiFlagResult, ...attachInfo } return request.post({ url: '/dataVisualization/findById', data }) } @@ -60,8 +69,24 @@ export const appCanvasNameCheck = async data => export const updateBase = data => request.post({ url: '/dataVisualization/updateBase', data }) -export const updateCanvas = data => - request.post({ url: '/dataVisualization/updateCanvas', data, loading: true }) +export const updateCanvas = data => { + const copyData = cloneDeep(data) + const fields = [ + 'xAxis', + 'xAxisExt', + 'yAxis', + 'yAxisExt', + 'extBubble', + 'extLabel', + 'extStack', + 'extTooltip' + ] + + for (const key in copyData.canvasViewInfo) { + originNameHandleWithArr(copyData.canvasViewInfo[key], fields) + } + return request.post({ url: '/dataVisualization/updateCanvas', data: copyData, loading: true }) +} export const moveResource = data => request.post({ url: '/dataVisualization/move', data }) diff --git a/frontend/src/api/data-visualization/visualization/linkJump.ts b/frontend/src/api/data-visualization/visualization/linkJump.ts index 615401f..97306f0 100644 --- a/frontend/src/api/data-visualization/visualization/linkJump.ts +++ b/frontend/src/api/data-visualization/visualization/linkJump.ts @@ -26,9 +26,9 @@ export function queryTargetVisualizationJumpInfo(requestInfo) { }) } -export function queryVisualizationJumpInfo(dvId) { +export function queryVisualizationJumpInfo(dvId, resourceTable = 'snapshot') { return request.get({ - url: '/linkJump/queryVisualizationJumpInfo/' + dvId, + url: '/linkJump/queryVisualizationJumpInfo/' + dvId + '/' + resourceTable, loading: false }) } diff --git a/frontend/src/api/data-visualization/visualization/linkage.ts b/frontend/src/api/data-visualization/visualization/linkage.ts index 41d50dd..ae8ffd3 100644 --- a/frontend/src/api/data-visualization/visualization/linkage.ts +++ b/frontend/src/api/data-visualization/visualization/linkage.ts @@ -8,8 +8,8 @@ export const getViewLinkageGatherArray = data => export const saveLinkage = data => request.post({ url: '/linkage/saveLinkage', data }) -export const getPanelAllLinkageInfo = dvId => - request.get({ url: '/linkage/getVisualizationAllLinkageInfo/' + dvId }) +export const getPanelAllLinkageInfo = (dvId, resourceTable = 'snapshot') => + request.get({ url: '/linkage/getVisualizationAllLinkageInfo/' + dvId + '/' + resourceTable }) export const updateLinkageActive = data => request.post({ url: '/linkage/updateLinkageActive', data }) diff --git a/frontend/src/data-visualization/utils/CalculateFields.ts b/frontend/src/data-visualization/utils/CalculateFields.ts new file mode 100644 index 0000000..01e0ac6 --- /dev/null +++ b/frontend/src/data-visualization/utils/CalculateFields.ts @@ -0,0 +1,36 @@ +import { Base64 } from 'js-base64' + +const originNameHandle = (arr = []) => { + arr.forEach(ele => { + if (ele.extField === 2) { + ele.originName = Base64.encode(ele.originName) + } + }) +} + +const originNameHandleBack = (arr = []) => { + arr.forEach(ele => { + if (ele.extField === 2) { + ele.originName = Base64.decode(ele.originName) + } + }) +} + +const originNameHandleWithArr = (obj = {}, fields) => { + fields.forEach(ele => { + originNameHandle(obj?.[ele] || []) + }) +} + +const originNameHandleBackWithArr = (obj = {}, fields) => { + fields.forEach(ele => { + originNameHandleBack(obj?.[ele] || []) + }) +} + +export { + originNameHandle, + originNameHandleBack, + originNameHandleWithArr, + originNameHandleBackWithArr +} From f56576b2c67d48bd1d93609ee8eca311987660ac Mon Sep 17 00:00:00 2001 From: limengnan <420004014@qq.com> Date: Tue, 1 Jul 2025 11:00:16 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9data-visualization\comp?= =?UTF-8?q?onents\data-visualization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-visualization/canvas/CanvasCore.vue | 5 +- .../canvas/ComponentWrapper.vue | 146 ++++++++++++++---- .../canvas/ContextMenuDetails.vue | 121 ++++++++------- .../data-visualization/canvas/DePreview.vue | 100 ++++++++++-- .../data-visualization/canvas/Shape.vue | 73 ++++----- 5 files changed, 309 insertions(+), 136 deletions(-) diff --git a/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue b/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue index 94140da..22faba3 100644 --- a/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue +++ b/frontend/src/data-visualization/components/data-visualization/canvas/CanvasCore.vue @@ -59,7 +59,6 @@ const contextmenuStore = contextmenuStoreWithOut() const { curComponent, dvInfo, editMode, tabMoveOutComponentId, canvasState, mainScrollTop } = storeToRefs(dvMainStore) const { editorMap, areaData, isCtrlOrCmdDown } = storeToRefs(composeStore) -const emits = defineEmits(['scrollCanvasAdjust']) const props = defineProps({ themes: { type: String, @@ -265,7 +264,7 @@ watch( watch( () => areaData.value.components.length, - (val, oldVal) => { + () => { groupAreaClickChange() } ) @@ -938,7 +937,7 @@ function removeItem(index) { dvMainStore.removeLinkageInfo(item['id']) if (isMainCanvas(canvasId.value)) { // 主画布中存在隐藏组件 直接从原始componentData中进行删除 - dvMainStore.deleteComponentById(item.id) + dvMainStore.deleteComponentById(item.id, undefined, false) } else { componentData.value.splice(index, 1) } diff --git a/frontend/src/data-visualization/components/data-visualization/canvas/ComponentWrapper.vue b/frontend/src/data-visualization/components/data-visualization/canvas/ComponentWrapper.vue index 0f999e7..a453c74 100644 --- a/frontend/src/data-visualization/components/data-visualization/canvas/ComponentWrapper.vue +++ b/frontend/src/data-visualization/components/data-visualization/canvas/ComponentWrapper.vue @@ -1,19 +1,27 @@
props.popActive || (dvMainStore.mobileInPc && element-loading-text="导出中..." element-loading-background="rgba(255, 255, 255, 1)" > +
+ + + +
props.popActive || (dvMainStore.mobileInPc && :element="config" :show-position="showPosition" :class="{ 'wrapper-edit-bar-active': active }" + @componentImageDownload="htmlToImage" @userViewEnlargeOpen="opt => emits('userViewEnlargeOpen', opt)" @datasetParamsInit="() => emits('datasetParamsInit')" > @@ -382,7 +454,7 @@ const showActive = computed(() => props.popActive || (dvMainStore.mobileInPc && class="wrapper-inner-adaptor" :style="slotStyle" :class="{ 'pop-wrapper-inner': showActive, 'event-active': eventEnable }" - @mousedown="onWrapperClick" + @mousedown="onWrapperClickCur" > props.popActive || (dvMainStore.mobileInPc && :is-edit="false" :suffix-id="suffixId" :font-family="fontFamily" + :active="active" + :common-params="commonParams" @onPointClick="onPointClick" + @onComponentEvent="onWrapperClick" />
@@ -426,12 +501,22 @@ const showActive = computed(() => props.popActive || (dvMainStore.mobileInPc && } .wrapper-outer { position: absolute; + .refresh-from-pc { + position: absolute; + right: 38px; + top: 12px; + z-index: 2; + font-size: 16px; + cursor: pointer; + color: var(--ed-color-primary); + } } .wrapper-inner { width: 100%; height: 100%; position: relative; background-size: 100% 100% !important; + padding: 0 !important; .wrapper-inner-adaptor { position: relative; transform-style: preserve-3d; @@ -475,4 +560,11 @@ const showActive = computed(() => props.popActive || (dvMainStore.mobileInPc && .event-active { cursor: pointer; } + +.freeze-component { + position: fixed; + z-index: 1; + top: var(--top-show-offset) px !important; + left: var(--left-show-offset) px !important; +} diff --git a/frontend/src/data-visualization/components/data-visualization/canvas/ContextMenuDetails.vue b/frontend/src/data-visualization/components/data-visualization/canvas/ContextMenuDetails.vue index 1ad3dae..0a30c3d 100644 --- a/frontend/src/data-visualization/components/data-visualization/canvas/ContextMenuDetails.vue +++ b/frontend/src/data-visualization/components/data-visualization/canvas/ContextMenuDetails.vue @@ -298,64 +298,73 @@ const editQueryCriteria = () => {
  • {{ t('visualization.delete') }}
  • -
  • - {{ t('visualization.cancel_group') }} -
  • - -