From c68a9bfac38d6cc13f8c84907a45fc7e928cc9be Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Tue, 16 Jul 2024 17:47:09 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BB=AA=E8=A1=A8=E6=9D=BF=E3=80=81?= =?UTF-8?q?=E5=A4=A7=E5=B1=8F):=20=E6=94=AF=E6=8C=81=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/MybatisPlusGenerator.java | 4 +- .../auto/entity/VisualizationTemplate.java | 27 +- .../mapper/VisualizationTemplateMapper.java | 4 +- .../ext/ExtVisualizationTemplateMapper.java | 2 +- .../service/TemplateManageService.java | 12 +- .../server/DataVisualizationServer.java | 12 +- .../main/resources/db/desktop/V2.9__ddl.sql | 4 + .../main/resources/db/migration/V2.9__ddl.sql | 4 + .../api/visualization/dataVisualization.ts | 8 +- .../data-visualization/DvToolbar.vue | 10 +- .../src/components/de-app/AppExportForm.vue | 76 +++++- core/core-frontend/src/utils/canvasUtils.ts | 3 +- core/core-frontend/src/utils/imgUtils.ts | 6 +- .../src/views/common/DeAppApply.vue | 256 ++++++++++++++++++ .../views/data-visualization/PreviewHead.vue | 3 + .../views/data-visualization/PreviewShow.vue | 28 +- .../src/views/data-visualization/index.vue | 3 +- .../template/component/DeTemplateImport.vue | 7 +- .../template/vo/VisualizationTemplateVO.java | 5 + .../visualization/DataVisualizationApi.java | 2 +- .../visualization/vo/DataVisualizationVO.java | 8 +- 21 files changed, 429 insertions(+), 55 deletions(-) create mode 100644 core/core-frontend/src/views/common/DeAppApply.vue 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 3e5d0ddc25..12bd3304f8 100644 --- a/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java +++ b/core/core-backend/src/main/java/io/dataease/MybatisPlusGenerator.java @@ -21,11 +21,11 @@ public class MybatisPlusGenerator { /** * 业务模块例如datasource,dataset,panel等 */ - private static final String busi = "visualization"; + private static final String busi = "template"; /** * 这是要生成代码的表名称 */ - private static final String TABLE_NAME = "visualization_report_filter"; + private static final String TABLE_NAME = "visualization_template"; /** * 下面两个配置基本上不用动 diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java index b2922f8f97..5a4ced5f44 100644 --- a/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java +++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/entity/VisualizationTemplate.java @@ -5,11 +5,11 @@ import java.io.Serializable; /** *

- * + * 模板表 *

* * @author fit2cloud - * @since 2024-04-11 + * @since 2024-07-16 */ @TableName("visualization_template") public class VisualizationTemplate implements Serializable { @@ -37,12 +37,12 @@ public class VisualizationTemplate implements Serializable { private Integer level; /** - * 模版种类 dataV or dashboard 目录或者文件夹 + * 模板种类 dataV or dashboard 目录或者文件夹 */ private String dvType; /** - * 节点类型 folder or panel 目录或者文件夹 + * 节点类型 app or template 应用 或者 模板 */ private String nodeType; @@ -62,7 +62,7 @@ public class VisualizationTemplate implements Serializable { private String snapshot; /** - * 模版类型 system 系统内置 self 用户自建 + * 模板类型 system 系统内置 self 用户自建 */ private String templateType; @@ -81,14 +81,16 @@ public class VisualizationTemplate implements Serializable { */ private String dynamicData; + /** + * app数据 + */ + private String appData; + /** * 使用次数 */ private Integer useCount; - /** - * 使用仪表板的版本 - */ private Integer version; public String getId() { @@ -195,6 +197,14 @@ public class VisualizationTemplate implements Serializable { this.dynamicData = dynamicData; } + public String getAppData() { + return appData; + } + + public void setAppData(String appData) { + this.appData = appData; + } + public Integer getUseCount() { return useCount; } @@ -227,6 +237,7 @@ public class VisualizationTemplate implements Serializable { ", templateStyle = " + templateStyle + ", templateData = " + templateData + ", dynamicData = " + dynamicData + + ", appData = " + appData + ", useCount = " + useCount + ", version = " + version + "}"; diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java index 92903d6dc5..28f93143c7 100644 --- a/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java +++ b/core/core-backend/src/main/java/io/dataease/template/dao/auto/mapper/VisualizationTemplateMapper.java @@ -6,11 +6,11 @@ import org.apache.ibatis.annotations.Mapper; /** *

- * Mapper 接口 + * 模板表 Mapper 接口 *

* * @author fit2cloud - * @since 2024-04-11 + * @since 2024-07-16 */ @Mapper public interface VisualizationTemplateMapper extends BaseMapper { diff --git a/core/core-backend/src/main/java/io/dataease/template/dao/ext/ExtVisualizationTemplateMapper.java b/core/core-backend/src/main/java/io/dataease/template/dao/ext/ExtVisualizationTemplateMapper.java index 3c575ac51d..a52a9d4e28 100644 --- a/core/core-backend/src/main/java/io/dataease/template/dao/ext/ExtVisualizationTemplateMapper.java +++ b/core/core-backend/src/main/java/io/dataease/template/dao/ext/ExtVisualizationTemplateMapper.java @@ -52,6 +52,6 @@ public interface ExtVisualizationTemplateMapper{ List findAppLinkJumpInfoInfo(@Param("dvId") Long dvId); - List findAppJumpTargetViewInfo(@Param("dvId") Long dvId); + List findAppLinkJumpTargetViewInfoInfo(@Param("dvId") Long dvId); } 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 88e507f563..dfa4178bda 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 @@ -80,10 +80,10 @@ public class TemplateManageService implements TemplateManageApi { request.setId(UUID.randomUUID().toString()); request.setCreateTime(System.currentTimeMillis()); request.setCreateBy(AuthUtils.getUser().getUserId().toString()); - if ("template".equals(request.getNodeType())) { + if ("template".equals(request.getNodeType()) || "app".equals(request.getNodeType())) { //Store static resource into the server staticResourceServer.saveFilesToServe(request.getStaticResource()); - String snapshotName = "template-" + request.getId() + ".jpeg"; + String snapshotName = request.getNodeType() + "-" + request.getId() + ".jpeg"; staticResourceServer.saveSingleFileToServe(snapshotName, request.getSnapshot().replace("data:image/jpeg;base64,", "")); request.setSnapshot("/" + UPLOAD_URL_PREFIX + '/' + snapshotName); } @@ -107,7 +107,7 @@ public class TemplateManageService implements TemplateManageApi { VisualizationTemplate template = new VisualizationTemplate(); BeanUtils.copyBean(template, request); - if(template.getVersion() == null){ + if (template.getVersion() == null) { template.setVersion(2); } templateMapper.insert(template); @@ -137,7 +137,7 @@ public class TemplateManageService implements TemplateManageApi { } VisualizationTemplate template = new VisualizationTemplate(); BeanUtils.copyBean(template, request); - if(template.getVersion() == null){ + if (template.getVersion() == null) { template.setVersion(2); } templateMapper.updateById(template); @@ -191,7 +191,7 @@ public class TemplateManageService implements TemplateManageApi { @Override public String checkCategoryTemplateBatchNames(TemplateManageRequest request) { - Long result = extTemplateMapper.checkCategoryTemplateBatchNames(request.getTemplateNames(),request.getCategories(),request.getTemplateArray()); + Long result = extTemplateMapper.checkCategoryTemplateBatchNames(request.getTemplateNames(), request.getCategories(), request.getTemplateArray()); if (result == 0) { return CommonConstants.CHECK_RESULT.NONE; } else { @@ -272,7 +272,7 @@ public class TemplateManageService implements TemplateManageApi { public List findCategoriesByTemplateIds(TemplateManageRequest request) throws Exception { if (!CollectionUtils.isEmpty(request.getTemplateArray())) { List result = extTemplateMapper.findTemplateArrayCategories(request.getTemplateArray()); - if(!CollectionUtils.isEmpty(result) &&result.size() == 1 ){ + if (!CollectionUtils.isEmpty(result) && result.size() == 1) { return Arrays.stream(result.get(0).split(",")).toList(); } } 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 c340178ea3..1c647fe4fb 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 @@ -304,6 +304,7 @@ public class DataVisualizationServer implements DataVisualizationApi { String templateData = null; String dynamicData = null; String staticResource = null; + String appData = null; String name = null; String dvType = null; Integer version = null; @@ -316,6 +317,7 @@ public class DataVisualizationServer implements DataVisualizationApi { name = visualizationTemplate.getName(); dvType = visualizationTemplate.getDvType(); version = visualizationTemplate.getVersion(); + appData = visualizationTemplate.getAppData(); // 模板市场记录 coreOptRecentManage.saveOpt(request.getTemplateId(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE, OptConstants.OPT_TYPE.NEW); VisualizationTemplate visualizationTemplateUpdate = new VisualizationTemplate(); @@ -327,6 +329,7 @@ public class DataVisualizationServer implements DataVisualizationApi { templateData = request.getComponentData(); dynamicData = request.getDynamicData(); staticResource = request.getStaticResource(); + appData = request.getAppData(); name = request.getName(); dvType = request.getType(); } else if (DataVisualizationConstants.NEW_PANEL_FROM.NEW_MARKET_TEMPLATE.equals(newFrom)) { @@ -341,6 +344,7 @@ public class DataVisualizationServer implements DataVisualizationApi { name = templateFileInfo.getName(); dvType = templateFileInfo.getDvType(); version = templateFileInfo.getVersion(); + appData = templateFileInfo.getAppData(); // 模板市场记录 coreOptRecentManage.saveOpt(request.getResourceName(), OptConstants.OPT_RESOURCE_TYPE.TEMPLATE, OptConstants.OPT_TYPE.NEW); } @@ -383,7 +387,7 @@ public class DataVisualizationServer implements DataVisualizationApi { request.setCanvasStyleData(templateStyle); //Store static resource into the server staticResourceServer.saveFilesToServe(staticResource); - return new DataVisualizationVO(newDvId, name, dvType, version, templateStyle, templateData, canvasViewInfo, null); + return new DataVisualizationVO(newDvId, name, dvType, version, templateStyle, templateData,appData, canvasViewInfo, null); } @Override @@ -415,10 +419,10 @@ public class DataVisualizationServer implements DataVisualizationApi { List datasourceVOInfo = null; List datasourceTaskVOInfo = null; //TODO 获取所有视图信息 - if (CollectionUtils.isEmpty(viewIds)) { + if (!CollectionUtils.isEmpty(viewIds)) { chartViewVOInfo = appTemplateMapper.findAppViewInfo(viewIds); } - if (CollectionUtils.isEmpty(dsIds)) { + if (!CollectionUtils.isEmpty(dsIds)) { datasetGroupVOInfo = appTemplateMapper.findAppDatasetGroupInfo(dsIds); datasetTableVOInfo = appTemplateMapper.findAppDatasetTableInfo(dsIds); datasetTableFieldVOInfo = appTemplateMapper.findAppDatasetTableFieldInfo(dsIds); @@ -430,7 +434,7 @@ public class DataVisualizationServer implements DataVisualizationApi { List linkageFieldVOInfo = appTemplateMapper.findAppLinkageFieldInfo(dvId); List linkJumpVOInfo = appTemplateMapper.findAppLinkJumpInfo(dvId); List linkJumpInfoVOInfo = appTemplateMapper.findAppLinkJumpInfoInfo(dvId); - List listJumpTargetViewInfoVO = appTemplateMapper.findAppJumpTargetViewInfo(dvId); + List listJumpTargetViewInfoVO = appTemplateMapper.findAppLinkJumpTargetViewInfoInfo(dvId); return new VisualizationExport2AppVO(chartViewVOInfo, datasetGroupVOInfo, datasetTableVOInfo, datasetTableFieldVOInfo, datasourceVOInfo, datasourceTaskVOInfo, diff --git a/core/core-backend/src/main/resources/db/desktop/V2.9__ddl.sql b/core/core-backend/src/main/resources/db/desktop/V2.9__ddl.sql index 0a32227095..b1e4e43562 100644 --- a/core/core-backend/src/main/resources/db/desktop/V2.9__ddl.sql +++ b/core/core-backend/src/main/resources/db/desktop/V2.9__ddl.sql @@ -48,3 +48,7 @@ INSERT INTO `core_copilot_config` VALUES (1, 'https://copilot-demo.test.fit2clou UPDATE `core_sys_setting` SET `pkey` = 'ai.baseUrl', `pval` = 'https://maxkb.fit2cloud.com/ui/chat/2ddd8b594ce09dbb?mode=embed', `type` = 'text', `sort` = 0 WHERE `id` = 3; +ALTER TABLE `visualization_template` + MODIFY COLUMN `node_type` varchar(255) NULL DEFAULT NULL COMMENT '节点类型 app or template 应用 或者 模板' AFTER `dv_type`, + ADD COLUMN `app_data` longtext NULL COMMENT 'app数据' AFTER `dynamic_data`; + diff --git a/core/core-backend/src/main/resources/db/migration/V2.9__ddl.sql b/core/core-backend/src/main/resources/db/migration/V2.9__ddl.sql index 421b9220d5..f8f3e97901 100644 --- a/core/core-backend/src/main/resources/db/migration/V2.9__ddl.sql +++ b/core/core-backend/src/main/resources/db/migration/V2.9__ddl.sql @@ -69,3 +69,7 @@ CREATE TABLE `core_api_traffic` PRIMARY KEY (`id`) ); +ALTER TABLE `visualization_template` + MODIFY COLUMN `node_type` varchar(255) NULL DEFAULT NULL COMMENT '节点类型 app or template 应用 或者 模板' AFTER `dv_type`, + ADD COLUMN `app_data` longtext NULL COMMENT 'app数据' AFTER `dynamic_data`; + diff --git a/core/core-frontend/src/api/visualization/dataVisualization.ts b/core/core-frontend/src/api/visualization/dataVisualization.ts index 23a8de6334..f14055fe0a 100644 --- a/core/core-frontend/src/api/visualization/dataVisualization.ts +++ b/core/core-frontend/src/api/visualization/dataVisualization.ts @@ -95,10 +95,10 @@ export const getComponentInfo = dvId => { }) } -export const export2AppCheck = dvId => { - return request.get({ - url: '/dataVisualization/export2AppCheck/' + dvId, - method: 'get', +export const export2AppCheck = params => { + return request.post({ + url: '/dataVisualization/export2AppCheck', + data: params, loading: true }) } diff --git a/core/core-frontend/src/components/data-visualization/DvToolbar.vue b/core/core-frontend/src/components/data-visualization/DvToolbar.vue index 415366efd3..2c175ab540 100644 --- a/core/core-frontend/src/components/data-visualization/DvToolbar.vue +++ b/core/core-frontend/src/components/data-visualization/DvToolbar.vue @@ -24,6 +24,7 @@ import OuterParamsSet from '@/components/visualization/OuterParamsSet.vue' import MultiplexingCanvas from '@/views/common/MultiplexingCanvas.vue' import ComponentButtonLabel from '@/components/visualization/ComponentButtonLabel.vue' import DeFullscreen from '@/components/visualization/common/DeFullscreen.vue' +import DeAppApply from '@/views/common/DeAppApply.vue' let nameEdit = ref(false) let inputName = ref('') let nameInput = ref(null) @@ -32,7 +33,8 @@ const snapshotStore = snapshotStoreWithOut() const { styleChangeTimes, snapshotIndex } = storeToRefs(snapshotStore) const resourceGroupOpt = ref(null) const dvToolbarMain = ref(null) -const { componentData, canvasStyleData, dvInfo, editMode } = storeToRefs(dvMainStore) +const { componentData, canvasStyleData, canvasViewInfo, dvInfo, editMode } = + storeToRefs(dvMainStore) let scaleEdit = 100 const { wsCache } = useCache('localStorage') const dvModel = 'dataV' @@ -342,6 +344,12 @@ const fullScreenPreview = () => { cur-canvas-type="dataV" ref="resourceGroupOpt" /> + diff --git a/core/core-frontend/src/components/de-app/AppExportForm.vue b/core/core-frontend/src/components/de-app/AppExportForm.vue index 44f5243113..55c5a425c4 100644 --- a/core/core-frontend/src/components/de-app/AppExportForm.vue +++ b/core/core-frontend/src/components/de-app/AppExportForm.vue @@ -1,7 +1,7 @@ + diff --git a/core/core-frontend/src/views/data-visualization/PreviewHead.vue b/core/core-frontend/src/views/data-visualization/PreviewHead.vue index e9043b690d..4b2dfed856 100644 --- a/core/core-frontend/src/views/data-visualization/PreviewHead.vue +++ b/core/core-frontend/src/views/data-visualization/PreviewHead.vue @@ -172,6 +172,9 @@ const initOpenHandler = newWindow => { 模板 + 应用 {{ t('chart.image') }} diff --git a/core/core-frontend/src/views/data-visualization/PreviewShow.vue b/core/core-frontend/src/views/data-visualization/PreviewShow.vue index 96bfdbaabf..00d2133627 100644 --- a/core/core-frontend/src/views/data-visualization/PreviewShow.vue +++ b/core/core-frontend/src/views/data-visualization/PreviewShow.vue @@ -104,16 +104,25 @@ const download = type => { }, 200) } -const downloadAsAppTemplate = downloadType => { +const fileDownload = (downloadType, attachParams) => { downloadStatus.value = true nextTick(() => { const vueDom = previewCanvasContainer.value.querySelector('.canvas-container') - download2AppTemplate(downloadType, vueDom, state.dvInfo.name, () => { + download2AppTemplate(downloadType, vueDom, state.dvInfo.name, attachParams, () => { downloadStatus.value = false }) }) } +const downloadAsAppTemplate = downloadType => { + console.log('===test===' + downloadType) + if (downloadType === 'template') { + fileDownload(downloadType, null) + } else if (downloadType === 'app') { + downLoadToAppPre() + } +} + const downLoadToAppPre = () => { const result = checkTemplate() if (result && result.length > 0) { @@ -123,7 +132,7 @@ const downLoadToAppPre = () => { appName: dvInfo.value.name, icon: null, version: '2.0', - creator: state.userLoginInfo?.nickName, + creator: state.userLoginInfo?.name, required: '2.9.0', description: null }) @@ -139,9 +148,6 @@ const checkTemplate = () => { }) return templateViewNames.slice(1) } -const downLoadToApp = appAttachInfo => { - // do attach -} const slideOpenChange = () => { slideShow.value = !slideShow.value @@ -182,7 +188,7 @@ const getPreviewStateInfo = () => { } const downLoadApp = appAttachInfo => { - downLoadToApp(appAttachInfo) + fileDownload('app', appAttachInfo) } const findUserData = callback => { @@ -291,7 +297,13 @@ onBeforeMount(() => { - +