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 @@
-
+
@@ -38,22 +37,43 @@
-
+
{{ $t('commons.cancel') }}
- {{ $t('app_template.export') }}
+ 导出
-
+
+
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(() => {
-
+