From 2d864eea23a421ae5b602d397c1956b4642c34d3 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Fri, 10 Nov 2023 08:39:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A8=A1=E7=89=88=E5=B8=82=E5=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/MybatisPlusGenerator.java | 4 +- .../constants/DataVisualizationConstants.java | 18 ++++ .../system/manage/SysParameterManage.java | 14 +++ .../VisualizationTemplateExtendData.java | 90 ++++++++++++++++++ ...VisualizationTemplateExtendDataMapper.java | 18 ++++ .../template/manage/TemplateMarketManage.java | 87 +++++++++++++++++ .../service/TemplateManageService.java | 18 +++- .../server/DataVisualizationServer.java | 88 +++++++++++++++++ .../main/resources/db/desktop/V2.1__ddl.sql | 20 +++- .../main/resources/db/migration/V2.1__ddl.sql | 13 ++- .../ExtVisualizationTemplateMapper.xml | 86 +++++++++++++++++ core/core-frontend/package.json | 1 + core/core-frontend/src/api/template.ts | 12 +-- core/core-frontend/src/assets/none.png | Bin 0 -> 2585 bytes core/core-frontend/src/assets/nothing.png | Bin 0 -> 3061 bytes core/core-frontend/src/style/index.less | 6 ++ core/core-frontend/src/utils/imgUtils.ts | 90 ++++++++++++++++-- .../views/dashboard/DashboardPreviewShow.vue | 20 +++- .../views/data-visualization/PreviewHead.vue | 8 +- .../views/system/template-setting/index.vue | 47 ++++++++- .../src/views/template-market/index.vue | 5 +- ...emplateImport.vue => DeTemplateImport.vue} | 24 ++--- .../{TemplateItem.vue => DeTemplateItem.vue} | 40 ++++++-- .../{TemplateList.vue => DeTemplateList.vue} | 39 +++++--- .../src/views/template/index.vue | 67 +++++++------ .../api/template/TemplateManageApi.java | 2 +- .../template/dto/TemplateManageFileDTO.java | 26 +++++ .../visualization/DataVisualizationApi.java | 18 ++++ .../request/DataVisualizationBaseRequest.java | 12 +++ .../visualization/vo/DataVisualizationVO.java | 11 +++ 30 files changed, 791 insertions(+), 93 deletions(-) create mode 100644 core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplateExtendData.java create mode 100644 core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateExtendDataMapper.java create mode 100644 core/core-backend/src/main/java/io/dataease/template/manage/TemplateMarketManage.java create mode 100644 core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml create mode 100644 core/core-frontend/src/assets/none.png create mode 100644 core/core-frontend/src/assets/nothing.png rename core/core-frontend/src/views/template/component/{TemplateImport.vue => DeTemplateImport.vue} (89%) rename core/core-frontend/src/views/template/component/{TemplateItem.vue => DeTemplateItem.vue} (70%) rename core/core-frontend/src/views/template/component/{TemplateList.vue => DeTemplateList.vue} (87%) create mode 100644 sdk/api/api-base/src/main/java/io/dataease/api/template/dto/TemplateManageFileDTO.java diff --git a/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java b/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java index 3c217a76b0..9c3dd007e8 100644 --- a/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java +++ b/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java @@ -14,7 +14,7 @@ public class MybatisPlusGenerator { * 第一 我嫌麻烦 * 第二 后面配置会放到nacos读起来更麻烦了 */ - private static final String url = "jdbc:mysql://39.98.78.97:3306/dataease?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false"; + private static final String url = "jdbc:mysql://127.0.0.1:3306/de_standalone?autoReconnect=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false"; private static final String username = "root"; private static final String password = "Password123@mysql"; @@ -25,7 +25,7 @@ public class MybatisPlusGenerator { /** * 这是要生成代码的表名称 */ - private static final String TABLE_NAME = "visualization_template"; + private static final String TABLE_NAME = "visualization_template_extend_data"; /** * 下面两个配置基本上不用动 diff --git a/core/core-backend/src/main/java/io/dataease/commons/constants/DataVisualizationConstants.java b/core/core-backend/src/main/java/io/dataease/commons/constants/DataVisualizationConstants.java index 2462a2a849..25acbfd475 100644 --- a/core/core-backend/src/main/java/io/dataease/commons/constants/DataVisualizationConstants.java +++ b/core/core-backend/src/main/java/io/dataease/commons/constants/DataVisualizationConstants.java @@ -1,6 +1,24 @@ package io.dataease.commons.constants; public class DataVisualizationConstants { + + //新建仪表板来源 + public static final class NEW_PANEL_FROM { + + // 直接新建 + public static final String NEW = "new"; + + // 内部模板新建 + public static final String NEW_INNER_TEMPLATE = "new_inner_template"; + + // 外部模板新建 + public static final String NEW_OUTER_TEMPLATE = "new_outer_template"; + + // 模板市场新建 + public static final String NEW_MARKET_TEMPLATE = "new_market_template"; + + } + //删除标志 public static final class DELETE_FLAG { //已删除 diff --git a/core/core-backend/src/main/java/io/dataease/system/manage/SysParameterManage.java b/core/core-backend/src/main/java/io/dataease/system/manage/SysParameterManage.java index 636342e8fd..48bbbada2f 100644 --- a/core/core-backend/src/main/java/io/dataease/system/manage/SysParameterManage.java +++ b/core/core-backend/src/main/java/io/dataease/system/manage/SysParameterManage.java @@ -7,8 +7,12 @@ import io.dataease.utils.IDUtils; import jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Component public class SysParameterManage { @@ -57,4 +61,14 @@ public class SysParameterManage { QueryWrapper queryWrapper = new QueryWrapper<>(); return coreSysSettingMapper.selectList(queryWrapper); } + + public Map groupVal(String groupKey) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.likeLeft("pkey", groupKey); + List sysSettings = coreSysSettingMapper.selectList(queryWrapper); + if (!CollectionUtils.isEmpty(sysSettings)) { + return sysSettings.stream().collect(Collectors.toMap(CoreSysSetting::getPkey, CoreSysSetting::getPval)); + } + return null; + } } diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplateExtendData.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplateExtendData.java new file mode 100644 index 0000000000..6c25244e0e --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplateExtendData.java @@ -0,0 +1,90 @@ +package io.dataease.template.dao.auto.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author fit2cloud + * @since 2023-11-10 + */ +@TableName("visualization_template_extend_data") +public class VisualizationTemplateExtendData implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; + + private Long dvId; + + private Long viewId; + + private String viewDetails; + + private String copyFrom; + + private String copyId; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getDvId() { + return dvId; + } + + public void setDvId(Long dvId) { + this.dvId = dvId; + } + + public Long getViewId() { + return viewId; + } + + public void setViewId(Long viewId) { + this.viewId = viewId; + } + + public String getViewDetails() { + return viewDetails; + } + + public void setViewDetails(String viewDetails) { + this.viewDetails = viewDetails; + } + + public String getCopyFrom() { + return copyFrom; + } + + public void setCopyFrom(String copyFrom) { + this.copyFrom = copyFrom; + } + + public String getCopyId() { + return copyId; + } + + public void setCopyId(String copyId) { + this.copyId = copyId; + } + + @Override + public String toString() { + return "VisualizationTemplateExtendData{" + + "id = " + id + + ", dvId = " + dvId + + ", viewId = " + viewId + + ", viewDetails = " + viewDetails + + ", copyFrom = " + copyFrom + + ", copyId = " + copyId + + "}"; + } +} diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateExtendDataMapper.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateExtendDataMapper.java new file mode 100644 index 0000000000..ee5d10116c --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateExtendDataMapper.java @@ -0,0 +1,18 @@ +package io.dataease.template.dao.auto.mapper; + +import io.dataease.template.dao.auto.entity.VisualizationTemplateExtendData; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author fit2cloud + * @since 2023-11-10 + */ +@Mapper +public interface VisualizationTemplateExtendDataMapper extends BaseMapper { + +} diff --git a/core/core-backend/src/main/java/io/dataease/template/manage/TemplateMarketManage.java b/core/core-backend/src/main/java/io/dataease/template/manage/TemplateMarketManage.java new file mode 100644 index 0000000000..e780399556 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/template/manage/TemplateMarketManage.java @@ -0,0 +1,87 @@ +package io.dataease.template.manage; + +import com.fasterxml.jackson.core.type.TypeReference; +import io.dataease.api.template.dto.TemplateManageFileDTO; +import io.dataease.api.template.dto.TemplateMarketDTO; +import io.dataease.api.template.request.TemplateMarketSearchRequest; +import io.dataease.api.template.response.MarketBaseResponse; +import io.dataease.api.template.vo.TemplateCategoryVO; +import io.dataease.exception.DEException; +import io.dataease.system.manage.SysParameterManage; +import io.dataease.utils.HttpClientConfig; +import io.dataease.utils.HttpClientUtil; +import io.dataease.utils.JsonUtil; +import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Author: wangjiahao + */ +@Service +public class TemplateMarketManage { + + private final static String POSTS_API = "/api/content/posts?page=0&size=2000"; + private final static String CATEGORIES_API = "/api/content/categories"; + + @Resource + private SysParameterManage sysParameterManage; + + /** + * @param templateUrl template url + * @Description Get template file from template market + */ + public TemplateManageFileDTO getTemplateFromMarket(String templateUrl) { + if (StringUtils.isNotEmpty(templateUrl)) { + String sufUrl = sysParameterManage.groupVal("template.").get("template.url"); + String templateInfo = HttpClientUtil.get(sufUrl + templateUrl, null); + return JsonUtil.parseObject(templateInfo,TemplateManageFileDTO.class); + } else { + return null; + } + } + + /** + * @param url content api url + * @Description Get info from template market content api + */ + public String marketGet(String url, String accessKey) { + HttpClientConfig config = new HttpClientConfig(); + config.addHeader("API-Authorization", accessKey); + return HttpClientUtil.get(url, config); + } + + public MarketBaseResponse searchTemplate(TemplateMarketSearchRequest request) { + try { + Map templateParams = sysParameterManage.groupVal("template."); + String result = marketGet(templateParams.get("template.url") + POSTS_API, templateParams.get("template.accessKey")); + TypeReference> market = new TypeReference<>() { + }; + List postsResult = JsonUtil.parseList(result,market); + return new MarketBaseResponse(templateParams.get("template.url"), postsResult); + } catch (Exception e) { + DEException.throwException(e); + } + return null; + } + + public List getCategories() { + Map templateParams = sysParameterManage.groupVal("template."); + String resultStr = marketGet(templateParams.get("template.url") + CATEGORIES_API, templateParams.get("template.accessKey")); + TypeReference> market = new TypeReference<>() { + }; + List categories = JsonUtil.parseList(resultStr,market); + if (CollectionUtils.isNotEmpty(categories)) { + return categories.stream().filter(item -> !"应用系列".equals(item.getName())).sorted(Comparator.comparing(TemplateCategoryVO::getPriority)).map(TemplateCategoryVO::getName).collect(Collectors.toList()); + } else { + return null; + } + + } +} diff --git a/core/core-backend/src/main/java/io/dataease/template/service/TemplateManageService.java b/core/core-backend/src/main/java/io/dataease/template/service/TemplateManageService.java index 52aea40e7a..9b1d81ace7 100644 --- a/core/core-backend/src/main/java/io/dataease/template/service/TemplateManageService.java +++ b/core/core-backend/src/main/java/io/dataease/template/service/TemplateManageService.java @@ -1,6 +1,7 @@ package io.dataease.template.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import io.dataease.api.template.TemplateManageApi; import io.dataease.api.template.dto.TemplateManageDTO; import io.dataease.api.template.request.TemplateManageRequest; import io.dataease.api.template.vo.VisualizationTemplateVO; @@ -17,6 +18,8 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.Optional; @@ -28,7 +31,9 @@ import static io.dataease.constant.StaticResourceConstants.UPLOAD_URL_PREFIX; * @author : WangJiaHao * @date : 2023/11/7 13:29 */ -public class TemplateManageService { +@RestController +@RequestMapping("/templateManage") +public class TemplateManageService implements TemplateManageApi { @Resource private VisualizationTemplateMapper templateMapper; @@ -37,6 +42,7 @@ public class TemplateManageService { @Resource private StaticResourceServer staticResourceServer; + @Override public List templateList(TemplateManageRequest request) { request.setWithBlobs("N"); List templateList = extTemplateMapper.findTemplateList(request); @@ -58,7 +64,9 @@ public class TemplateManageService { return extTemplateMapper.findTemplateList(request); } + @Transactional + @Override public TemplateManageDTO save(TemplateManageRequest request) { if (StringUtils.isEmpty(request.getId())) { request.setId(UUID.randomUUID().toString()); @@ -121,17 +129,17 @@ public class TemplateManageService { return CommonConstants.CHECK_RESULT.EXIST_ALL; } } - + @Override public String nameCheck(TemplateManageRequest request) { return nameCheck(request.getOptType(), request.getName(), request.getPid(), request.getId()); } - + @Override public void delete(String id) { Assert.notNull(id, "id cannot be null"); templateMapper.deleteById(id); } - + @Override public VisualizationTemplateVO findOne(String panelId) { VisualizationTemplate template = templateMapper.selectById(panelId); if(template != null){ @@ -142,7 +150,7 @@ public class TemplateManageService { return null; } } - + @Override public List find(TemplateManageRequest request) { return extTemplateMapper.findTemplateList(request); } diff --git a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java index cf57e7a16d..8a73c7640d 100644 --- a/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java +++ b/core/core-backend/src/main/java/io/dataease/visualization/server/DataVisualizationServer.java @@ -3,22 +3,29 @@ package io.dataease.visualization.server; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import io.dataease.api.chart.dto.ChartViewDTO; +import io.dataease.api.template.dto.TemplateManageFileDTO; import io.dataease.api.visualization.DataVisualizationApi; import io.dataease.api.visualization.request.DataVisualizationBaseRequest; import io.dataease.api.visualization.request.VisualizationWorkbranchQueryRequest; import io.dataease.api.visualization.vo.DataVisualizationVO; import io.dataease.api.visualization.vo.VisualizationResourceVO; import io.dataease.chart.dao.auto.entity.CoreChartView; +import io.dataease.chart.dao.auto.mapper.CoreChartViewMapper; import io.dataease.chart.manage.ChartDataManage; import io.dataease.chart.manage.ChartViewManege; import io.dataease.commons.constants.DataVisualizationConstants; +import io.dataease.constant.CommonConstants; import io.dataease.exception.DEException; import io.dataease.license.config.XpackInteract; import io.dataease.model.BusiNodeRequest; import io.dataease.model.BusiNodeVO; +import io.dataease.template.dao.auto.entity.VisualizationTemplate; +import io.dataease.template.dao.auto.mapper.VisualizationTemplateMapper; +import io.dataease.template.manage.TemplateMarketManage; import io.dataease.utils.AuthUtils; import io.dataease.utils.BeanUtils; import io.dataease.utils.IDUtils; +import io.dataease.utils.JsonUtil; import io.dataease.visualization.dao.auto.entity.DataVisualizationInfo; import io.dataease.visualization.dao.auto.mapper.DataVisualizationInfoMapper; import io.dataease.visualization.dao.ext.mapper.ExtDataVisualizationMapper; @@ -29,7 +36,10 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -54,6 +64,16 @@ public class DataVisualizationServer implements DataVisualizationApi { @Resource private ChartDataManage chartDataManage; + @Resource + private VisualizationTemplateMapper templateMapper; + + @Resource + private TemplateMarketManage templateMarketManage; + + @Resource + private StaticResourceServer staticResourceServer; + + @Override @XpackInteract(value = "dataVisualizationServer", original = true) public DataVisualizationVO findById(Long dvId,String busiFlag) { @@ -195,6 +215,74 @@ public class DataVisualizationServer implements DataVisualizationApi { return extDataVisualizationMapper.findDvType(dvId); } + @Override + public DataVisualizationVO decompression(DataVisualizationBaseRequest request) throws Exception { + Long newDvId = IDUtils.snowID(); + String newFrom = request.getNewFrom(); + String templateStyle = null; + String templateData = null; + String dynamicData = null; + String staticResource = null; + String name = null; + String dvType = null; + //内部模板新建 + if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_INNER_TEMPLATE.equals(newFrom)) { + VisualizationTemplate visualizationTemplate = templateMapper.selectById(request.getTemplateId()); + templateStyle = visualizationTemplate.getTemplateStyle(); + templateData = visualizationTemplate.getTemplateData(); + dynamicData = visualizationTemplate.getDynamicData(); + name = visualizationTemplate.getName(); + dvType = visualizationTemplate.getDvType(); + } else if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_OUTER_TEMPLATE.equals(newFrom)) { + templateStyle = request.getCanvasStyleData(); + templateData = request.getCanvasStyleData(); + dynamicData = request.getDynamicData(); + staticResource = request.getStaticResource(); + name = request.getName(); + dvType = request.getType(); + } else if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_MARKET_TEMPLATE.equals(newFrom)) { + TemplateManageFileDTO templateFileInfo = templateMarketManage.getTemplateFromMarket(request.getTemplateUrl()); + if (templateFileInfo == null) { + DEException.throwException("Can't find the template's info from market,please check"); + } + templateStyle = templateFileInfo.getCanvasStyleData(); + templateData = templateFileInfo.getComponentData(); + dynamicData = templateFileInfo.getDynamicData(); + staticResource = templateFileInfo.getStaticResource(); + name = request.getName(); + dvType = request.getType(); + } + // 解析动态数据 + Map dynamicDataMap = JsonUtil.parseObject(dynamicData, Map.class); + List chartViews = new ArrayList<>(); + Map canvasViewInfo = new HashMap<>(); +// List viewsData = new ArrayList<>(); + for (Map.Entry entry : dynamicDataMap.entrySet()) { + String originViewId = entry.getKey(); + String originViewData = entry.getValue(); + ChartViewDTO chartView = JsonUtil.parseObject(originViewData, ChartViewDTO.class); + Long newViewId = IDUtils.snowID(); + chartView.setId(newViewId); + chartView.setSceneId(newDvId); + chartView.setDataFrom(CommonConstants.VIEW_DATA_FROM.TEMPLATE); + // 数据处理 1.替换viewId 2.加入panelView 数据(数据来源为template) 3.加入模板view data数据 + // viewsData.add(new PanelGroupExtendDataDTO(newPanelId, newViewId, originViewData)); + templateData = templateData.replaceAll(originViewId, newViewId.toString()); + chartViewManege.save(chartView); + canvasViewInfo.put(chartView.getId(),chartView); + } + request.setComponentData(templateData); + request.setCanvasStyleData(templateStyle); + //Store static resource into the server + staticResourceServer.saveFilesToServe(staticResource); + return new DataVisualizationVO(newDvId,name,dvType,templateStyle,templateData,canvasViewInfo); + } + + @Override + public DataVisualizationVO decompressionLocalFile(MultipartFile file) { + return null; + } + @Override public void nameCheck(DataVisualizationBaseRequest request) { diff --git a/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql b/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql index e8b15d3238..74118a1f43 100644 --- a/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql +++ b/core/core-backend/src/main/resources/db/desktop/V2.1__ddl.sql @@ -14,4 +14,22 @@ CREATE TABLE `visualization_template` ( `template_data` longtext COMMENT 'template 数据', `dynamic_data` longtext COMMENT '预存数据', PRIMARY KEY (`id`) -); \ No newline at end of file +); + +BEGIN; +INSERT INTO `core_menu` +VALUES (19, 0, 2, 'template-market', 'template-market', 4, NULL, '/template-market', 0, 1, 0); +INSERT INTO `core_menu` +VALUES (20, 15, 2, 'template-setting', 'system/template-setting', 4, 'icon_template', '/template-setting', 0, 1, 1); +COMMIT; + +DROP TABLE IF EXISTS `visualization_template_extend_data`; +CREATE TABLE `visualization_template_extend_data` ( + `id` bigint NOT NULL, + `dv_id` bigint DEFAULT NULL, + `view_id` bigint DEFAULT NULL, + `view_details` longtext, + `copy_from` varchar(255) DEFAULT NULL, + `copy_id` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +); diff --git a/core/core-backend/src/main/resources/db/migration/V2.1__ddl.sql b/core/core-backend/src/main/resources/db/migration/V2.1__ddl.sql index 2df7f2aa01..bc45bca231 100644 --- a/core/core-backend/src/main/resources/db/migration/V2.1__ddl.sql +++ b/core/core-backend/src/main/resources/db/migration/V2.1__ddl.sql @@ -23,4 +23,15 @@ INSERT INTO `core_menu` VALUES (19, 0, 2, 'template-market', 'template-market', 4, NULL, '/template-market', 0, 1, 0); INSERT INTO `core_menu` VALUES (20, 15, 2, 'template-setting', 'system/template-setting', 4, 'icon_template', '/template-setting', 0, 1, 1); -COMMIT; \ No newline at end of file +COMMIT; + +DROP TABLE IF EXISTS `visualization_template_extend_data`; +CREATE TABLE `visualization_template_extend_data` ( + `id` bigint NOT NULL, + `dv_id` bigint DEFAULT NULL, + `view_id` bigint DEFAULT NULL, + `view_details` longtext, + `copy_from` varchar(255) DEFAULT NULL, + `copy_id` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +); diff --git a/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml b/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml new file mode 100644 index 0000000000..22e2623b47 --- /dev/null +++ b/core/core-backend/src/main/resources/mybatis/ExtVisualizationTemplateMapper.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + visualization_template.id, visualization_template.`name`, visualization_template.pid, visualization_template.`level`,visualization_template.`dv_type`, visualization_template.node_type, visualization_template.create_by, visualization_template.create_time, visualization_template.template_type, visualization_template.snapshot + + + visualization_template.template_style, visualization_template.template_data, visualization_template.dynamic_data + + + + diff --git a/core/core-frontend/package.json b/core/core-frontend/package.json index 894f8a1546..d9ca0ae122 100644 --- a/core/core-frontend/package.json +++ b/core/core-frontend/package.json @@ -27,6 +27,7 @@ "deepmerge": "^4.3.1", "element-plus-secondary": "^0.4.10", "element-resize-detector": "^1.2.4", + "file-saver": "^2.0.5", "highcharts": "^10.3.3", "html-to-image": "^1.11.11", "html2canvas": "^1.4.1", diff --git a/core/core-frontend/src/api/template.ts b/core/core-frontend/src/api/template.ts index fdce516ca0..320cc93401 100644 --- a/core/core-frontend/src/api/template.ts +++ b/core/core-frontend/src/api/template.ts @@ -2,33 +2,33 @@ import request from '@/config/axios' export function save(data) { return request.post({ - url: '/template/save', + url: '/templateManage/save', data: data, loading: true }) } export function templateDelete(id) { return request.post({ - url: '/template/delete/' + id + url: '/templateManage/delete/' + id }) } export function showTemplateList(data) { return request.post({ - url: '/template/templateList', + url: '/templateManage/templateList', data: data }) } export function findOne(id) { return request.get({ - url: '/template/findOne/' + id + url: '/templateManage/findOne/' + id }) } export function find(data) { return request.post({ - url: '/template/find', + url: '/templateManage/find', data: data, loading: true }) @@ -36,7 +36,7 @@ export function find(data) { export function nameCheck(data) { return request.post({ - url: '/template/nameCheck', + url: '/templateManage/nameCheck', data: data }) } diff --git a/core/core-frontend/src/assets/none.png b/core/core-frontend/src/assets/none.png new file mode 100644 index 0000000000000000000000000000000000000000..700664ed24bce25c0a3834dc841b3d6730166005 GIT binary patch literal 2585 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 literal 0 HcmV?d00001 diff --git a/core/core-frontend/src/assets/nothing.png b/core/core-frontend/src/assets/nothing.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1fa548bf76deb8ac4fbce166a93047d199bb97 GIT binary patch literal 3061 zcmVw)vdq^ELLFd3QShuWCg$qf>&U?f{RyxyaFr#q$*WO zNjMPk5FiY~20fhfjb{`+=BatLH2tfh20e`A`TCqbefo6w2n`X1LLrq%B+_GJV~bzD zd`XXvjy~pVieE~PjEvx#QXhA~uT}U`;n#}l<6@)H*yUgIu~@8fd3l-7WHJ>R5=Ll% z+1uM&WP!6R%n$r93!%wB^88ce&vXTKX2J9kzFS;u9D&OSi{4h)6f(G!WTCHx2-W3QddZ|>(a-R&Vei5cc z_X9W3Ei{1p_wVOOK!g+h@bC~qza+7(+Aet(|JCg5>=p@xFrptF9j&t1Yd!~Kp@7jq zv)SAbMf}i3hh?)H|794(?nV^xLlYf+c03+mqv3Glj)3^JT5UP3h(B=A5sfF4Nr?Ru zMH~ctEdEB&;s+`^teZ1tucP3~?GlE|4@7in-L}}|?rvjxdfN9fzVD*5b*I_7ccgV& z6I5RxBOfW3%P&~)_fl|s;6AanzdtxQ@YN&wCi=2T>Bcx+3-{Y8!J|9^IN<~lHTExL5+fugv2x5B#;oyXy? zrQm_H*l09T$Q{LPJ2ylx1X>8BgWg=OVtBq#0!9zdOcyf78@)925M#Ur>A zEvkopSR6VxH@DsWny%!^e zHp`bqlGp~qf7m-90m-U*cF-fbER5)n)5^J!!n2+|!?zC6F-6C&{RK(-0>bZ?jz}b+ zXZO@=hv>ChZG|MRI6gU}gQF7?h}8A<^=kVQ9in3=Cz814;HWH=@H}Dmy!~-YbWE(U z|Id=d69f}J+wS69qH}A=lEhOW{Q1Qti9mbT-4b0d%9FT9pp4x!?U!~-e@2p_g`@aR zOXsxfqO5QodQ#Xm8^362*epqUc=Fx1w%>bxeo6ZWVvW(eiO1tv!g_Z+K-A9WPm)eh zDPxxbD5D~EU;MA`ogaudTOjcq);X(O)$yC0V2J>jZiU{ldc7_Mj}X;rH62qAw2?#v z9BLG6G#b*TXi` z5giQArF)MU2;3pMjNT&z=2&8Kq9t;q#7`JYJVyp{7NDm6)2C~?snuK0jo-e-Nsc&Q zZ_^+mMc3i7dPV0St8{u+F2l+L_)E2 zz7{Eh!2KHSQ+NNHX(b@D0^*}leAq834WJu%68z{joUmZgcTqW0qzHmYU5}~Bq%FZU z;PM|moL3Syx}PInP?tyao~MWb>(jGx^xIAZ*MRVuM-Lr+R#H{6@P>*(`BAP>EjS++)_@s1*d-ll(W z(Qb!VMiVfiY%+-9Ij)N6Z0V8f*So zkDM$;m`2n6p0uKF8LCoQSXfXzddnYizy6jY!uWV^-wVO)PN^DUwAF|R#TMM3x8k;z z=xpgZiU`Sxaoy)n&)iLtoSvQQKA%jEQ`oS+t?fcvqVsrtn<9cy_6&34D39s~q;-uv z#rUmT6gKS1bK37M(be&Kjv@eZ;YRuJ!mjh}yfGv*O6wwFBfv~suKkq8jxh%N{mAs| zm?hH#DbwHoDB2!d<9*78{|2d6qt6Kv9;$Vm$J!w}yZEiBMDb?UuASU~5-KCB$Mcv> zQ5uMW;G&G%ySwh5jb@IHjyA*G?;XJq=ApZJv@q}ae($i--~TLHx^pxRMBx7xQGB)? z>4$y76KlCOGc)sJ`*Sg!H$^6(gAhiuW9>lTr z+Z{!CKV5N%!sqo4<}<2$e?@}rEeE&XPx1uAGppG%OsPJ-oi+`~>@XUO8CKM4!UyT< z*~(w(J#V;q9QW-7w)iv!j8UK7FR)}Mb!rIC@Ex3p53wK2%_vnjRt+bpJ|4AjoLKOLpm+cXst2COVL}k_zu*5y@g@*b5!7VUK{SYfc9t~M&vcu} zFswanOVjDy+rW9VJrDFjIFYg`1bw7Ak5(H>>SK z%`6_C#81IhOue+}-R1G!cF>W$R$c03Use&(6CQ#;n4KX%QLTK->^+vd0ITPE?NA7K zRYe+R1A?nRKB*|{*#od}6iQ^;^Xz)q+WNU%E^l%R67Ez+Nhf;QH$7~1o*cNW!)=g6 zSfEd>RQ9hskPs_7zEl1DQ9g;H@1;V#-TvjU;$k;!Bn>ESpFf_|gfYzCgRk@Uh=Zo40Er?1qP+J8hcH!lio zcpI$4CiQ`$4<}eXKV(389;(Y-Y zj{DnBq^^gjXKl(p-g`8c?uCVGcv`IhSI_C%CB3p+iF0rty%rq!cB(GV!>{vYjU;`6 zaX3fm>*NEz9;M9V_@832*qYpB+7Z~5`)4N;C{FSH{OnSxl;(+=oiNI&2Mt8%UIuJN z_+EjC|3D&Fuz)U**f1wEBO6b)!HhN40cD^??*?5#GMQXtfl{0VT4b;An4eCo zFQ?UsA3g6-QI8+hPPsrm`7Zx^RIB9KWfup@lCAg$I|9{2olUoH00000NkvXXu0mjf D { + const snapshot = canvas.toDataURL('image/jpeg', 0.1) // 0.1是图片质量 + if (snapshot !== '') { + const templateInfo = { + name: name, + templateType: 'self', + snapshot: snapshot, + dvType: dvInfo.value.type, + canvasStyleData: JSON.stringify(canvasStyleData.value), + componentData: JSON.stringify(componentData.value), + dynamicData: JSON.stringify(canvasViewInfo.value), + staticResource: JSON.stringify(staticResource || {}) + } + const blob = new Blob([JSON.stringify(templateInfo)], { type: '' }) + if (downloadType === 'template') { + FileSaver.saveAs(blob, name + '-TEMPLATE.DET2') + } + } + if (callBack) { + callBack() + } + }) + }) + } catch (e) { + console.error(e) + } +} + export function downloadCanvas(type, canvasDom, name, callBack?) { // const canvasDom = document.getElementById(canvasId) if (canvasDom) { @@ -56,15 +92,57 @@ export function downloadCanvas(type, canvasDom, name, callBack?) { } } -export function dataURLToBlob(dataurl) { +export function dataURLToBlob(dataUrl) { // ie 图片转格式 - const arr = dataurl.split(',') + const arr = dataUrl.split(',') const mime = arr[0].match(/:(.*?);/)[1] - const bstr = atob(arr[1]) - let n = bstr.length + const bStr = atob(arr[1]) + let n = bStr.length const u8arr = new Uint8Array(n) while (n--) { - u8arr[n] = bstr.charCodeAt(n) + u8arr[n] = bStr.charCodeAt(n) } return new Blob([u8arr], { type: mime }) } + +// 解析静态文件 +export function findStaticSource(callBack) { + const staticResource = [] + // 系统背景文件 + if ( + typeof canvasStyleData.value.background === 'string' && + canvasStyleData.value.background.indexOf('static-resource') > -1 + ) { + staticResource.push(canvasStyleData.value.background) + } + componentData.value.forEach(item => { + if ( + typeof item.commonBackground.outerImage === 'string' && + item.commonBackground.outerImage.indexOf('static-resource') > -1 + ) { + staticResource.push(item.commonBackground.outerImage) + } + if ( + item.component === 'Picture' && + item.propValue['url'] && + typeof item.propValue['url'] === 'string' && + item.propValue['url'].indexOf('static-resource') > -1 + ) { + staticResource.push(item.propValue) + } + }) + if (staticResource.length > 0) { + try { + findResourceAsBase64({ resourcePathList: staticResource }).then(rsp => { + callBack(rsp.data) + }) + } catch (e) { + console.error('findResourceAsBase64 error', e) + callBack() + } + } else { + setTimeout(() => { + callBack() + }, 0) + } +} diff --git a/core/core-frontend/src/views/dashboard/DashboardPreviewShow.vue b/core/core-frontend/src/views/dashboard/DashboardPreviewShow.vue index bcfdf1832d..c09810d72f 100644 --- a/core/core-frontend/src/views/dashboard/DashboardPreviewShow.vue +++ b/core/core-frontend/src/views/dashboard/DashboardPreviewShow.vue @@ -10,7 +10,7 @@ import { useRequestStoreWithOut } from '@/store/modules/request' import { usePermissionStoreWithOut } from '@/store/modules/permission' import { useMoveLine } from '@/hooks/web/useMoveLine' import { Icon } from '@/components/icon-custom' -import { downloadCanvas } from '@/utils/imgUtils' +import { download2AppTemplate, downloadCanvas } from '@/utils/imgUtils' const dvMainStore = dvMainStoreWithOut() const previewCanvasContainer = ref(null) @@ -89,7 +89,16 @@ const downloadH2 = type => { downloadCanvas(type, vueDom, state.dvInfo.name, () => { downloadStatus.value = false }) - }, 200) + }) +} + +const downloadAsAppTemplate = downloadType => { + nextTick(() => { + const vueDom = previewCanvasContainer.value.querySelector('.canvas-container') + download2AppTemplate(downloadType, vueDom, state.dvInfo.name, () => { + downloadStatus.value = false + }) + }) } const slideOpenChange = () => { @@ -155,7 +164,12 @@ defineExpose({ @@ -65,6 +65,7 @@ const state = reactive({ templateInfo: { level: '1', pid: props.pid, + dvType: 'dashboard', name: '', templateStyle: null, templateData: null, @@ -115,7 +116,7 @@ const saveTemplate = () => { type: 'primary', cb: () => save(state.templateInfo).then(response => { - ElMessage.success(t('system_parameter_setting.import_succeeded')) + ElMessage.success('导入成功') emits('refresh') emits('closeEditTemplateDialog') }), @@ -124,7 +125,7 @@ const saveTemplate = () => { handlerConfirm(options) } else { save(state.templateInfo).then(response => { - ElMessage.success(t('system_parameter_setting.import_succeeded')) + ElMessage.success(t('导入成功')) emits('refresh') emits('closeEditTemplateDialog') }) @@ -143,8 +144,9 @@ const handleFileChange = e => { const result = res.target.result as string state.importTemplateInfo = JSON.parse(result) state.templateInfo.name = state.importTemplateInfo['name'] - state.templateInfo.templateStyle = state.importTemplateInfo['panelStyle'] - state.templateInfo.templateData = state.importTemplateInfo['panelData'] + state.templateInfo.dvType = state.importTemplateInfo['dvType'] + state.templateInfo.templateStyle = state.importTemplateInfo['canvasStyleData'] + state.templateInfo.templateData = state.importTemplateInfo['componentData'] state.templateInfo.snapshot = state.importTemplateInfo.snapshot state.templateInfo.dynamicData = state.importTemplateInfo['dynamicData'] state.templateInfo.staticResource = state.importTemplateInfo['staticResource'] @@ -161,7 +163,7 @@ onMounted(() => { }) - diff --git a/core/core-frontend/src/views/template/component/TemplateList.vue b/core/core-frontend/src/views/template/component/DeTemplateList.vue similarity index 87% rename from core/core-frontend/src/views/template/component/TemplateList.vue rename to core/core-frontend/src/views/template/component/DeTemplateList.vue index aae066c3f4..771d302f41 100644 --- a/core/core-frontend/src/views/template/component/TemplateList.vue +++ b/core/core-frontend/src/views/template/component/DeTemplateList.vue @@ -2,24 +2,26 @@
  • - + + + {{ ele.name }} @@ -38,13 +42,13 @@ @@ -59,7 +63,7 @@ secondary @click="add()" > - {{ t('panel.add_category') }} + {{ t('visualization.add_category') }}
@@ -67,6 +71,8 @@ diff --git a/core/core-frontend/src/views/template/index.vue b/core/core-frontend/src/views/template/index.vue index f2a442c47d..7b2b2fab36 100644 --- a/core/core-frontend/src/views/template/index.vue +++ b/core/core-frontend/src/views/template/index.vue @@ -1,21 +1,21 @@ - - + - { if (nameRepeat(value)) { @@ -160,7 +162,7 @@ const state = reactive({ formType: '', originName: '', templateDialog: { - title: t('panel.import_template'), + title: t('visualization.import_template'), visible: false, pid: '' } @@ -251,14 +253,10 @@ const showTemplateEditDialog = (type, templateInfo) => { state.formType = type if (type === 'edit') { state.templateEditForm = JSON.parse(JSON.stringify(templateInfo)) - state.dialogTitle = t( - `system_parameter_setting.${ - state.templateEditForm['nodeType'] === 'folder' ? 'edit_classification' : 'edit_template' - }` - ) + state.dialogTitle = state.templateEditForm['nodeType'] === 'folder' ? '编辑分类' : '编辑模版' state.originName = state.templateEditForm['label'] } else { - state.dialogTitle = t('panel.add_category') + state.dialogTitle = t('visualization.add_category') state.templateEditForm = { name: '', nodeType: 'folder', @@ -266,11 +264,7 @@ const showTemplateEditDialog = (type, templateInfo) => { level: 0 } } - state.dialogTitleLabel = t( - `system_parameter_setting.${ - state.templateEditForm['nodeType'] === 'folder' ? 'classification_name' : 'template_name' - }` - ) + state.dialogTitleLabel = state.templateEditForm['nodeType'] === 'folder' ? '分类名称' : '模版名称' state.editTemplate = true } @@ -300,13 +294,15 @@ const close = () => { state.editTemplate = false } const getTree = () => { - const request = { - templateType: state.currentTemplateType, - level: '0' - } - find(request).then(res => { - state.templateList = res.data - showFirst() + nextTick(() => { + const request = { + templateType: state.currentTemplateType, + level: '0' + } + find(request).then(res => { + state.templateList = res.data + showFirst() + }) }) } const showFirst = () => { @@ -367,6 +363,7 @@ onMounted(() => { } .flex-tabs { + margin-top: 16px; display: flex; background: #f5f6f7; } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/template/TemplateManageApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/template/TemplateManageApi.java index 6716678803..2dc3452e63 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/template/TemplateManageApi.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/template/TemplateManageApi.java @@ -9,7 +9,7 @@ import java.util.List; public interface TemplateManageApi { @PostMapping("/templateList") - List templateList(); + List templateList(TemplateManageRequest request); @PostMapping("/save") TemplateManageDTO save(@RequestBody TemplateManageRequest request); diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/template/dto/TemplateManageFileDTO.java b/sdk/api/api-base/src/main/java/io/dataease/api/template/dto/TemplateManageFileDTO.java new file mode 100644 index 0000000000..1b9c692f02 --- /dev/null +++ b/sdk/api/api-base/src/main/java/io/dataease/api/template/dto/TemplateManageFileDTO.java @@ -0,0 +1,26 @@ +package io.dataease.api.template.dto; + + +import io.dataease.api.template.vo.VisualizationTemplateVO; +import lombok.Data; + +import java.util.List; + + +@Data +public class TemplateManageFileDTO extends VisualizationTemplateVO { + + /** + * 样式数据 + */ + private String canvasStyleData; + + /** + * 组件数据 + */ + private String componentData; + + + private String staticResource; + +} diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java index b7b8f288f0..0b8817daad 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/DataVisualizationApi.java @@ -11,6 +11,7 @@ import io.dataease.auth.DePermit; import io.dataease.model.BusiNodeRequest; import io.dataease.model.BusiNodeVO; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -63,4 +64,21 @@ public interface DataVisualizationApi { @GetMapping("/findDvType/{dvId}") String findDvType(@PathVariable("dvId")Long dvId); + + /** + * 从模版解压可视化资源 模版来源包括 模版市场、内部模版管理 + * + * @return + */ + @PostMapping("/decompression") + DataVisualizationVO decompression(@RequestBody DataVisualizationBaseRequest request) throws Exception; + + /** + * 从模版解压可视化资源 模版来源包括本地上传 + * + * @return + */ + @PostMapping("/decompressionLocalFile") + DataVisualizationVO decompressionLocalFile(@RequestPart(value = "file") MultipartFile file); + } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/request/DataVisualizationBaseRequest.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/request/DataVisualizationBaseRequest.java index 20977a3bb9..caff3bd810 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/request/DataVisualizationBaseRequest.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/request/DataVisualizationBaseRequest.java @@ -10,4 +10,16 @@ public class DataVisualizationBaseRequest extends DataVisualizationVO { private Boolean moveFromUpdate = false; + private String optType; + + private String newFrom; + + private String dynamicData; + + private String templateId; + + private String staticResource; + + private String templateUrl; + } diff --git a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java index 5298c53c9f..f0921799d6 100644 --- a/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java +++ b/sdk/api/api-base/src/main/java/io/dataease/api/visualization/vo/DataVisualizationVO.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import io.dataease.api.chart.dto.ChartViewDTO; import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.HashMap; @@ -11,6 +12,7 @@ import java.util.List; import java.util.Map; @Data +@NoArgsConstructor public class DataVisualizationVO implements Serializable { @JsonSerialize(using = ToStringSerializer.class) @@ -120,4 +122,13 @@ public class DataVisualizationVO implements Serializable { * 视图基本信息 */ private Map canvasViewInfo = new HashMap<>(); + + public DataVisualizationVO(Long id, String name, String type, String canvasStyleData, String componentData, Map canvasViewInfo) { + this.id = id; + this.name = name; + this.type = type; + this.canvasStyleData = canvasStyleData; + this.componentData = componentData; + this.canvasViewInfo = canvasViewInfo; + } }