diff --git a/nezha-fronted/src/components/charts/chart-list.vue b/nezha-fronted/src/components/charts/chart-list.vue index 91f9a9848..b37bdf51c 100644 --- a/nezha-fronted/src/components/charts/chart-list.vue +++ b/nezha-fronted/src/components/charts/chart-list.vue @@ -26,6 +26,7 @@ { if (item.id === chartId) { this.getChartData(item, index, 'refresh'); } }); }, + searchData(chartId,searchTime){ + if(searchTime){//全屏时间查询 + this.filter.start_time=bus.timeFormate(searchTime[0], 'yyyy-MM-dd hh:mm:ss'); + this.filter.end_time=bus.timeFormate(searchTime[1], 'yyyy-MM-dd hh:mm:ss'); + } + this.dataList.forEach((item, index) => { + if (item.id === chartId) { + this.getChartData(item, index, 'searchTime'); + } + }); + } /* // 刷新数据 refreshData() { diff --git a/nezha-fronted/src/components/charts/chart-table.scss b/nezha-fronted/src/components/charts/chart-table.scss index 04cf5e9d0..cdc1ece32 100644 --- a/nezha-fronted/src/components/charts/chart-table.scss +++ b/nezha-fronted/src/components/charts/chart-table.scss @@ -19,6 +19,7 @@ // top: 5px; // z-index: 10; padding-right: 40px; + padding-bottom:9px; .set-icon { display: inline-block; cursor: pointer; diff --git a/nezha-fronted/src/components/charts/chart-table.vue b/nezha-fronted/src/components/charts/chart-table.vue index e4e9da6f0..85991460a 100644 --- a/nezha-fronted/src/components/charts/chart-table.vue +++ b/nezha-fronted/src/components/charts/chart-table.vue @@ -44,9 +44,20 @@ {{data.title}}
+ + - +
@@ -124,6 +135,89 @@ export default { sortable: true, render: (h, params) => h('span', this.getNumStr(params.row.value)), }], + searchTime:[new Date().setHours(new Date().getHours()-1),new Date()], + oldSearchTime:[], + pickerOptions: { + shortcuts: [ + { + text: this.$t("dashboard.panel.recOne"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setHours(start.getHours() - 1); + picker.$emit('pick', [start, end]); + } + },{ + text: this.$t("dashboard.panel.recFour"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setHours(start.getHours() - 4); + picker.$emit('pick', [start, end]); + } + }, { + text: this.$t("dashboard.panel.recOneDay"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setDate(start.getDate() - 1); + picker.$emit('pick', [start, end]); + } + }, { + text: this.$t("dashboard.panel.yesterday"), + onClick(picker) { + const start = new Date(); + const end = new Date(); + start.setDate(start.getDate() - 1); + start.setHours(0); + start.setMinutes(0); + start.setSeconds(0); + end.setDate(end.getDate() - 1); + end.setHours(23); + end.setMinutes(59); + end.setSeconds(59); + picker.$emit('pick', [start, end]); + } + },{ + text: this.$t("dashboard.panel.recSevenDay"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setDate(start.getDate() - 7); + picker.$emit('pick', [start, end]); + } + }, { + text: this.$t("dashboard.panel.recOneMonth"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setDate(start.getDate() - 30); + picker.$emit('pick', [start, end]); + } + }, { + text: this.$t("dashboard.panel.curMonth"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setDate(1); + start.setHours(0); + start.setMinutes(0); + picker.$emit('pick', [start, end]); + } + },{ + text: this.$t("dashboard.panel.lastMonth"), + onClick(picker) { + const end = new Date(); + const start = new Date(); + start.setDate(1); + start.setMonth(start.getMonth() - 1); + end.setDate(0); + start.setStart(); + end.setEnd(); + picker.$emit('pick', [start, end]); + } + }] + }, }; }, computed: { @@ -150,8 +244,16 @@ export default { removeChart() { this.$emit('on-remove-chart-block', this.data.id); }, + dateChange(time) { + this.filter.start_time = bus.timeFormate(this.searchTime[0], 'yyyy-MM-dd hh:mm:ss'); + this.filter.end_time = bus.timeFormate(this.searchTime[1], 'yyyy-MM-dd hh:mm:ss'); + this.tableLoading = true; + this.$emit('on-search-data', this.data.id,this.searchTime); + }, // 全屏查看 showAllScreen() { + // 初始化同步时间 + this.searchTime = this.oldSearchTime; this.screenModal = true; }, // 设置数据, filter区分 @@ -164,6 +266,9 @@ export default { this.panelIdInner = panelId; this.data = chartItem; this.seriesItem = seriesItem; + this.searchTime[0] = filter.start_time; + this.searchTime[1] = filter.end_time; + this.oldSearchTime = this.searchTime; }, // 获取格式 getNumStr(num) { diff --git a/nezha-fronted/src/components/charts/line-chart-block.vue b/nezha-fronted/src/components/charts/line-chart-block.vue index 015483502..4efde4c6c 100644 --- a/nezha-fronted/src/components/charts/line-chart-block.vue +++ b/nezha-fronted/src/components/charts/line-chart-block.vue @@ -21,7 +21,7 @@
-
+
-
+
{{$t('dashboard.panel.cancel')}} @@ -214,12 +214,16 @@ export default { if ( chartInfo.type === 4) {//line,bar this.chartType = 'line'; } + let chartId = ''; if (chartSite === 'local') { this.echartStore = echarts.init(ele); + chartId='lineChartArea'; }else if (chartSite === 'screen') { this.echartModalStore = echarts.init(ele); + chartId='screenShowArea'; } var chartWidth = ele.clientWidth; + //let chartTitle = this.handleLineFeed(chartInfo.title,chartWidth); var option = { title: { text: chartInfo.title || null, @@ -227,7 +231,7 @@ export default { useHTML: true, textStyle: { //display: 'inline-block',//无此属性 - width: '300px', + width: '60%', fontStyle:'normal', fontWeight:'normal' } @@ -243,7 +247,18 @@ export default { tooltip: { trigger: 'axis', confine:true, - //formatter:"{a}
"+"
"+"{b}"+"
"+"
{c}", + formatter:function(params){ + let str = `
`; + params.forEach((item, i) => { + if(i!==0){ + str +=`
`; + } + str +=` ${item.seriesName}:${item.data[1]}`; + }); + str +=`
`; + return str; + // return `
${params[0].seriesName}:${params[0].data[1]}
`; + }, }, legend: { type:'scroll', @@ -279,10 +294,17 @@ export default { }else { var charNum = `${(chartWidth-100)/(txtWidth/name.length)}`; return name.slice(0,charNum)+'...'; - //return name; } }, - tooltip:{show:true}, + tooltip:{ + show:true, + formatter:function(params){ + //alert(params.length); + //alert(JSON.stringify(params)); + + return `
${params.name}
`; + }, + }, data: legend, orient:'vertical', x:'center', @@ -493,6 +515,54 @@ export default { this.echartModalStore.resize({height:chartInfo.height});//,width:`${ele.clientWidth-100}`} } }, + handleLineFeed(str,chartWidth){ + let rlt=''; + if(!str){ + return ''; + } + //计算宽度 + var span = document.createElement("span"); + var result = {}; + result.width = span.offsetWidth; + result.height = span.offsetHeight; + span.style.visibility = "hidden"; + span.style.fontSize = 14; + span.style.fontFamily = "Arial"; + span.style.display = "inline-block"; + document.body.appendChild(span); + if(typeof span.textContent != "undefined"){ + span.textContent = str; + }else{ + span.innerText = str; + } + var txtWidth = parseFloat(window.getComputedStyle(span).width) - result.width; + document.body.removeChild(span); + + if(txtWidth < chartWidth){ + return str; + }else { + var charNum = `${(chartWidth-100)/(txtWidth/str.length)}`; + return str.slice(0,charNum)+'...'; + } + /* + if(txtWidth < (chartWidth-30)){ + return str; + }else { + var charNum = `${(chartWidth-200)/(txtWidth/str.length)}`;//一行的字符数 + charNum = parseInt(charNum); + if(str.length>charNum){ + let num = `${str.length/charNum}`; + num = parseInt(num)+1; + for(let i=0;i 0 && tagsArr.length > 0) { @@ -132,11 +133,17 @@ if (tag !== '__name__') { host += `${tag}="${queryItem.metric[tag]}",`; } + if (tag === 'asset') { + let labVal= `${queryItem.metric[tag]}`; + if(labVal!==''){ + charTitle += `(${queryItem.metric[tag]})`; + } + } }); if(host.endsWith(',')){host = host.substr(0,host.length-1);} host +="}"; } - soleParam.title = host; + soleParam.title = charTitle; elements.push({ expression: host, type: this.elementTarget.type, diff --git a/nezha-fronted/src/components/page/dashboard/metricPreview.vue b/nezha-fronted/src/components/page/dashboard/metricPreview.vue index 06ec68474..dd8dcb002 100644 --- a/nezha-fronted/src/components/page/dashboard/metricPreview.vue +++ b/nezha-fronted/src/components/page/dashboard/metricPreview.vue @@ -264,7 +264,7 @@ export default { // 获取一个图表具体数据 getChartData(response, params) { const chartItem = Object.assign({}, params); - chartItem.title = params.metric || '预览图'; + chartItem.title = params.metric; const series = []; const legend = []; // 一个图表 @@ -278,11 +278,13 @@ export default { type:chartItem.type, //visible: true, //threshold: null, + chartTitle:'' }, metric_name: '', }; // 图表中每条线的名字,后半部分 let host = `${queryItem.metric.__name__}`;//up, + let charName = `${queryItem.metric.__name__}`; const tagsArr = Object.keys(queryItem.metric);//["__name__","asset","idc","instance","job","module","project"] // 设置时间-数据格式对 const dpsArr = Object.entries(queryItem.values);//[ ["0",[1577959830.781,"0"]], ["1",[1577959845.781,"0"]] ] @@ -290,15 +292,24 @@ export default { if (dpsArr.length > 0 && tagsArr.length > 0) { host +="{"; tagsArr.forEach((tag, i) => { - if (tag !== '__name__') { - host += `${tag}="${queryItem.metric[tag]}",`; - } - }); + if (tag !== '__name__') { + host += `${tag}="${queryItem.metric[tag]}",`; + } + + if (tag === 'asset') { + let labVal= `${queryItem.metric[tag]}`; + if(labVal!==''){ + charName += `(${queryItem.metric[tag]})`; + } + } + }); if(host.endsWith(',')){host = host.substr(0,host.length-1);} host +="}"; legend.push(host); + // 图表中每条线的名字,去掉最后的逗号与空格 seriesItem.theData.name = host; + seriesItem.theData.chartTitle =charName; seriesItem.metric_name = seriesItem.theData.name; // 将秒改为毫秒 seriesItem.theData.data = queryItem.values.map(dpsItem => @@ -331,7 +342,7 @@ export default { series.forEach((serieData, index) => { // 设置每个图表名称 const chartInfoParams = Object.assign({}, chartItem); - chartInfoParams.title = serieData.name; + chartInfoParams.title = serieData.chartTitle; this.$refs.editChartMultiple[index] .setData(chartInfoParams, [serieData], 0, filterParams,[legend[index]]); }); diff --git a/nezha-fronted/src/components/page/dashboard/panel.vue b/nezha-fronted/src/components/page/dashboard/panel.vue index c9a678209..9d47eafd4 100644 --- a/nezha-fronted/src/components/page/dashboard/panel.vue +++ b/nezha-fronted/src/components/page/dashboard/panel.vue @@ -154,6 +154,7 @@
@@ -377,6 +378,11 @@ panelReload(){ this.getTableData(); }, + refreshTime(st,et){ + const startTime = bus.timeFormate(st, 'yyyy-MM-dd hh:mm'); + const endTime = bus.timeFormate(et, 'yyyy-MM-dd hh:mm'); + this.searchTime = [startTime, endTime]; + }, panelReloadForDel:function(){ if(this.showPanel.id===this.panel.id){ this.showPanel.id ='';