feat:新功能

1 tooltip颜色随机产生
fix:修改问题
1 x轴时间优化显示
2 面积图,透明度调整为0.3
3 点击1个legend,剩余的tooltip不对
4 新增chart:panel显示当前页面的panel,对齐输入框,chart name名字修改
5 chart错误信息参考grafana修改(进行中)
This commit is contained in:
hyx
2020-04-21 20:59:58 +08:00
parent e5516b06b5
commit 00d662327c
14 changed files with 156 additions and 39 deletions

View File

@@ -20,6 +20,9 @@ Created by iconfont
/> />
<missing-glyph /> <missing-glyph />
<glyph glyph-name="warning" unicode="&#58928;" d="M575.667042 768.018164c0 35.051307-28.199249 63.502289-63.147202 63.940264-0.173962 0.008186-0.349971 0.020466-0.51984 0.020466-0.036839 0-0.076748-0.004093-0.11461-0.004093-0.060375 0-0.118704 0.004093-0.179079 0.004093-35.32453 0-63.960731-28.636201-63.960731-63.96073 0-2.503007 0.159636-4.968152 0.438999-7.396458l31.835056-536.268729c0-17.662265 14.3181-31.980365 31.980365-31.980366 17.662265 0 31.980365 14.3181 31.980365 31.980366l31.262005 536.385386c0.271176 2.390443 0.424672 4.816702 0.424672 7.279801zM511.706311 64.45115m-63.960731 0a63.960731 63.960731 0 1 1 127.921462 0 63.960731 63.960731 0 1 1-127.921462 0Z" horiz-adv-x="1024" />
<glyph glyph-name="push-pin-line" unicode="&#59217;" d="M768 768v-85.333333h-42.666667v-256l85.333334-128v-85.333334h-256v-298.666666h-85.333334v298.666666H213.333333v85.333334l85.333334 128V682.666667H256V768h512zM384 682.666667v-281.856L315.904 298.666667h392.192L640 400.810667V682.666667H384z" horiz-adv-x="1024" /> <glyph glyph-name="push-pin-line" unicode="&#59217;" d="M768 768v-85.333333h-42.666667v-256l85.333334-128v-85.333334h-256v-298.666666h-85.333334v298.666666H213.333333v85.333334l85.333334 128V682.666667H256V768h512zM384 682.666667v-281.856L315.904 298.666667h392.192L640 400.810667V682.666667H384z" horiz-adv-x="1024" />

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because one or more lines are too long

View File

@@ -597,15 +597,16 @@ export default {
smooth:true, //曲线变平滑 smooth:true, //曲线变平滑
data: [], data: [],
type:chartInfo.type, type:chartInfo.type,
},
//visible: true, //visible: true,
//threshold: null, //threshold: null,
},
metric_name: '', metric_name: '',
}; };
if(chartInfo.type === 'stackArea'){ if(chartInfo.type === 'stackArea'){
seriesItem.theData.type='line'; seriesItem.theData.type='line';
seriesItem.theData.stack=chartInfo.title; seriesItem.theData.stack=chartInfo.title;
seriesItem.theData.areaStyle={}; seriesItem.theData.areaStyle={"opacity": 0.3};
} }
// 图表中每条线的名字,后半部分 // 图表中每条线的名字,后半部分
let host = '';//up, let host = '';//up,

View File

@@ -95,7 +95,7 @@
import bus from '../../libs/bus'; import bus from '../../libs/bus';
import loading from "../common/loading"; import loading from "../common/loading";
import chartDataFormat from './chartDataFormat' import chartDataFormat from './chartDataFormat'
//import {randomcolor} from '../common/js/radomcolor/randomcolor.js' import {randomcolor} from '../common/js/radomcolor/randomcolor.js'
export default { export default {
name: 'chartPreview', name: 'chartPreview',
@@ -405,7 +405,7 @@ console.log('=======',this.chart);
if(chartItem.type === 'stackArea'){ if(chartItem.type === 'stackArea'){
seriesItem.theData.type='line'; seriesItem.theData.type='line';
seriesItem.theData.stack=chartItem.title; seriesItem.theData.stack=chartItem.title;
seriesItem.theData.areaStyle={}; seriesItem.theData.areaStyle={"opacity": 0.3};
} }
// 图表中每条线的名字,后半部分 // 图表中每条线的名字,后半部分
let host = '';//up, let host = '';//up,
@@ -588,6 +588,15 @@ console.log('=======',this.chart);
// chartSite用于区分是全屏显示还是局部显示 // chartSite用于区分是全屏显示还是局部显示
initChart(chartInfo, dataArg, ele,legend) { initChart(chartInfo, dataArg, ele,legend) {
const self = this; const self = this;
let minTime = null;
let maxTime = null
if(dataArg.length>0 && dataArg[0].data
&& dataArg[0].data.length>0 && dataArg[0].data[0].length>0){
let len = dataArg[0].data.length-1;
minTime = dataArg[0].data[0][0];
maxTime = dataArg[0].data[len][0];
//console.log('time==========',minTime,maxTime)
}
this.chartType = ''; // 图表类型 this.chartType = ''; // 图表类型
if ( chartInfo.type === 4) {//line,bar if ( chartInfo.type === 4) {//line,bar
this.chartType = 'line'; this.chartType = 'line';
@@ -670,7 +679,8 @@ console.log('=======',this.chart);
//let tip=legend.find((element)=>{ //let tip=legend.find((element)=>{
//return element.name == item.seriesName; //return element.name == item.seriesName;
//}); //});
let tip=legend[i]; let tip=legend[item.seriesIndex];
let color = self.bgColorList[item.seriesIndex];
if(i===0){ if(i===0){
let t_date = new Date(item.data[0]); let t_date = new Date(item.data[0]);
str += [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('-') + " " str += [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('-') + " "
@@ -682,7 +692,7 @@ console.log('=======',this.chart);
val = Number(item.data[1]); val = Number(item.data[1]);
} }
str += `<div style="white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display: flex; justify-content: space-between; min-width: 150px; max-width: 600px; line-height: 18px; font-size: 12px;">`; str += `<div style="white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;display: flex; justify-content: space-between; min-width: 150px; max-width: 600px; line-height: 18px; font-size: 12px;">`;
str += `<div style="max-width: 500px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;"><span style='display:inline-block;margin-right:5px;border-radius:10px;width:15px;height:5px;background-color: ${item.color};}'></span>${tip?(tip.alias?tip.alias:tip.name):item.seriesName} </div>`; str += `<div style="max-width: 500px;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis;"><span style='display:inline-block;margin-right:5px;border-radius:10px;width:15px;height:5px;background-color: ${color};}'></span>${tip?(tip.alias?tip.alias:tip.name):item.seriesName} </div>`;
str += `<div style="padding-left: 10px;">`; str += `<div style="padding-left: 10px;">`;
str += chartDataFormat.getUnit(chartInfo.unit?chartInfo.unit:2).compute(val,null,2); str += chartDataFormat.getUnit(chartInfo.unit?chartInfo.unit:2).compute(val,null,2);
str += `</div>`; str += `</div>`;
@@ -774,9 +784,27 @@ console.log('=======',this.chart);
intervale: 0, intervale: 0,
rotate: 0, rotate: 0,
formatter: function (value) { formatter: function (value) {
var t_date = new Date(value); value = bus.computeTimezone(value);
return [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('-') + "\n" let t_date = new Date(value);
+ [t_date.getHours(), t_date.getMinutes()].join(':'); let hour = t_date.getHours();
hour=hour>9?hour:"0"+hour; //加0补充为两位数字
let minute = t_date.getMinutes();
minute=minute>9?minute:"0"+minute; //如果分钟小于10,则在前面加0补充为两位数字
if(minTime!==null && maxTime!==null){
let diffSec = (maxTime-minTime)/1000;
let secOneDay = 24*60*60;//1天的秒数
let secOneMonth = secOneDay*30;//30天的秒数
if(diffSec<=secOneDay) {//同一天
return [hour,minute ].join(':');
}else if(diffSec<secOneMonth){//大于1天小于30天
return [t_date.getMonth() + 1, t_date.getDate()].join('/') +" "+ [hour, minute].join(':');
}else {//大于等于30天
return [t_date.getMonth() + 1, t_date.getDate()].join('/');
}
}else {
return [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('/') + "\n"
+ [hour, minute].join(':');
}
} }
}, },
axisPointer: {//y轴上显示指针对应的值 axisPointer: {//y轴上显示指针对应的值
@@ -865,7 +893,7 @@ console.log('=======',this.chart);
}, },
// 设置数据 // 设置数据
setData(chartItem, seriesItem,legend) { setData(chartItem, seriesItem,legend) {
//this.setColor(legend.length); this.setColor(legend.length);
this.legend = legend; this.legend = legend;
//this.data = chartItem; //this.data = chartItem;
//this.seriesItem = seriesItem; //this.seriesItem = seriesItem;
@@ -987,7 +1015,7 @@ console.log('=======',this.chart);
if(this.chart.type === 'stackArea'){ if(this.chart.type === 'stackArea'){
seriesItem.theData.type='line'; seriesItem.theData.type='line';
seriesItem.theData.stack=this.chart.title; seriesItem.theData.stack=this.chart.title;
seriesItem.theData.areaStyle={}; seriesItem.theData.areaStyle={"opacity": 0.3};
} }
// 图表中每条线的名字,后半部分 // 图表中每条线的名字,后半部分
// let host = `${queryItem.metric.__name__}{`;//up, // let host = `${queryItem.metric.__name__}{`;//up,

View File

@@ -112,6 +112,49 @@
text-align: center; text-align: center;
width: 100%; width: 100%;
line-height: 28px; line-height: 28px;
.panel-info-corner {
color: #767980;
cursor: pointer;
position: absolute;
display: none;
left: 0;
width: 28px;
height: 28px;
z-index: 2;
top: 0;
}
.panel-info-corner--error {
display: block;
color: #fff;
}
.panel-info-corner .fa {
position: relative;
top: -6px;
left: -6px;
font-size: 75%;
z-index: 3;
}
.fa {
display: inline-block;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
}
.panel-info-corner--error .panel-info-corner-inner {
border-left: 28px solid #e02f44;
border-right: none;
border-bottom: 28px solid rgba(0,0,0,0);
}
.panel-info-corner-inner {
width: 0;
height: 0;
position: absolute;
left: 0;
bottom: 0;
}
.chart-error-popper{
background-color:#e02f44;
}
.nz-chart-top{ .nz-chart-top{
width:100%; width:100%;
} }

View File

@@ -24,7 +24,18 @@
</div>--> </div>-->
<div class="clearfix chartTitle" :id="'chartTitle'+chartIndex" > <div class="clearfix chartTitle" :id="'chartTitle'+chartIndex" >
<el-popover
v-if="isError"
placement="top-start"
width="200"
popper-class="chart-error-popper"
trigger="hover"
content="。。">
<span slot="reference" style="" class="panel-info-corner panel-info-corner--error">
<i class="nz-icon nz-icon-warning fa"></i>
<span class="panel-info-corner-inner"></span>
</span>
</el-popover>
<el-dropdown trigger="click" v-show="firstShow" class="nz-chart-top" :key="'chartDropdown'+chartIndex" v-clickoutside="clickos"> <el-dropdown trigger="click" v-show="firstShow" class="nz-chart-top" :key="'chartDropdown'+chartIndex" v-clickoutside="clickos">
<el-dropdown-menu style="display: none"></el-dropdown-menu> <el-dropdown-menu style="display: none"></el-dropdown-menu>
<span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow"> <span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow">
@@ -121,7 +132,7 @@
import bus from '../../libs/bus'; import bus from '../../libs/bus';
import loading from "../common/loading"; import loading from "../common/loading";
import chartDataFormat from './chartDataFormat' import chartDataFormat from './chartDataFormat'
//import {randomcolor} from '../common/js/radomcolor/randomcolor.js' import {randomcolor} from '../common/js/radomcolor/randomcolor.js'
export default { export default {
name: 'lineChartBlock', name: 'lineChartBlock',
@@ -158,6 +169,7 @@
seriesItem: [], // 保存信息 seriesItem: [], // 保存信息
seriesItemScreen:[], seriesItemScreen:[],
images: '', images: '',
isError:false,
toolbox: false, toolbox: false,
items: { items: {
metric_name: [], // 每条数据列名称 metric_name: [], // 每条数据列名称
@@ -635,8 +647,14 @@
if ( chartInfo.type === 4) {//line,bar if ( chartInfo.type === 4) {//line,bar
this.chartType = 'line'; this.chartType = 'line';
} }
//let chartId = ''; let minTime = null;
let maxTime = null
if(dataArg.length>0 && dataArg[0].data
&& dataArg[0].data.length>0 && dataArg[0].data[0].length>0){
let len = dataArg[0].data.length-1;
minTime = dataArg[0].data[0][0];
maxTime = dataArg[0].data[len][0];
}
if (chartSite === 'local') { if (chartSite === 'local') {
this.echartStore = echarts.init(ele); this.echartStore = echarts.init(ele);
//chartId='lineChartArea'; //chartId='lineChartArea';
@@ -751,8 +769,8 @@
//alert('legend====='+JSON.stringify(element)) //alert('legend====='+JSON.stringify(element))
//return element.name == item.seriesName; //return element.name == item.seriesName;
//}); //});
let tip=legend[i]; let tip=legend[item.seriesIndex];
let color = self.bgColorList[i]; let color = self.bgColorList[item.seriesIndex];
if(i===0){ if(i===0){
let value=bus.computeTimezone(item.data[0]); let value=bus.computeTimezone(item.data[0]);
let t_date = new Date(value); let t_date = new Date(value);
@@ -865,9 +883,27 @@
rotate: 0, rotate: 0,
formatter: function (value) { formatter: function (value) {
value = bus.computeTimezone(value); value = bus.computeTimezone(value);
var t_date = new Date(value); let t_date = new Date(value);
return [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('-') + "\n" let hour = t_date.getHours();
+ [t_date.getHours(), t_date.getMinutes()].join(':'); hour=hour>9?hour:"0"+hour; //加0补充为两位数字
let minute = t_date.getMinutes();
minute=minute>9?minute:"0"+minute; //如果分钟小于10,则在前面加0补充为两位数字
if(minTime!==null && maxTime!==null){
let diffSec = (maxTime-minTime)/1000;
let secOneDay = 24*60*60;//1天的秒数
let secOneMonth = secOneDay*30;//30天的秒数
if(diffSec<=secOneDay) {//同一天
return [hour,minute ].join(':');
}else if(diffSec<secOneMonth){//大于1天小于30天
return [t_date.getMonth() + 1, t_date.getDate()].join('/') +" "+ [hour, minute].join(':');
}else {//大于等于30天
return [t_date.getMonth() + 1, t_date.getDate()].join('/');
}
}else {
return [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('/') + "\n"
+ [hour, minute].join(':');
}
} }
}, },
axisPointer: {//y轴上显示指针对应的值 axisPointer: {//y轴上显示指针对应的值
@@ -1125,12 +1161,12 @@
setColor(colorNum){ setColor(colorNum){
this.bgColorList = []; this.bgColorList = [];
for(let i=0;i<colorNum;i++) { for(let i=0;i<colorNum;i++) {
//this.bgColorList.push(randomcolor()) this.bgColorList.push(randomcolor())
} }
}, },
// 设置数据, filter区分 // 设置数据, filter区分
setData(chartItem, seriesItem, panelId, filter,legend,area) { setData(chartItem, seriesItem, panelId, filter,legend,area) {
//this.setColor(legend.length); this.setColor(legend.length);
if(area==='showFullScreen'){//全屏按时间查询 if(area==='showFullScreen'){//全屏按时间查询
/* /*
this.legend = legend; this.legend = legend;
@@ -1319,7 +1355,7 @@
if(this.data.type === 'stackArea'){ if(this.data.type === 'stackArea'){
seriesItem.theData.type='line'; seriesItem.theData.type='line';
seriesItem.theData.stack=this.data.title; seriesItem.theData.stack=this.data.title;
seriesItem.theData.areaStyle={}; seriesItem.theData.areaStyle={"opacity": 0.3};
} }
// 图表中每条线的名字,后半部分 // 图表中每条线的名字,后半部分
// let host = `${queryItem.metric.__name__}{`;//up, // let host = `${queryItem.metric.__name__}{`;//up,

View File

@@ -114,7 +114,7 @@ const en = {
editChartTitle: 'Edit',//"编辑图表" editChartTitle: 'Edit',//"编辑图表"
chartForm:{ chartForm:{
chartId:"ID", chartId:"ID",
chartName:"Chart n", chartName:"Chart Name",
type:"Type", type:"Type",
unit:"Unit", unit:"Unit",
url:"URL", url:"URL",

View File

@@ -117,7 +117,7 @@
<el-col :span="2" > <el-col :span="2" >
<div class="label-center" >{{$t('dashboard.panel.chartForm.type')}}</div> <div class="label-center" >{{$t('dashboard.panel.chartForm.type')}}</div>
</el-col> </el-col>
<el-col :span="10" style="margin-left:-7px;"> <el-col :span="10" >
<div class="grid-content "> <div class="grid-content ">
<el-form-item prop="type"> <el-form-item prop="type">
<el-select class="right-box-row-with-btn" @change="chartTypeChange" value-key="chartType" popper-class="chart-box-dropdown-mini" v-model="chart.type" placeholder="" size="mini"> <el-select class="right-box-row-with-btn" @change="chartTypeChange" value-key="chartType" popper-class="chart-box-dropdown-mini" v-model="chart.type" placeholder="" size="mini">
@@ -128,7 +128,7 @@
</el-form-item> </el-form-item>
</div> </div>
</el-col> </el-col>
<el-col v-show="!isUrl" :span="2" style="margin-left: 7px"> <el-col v-show="!isUrl" :span="2" >
<div class="label-center" >{{$t('dashboard.panel.chartForm.unit')}}</div> <div class="label-center" >{{$t('dashboard.panel.chartForm.unit')}}</div>
</el-col> </el-col>
<el-col v-show="!isUrl" :span="10"> <el-col v-show="!isUrl" :span="10">
@@ -148,7 +148,7 @@
<el-col :span="2" > <el-col :span="2" >
<div class="label-center" >{{$t('dashboard.panel.chartForm.width')}}</div> <div class="label-center" >{{$t('dashboard.panel.chartForm.width')}}</div>
</el-col> </el-col>
<el-col :span="10" style="margin-left:0px;"> <el-col :span="10" >
<div class="grid-content "> <div class="grid-content ">
<el-form-item prop="span"> <el-form-item prop="span">
<el-select class="right-box-row-with-btn" value-key="chartSpan" popper-class="chart-box-dropdown-mini" v-model="chart.span" placeholder="" size="mini"> <el-select class="right-box-row-with-btn" value-key="chartSpan" popper-class="chart-box-dropdown-mini" v-model="chart.span" placeholder="" size="mini">
@@ -162,7 +162,7 @@
<el-col :span="2" > <el-col :span="2" >
<div class="label-center" >{{$t('dashboard.panel.chartForm.high')}}</div> <div class="label-center" >{{$t('dashboard.panel.chartForm.high')}}</div>
</el-col> </el-col>
<el-col :span="10" style="margin-left: 0px;"> <el-col :span="10" >
<div class="grid-content" > <div class="grid-content" >
<el-form-item prop="height"> <el-form-item prop="height">
<!-- <el-input label="" v-model="chart.height" placeholder="" size="mini"></el-input>--> <!-- <el-input label="" v-model="chart.height" placeholder="" size="mini"></el-input>-->
@@ -238,7 +238,8 @@
export default { export default {
name: "chartBox", name: "chartBox",
props: { props: {
panelData: Array panelData: Array,
showPanel:{}
}, },
data() { data() {
return { return {
@@ -325,6 +326,7 @@
}, },
methods: { methods: {
show(show) { show(show) {
this.panelName2 = this.showPanel.name;
this.rightBox.show = show; this.rightBox.show = show;
this.isUrl = false; this.isUrl = false;
}, },

View File

@@ -96,7 +96,7 @@
</left-menu> </left-menu>
<panel-box :panel="panel" @reload="panelReload" @reloadForDel="panelReloadForDel" ref="panelBox"></panel-box> <panel-box :panel="panel" @reload="panelReload" @reloadForDel="panelReloadForDel" ref="panelBox"></panel-box>
<chart-box ref="addChartModal" :panel-data="panelData" @reload="panelReload" @on-create-success="createSuccess" @on-delete-success="delChartOk" @reloadOnlyPanel="panelReloadOnlyPanel"></chart-box> <chart-box ref="addChartModal" :showPanel="showPanel" :panel-data="panelData" @reload="panelReload" @on-create-success="createSuccess" @on-delete-success="delChartOk" @reloadOnlyPanel="panelReloadOnlyPanel"></chart-box>
</div> </div>
</template> </template>