From 1d8fcb18ffed12652c7171ffb7924929566d142c Mon Sep 17 00:00:00 2001 From: zhangyu Date: Mon, 20 Feb 2023 14:25:09 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=20=E6=9A=82=E5=AD=98topo=E6=94=B9?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/project/meta2dProps.scss | 12 +- .../components/common/mixin/beforeMeta2d.js | 43 +- .../common/project/meta2d/js/meta2dMain.js | 65 ++- .../common/project/meta2d/js/meta2dStore.js | 27 ++ .../common/project/meta2d/js/topoUtil.js | 124 +++++- .../common/project/meta2d/meta2dCanvas.vue | 70 +++- .../common/project/meta2d/meta2dData.vue | 21 +- .../common/project/meta2d/meta2dElement.vue | 391 ++++++++++++++++-- .../common/project/meta2d/meta2dHeader.vue | 51 ++- .../common/project/meta2d/meta2dMain.vue | 20 +- .../common/project/meta2d/meta2dProps.vue | 33 +- .../project/meta2d/meta2dSelectImage.vue | 115 ++++++ .../page/dashboard/explore/promqlInput.vue | 2 - .../page/monitor/project/project.vue | 2 +- nezha-fronted/src/store/index.js | 4 +- 15 files changed, 853 insertions(+), 127 deletions(-) create mode 100644 nezha-fronted/src/components/common/project/meta2d/js/meta2dStore.js create mode 100644 nezha-fronted/src/components/common/project/meta2d/meta2dSelectImage.vue diff --git a/nezha-fronted/src/assets/css/components/common/project/meta2dProps.scss b/nezha-fronted/src/assets/css/components/common/project/meta2dProps.scss index cb86ec777..dcd3246e7 100644 --- a/nezha-fronted/src/assets/css/components/common/project/meta2dProps.scss +++ b/nezha-fronted/src/assets/css/components/common/project/meta2dProps.scss @@ -13,7 +13,7 @@ } .form-row-item{ vertical-align: top; - width: calc(50% - 15px); + width: calc(50% - 3px); display: inline-block; box-sizing: border-box; padding: 0 5px; @@ -48,4 +48,14 @@ .form-row-content{ margin-bottom: 5px; } + .right-box__container.pens-data{ + overflow: unset; + overflow-y: unset; + } + .right-box__container .chart-config .thresholds-item .mapping-display-input input{ + padding-left: 15px; + } + .right-box__container .el-form{ + padding-top: 0; + } } diff --git a/nezha-fronted/src/components/common/mixin/beforeMeta2d.js b/nezha-fronted/src/components/common/mixin/beforeMeta2d.js index 1b31433f9..cf4638244 100644 --- a/nezha-fronted/src/components/common/mixin/beforeMeta2d.js +++ b/nezha-fronted/src/components/common/mixin/beforeMeta2d.js @@ -2,32 +2,31 @@ export default { data () { return { topoData: {}, - querysArray: {}, + querysArray: [], meta2dType: '', - timeType: 1, + timeType: 1 } }, - mounted () { - if (this.meta2dType === 'project') { - setTimeout(() => { - const res = { - topo: {}, - elements: [], - timeType: 4 + watch: { + currentProject: { + handler (n) { + this.reload() + } + }, + chart: {} + }, + methods: { + reload () { + this.$get('monitor/project/topo', { projectId: this.currentProject.id }).then(res => { + if (res.data && res.data.topo) { + this.topoData = res.data.topo.topo || {} + this.querysArray = res.data.topo.elements || [] + this.timeType = res.data.topo.timeType || 1 + } else { + this.topoData = {} + this.querysArray = [] + this.timeType = 1 } - this.topoData = res.topo - this.querysArray = res.elements - }) - } else { - setTimeout(() => { - const res = { - topo: {}, - elements: [], - timeType: 4 - } - this.topoData = res.topo - this.querysArray = res.elements - this.timeType = res.timeType || 1 }) } } diff --git a/nezha-fronted/src/components/common/project/meta2d/js/meta2dMain.js b/nezha-fronted/src/components/common/project/meta2d/js/meta2dMain.js index 3d402bbfd..acd461e71 100644 --- a/nezha-fronted/src/components/common/project/meta2d/js/meta2dMain.js +++ b/nezha-fronted/src/components/common/project/meta2d/js/meta2dMain.js @@ -19,7 +19,8 @@ export default { return { selectPens: [], editFlag: false, - prevFlag: false + prevFlag: false, + meta2dLoading: true } }, mounted () { @@ -37,7 +38,6 @@ export default { // meta2d.registerCanvasDraw(chartsPens()) /* 画布绑定事件 */ meta2d.beforeAddPens = (pens) => { // 添加画笔前 - console.log(pens) if (pens.length === 1) { if (!pens[0].type) { this.nodeInit(pens[0]) @@ -57,25 +57,37 @@ export default { // meta2d.on('add', this.appPen) // 添加新画笔· meta2d.on('click', this.topoClick) // click画笔· setTopology(this.meta2dId, meta2d) - console.log(getTopology(this.meta2dId)) - this.clacTopoData(this.topoData).then((data) => { - console.log(data) - meta2d.open(data) - meta2d.centerView() - meta2d.lock(1) + }, + reload () { + const endTime = new Date().getTime() + const startTime = endTime - 60 * 5 * 1000 + this.getQueryValues(this.querysArray, startTime, endTime).then((arr) => { + this.clacTopoData(this.topoData, arr).then((data) => { + console.log(data) + getTopology(this.meta2dId).resize() + getTopology(this.meta2dId).open(data) + getTopology(this.meta2dId).centerView() + getTopology(this.meta2dId).lock(1) + }) }) }, - clacTopoData (data) { // 主要处理 属性为原始属性 处理动画属性对原始属性的影响 + clacTopoData (data, queryValues) { // 主要处理 属性为原始属性 处理动画属性对原始属性的影响 return new Promise(resolve => { if (!data.pens) { data.pens = [] } + data.pens.forEach(pen => { + if (pen.isNz) { + if (pen.data.legend) { + + } + } else { + // 处理加载数据 + } + }) resolve(data) }) }, - calcNode (node) { // 处理节点数据 - node = { ...node, ...node.data.params } - }, nodeInit (pen) { // 初始化节点参数 pen.data = { params: { // 用于编辑时 重置为节点初始状态 @@ -87,7 +99,7 @@ export default { imageId: '', valueMapping: [], legend: '', - statistics: '', + statistic: '', enable: { valueMapping: true, tooltip: true @@ -100,6 +112,7 @@ export default { legends: [] // {legend: '' , alias} } } + pen.isNz = true pen.background = '#22222200' pen.textAlign = 'center' pen.textBaseline = 'middle' @@ -115,7 +128,10 @@ export default { pen.lineWidth = 1 pen.lineDash = [] pen.borderRadius = 0 - console.log(pen) + pen.paddingTop = 5 + pen.paddingBottom = 5 + pen.paddingLeft = 5 + pen.paddingRight = 5 }, lineInit (pen) { // 初始化连线参数 pen.data = { @@ -123,8 +139,16 @@ export default { animateColor: '#FA901CFF', borderColor: '#22222200', color: '#222222FF' - } + }, + valueMapping: [], + legend: '', + statistic: '', + enable: { + valueMapping: true, + tooltip: true + }, } + pen.disableInput = true pen.lineAnimateType = 0 pen.animateSpan = 1 pen.animateReverse = false @@ -137,13 +161,12 @@ export default { pen.borderType = 0 pen.lineWidth = 1 pen.lineDash = [] + pen.isNz = true }, pensActive (pens, e) { // 选中节点 - console.log(pens, 'active', e) this.selectPens = pens }, topoClick (params, e) { // 点击节点 - console.log(this.$refs.meta2dProps) if (!params.pen && this.$refs.meta2dProps) { this.$refs.meta2dProps.activeName = 'canvas' this.selectPens = [] @@ -156,7 +179,6 @@ export default { // console.log(pens) }, updatePens (pen, key) { // 更新对应的节点 - console.log(pen, key, 'update') // meta2d.setValue({ id: pen.id, text: 'new text' }, { render: false }); const obj = { id: pen.id } obj[key] = pen[key] @@ -165,13 +187,18 @@ export default { } getTopology(this.meta2dId).setValue(obj) if (key === 'lineAnimateType') { - console.log('lineAnimateType', 'start') if (!pen[key]) { getTopology(this.meta2dId).stopAnimate(pen.id) return } getTopology(this.meta2dId).startAnimate(pen.id) } + }, + exitEdit (isRefresh) { + this.editFlag = false + if (isRefresh) { + this.$emit('reload') + } } } } diff --git a/nezha-fronted/src/components/common/project/meta2d/js/meta2dStore.js b/nezha-fronted/src/components/common/project/meta2d/js/meta2dStore.js new file mode 100644 index 000000000..49a8fe338 --- /dev/null +++ b/nezha-fronted/src/components/common/project/meta2d/js/meta2dStore.js @@ -0,0 +1,27 @@ +const meta2dStore = { + state: { + queryValues: [] + }, + mutations: { + setQueryValues (state, arr) { + state.queryValues = arr + }, + delQueryValues (state, obj) { + delete state.queryValues[obj.key] + } + }, + getters: { + getQueryValues (state) { + return state.queryValues + } + }, + actions: { + dispatchSetQueryValues (store, arr) { + store.commit('setQueryValues', arr) + }, + dispatchDelQueryValues (store, arr) { + store.commit('delQueryValues', arr) + } + } +} +export default meta2dStore diff --git a/nezha-fronted/src/components/common/project/meta2d/js/topoUtil.js b/nezha-fronted/src/components/common/project/meta2d/js/topoUtil.js index 951cb0591..3c16d9a95 100644 --- a/nezha-fronted/src/components/common/project/meta2d/js/topoUtil.js +++ b/nezha-fronted/src/components/common/project/meta2d/js/topoUtil.js @@ -1,14 +1,134 @@ import { getTopology, setTopology, dealImg, topologyImg } from '@/components/common/js/common' +import bus from '@/libs/bus' +import axios from 'axios' export default { methods: { topoResize (id) { getTopology(id).resize() }, initEdit (id) { - console.log(getTopology(id)) getTopology(id).lock(0) - getTopology(id).centerView() getTopology(id).stopAnimate(getTopology(id).data.pens) + console.log(getTopology(id).data.pens) + if (getTopology(id).data.pens) { + getTopology(id).data.pens.forEach(item => { + this.calcNode(item) + }) + } + getTopology(id).render() + getTopology(id).centerView() + }, + calcNode (node) { // 处理节点数据 + node = { ...node, ...node.data.params } + getTopology(this.meta2dId)._setValue(node) + }, + getQueryValues (elements, startTime, endTime) { + this.meta2dLoading = true + return new Promise(resolve => { + const step = bus.getStep(startTime, endTime) + endTime = parseInt(endTime / 1000) + startTime = parseInt(startTime / 1000) + const urlPre = '/prom' + console.log(endTime, startTime) + elements = elements.filter(item => item.state && item.expression) + const requests = elements.map((element) => { + // query_range + let query = `${urlPre}/api/v1/query_range?start=${startTime}&end=${endTime}&step=${step}` + query += `&nullType=${'null'}` + if (element.filter) { + query += `&filter=${element.filter}` + } + query += `&query=${encodeURIComponent(element.expression)}` + return this.$get(query) + }) + axios.all(requests).then((res) => { + console.log(res) + const arr = [] + res.forEach((request, index) => { + arr.push({ + type: 'title', + name: elements[index].name + }) + if (request.code === 200 && request.status === 'success') { + request.data.result.forEach((r, rindex) => { + let legend = '' + if (!r.metric) { + r.metric = {} + } + if (r.metric.__name__) { + legend += `${r.metric.__name__}{` + } + const tagKeysArr = Object.keys(r.metric) + tagKeysArr.forEach(tagKey => { + if (tagKey !== '__name__' && tagKey !== 'legend' && tagKey !== 'values' && tagKey !== '$value') { + legend += `${tagKey}="${r.metric[tagKey]}",` + } + }) + if (legend.endsWith(',')) { + legend = legend.substr(0, legend.length - 1) + } + if (r.metric.__name__) { + legend += '}' + } + if (!legend && elements) { + legend = elements[index].expression + } + const obj = { + type: 'item', + id: rindex + elements[index].name + JSON.stringify(r.metric), + name: this.handleLegendAlias(legend, elements[index].legend, r.metric), + values: r.values + } + arr.push(obj) + }) + } + }) + this.meta2dLoading = false + this.$store.dispatch('dispatchSetQueryValues', arr) + resolve(arr) + }) + }) + }, + handleLegendAlias (legend, aliasExpression, params) { + const self = this + const myParams = JSON.parse(JSON.stringify(params)) + myParams.$labels = JSON.parse(JSON.stringify(params)) + myParams.$value = myParams.value + if (/\{\{.+\}\}/.test(aliasExpression)) { + const labelValue = aliasExpression.replace(/(\{\{.+?\}\})/g, function (i) { + const label = i.substr(i.indexOf('{{') + 2, i.indexOf('}}') - i.indexOf('{{') - 2) + if (!legend) { + return label + } + let value = null + if (params && self.$loadsh.get(myParams, label)) { + value = self.$loadsh.get(myParams, label) + } + if (label) { + const reg = new RegExp(label + '=".+?"', 'g') + if (reg.test(legend)) { + const ans = legend.match(reg) + let find = '' + ans.forEach(item => { + const index = legend.indexOf(item) + if (legend[index - 1] !== '_') { + find = item + } + }) + value = find.substr(find.indexOf('"') + 1, find.lastIndexOf('"') - find.indexOf('"') - 1) + } + } + return value || '' + }) + return labelValue + } else { + if (!aliasExpression) { + return legend + // let result =legend.substr(legend.indexOf('"') + 1,legend.lastIndexOf('"') - legend.indexOf('"') - 1); + // return result + } + return aliasExpression + } } } } diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dCanvas.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dCanvas.vue index 0769925d7..b394819d7 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dCanvas.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dCanvas.vue @@ -1,12 +1,76 @@ diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dData.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dData.vue index b409c1af7..b87855d78 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dData.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dData.vue @@ -138,6 +138,10 @@ const rz = { export default { name: 'meta2dData', mixins: [promqlInputMixin, rz], + props: { + querysArray: {}, + timeType: {} + }, components: { draggable, promqlInput @@ -197,11 +201,6 @@ export default { } else if (!this.expressionName[index]) { this.expressionName[index] = this.expressionsShow[index].oldName } else { - this.param.rightYAxis && this.param.rightYAxis.elementNames.forEach((item, index) => { - if (item == this.expressionsShow[index].oldName) { - this.param.rightYAxis.elementNames[index] = this.expressionName[index] - } - }) this.expressionsShow[index].oldName = this.expressionName[index] } this.expressionChange() @@ -293,12 +292,6 @@ export default { }, removeExpression (index) { if (this.expressionsShow.length > 1) { - this.param.rightYAxis && this.param.rightYAxis.elementNames.forEach((elementName, subIndex) => { - if (elementName == this.expressionName[index]) { - this.param.rightYAxis.elementNames.splice(subIndex, 1) - } - }) - this.expressions.splice(index, 1) this.expressionName.splice(index, 1) this.expressionsShow.splice(index, 1) @@ -330,10 +323,6 @@ export default { showError () { }, hideError (key, index) { - if (!this.param[key] || !this.param[key].length) { - return - } - this.param[key][index].error = false this.$forceUpdate() }, move () { @@ -373,6 +362,8 @@ export default { this.expressions = [] this.expressionsShow = [] this.expressionName = [] + this.elements = this.$loadsh.cloneDeep(this.querysArray) + this.dataTimeType = this.timeType if (!this.elements.length) { this.addExpression() } else { diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dElement.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dElement.vue index 0dab2d59d..a0e117eb3 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dElement.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dElement.vue @@ -1,5 +1,5 @@ diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dHeader.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dHeader.vue index 4de66a718..3e2df6166 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dHeader.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dHeader.vue @@ -1,6 +1,6 @@ @@ -37,7 +40,7 @@ export default { type: Boolean, default: false }, - projectName: {} + project: {} }, data () { return { @@ -54,14 +57,12 @@ export default { }, methods: { editMeta2d () { - console.log() this.topoScreenState = JSON.parse(JSON.stringify(this.topoScreen)) this.$store.commit('setShowTopoScreen', true) setTimeout(() => { this.topoResize(this.meta2dId) this.initEdit(this.meta2dId) this.$emit('edit') - console.log(getTopology(this.meta2dId).data()) }) }, onDragstart (e) { @@ -86,8 +87,48 @@ export default { }, // 开启钢笔状态 setDrawPen () { - console.log(123123123123) getTopology(this.meta2dId).drawLine('line') + }, + saveMeta2d () { + if (this.isChart) { + this.saveChart() + } else { + this.saveProject() + } + }, + saveChart () { + + }, + saveProject () { + const elements = this.$parent.$refs.meta2dProps.$refs.meta2dData.elements + console.log(elements) + const params = { + topo: getTopology(this.meta2dId).data(), + elements: elements, + timeType: '' + } + + this.$put('monitor/project/topo', { topo: JSON.stringify(params), projectId: this.project.id }).then(res => { + this.prevent_opt.save = false + if (res.code === 200) { + this.$message({ + message: this.$t('tip.saveSuccess'), + type: 'success' + }) + this.$store.commit('setShowTopoScreen', this.topoScreenState) + this.$nextTick(() => { + getTopology(this.meta2dId).lock(1) + getTopology(this.meta2dId).resize() + }) + this.$emit('exitEdit', true) + } + }).catch(res => { + this.prevent_opt.save = false + this.$message({ + message: res.msg, + type: 'error' + }) + }) } } } diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue index 0bda3d352..9f4ba97dd 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dMain.vue @@ -1,10 +1,18 @@ @@ -13,9 +21,10 @@ import meta2dHeader from '@/components/common/project/meta2d/meta2dHeader' import meta2dProps from '@/components/common/project/meta2d/meta2dProps' import meta2dMain from '@/components/common/project/meta2d/js/meta2dMain' import { getTopology, setTopology } from '@/components/common/js/common' +import topoUtil from '@/components/common/project/meta2d/js/topoUtil' export default { name: 'meta2dMain', - mixins: [meta2dMain], + mixins: [meta2dMain, topoUtil], props: { meta2dId: {}, // 唯一id 不可重复 topoData: {}, // topo图数据 @@ -25,7 +34,7 @@ export default { }, querysArray: {}, timeType: {}, - projectName: {} + project: {} }, components: { meta2dHeader, @@ -35,6 +44,7 @@ export default { topoData: { immediate: true, handler () { + this.reload() } } }, diff --git a/nezha-fronted/src/components/common/project/meta2d/meta2dProps.vue b/nezha-fronted/src/components/common/project/meta2d/meta2dProps.vue index eae4e7e73..0db48f51c 100644 --- a/nezha-fronted/src/components/common/project/meta2d/meta2dProps.vue +++ b/nezha-fronted/src/components/common/project/meta2d/meta2dProps.vue @@ -1,14 +1,14 @@