From 3cf58c72e8fe1dbfa0434c7b48032b0e6f0d2011 Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 8 Sep 2023 15:18:23 +0800 Subject: [PATCH 1/4] =?UTF-8?q?NEZ-3180=20fix=EF=BC=9ADashboard=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=20query=5Frange=20=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=B8=8E=E4=B8=8A=E6=96=B9=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=99=A8=E5=B1=95=E7=A4=BA=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/chart/chart/chartDiagram.vue | 25 ++++++++++- .../src/components/chart/panelChart.vue | 18 ++++++-- .../components/common/mixin/beforeMeta2d.js | 43 ++++++++++++------- .../project/meta2d/js/meta2dMainCalc.js | 8 +++- .../common/project/meta2d/meta2dMain.vue | 6 +-- 5 files changed, 74 insertions(+), 26 deletions(-) diff --git a/nezha-fronted/src/components/chart/chart/chartDiagram.vue b/nezha-fronted/src/components/chart/chart/chartDiagram.vue index b5857c3ed..7309497c6 100644 --- a/nezha-fronted/src/components/chart/chart/chartDiagram.vue +++ b/nezha-fronted/src/components/chart/chart/chartDiagram.vue @@ -9,7 +9,18 @@ - + @@ -35,7 +46,8 @@ export default { querysArray: {}, currentProject: {}, params: {} - } + }, + timeRange: ['', ''] } }, created () { @@ -43,6 +55,10 @@ export default { this.iconArray = [...res.data.list] this.iconArrayLoad = true }) + const timeRange = this.$lodash.cloneDeep(this.filterTime) + timeRange[0] = this.momentStrToTimestamp(timeRange[0]) + timeRange[1] = this.momentStrToTimestamp(timeRange[1]) + this.timeRange = timeRange }, mounted () { bus.$on('showMeta2dPreview', (params) => { @@ -53,6 +69,11 @@ export default { methods: { resize () { this.$refs.diagram.resize() + }, + refresh (timeRange) { + console.log(timeRange) + this.timeRange = timeRange + this.reload(true) } }, destroyed () { diff --git a/nezha-fronted/src/components/chart/panelChart.vue b/nezha-fronted/src/components/chart/panelChart.vue index 429ee98cc..c8bccc99a 100644 --- a/nezha-fronted/src/components/chart/panelChart.vue +++ b/nezha-fronted/src/components/chart/panelChart.vue @@ -191,7 +191,11 @@ export default { this.minusTime = '' this.multipleTime = false } - this.chartInfo.loaded && this.query(elements, startTime, endTime, step) + if (this.chartInfo.type === 'diagram') { + this.chartInfo.loaded && this.query(elements, startTime, endTime, step, '', true) + } else { + this.chartInfo.loaded && this.query(elements, startTime, endTime, step) + } }, // 参数 isRefresh 标识是否是刷新操作 getChartData (isRefresh, params) { // 获取chart的数据前的准备 主要用于处理时间参数 @@ -235,12 +239,12 @@ export default { this.variablesHandle() const elements = this.chartInfo.elements || [] if (this.isExportHtml) { - this.chartInfo.loaded && this.queryData(elements, startTime, endTime, step, params) + this.chartInfo.loaded && this.queryData(elements, startTime, endTime, step, params, isRefresh) return } - this.chartInfo.loaded && this.query(elements, startTime, endTime, step, params) + this.chartInfo.loaded && this.query(elements, startTime, endTime, step, params, isRefresh) }, - query (elements, startTime, endTime, step, params) { // 获取chart的数据 + query (elements, startTime, endTime, step, params, isRefresh) { // 获取chart的数据 this.isError = false this.allDataLength = 0 // this.chartData = this.chartInfo.chartData @@ -508,6 +512,12 @@ export default { } else { this.chartData = [this.chartInfo.param.topo] } + if (isRefresh) { + let dom = this.$refs.chart.$refs['chart' + this.chartInfo.id] + if (dom) { + dom.refresh([startTime, endTime]) + } + } } if (this.chartInfo.type === 'group') { this.chartData = lodash.get(this, 'chartInfo.children', []) diff --git a/nezha-fronted/src/components/common/mixin/beforeMeta2d.js b/nezha-fronted/src/components/common/mixin/beforeMeta2d.js index 3f2e0069c..23d329ca6 100644 --- a/nezha-fronted/src/components/common/mixin/beforeMeta2d.js +++ b/nezha-fronted/src/components/common/mixin/beforeMeta2d.js @@ -18,7 +18,7 @@ export default { chart: {} }, methods: { - reload () { + reload (isRefresh) { if (this.currentProject && this.currentProject.id) { this.$get('monitor/project/topo', { projectId: this.currentProject.id }).then(res => { if (res.data && res.data.topo) { @@ -42,21 +42,34 @@ export default { const res = { data: this.chartInfo.param } - if (res.data && res.data.topo) { - this.topoData = res.data.topo || {} - if (res.data.topo.topo) { - this.topoData = res.data.topo.topo || {} - } - this.querysArray = res.data.topo.elements || [] - this.params = { - timeType: res.data.topo.timeType || 5 - } + if (isRefresh) { + this.$get('/visual/dashboard/chart/' + this.chartInfo.id).then(response => { + res.data = JSON.parse(response.data.param) + console.log(res.data) + this.topoInit(res) + this.chartInfo.param.topo = res.data.topo + this.$refs.diagram && this.$refs.diagram.reload() + }) } else { - this.topoData = {} - this.querysArray = [] - this.params = { - timeType: 5 - } + this.topoInit(res) + } + } + }, + topoInit (res) { + if (res.data && res.data.topo) { + this.topoData = res.data.topo || {} + if (res.data.topo.topo) { + this.topoData = res.data.topo.topo || {} + } + this.querysArray = res.data.topo.elements || [] + this.params = { + timeType: res.data.topo.timeType || 5 + } + } else { + this.topoData = {} + this.querysArray = [] + this.params = { + timeType: 5 } } } diff --git a/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js b/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js index fce470116..57e768552 100644 --- a/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js +++ b/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js @@ -124,8 +124,12 @@ export default { }, reload () { this.position.show = false - const endTime = new Date().getTime() - const startTime = endTime - 60 * this.params.timeType * 1000 + let endTime = new Date().getTime() + let startTime = endTime - 60 * this.params.timeType * 1000 + if (this.isChart) { + startTime = this.timeRange[0] + endTime = this.timeRange[1] + } this.getQueryValues(this.querysArray, startTime, endTime).then((arr) => { this.clacTopoData(this.$lodash.cloneDeep(this.topoData), arr).then((data) => { if (!getTopology(this.meta2dId)) { diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue index d979b6026..54fa0bdf7 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue @@ -172,7 +172,9 @@ export default { paddingTop: { type: Number, default: 20 - } + }, + timeRange: {}, + nowTimeType: {} }, data () { return { @@ -188,8 +190,6 @@ export default { }, } }, - computed: { - }, components: { meta2dHeader, meta2dProps, From fe08ae3d9f90070432711884c46285e9e818d9ce Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 8 Sep 2023 15:18:51 +0800 Subject: [PATCH 2/4] =?UTF-8?q?NEZ-3181=20fix=EF=BC=9AChart=20=E5=85=A8?= =?UTF-8?q?=E5=B1=8F=E9=A2=84=E8=A7=88=E7=82=B9=E5=87=BB=20=E5=8F=B3?= =?UTF-8?q?=E4=B8=8A=E8=A7=92=20=E5=88=B7=E6=96=B0=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nezha-fronted/src/components/chart/chart/chartAutotopology.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/nezha-fronted/src/components/chart/chart/chartAutotopology.vue b/nezha-fronted/src/components/chart/chart/chartAutotopology.vue index 6c9a11b1f..70938bf3c 100644 --- a/nezha-fronted/src/components/chart/chart/chartAutotopology.vue +++ b/nezha-fronted/src/components/chart/chart/chartAutotopology.vue @@ -19,6 +19,7 @@ class="meta2d-chart" :is-chart="true" :iconArray="iconArray" + :time-range="filterTime" :ref="'topology' + index" :paddingTop="40" /> From de78cc419f721f0f1ede8383e591f97d98de2f89 Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 8 Sep 2023 15:27:42 +0800 Subject: [PATCH 3/4] =?UTF-8?q?NEZ-3183=20fix=EF=BC=9Aasset=E7=AD=89?= =?UTF-8?q?=E8=AF=A6=E6=83=85tooltip=E4=B8=8D=E6=94=AF=E6=8C=81=E9=BC=A0?= =?UTF-8?q?=E6=A0=87=E7=A7=BB=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/table/settings/endpointTable.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nezha-fronted/src/components/common/table/settings/endpointTable.vue b/nezha-fronted/src/components/common/table/settings/endpointTable.vue index da2564abc..12af232bb 100644 --- a/nezha-fronted/src/components/common/table/settings/endpointTable.vue +++ b/nezha-fronted/src/components/common/table/settings/endpointTable.vue @@ -105,7 +105,7 @@ @mouseleave="labelHover1(scope.row, item.prop, false, $event, true)"> [{{scope.row.configs[0].enable ? 'Metrics':''}}{{scope.row.configs[0].enable&&scope.row.configs[1].enable?',':''}}{{scope.row.configs[1].enable ? 'Logs' : ''}}] - +
{{JSON.stringify(clConfigs(scope.row),null,2)}}
@@ -215,6 +215,7 @@ :id="alertLabelId" :that="alertLabelObj" :type="alertLabelType" + @tipHover="tipHover" >
@@ -366,7 +367,7 @@ export default { } // this.$set(this.tableData,index,item);// 调用父组件 }, - tipHover (tipLoading, item, type) { + nztipHover (tipLoading, item, type) { if (item[type].timeout) { clearTimeout(item[type].timeout) item[type].timeout = null From ed7a48d1dfb680a7650fa2b326a8ff69d0ff7e8c Mon Sep 17 00:00:00 2001 From: zhangyu Date: Fri, 8 Sep 2023 16:10:58 +0800 Subject: [PATCH 4/4] =?UTF-8?q?NEZ-3182=20=20fix=EF=BC=9A=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E7=BC=A9=E6=94=BE=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/project/meta2d/js/meta2dMainCalc.js | 13 ++++++++++--- .../common/project/meta2d/meta2dMain.vue | 5 +++++ .../common/project/meta2d/topologyTopTool.vue | 6 +++--- nezha-fronted/static/roteCursor.cur | Bin 165662 -> 0 bytes 4 files changed, 18 insertions(+), 6 deletions(-) delete mode 100644 nezha-fronted/static/roteCursor.cur diff --git a/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js b/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js index 57e768552..87d7629b1 100644 --- a/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js +++ b/nezha-fronted/src/components/common/project/meta2d/js/meta2dMainCalc.js @@ -81,8 +81,9 @@ export default { init: function () { const meta2dOptions = { minScale: this.minScale, - maxScale: 2, - autoAnchor: false + // maxScale: 2, + autoAnchor: false, + // disableAnchor: true } const meta2d = new window.Meta2d(this.meta2dId, meta2dOptions) meta2d.register(flowPens()) @@ -126,9 +127,12 @@ export default { this.position.show = false let endTime = new Date().getTime() let startTime = endTime - 60 * this.params.timeType * 1000 - if (this.isChart) { + if (this.isChart && this.timeRange) { startTime = this.timeRange[0] endTime = this.timeRange[1] + } else if (this.filterTime) { + startTime = this.filterTime[0] + endTime = this.filterTime[1] } this.getQueryValues(this.querysArray, startTime, endTime).then((arr) => { this.clacTopoData(this.$lodash.cloneDeep(this.topoData), arr).then((data) => { @@ -306,6 +310,9 @@ export default { }, pensActive (pens, e) { // 选中节点 setTimeout(() => { + pens.forEach(item => { + item.disableAnchor = false + }) this.selectPens = pens this.modulesDiff(pens[0]) this.$nextTick(() => { diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue index 54fa0bdf7..5179befed 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue @@ -137,6 +137,11 @@ export default { option: this.option } }, + computed: { + filterTime () { + return this.$store.getters.getTimeRange + }, + }, props: { meta2dId: {}, // 唯一id 不可重复 iconArray: { diff --git a/nezha-fronted/src/components/common/project/meta2d/topologyTopTool.vue b/nezha-fronted/src/components/common/project/meta2d/topologyTopTool.vue index 00d4db522..061753ea2 100644 --- a/nezha-fronted/src/components/common/project/meta2d/topologyTopTool.vue +++ b/nezha-fronted/src/components/common/project/meta2d/topologyTopTool.vue @@ -289,9 +289,9 @@ export default { if (this.scaleNum < 25) { this.scaleNum = 25 } - if (this.scaleNum > 400) { - this.scaleNum = 400 - } + // if (this.scaleNum > 400) { + // this.scaleNum = 400 + // } this.scale(this.scaleNum) }, scale (val) { diff --git a/nezha-fronted/static/roteCursor.cur b/nezha-fronted/static/roteCursor.cur deleted file mode 100644 index 09bc2775bdeac6838c40f963fba4ad0f5f70fae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165662 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 Z^@z3#UQ)THUZu72j>_r)@xDgj^8cQ=qgVg{