perf:panel页面后台报错问题修复 & chart组件调整

This commit is contained in:
wangwenrui
2020-04-21 19:28:01 +08:00
parent fbde688ddd
commit f1bc850526
10 changed files with 804 additions and 81 deletions

View File

@@ -20,6 +20,7 @@
<div class="clearfix chartTitle" :class="{'dragTitle':dragTitleShow}" :id="'chartTitle'+chartIndex"> <div class="clearfix chartTitle" :class="{'dragTitle':dragTitleShow}" :id="'chartTitle'+chartIndex">
<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>
<span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow"> <span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow">
<span class="chart-title-text">{{data.title}}</span> <span class="chart-title-text">{{data.title}}</span>
<span class="chart-title-icon"><i class="el-icon-caret-bottom el-icon--right" :class="{'visible':caretShow,'hidden':!caretShow}"></i></span> <span class="chart-title-icon"><i class="el-icon-caret-bottom el-icon--right" :class="{'visible':caretShow,'hidden':!caretShow}"></i></span>

View File

@@ -13,6 +13,7 @@
<div class="clearfix chartTitle" :class="{'dragTitle':dragTitleShow}" :id="'chartTitle'+chartIndex"> <div class="clearfix chartTitle" :class="{'dragTitle':dragTitleShow}" :id="'chartTitle'+chartIndex">
<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>
<span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow"> <span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow">
<span class="chart-title-text">{{data.title}}</span> <span class="chart-title-text">{{data.title}}</span>
<span class="chart-title-icon"><i class="el-icon-caret-bottom el-icon--right" :class="{'visible':caretShow,'hidden':!caretShow}"></i></span> <span class="chart-title-icon"><i class="el-icon-caret-bottom el-icon--right" :class="{'visible':caretShow,'hidden':!caretShow}"></i></span>

View File

@@ -26,6 +26,7 @@
<div class="clearfix chartTitle" :id="'chartTitle'+chartIndex" > <div class="clearfix chartTitle" :id="'chartTitle'+chartIndex" >
<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>
<span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow"> <span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow">
<span class="chart-title-text">{{data.title}}</span> <span class="chart-title-text">{{data.title}}</span>
<span class="chart-title-icon"><i class="el-icon-caret-bottom el-icon--right" :class="{'visible':caretShow,'hidden':!caretShow}"></i></span> <span class="chart-title-icon"><i class="el-icon-caret-bottom el-icon--right" :class="{'visible':caretShow,'hidden':!caretShow}"></i></span>

View File

@@ -0,0 +1,106 @@
var EleResize = {
_handleResize: function (e) {
var ele = e.target || e.srcElement;
var trigger = ele.__resizeTrigger__;
if (trigger) {
var handlers = trigger.__z_resizeListeners;
if (handlers) {
var size = handlers.length;
for (var i = 0; i < size; i++) {
var h = handlers[i];
var handler = h.handler;
var context = h.context;
handler.apply(context, [e]);
}
}
}
},
_removeHandler: function (ele, handler, context) {
var handlers = ele.__z_resizeListeners;
if (handlers) {
var size = handlers.length;
for (var i = 0; i < size; i++) {
var h = handlers[i];
if (h.handler === handler && h.context === context) {
handlers.splice(i, 1);
return;
}
}
}
},
_createResizeTrigger: function (ele) {
var obj = document.createElement('object');
obj.setAttribute('style',
'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;');
obj.onload = EleResize._handleObjectLoad;
obj.type = 'text/html';
ele.appendChild(obj);
obj.data = 'about:blank';
return obj;
},
_handleObjectLoad: function (evt) {
this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize);
}
};
if (document.attachEvent) {//ie9-10
EleResize.on = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners;
if (!handlers) {
handlers = [];
ele.__z_resizeListeners = handlers;
ele.__resizeTrigger__ = ele;
ele.attachEvent('onresize', EleResize._handleResize);
}
handlers.push({
handler: handler,
context: context
});
};
EleResize.off = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners;
if (handlers) {
EleResize._removeHandler(ele, handler, context);
if (handlers.length === 0) {
ele.detachEvent('onresize', EleResize._handleResize);
delete ele.__z_resizeListeners;
}
}
}
} else {
EleResize.on = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners;
if (!handlers) {
handlers = [];
ele.__z_resizeListeners = handlers;
if (getComputedStyle(ele, null).position === 'static') {
ele.style.position = 'relative';
}
var obj = EleResize._createResizeTrigger(ele);
ele.__resizeTrigger__ = obj;
obj.__resizeElement__ = ele;
}
handlers.push({
handler: handler,
context: context
});
};
EleResize.off = function (ele, handler, context) {
var handlers = ele.__z_resizeListeners;
if (handlers) {
EleResize._removeHandler(ele, handler, context);
if (handlers.length === 0) {
var trigger = ele.__resizeTrigger__;
if (trigger) {
trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize);
ele.removeChild(trigger);
delete ele.__resizeTrigger__;
}
delete ele.__z_resizeListeners;
}
}
}
}
export default EleResize;

View File

@@ -58,7 +58,7 @@ export default {
localStorage.setItem('nz-sys-timezone',res.data.timezone); localStorage.setItem('nz-sys-timezone',res.data.timezone);
localStorage.setItem('nz-sys-default-cabinet-usize',res.data.defaultCabinetUsize); localStorage.setItem('nz-sys-default-cabinet-usize',res.data.defaultCabinetUsize);
localStorage.setItem('nz-sys-max-terminal-num',res.data.maxTerminalNum); localStorage.setItem('nz-sys-max-terminal-num',res.data.maxTerminalNum);
localStorage.setItem('nz-sys-asset-ping-switch',res.data.assetPingSwith); localStorage.setItem('nz-sys-asset-ping-switch',res.data.assetPingSwitch);
this.$i18n.locale = this.lang; this.$i18n.locale = this.lang;
bus.$emit('login'); bus.$emit('login');
this.$router.push({ this.$router.push({

View File

@@ -0,0 +1,296 @@
<template>
<div class="explore">
<left-menu >
<div slot="content-left" class="slot-content">
<div class="sidebar-title">{{$t('dashboard.title')}}</div>
<div class="sidebar-info">
<div class="sidebar-info-item " @click="jumpTo('overview')">{{$t('dashboard.overview.title')}}</div>
<div class="sidebar-info-item" @click="jumpTo('panel')">{{$t('dashboard.panel.title')}}</div>
<div class="sidebar-info-item" @click="jumpTo('metricPreview')">{{$t('dashboard.metricPreview.title')}}</div>
<div class="sidebar-info-item sidebar-info-item-active" >{{$t('dashboard.metricPreview.title')}}</div>
</div>
</div>
<div slot="content-right" class="slot-content">
<div class="main-list main-and-sub-transition" >
<!-- 顶部工具栏 -->
<div class="top-tools" >
<div class="nz-btn-group nz-btn-group-size-normal nz-btn-group-light margin-r-20">
<button style="border-right: 1px solid rgba(162,162,162,0.50);" type="button"
class="nz-btn nz-btn-size-normal nz-btn-style-light" @click="Refresh()">
<i style="font-size: 12px" class="global-active-color nz-icon nz-icon-refresh"></i>
</button><el-popover
v-model="visible" placement="bottom-start" width="200" trigger="click">
<ul class="popover_ul">
<li v-for="i in intervalList" :style="{color:interval==i.value?'#31749C':''}" :key="i.value+i.name"
@click="selectInterval(i.value)">
{{i.name}}
</li>
</ul>
<button type="button" style="border-radius: 0 4px 4px 0" class="nz-btn nz-btn-size-normal nz-btn-style-light" slot="reference">
<i style="font-size: 12px" class="nz-icon nz-icon-arrow-down"></i>
</button>
</el-popover>
</div>
<el-date-picker size="mini" ref="calendar"
format="yyyy/MM/dd HH:mm"
@change="dateChange"
v-model="searchTime"
type="datetimerange"
:picker-options="pickerOptions"
:range-separator="$t('dashboard.panel.to')"
:start-placeholder="$t('dashboard.panel.startTime')"
:end-placeholder="$t('dashboard.panel.endTime')"
style="margin-right: 20px"
align="right">
</el-date-picker>
</div>
<div class="expression-room">
<promql-input
v-for="index of promqlCount"
:key="expressions[index]"
:expression-list="expressions"
:index="index"
@change="expressionChange"
@addExpression="addExpression"
@removeExpression="removeExpression"
></promql-input>
</div>
<div class="chart-room" style="width: 100%;height: 500px">
<chart ref="exploreChart"></chart>
</div>
<div class="table-room">table</div>
</div>
</div>
</left-menu>
</div>
</template>
<script>
import bus from "../../../../libs/bus";
import promqlInput from "./promqlInput";
import chart from "../overview/chart";
import axios from 'axios'
import chartDataFormat from "../../../charts/chartDataFormat";
export default {
name: "explore",
components:{
'promql-input':promqlInput,
'chart':chart,
},
data(){
return{
promqlCount:1,
expressions:[''],
searchTime:[new Date().setHours(new Date().getHours() -1),new Date()],
filterTime:{},
visible:false,
intervalList: [{
value: 0,
name: this.$t("dashboard.panel.refreshInterval.never"),
}, {
value: 60,
name: this.$t("dashboard.panel.refreshInterval.oneMinute"),
}, {
value: 180,
name: this.$t("dashboard.panel.refreshInterval.threeMinutes"),
}, {
value: 300,
name: this.$t("dashboard.panel.refreshInterval.fiveMinutes"),
}, {
value: 600,
name: this.$t("dashboard.panel.refreshInterval.tenMinutes"),
}],
interval: 0,
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]);
}
}],
},
}
},
created(){
this.filterTime.startTime=bus.timeFormate(this.searchTime[0], 'yyyy-MM-dd hh:mm:ss');
this.filterTime.endTime=bus.timeFormate(this.searchTime[1], 'yyyy-MM-dd hh:mm:ss');
},
methods:{
queryChartData:function(){
setTimeout(()=>{
if(this.expressions.length>0){
let requestArr=[];
this.expressions.forEach((item,index)=>{
if(item != ''){
requestArr.push(axios.get('/prom/api/v1/query_range?query='+item+'&start='+this.filterTime.startTime+'&end='+this.filterTime.endTime+'&step=15'))
}
})
axios.all(requestArr).then(res=>{
if(res.length>0){
let series=[];
let legend=[];
res.forEach((response,index)=>{
if(response.data.status == 'success'){
let data=response.data.data.result;
data.forEach((result,index)=>{
let seriesItem={
name: '',
symbol:'none', //去掉点
smooth:true, //曲线变平滑
data: [],
type:'line',
}
seriesItem.data=result.values.map((item)=>{
return [item[0]*1000,item[1]];
})
console.log(seriesItem);
let metric=Object.assign({},result.metric);
seriesItem.name+=metric.__name__+'{';
delete metric.__name__;
for (let key in metric){
seriesItem.name+=key+"="+'"'+metric[key]+'",';
}
seriesItem.name=seriesItem.name.substr(0,seriesItem.name.length-1);
seriesItem.name+="}";
series.push(seriesItem);
legend.push({name:seriesItem.name,alias:null,isGray:false});
})
}
})
this.$refs.exploreChart.setLegend(legend);
this.$refs.exploreChart.setSeries(series)
}
})
}
},200)
},
queryTableData:function(){
setTimeout(()=>{
if(this.expressions.length>0){
let requestArr=[];
this.expressions.forEach((item,index)=>{
if(item != ''){
requestArr.push(axios.get('/prom/api/v1/query?query='+item))
}
})
axios.all(requestArr).then(res=>{
res.forEach((response,index)=>{
// console.log(response);
})
})
}
},200)
},
expressionChange:function(){
this.queryTableData();
this.queryChartData()
},
addExpression:function(index){
this.expressions.splice(index+1,0,'');
this.promqlCount++;
},
removeExpression:function(index){
this.expressions.splice(index,1);
this.promqlCount--;
},
dateChange(time) {
this.filterTime.startTime=bus.timeFormate(time[0], 'yyyy-MM-dd hh:mm:ss');
this.filterTime.endTime=bus.timeFormate(time[1], 'yyyy-MM-dd hh:mm:ss');
},
jumpTo(data, id) {
bus.$emit("menu-change", data);
this.$router.push({
path: "/" + data,
query: {
t: +new Date()
}
});
},
},
watch:{
promqlCount:function(n,o){
this.expressionChange();
}
}
}
</script>
<style scoped>
.explore{
height: 100%;
}
</style>

View File

@@ -0,0 +1,192 @@
<template>
<div class="promqlInput">
<div class="query-row">
<div class="query-input">
<div class="metricBtn">
<el-dropdown class="metric-selector">
<el-dropdown-menu style="display: none"></el-dropdown-menu>
<el-button class="metric-btn" @click="toggleDropdown">Metric &nbsp;<i class="el-icon-arrow-down"></i></el-button>
<el-cascader-panel v-show="dropDownVisible" v-model="cascaderValue" slot="dropdown" ref="metricSelector" :props="{emitPath:false}" :options="metricOptions" @change="metricChange"></el-cascader-panel>
</el-dropdown>
</div>
<div class="inputBox">
<el-autocomplete :fetch-suggestions="filterInput" :trigger-on-focus="false" v-model="expressionList[index]" @blur="expressionChange" style="width: 100%"></el-autocomplete>
</div>
</div>
</div>
<div>
<div class="query-options">
<div class="option" @click="clearExpression"><i class="el-icon-close"></i></div>
<div class="option" @click="addExpression"><i class="el-icon-plus"></i></div>
<div class="option" @click="removeExpression"><i class="el-icon-minus"></i></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "promqlInput",
props:{
index:{type:Number},
expressionList:{}
},
data(){
return {
dropDownVisible:false,
metricStore:[],
metricOptions:[],
cascaderValue:'',
}
},
created() {
this.queryMetrics();
},
methods:{
clearExpression:function(){
this.expressionList[this.index]='';
},
addExpression:function(){
this.$emit('addExpression',this.index);
},
removeExpression:function(){
this.$emit('removeExpression',this.index);
},
toggleDropdown:function(){
this.dropDownVisible=!this.dropDownVisible;
if(this.dropDownVisible == true){
let $temp=this;
document.addEventListener('click',function(e){
e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
$temp.dropDownVisible=false;
},false)
this.$el.addEventListener('click',function(e){
e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
},false)
}
},
queryMetrics:function(){
this.metricOptions=[];
this.$get('prom/api/v1/label/__name__/values').then(response=>{
if(response.status == 'success'){
let metrics=response.data.sort();
let metricMap=new Map();
metrics.forEach((item)=>{
let key='';
if(/^[a-zA-Z]+?_[a-zA-Z]*/.test(item)){
key=item.split('_')[0];
}else if(/^_\w*/.test(item)){
key=' ';
}else{
key=item;
}
if(metricMap.get(key)){
let values=metricMap.get(key);
values.push({label:item,value:item});
}else{
let values=[{label:item,value:item}];
metricMap.set(key,values);
}
this.metricStore.push({label:item,value:item})
})
for(let key of metricMap.keys()){
let option={
label:key,
value:key,
}
if(metricMap.get(key) && metricMap.get(key).length>1){
option.children=metricMap.get(key);
}
this.metricOptions.push(option);
}
}
})
},
filterInput:function(queryString, cb){
let metrics=Object.assign([],this.metricStore);
let result=queryString?metrics.filter((item)=>{
return item.value.toLowerCase().indexOf(queryString.toLowerCase()) != -1;
}):metrics;
cb(result)
},
metricChange:function(value){
this.expressionList[this.index]=value;
this.dropDownVisible=false;
this.$emit('change')
},
expressionChange:function(){
this.$emit('change')
}
},
watch:{
dropDownVisible:function(n,o){
if(this.$refs.metricSelector){
this.$refs.metricSelector.dropDownVisible=n;
}
},
}
}
</script>
<style scoped>
.promqlInput{
position: relative;
height: 40px;
width: 100%;
display: flex;
margin-bottom: 10px;
}
.promqlInput .query-row{
width: 100%;
}
.query-row .query-input{
display: flex;
justify-content: flex-start;
}
.promqlInput .query-options{
display: flex;
justify-content: space-around;
width: 126px;
}
.query-options .option{
border-right: 1px solid #dde4ed;
border-radius: 3px;
background-color: #dde4ed;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
}
.query-options .option:focus,.query-options .option:hover{
background-color: #CCD7E4;
}
.query-input .metricBtn{
width: 100px;
margin-right: 10px;
}
.query-input .inputBox{
width: 100%;
}
.metric-btn{
background-color: #dde4ed;
}
.metric-btn:hover ,.metric-btn:focus {
background-color: #CCD7E4;
color:#606266;
}
.metric-selector .el-cascader-panel{
height: 300px;
position: absolute;
z-index: 2100;
background-color: #FFF;
}
</style>
<style>
.metric-selector-pop{
position:relative;
z-index: 2100;
}
</style>

View File

@@ -4,8 +4,14 @@
<div class="chart-header">{{chartTitle}}</div> <div class="chart-header">{{chartTitle}}</div>
<div class="chart-body" ref="chartBody" :id="chartId" style="height: 95%"></div> <div class="chart-body" ref="chartBody" :id="chartId" ></div>
<div class="legend-container" id="legendArea" ref="legendArea" v-show="legend.length>0" v-scrollBar:legend>
<div v-for="(item, index) in legend" :title="item.alias?item.alias:item.name" @click="clickLegend(item.name,index)" class="legend-item" :class="{'ft-gr':item.isGray}" :key="'legend_' + item.name+'_'+index">
<span class="legend-shape" :style="{background:(item.isGray?'#D3D3D3':getBgColor(index))}"></span>{{item.alias?item.alias:item.name}}
<br/>
</div>
</div>
</div> </div>
</template> </template>
@@ -16,6 +22,8 @@
import loading from "../../../common/loading"; import loading from "../../../common/loading";
import uuidv1 from "uuid/v1"; import uuidv1 from "uuid/v1";
import chartConfig from './chartConfig' import chartConfig from './chartConfig'
import bus from "../../../../libs/bus";
import EleResize from "../../../common/js/divResize";
export default { export default {
name: "chart", name: "chart",
components:{ components:{
@@ -24,6 +32,8 @@
props:{ props:{
chartTitle:{type:String}, chartTitle:{type:String},
chartType:{type:String,default:'line'}, chartType:{type:String,default:'line'},
tooltipFormatter:Function,
yAxisFormatter:Function,
map:{} map:{}
}, },
data(){ data(){
@@ -31,19 +41,23 @@
chart:null, chart:null,
option:{}, option:{},
chartId:new uuidv1()+'-'+new Date().getTime(), chartId:new uuidv1()+'-'+new Date().getTime(),
legend:[],
} }
}, },
created() { created() {
}, },
methods:{ methods:{
modifyOption:function(target,name,obj){ modifyOption:function(target,name,obj){
if(this.option){ if(this.option){
this.option=chartConfig.getOption(this.chartType); this.option=chartConfig.getOption(this.chartType);
} }
this.$set(this.option[target],name,obj) this.$set(this.option[target],name,obj)
}, },
setLegend:function(legend){
this.legend=legend;
this.resize();
},
setSeries:function(series){ setSeries:function(series){
if(!this.chart){ if(!this.chart){
this.chart=echarts.init(document.getElementById(this.chartId)); this.chart=echarts.init(document.getElementById(this.chartId));
@@ -61,21 +75,153 @@
if(this.option){ if(this.option){
this.option=chartConfig.getOption(this.chartType); this.option=chartConfig.getOption(this.chartType);
} }
this.modifyOption('tooltip','position',this.defaultTooltipPosition)
if (this.tooltipFormatter) {
this.modifyOption('tooltip', 'formatter', this.tooltipFormatter)
} else {
this.modifyOption('tooltip', 'formatter', this.defaultTooltipFormatter)
}
if(this.chartType == 'line'){
if(this.yAxisFormatter){
this.modifyOption('yAxis','formatter',this.yAxisFormatter)
}else{
this.modifyOption('yAxis','formatter',this.defaultYAxisFormatter)
}
}
this.$set(this.option,'series',this.series); this.$set(this.option,'series',this.series);
/*if(this.chartType == 'line'){
this.$set(this.option.tooltip,'formatter',this.tooltipFormatter);
this.$set(this.option.tooltip,'position',this.tooltipPosition);
this.$set(this.option.yAxis,'formatter',this.yAxisFormatter);
}*/
this.chart.clear(); this.chart.clear();
this.chart.setOption(this.option) this.chart.setOption(this.option)
this.resize();
}, },
resizeChart:function(width,height){ resizeChart:function(width,height){
if(this.chart){ if(this.chart){
this.chart.resize({width:width,height:height}); this.chart.resize({width:width,height:height});
} }
}, },
resize:function(){
if(this.chart){
let height=this.$el.clientHeight ;
let width=this.$el.clientWidth;
if(this.chartTitle){
height = height - 20;
}
if(this.legend && this.legend.length>0){
height = height - 80;
}
this.chart.resize({width:width,height:height});
}
},
getBgColor:function(index){
let color=chartConfig.getBgColorList()[index];
return color;
},
clickLegend(legendName,index){
let curIsGrey=this.legend[index].isGray;
if(this.chart){
this.legend.forEach((item,i)=>{
let isGrey = item.isGray;
if(index != i){ //不是当前点击的
if(!curIsGrey && !isGrey){
this.chart.dispatchAction({
type: 'legendUnSelect',
name: item.name
});
item.isGray=true;
}else if(!curIsGrey && isGrey){
this.chart.dispatchAction({
type: 'legendSelect',
name: item.name
});
item.isGray=false;
}else{
this.chart.dispatchAction({
type: 'legendUnSelect',
name: item.name
});
item.isGray=true
}
}else {//当前点击的
this.chart.dispatchAction({
type: 'legendSelect',
name: item.name
});
if(item.isGray === true){
item.isGray = false;
}
}
});
}
},
defaultTooltipPosition:function(point,params,dom,rect,size){
dom.style.transform = "translateZ(0)";
//提示框位置
var x=0;
var y=0;
//当前鼠标位置
var pointX = point[0];
var pointY = point[1];
//外层div大小
var viewWidth = size.viewSize[0];
var viewHeight = size.viewSize[1];
//提示框大小
var boxWidth = size.contentSize[0];
var boxHeight = size.contentSize[1];
let chartDom = document.getElementById(this.chartId);
if(chartDom){
let parTop = chartDom.offsetTop;
let parLeft = chartDom.offsetLeft;
let parent = chartDom.parentElement;
let parClientHeight = parent.clientHeight;//可视高度
let parClientWidth = parent.clientWidth;//可视宽度
let parScrollTop = parent.scrollTop;
if((parClientWidth-pointX-parLeft-20)>=boxWidth){//说明鼠标在左边放不下提示框
x=pointX+10;
}else{
x = pointX - boxWidth;
}
if((parClientHeight-pointY-(parTop-parScrollTop)-20)>=boxHeight){//说明鼠标上面放不下提示框
y = pointY+10;
}else {
y = pointY-boxHeight;
}
return [x,y];
}else {
x = pointX - boxWidth;
y = pointY+10;
return [x,y];
}
},
defaultTooltipFormatter:function(params){
let str = `<div>`;
params.forEach((item, i) => {
if(i===0){
let value=bus.computeTimezone(item.data[0])
let t_date = new Date(value);
str += [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('-') + " "
+ [t_date.getHours(), t_date.getMinutes(),t_date.getSeconds()].join(':');
str +=`<br/>`;
}
let 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="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>${item.seriesName}: </div>`;
str += `<div style="padding-left: 10px;">`;
str += chartDataFormat.getUnit(5).compute(val,null,2);
str += `</div>`;
str += `</div>`;
});
str +=`</div>`;
return str;
},
defaultYAxisFormatter:function(value,index){
let unit=chartDataFormat.getUnit(5);
return unit.compute(value,index);
},
startLoading:function(){ startLoading:function(){
this.$refs.loading.startLoading(); this.$refs.loading.startLoading();
}, },
@@ -85,6 +231,7 @@
}, },
mounted() { mounted() {
this.chart=echarts.init(document.getElementById(this.chartId)); this.chart=echarts.init(document.getElementById(this.chartId));
EleResize.on(this.$el,this.resize);
}, },
watch:{ watch:{
@@ -98,9 +245,41 @@
</script> </script>
<style scoped> <style scoped>
.chart-room{ .chart-room{
width: 95%; width: 95%;
height: 100%; height: 100%;
position: relative; position: relative;
} }
.chart-room .legend-container{
width: calc(100% - 30px);
/*max-height:80px;*/
/*min-height:40px;*/
height: 80px;
font-size:12px;
text-align:left;
margin:0 auto;
line-height: 18px;
position: relative;
}
.chart-room .legend-container .legend-item{
text-overflow:ellipsis;
white-space:nowrap;
width:100%;
overflow-x:hidden;
cursor:pointer;
display:inline-block;
float:left;
line-height: 20px;
}
.chart-room .ft-gr{
color:lightgray;
}
.chart-room .legend-shape{
display:inline-block;
margin-right:5px;
border-radius:10px;
width:15px;
height:5px;
vertical-align: middle;
}
</style> </style>

View File

@@ -1,11 +1,19 @@
<script> <script>
import chartDataFormat from "../../../charts/chartDataFormat"; import chartDataFormat from "../../../charts/chartDataFormat";
import bus from '../../../../libs/bus'; import bus from '../../../../libs/bus';
let bgColorList=['#7bbfea', '#b3424a', '#f05b72', '#596032', '#bd6758',
'#cd9a5b', '#918597', '#70a19f', '#005344', '#FF00FF',
'#f7acbc', '#5f5d46', '#66ffff', '#ccFF66', '#f47920',
'#769149', '#1d953f', '#abc88b', '#7f7522', '#9b95c9',
'#f3715c', '#ea66a6', '#d1c7b7', '#9d9087', '#77787b',
'#f58220', '#c37e00', '#00ae9d', '#f26522', '#76becc',
'#76624c', '#d71345', '#2468a2', '#ca8687', '#1b315e',
]
const commonOption={ const commonOption={
title:{ title:{
show:false, show:false,
}, },
color: this.bgColorList, color: bgColorList,
legend:{ legend:{
show:false, show:false,
}, },
@@ -25,7 +33,7 @@
}, },
dataZoom: [{ dataZoom: [{
type: 'slider', type: 'slider',
show:true, show:false,
xAxisIndex: [0], xAxisIndex: [0],
start: 0, start: 0,
end: 100, end: 100,
@@ -119,6 +127,9 @@
}, },
setMap:function(map){ setMap:function(map){
mapOptions.geo.map=map mapOptions.geo.map=map
},
getBgColorList:function(){
return Object.assign([],bgColorList)
} }
} }
</script> </script>

View File

@@ -8,6 +8,7 @@
<div class="sidebar-info-item sidebar-info-item-active" >{{$t('dashboard.overview.title')}}</div> <div class="sidebar-info-item sidebar-info-item-active" >{{$t('dashboard.overview.title')}}</div>
<div class="sidebar-info-item sidebar-info-top " @click="jumpTo('panel')">{{$t('dashboard.panel.title')}}</div> <div class="sidebar-info-item sidebar-info-top " @click="jumpTo('panel')">{{$t('dashboard.panel.title')}}</div>
<div class="sidebar-info-item" @click="jumpTo('metricPreview')">{{$t('dashboard.metricPreview.title')}}</div> <div class="sidebar-info-item" @click="jumpTo('metricPreview')">{{$t('dashboard.metricPreview.title')}}</div>
<div class="sidebar-info-item" @click="jumpTo('explore')">{{$t('dashboard.metricPreview.title')}}</div>
</div> </div>
</div> </div>
<!--右侧内容--> <!--右侧内容-->
@@ -48,7 +49,7 @@
<table-box :pop-data="dataCenterStatData" ref="dataCenterTab" ></table-box> <table-box :pop-data="dataCenterStatData" ref="dataCenterTab" ></table-box>
</div> </div>
<div style="flex: 3;"> <div style="flex: 3;">
<chart-box chart-title="" chart-type="map" :map="map" ref="dataCenterMap"></chart-box> <chart-box chart-title="" chart-type="map" :tooltip-formatter="mapTooltipFormatter" :map="map" ref="dataCenterMap"></chart-box>
</div> </div>
</div> </div>
</div> </div>
@@ -940,71 +941,6 @@
return tooltip; return tooltip;
}, },
tooltipPosition:function(point,params,dom,rect,size){
dom.style.transform = "translateZ(0)";
//提示框位置
var x=0;
var y=0;
//当前鼠标位置
var pointX = point[0];
var pointY = point[1];
//外层div大小
var viewWidth = size.viewSize[0];
var viewHeight = size.viewSize[1];
//提示框大小
var boxWidth = size.contentSize[0];
var boxHeight = size.contentSize[1];
let chartDom = document.getElementById(this.chartId);
if(chartDom){
let parTop = chartDom.offsetTop;
let parLeft = chartDom.offsetLeft;
let parent = chartDom.parentElement;
let parClientHeight = parent.clientHeight;//可视高度
let parClientWidth = parent.clientWidth;//可视宽度
let parScrollTop = parent.scrollTop;
if((parClientWidth-pointX-parLeft-20)>=boxWidth){//说明鼠标在左边放不下提示框
x=pointX+10;
}else{
x = pointX - boxWidth;
}
if((parClientHeight-pointY-(parTop-parScrollTop)-20)>=boxHeight){//说明鼠标上面放不下提示框
y = pointY+10;
}else {
y = pointY-boxHeight;
}
return [x,y];
}else {
x = pointX - boxWidth;
y = pointY+10;
return [x,y];
}
},
tooltipFormatter:function(params){
let str = `<div>`;
params.forEach((item, i) => {
if(i===0){
let value=bus.computeTimezone(item.data[0])
let t_date = new Date(value);
str += [t_date.getFullYear(), t_date.getMonth() + 1, t_date.getDate()].join('-') + " "
+ [t_date.getHours(), t_date.getMinutes(),t_date.getSeconds()].join(':');
str +=`<br/>`;
}
let 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="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>${item.seriesName}: </div>`;
str += `<div style="padding-left: 10px;">`;
str += chartDataFormat.getUnit(5).compute(val,null,2);
str += `</div>`;
str += `</div>`;
});
str +=`</div>`;
return str;
},
yAxisFormatter:function(value,index){
let unit=chartDataFormat.getUnit(5);
return unit.compute(value,index);
},
getAssetTabTitle:function(){ getAssetTabTitle:function(){
switch (this.typeFilter) { switch (this.typeFilter) {
case "typeStat": case "typeStat":