diff --git a/README.md b/README.md index a9abdc98e7..1099a7bcf3 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ curl -sSL https://github.com/dataease/dataease/releases/latest/download/quick_st ``` - [在线文档](https://dataease.io/docs/) -- [演示视频](https://www.bilibili.com/video/BV1UB4y1K7jA) +- [演示视频](https://www.bilibili.com/video/BV1i34y1v7hq/) ## 微信群 diff --git a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java index 8f4604dd22..dddcbac4ce 100644 --- a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java +++ b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java @@ -5,10 +5,7 @@ import io.dataease.auth.annotation.DePermission; import io.dataease.auth.annotation.DePermissionProxy; import io.dataease.commons.constants.DePermissionType; import io.dataease.commons.constants.ResourceAuthLevel; -import io.dataease.controller.request.chart.ChartCalRequest; -import io.dataease.controller.request.chart.ChartExtRequest; -import io.dataease.controller.request.chart.ChartViewCacheRequest; -import io.dataease.controller.request.chart.ChartViewRequest; +import io.dataease.controller.request.chart.*; import io.dataease.controller.response.ChartDetail; import io.dataease.dto.chart.ChartViewDTO; import io.dataease.plugins.common.base.domain.ChartViewCacheWithBLOBs; @@ -23,6 +20,7 @@ import springfox.documentation.annotations.ApiIgnore; import javax.annotation.Resource; import java.util.List; +import java.util.Map; /** * @Author gin @@ -112,6 +110,13 @@ public class ChartViewController { return chartViewService.chartCopy(id, panelId); } + @DePermission(type = DePermissionType.PANEL, level = ResourceAuthLevel.PANNEL_LEVEL_MANAGE, paramIndex = 1) + @ApiOperation("批量复制") + @PostMapping("chartBatchCopy/{panelId}") + public Map chartBatchCopy(@RequestBody ChartCopyBatchRequest request, @PathVariable String panelId) { + return chartViewService.chartBatchCopy(request,panelId); + } + @ApiIgnore @GetMapping("searchAdviceSceneId/{panelId}") public String searchAdviceSceneId(@PathVariable String panelId) { diff --git a/backend/src/main/java/io/dataease/controller/request/chart/ChartCopyBatchRequest.java b/backend/src/main/java/io/dataease/controller/request/chart/ChartCopyBatchRequest.java new file mode 100644 index 0000000000..9a8248ecc9 --- /dev/null +++ b/backend/src/main/java/io/dataease/controller/request/chart/ChartCopyBatchRequest.java @@ -0,0 +1,20 @@ +package io.dataease.controller.request.chart; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +/** + * Author: wangjiahao + * Date: 2022/4/26 + * Description: + */ +@Data +public class ChartCopyBatchRequest { + + private String panelId; + + private Map sourceAndTargetIds; + +} diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index c3d1e31871..4ba1f479a6 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -1,5 +1,6 @@ package io.dataease.service.chart; +import cn.hutool.core.lang.Assert; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import io.dataease.auth.entity.SysUserEntity; @@ -1024,13 +1025,35 @@ public class ChartViewService { return chartViewMapper.selectByPrimaryKey(id); } - public String chartCopy(String id, String panelId) { + public String chartCopy(String sourceViewId,String newViewId, String panelId) { + extChartViewMapper.chartCopy(newViewId, sourceViewId, panelId); + extChartViewMapper.copyCache(sourceViewId, newViewId); + extPanelGroupExtendDataMapper.copyExtendData(sourceViewId, newViewId, panelId); + chartViewCacheService.refreshCache(newViewId); + return newViewId; + } + + public String chartCopy(String sourceViewId, String panelId) { String newChartId = UUID.randomUUID().toString(); - extChartViewMapper.chartCopy(newChartId, id, panelId); - extChartViewMapper.copyCache(id, newChartId); - extPanelGroupExtendDataMapper.copyExtendData(id, newChartId, panelId); - chartViewCacheService.refreshCache(newChartId); - return newChartId; + return chartCopy(sourceViewId,newChartId,panelId); + } + + + /** + * @Description Copy a set of views with a given source ID and target ID + * @param request + * @param panelId + * @return + */ + public Map chartBatchCopy(ChartCopyBatchRequest request,String panelId){ + Assert.notNull(panelId,"panelId should not be null"); + Map sourceAndTargetIds = request.getSourceAndTargetIds(); + if(sourceAndTargetIds != null && !sourceAndTargetIds.isEmpty()){ + for(Map.Entry entry:sourceAndTargetIds.entrySet()){ + chartCopy(entry.getKey(),entry.getValue(),panelId); + } + } + return request.getSourceAndTargetIds(); } public String searchAdviceSceneId(String panelId) { diff --git a/backend/src/main/resources/db/migration/V34__1.10.sql b/backend/src/main/resources/db/migration/V34__1.10.sql index f61d20bb47..97d0a98a5d 100644 --- a/backend/src/main/resources/db/migration/V34__1.10.sql +++ b/backend/src/main/resources/db/migration/V34__1.10.sql @@ -161,3 +161,11 @@ RETURN 'success'; END ;; delimiter ; + +ALTER TABLE `qrtz_triggers` +DROP INDEX `IDX_QRTZ_T_G`, +DROP INDEX `IDX_QRTZ_T_STATE`, +DROP INDEX `IDX_QRTZ_T_NFT_MISFIRE`; + +ALTER TABLE `qrtz_fired_triggers` +DROP INDEX `IDX_QRTZ_FT_TRIG_INST_NAME`; diff --git a/frontend/src/api/chart/chart.js b/frontend/src/api/chart/chart.js index a3de990024..42ed1fdd90 100644 --- a/frontend/src/api/chart/chart.js +++ b/frontend/src/api/chart/chart.js @@ -27,6 +27,14 @@ export function chartCopy(id, panelId) { loading: false }) } +export function chartBatchCopy(params, panelId) { + return request({ + url: '/chart/view/chartBatchCopy/' + panelId, + method: 'post', + data: params, + loading: false + }) +} export function chartGroupTree(data) { return request({ url: '/chart/group/tree', diff --git a/frontend/src/components/canvas/store/copy.js b/frontend/src/components/canvas/store/copy.js index f8bcfa22c7..a8fde22975 100644 --- a/frontend/src/components/canvas/store/copy.js +++ b/frontend/src/components/canvas/store/copy.js @@ -2,7 +2,7 @@ import store from '@/store/index' import toast from '@/components/canvas/utils/toast' import generateID from '@/components/canvas/utils/generateID' import { deepCopy } from '@/components/canvas/utils/utils' -import { chartCopy } from '@/api/chart/chart' +import { chartBatchCopy, chartCopy } from '@/api/chart/chart' import { uuid } from 'vue-uuid' export default { @@ -53,6 +53,19 @@ export default { newView.propValue.viewId = res.data store.commit('addComponent', { component: newView }) }) + } if (data.type === 'de-tabs') { + const sourceAndTargetIds = {} + const newCop = deepCopy(data) + newCop.options.tabList.forEach((item) => { + if (item.content && item.content.type === 'view') { + const newViewId = uuid.v1() + sourceAndTargetIds[item.content.propValue.viewId] = newViewId + item.content.propValue.viewId = newViewId + } + }) + chartBatchCopy({ 'sourceAndTargetIds': sourceAndTargetIds }, state.panel.panelInfo.id).then((rsp) => { + store.commit('addComponent', { component: newCop }) + }) } else { const newCop = deepCopy(data) newCop.id = uuid.v1() diff --git a/frontend/src/components/widget/DeWidget/DeTabs.vue b/frontend/src/components/widget/DeWidget/DeTabs.vue index a0cedc4081..40a6eaf09b 100644 --- a/frontend/src/components/widget/DeWidget/DeTabs.vue +++ b/frontend/src/components/widget/DeWidget/DeTabs.vue @@ -6,7 +6,7 @@ type="card" style-type="radioGroup" class="de-tabs-height" - :class="isEdit ? 'de-tabs-edit' : ''" + :class="isCurrentEdit ? 'de-tabs-edit' : ''" :font-color="fontColor" :active-color="activeColor" :border-color="borderColor" @@ -249,6 +249,9 @@ export default { }, titleValid() { return !!this.textarea && !!this.textarea.trim() + }, + isCurrentEdit() { + return this.isEdit && this.curComponent && this.curComponent.id === this.element.id } }, watch: { diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss index ca8f3457e0..d3b3752e6a 100644 --- a/frontend/src/styles/index.scss +++ b/frontend/src/styles/index.scss @@ -143,7 +143,7 @@ div:focus { height: 100vh !important; } } -.de-tabs-edit { +.de-tabs-edit>.el-tabs__header{ padding-right: 50px !important; } .de-tabs { diff --git a/frontend/src/views/background/index.vue b/frontend/src/views/background/index.vue index cdec3808a9..9a6a14a525 100644 --- a/frontend/src/views/background/index.vue +++ b/frontend/src/views/background/index.vue @@ -110,6 +110,7 @@ import { mapState } from 'vuex' import { deepCopy } from '@/components/canvas/utils/utils' import { COLOR_PANEL } from '@/views/chart/chart/chart' import { uploadFileResult } from '@/api/staticResource/staticResource' +import { COMMON_BACKGROUND_NONE } from '@/components/canvas/custom-component/component-list' export default { name: 'Background', @@ -144,7 +145,7 @@ export default { if (this.curComponent && this.curComponent.commonBackground && this.curComponent.commonBackground.outerImage && typeof (this.curComponent.commonBackground.outerImage) === 'string') { this.fileList.push({ url: this.curComponent.commonBackground.outerImage }) } - this.backgroundOrigin = deepCopy(this.curComponent.commonBackground) + this.backgroundOrigin = deepCopy(this.curComponent.commonBackground ? this.curComponent.commonBackground : COMMON_BACKGROUND_NONE) this.queryBackground() }, queryBackground() { diff --git a/frontend/src/views/panel/edit/index.vue b/frontend/src/views/panel/edit/index.vue index f748bc5699..380c0b7b9f 100644 --- a/frontend/src/views/panel/edit/index.vue +++ b/frontend/src/views/panel/edit/index.vue @@ -949,6 +949,7 @@ export default { hyperlinks: HYPERLINKS, mobileStyle: BASE_MOBILE_STYLE, propValue: fileResult, + commonBackground: deepCopy(COMMON_BACKGROUND), style: { ...commonStyle } diff --git a/frontend/src/views/wizard/details/DemoVideo.vue b/frontend/src/views/wizard/details/DemoVideo.vue index dc589dfad4..c7fc575916 100644 --- a/frontend/src/views/wizard/details/DemoVideo.vue +++ b/frontend/src/views/wizard/details/DemoVideo.vue @@ -2,7 +2,7 @@
diff --git a/frontend/src/views/wizard/index.vue b/frontend/src/views/wizard/index.vue index f692c6c16a..fc5d8d632f 100644 --- a/frontend/src/views/wizard/index.vue +++ b/frontend/src/views/wizard/index.vue @@ -43,7 +43,7 @@ export default { head: this.$t('wizard.quick_start'), content: this.$t('wizard.demo_video_hint'), bottom: '', - href: 'https://www.bilibili.com/video/BV1UB4y1K7jA', + href: 'https://www.bilibili.com/video/BV1i34y1v7hq/', component: 'CardDetail' }, {