feat:新功能

1 dashboard模块:图表增加url类型(新增,预览,修改,删除,全屏,刷新),目前拖拽改变大小存在问题(prev及next相关问题)
fix:修改问题
1 webshell模块:resize时增加防抖处理了
2 explor模块:全屏不显示标题,下拉菜单只显示全屏
This commit is contained in:
hyx
2020-04-14 21:46:38 +08:00
parent 3b9c728c30
commit 764f2fb6c3
14 changed files with 1077 additions and 150 deletions

View File

@@ -105,6 +105,16 @@
:panel-id="filter.panelId" :panel-id="filter.panelId"
:chart-index="index" :chart-index="index"
:editChartId="'editChartId' + item.id"></chart-table> :editChartId="'editChartId' + item.id"></chart-table>
<chart-url v-if="item.type === 'url'" ref="editChart" :key="'inner' + item.id"
@on-refresh-data="refreshChart"
@on-search-data="searchData"
@on-remove-chart-block="removeChart"
@on-drag-chart="editChartForDrag"
@on-edit-chart-block="editData"
:panel-id="filter.panelId"
:chart-index="index"
:editChartId="'editChartId' + item.id"></chart-url>
</div> </div>
</draggable> </draggable>
<el-row v-if="dataList.length === 0" class="noData"></el-row> <el-row v-if="dataList.length === 0" class="noData"></el-row>
@@ -115,6 +125,7 @@ import axios from 'axios';
import bus from '../../libs/bus'; import bus from '../../libs/bus';
import lineChartBlock from './line-chart-block'; import lineChartBlock from './line-chart-block';
import chartTable from './chart-table'; import chartTable from './chart-table';
import chartUrl from './chart-url';
import draggable from 'vuedraggable' import draggable from 'vuedraggable'
export default { export default {
@@ -124,6 +135,7 @@ export default {
components: { components: {
lineChartBlock, lineChartBlock,
chartTable, chartTable,
chartUrl,
draggable, draggable,
}, },
data() { data() {
@@ -489,6 +501,7 @@ export default {
}else { }else {
this.dataList = this.dataTotalList; this.dataList = this.dataTotalList;
} }
console.log('0000==========',this.dataList);
this.$nextTick(() => { this.$nextTick(() => {
if (this.dataList.length > 0 && this.$refs.editChart) { if (this.dataList.length > 0 && this.$refs.editChart) {
this.$refs.editChart.forEach((item, i) => { this.$refs.editChart.forEach((item, i) => {
@@ -508,7 +521,12 @@ export default {
if(oldDataListLen){ if(oldDataListLen){
realIndex += oldDataListLen; realIndex += oldDataListLen;
} }
this.getChartData(item, realIndex); let chartType = item.type;
if(chartType!=='url'){
this.getChartData(item, realIndex);
}else {
this.setSize(item.span, realIndex); // 设置该图表宽度
}
}); });
} }
}, },

View File

@@ -0,0 +1,196 @@
/* ---------edit-chart-move--------- */
.clearfix:after{
display: block;
content: "";
clear: both;
}
.clearfix{
margin-bottom: 10px;
}
.loading-font{
color:#232f3e !important;
}
.dialog-tool {
margin-right: 40px;
}
.hidden{
visibility: hidden;
}
.visible{
visibility: visible;
}
.nz-chart-dropdown {
height: 147px;
li {
/*padding: 0 20px !important;*/
padding-left:15px !important;
padding-right:0px !important;
width:140px;
text-align: left;
i {
margin-right: 10px;
}
}
}
.chart-url {
width: 100%;
height: 100%;//calc(100% - 40px);
// min-height: 500px;
position: relative;
background: #FFF;
border: 1px solid #d8dce1;
padding: 0px 0px;
margin-bottom: 10px;
padding-bottom: 3px;
.url-container{
padding-left: 8px;
padding-right: 8px;
}
.vue-resizable-handle {
position: absolute;
width: 20px;
height: 20px;
bottom: 0;
right: 0;
cursor: se-resize;
box-sizing: border-box;
}
.vue-resizable-handle:after {
border-right: 2px solid #555;
border-bottom: 2px solid #555;
content: "";
position: absolute;
right: 3px;
bottom: 3px;
width: 5px;
height: 5px;
/*border-right: 2px solid rgba(0,0,0,.4);
border-bottom: 2px solid rgba(0,0,0,.4);*/
box-sizing: inherit;
}
.chartTitle:hover {
background-color:#d8dce1;
}
.dragTitle{
background-color:#d8dce1;
}
.chartTitle {
text-align: center;
width: 100%;
line-height: 28px;
.nz-chart-top{
width:100%;
}
.el-dropdown-link {
cursor: move;
}
.el-icon-arrow-down {
font-size: 12px;
}
.chart-title {
font-weight: bold;
font-size: 18px;
line-height: 26px;
color: #333;
margin: -3px 0 3px 3px;
display:flex;
justify-content:center;
align-items:center;
.chart-title-text{
max-width:calc(100% - 20px);
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
cursor: pointer;
}
.chart-title-icon{
display: inline-block;
cursor: pointer;
}
}
}
.edit:after{
display: block;
content: "";
clear: both;
}
.button-panel-height{
height:26px;
}
.button-panel-height button{
height:26px;
}
.edit {
position: absolute;
right: 20px;
top: 17px;
z-index: 10;
/*background: $btn-light-background-color;
border-radius: 6px;;
border: 1px solid #ccc;
.set-icon {
display: inline-block;
cursor: pointer;
padding: 5px 15px;
border-right: 1px solid #ccc;
}
.set-icon:hover{
background: $btn-light-background-color-hover;
}
.set-icon:last-child{
border-right: none !important;
}
.el-icon-refresh-right{
color: #F0BF84;
}
i{
font-size: 16px;
color: #000;
}
.list-icon {
float: left;
}
.show-icon {
cursor: pointer;
float: right;
font-size: 14px;
}*/
}
.chart-select {
position: absolute;
left: 40px;
top: 25px;
z-index: 10;
font-size: 14px;
.chart-select-btn {
margin-right: 10px;
cursor: pointer;
&.active {
color: #5aacff;
}
}
}
/*没有数据显示*/
.null {
position: absolute;
top: 50%;
width: 100%;
text-align: center;
font-size: 24px;
font-weight: 600;
}
.chart-table-col{
width: 100%;
}
.element-bottom-border {
border-bottom: 1px solid #dfe7f2;
margin-bottom:-20px;
}
.element-top-border {
padding-top: 10px;
border-top: 1px solid #dfe7f2;
margin-top:-25px;
}
}

View File

@@ -0,0 +1,374 @@
<style lang="scss" scoped>
@import './chart-url.scss';
</style>
<style>
.max-width-90{
max-width: 90px;
}
</style>
<template>
<div class="chart-url" :id="'chartUrlDiv'+chartIndex" v-show="divFirstShow" @mouseenter="caretShow=true" @mouseleave="caretShow=false">
<loading :ref="'localLoading'+chartIndex"></loading>
<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">
<span class="el-dropdown-link chart-title" @click="dropdownMenuShow=!dropdownMenuShow">
<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>
<ul slot="dropdown" v-show="dropdownMenuShow" :id="'dropdownUl'+chartIndex" class="el-dropdown-menu nz-chart-dropdown" style="position: absolute; top: 30px; left: calc(50% - 79px); transform-origin: center top; z-index: 1000;" >
<li @click="refreshChart" class="el-dropdown-menu__item">
<i class="global-active-color el-icon-refresh-right" style="font-size: 16px;"></i><span>{{$t('dashboard.refresh')}}</span></li>
<li @click="editChart" class="el-dropdown-menu__item">
<i class="nz-icon nz-icon-edit" style="font-size: 14px; margin-right: 11px; margin-left: 1px;"></i>{{$t('dashboard.edit')}}</li>
<li @click="removeChart" class="el-dropdown-menu__item">
<i class="el-icon-delete" style="font-size: 16px;"></i>{{$t('dashboard.delete')}}</li>
<li @click="showAllScreen" class="el-dropdown-menu__item">
<i class="el-icon-full-screen" style="font-size: 16px;"></i>{{$t('dashboard.screen')}}</li>
</ul>
</el-dropdown>
</div>
<div :id="'chartUrl'+chartIndex" class="mt-10 url-container" v-show="firstShow" >
<iframe :id="'urlContainer'+chartIndex" frameborder="0" width="100%" height="100%" name="showHere" scrolling=auto
style="z-index:5000;"
></iframe><!-- style=" position: absolute; width: 100%; height: 100%; top: 0;left:0;" :src="chart.url" v-scrollBar:char-url-preview-->
</div>
<!--全屏-->
<el-dialog class="nz-dialog table-chart-dialog" :title="$t('dashboard.panel.view')" :visible.sync="screenModal" width="96%" @opened="initDialog" @close="screenModal = false" >
<div slot="title">
<span class="nz-dialog-title">{{data.title}}</span>
</div>
<iframe :id="'urlContainerFull'+chartIndex" frameborder="0" width="100%" height="100%" name="showHereFull" scrolling=auto
style="z-index:5000;"
></iframe><!-- style=" position: absolute; width: 100%; height: 100%; top: 0;left:0;" :src="chart.url" v-scrollBar:char-url-preview-->
<loading :ref="'localLoadingScreen'+chartIndex"></loading>
</el-dialog>
<span class="vue-resizable-handle" @mousedown="dragResize"></span>
</div>
</template>
<script>
import bus from '../../libs/bus';
import chartDataFormat from './chartDataFormat'
import loading from "../common/loading";
export default {
name: 'chartUrl',
components: {
'loading': loading,
},
props: {
// 看板id
panelId: {
type: Number,
default: 0,
},
editChartId: {
type: String,
default: 'editChartId',
},
chartIndex:{
type: Number,
default: 0,
}
},
data() {
return {
data: {}, // 该图表信息,chartItem
unit:{},
images: '',
loading:Object,
panelIdInner: '', // 看板id=panelId,原写作chart,由set_data获取
firstLoad: false, // 是否第一次加载
screenModal: false,
firstShow: false, // 默认不显示操作按钮,
caretShow:false,
dragTitleShow:false,
dropdownMenuShow:false,
minHeight:200,
chartSpaceHeight:5,//top-border: 1,bottom-border: 1,padding-bottome:3
titleHeight:38,//title-height:28,magrin-bottom:10
divFirstShow:false,
};
},
created() {
},
computed: {},
watch: {},
methods: {
showLoad(chartItem) {
this.data = chartItem;
console.log('=========',this.data);
this.panelIdInner = this.panelId;
//设置高度
this.$nextTick(() => {
const chartBox = document.getElementById('chartUrlDiv'+this.chartIndex);
let height = chartItem.height;
if(height<this.minHeight){
height = this.minHeight;
}
chartBox.style.height = `${height-this.chartSpaceHeight}px`;
const urlBox = document.getElementById('urlContainer'+this.chartIndex);
urlBox.style.height = `${height-this.chartSpaceHeight-this.titleHeight}px`;// -75-32
});
this.startLoading();
this.setLoadFrame();
this.divFirstShow = true;
},
setLoadFrame(){
let that = this;
this.$nextTick(() => {
let iframe = document.querySelector('#urlContainer'+this.chartIndex);
// 处理兼容行问题
if (iframe.attachEvent) {
iframe.attachEvent('onload', function () {
// iframe加载完毕以后执行操作
that.firstShow = true;
console.log('iframe已加载完毕');
that.endLoading();
})
} else {
iframe.onload = function () {
// iframe加载完毕以后执行操作
that.firstShow = true;
console.log('iframe已加载完毕');
that.endLoading();
}
}
iframe.src = that.data.param.url;
});
},
initDialog(){
this.startLoading('screen');
this.setLoadFrameFull();
},
dragResize:function(e){
console.log('========',this.data)
var diffWidth =20; //界面的宽度空白的地方的宽度
var chartBoxPadding = 22;
var targetDiv= document.getElementById('chartUrlDiv'+this.chartIndex); //e.target.parentNode.parentNode;.children[0]
var targetDivContainer= document.getElementById('listContainer'); //e.target.parentNode.parentNode;.children[0]
var maxWidth = targetDivContainer.offsetWidth-diffWidth;
var minWidth = maxWidth/12;
var stepWidth = maxWidth/12;
var stepHeight = 10;
//得到点击时该容器的宽高:
var targetDivHeight=targetDiv.offsetHeight;
var targetDivWidth=targetDiv.offsetWidth;
var startY=e.clientY;
var startX=e.clientX;
var _this=this;
document.onmousemove=function(e){
e.preventDefault();
//得到鼠标拖动的宽高距离:取绝对值
var distY=Math.abs(e.clientY-startY);
var distX=Math.abs(e.clientX-startX);
//往上方拖动:
if( e.clientY < startY){
targetDiv.style.height=targetDivHeight-distY+'px';
//heightTmp = targetDivHeight-distY;
}
if( e.clientX < startX){
targetDiv.style.width=targetDivWidth-distX+'px';
//widthTmp = targetDivWidth-distX;
}
//往下方拖动:
if (e.clientY > startY) {
targetDiv.style.height=(targetDivHeight+distY)+'px';
//heightTmp = targetDivHeight+distY;
}
if (e.clientX > startX) {
targetDiv.style.width=(targetDivWidth+distX)+'px';
//widthTmp = targetDivWidth+distX;
}
if(parseInt(targetDiv.style.height)<=_this.minHeight){
targetDiv.style.height=_this.minHeight+'px';
//heightTmp = _this.minHeight;
}
if(parseInt(targetDiv.style.width)>=maxWidth){
targetDiv.style.width=maxWidth+'px';
//widthTmp = maxWidth;
}
if(parseInt(targetDiv.style.width)<=minWidth){
targetDiv.style.width=minWidth+'px';
//widthTmp = minWidth;
}
//调整表格大小
let containerHeight = parseInt(targetDiv.style.height);
let containerWidth = parseInt(targetDiv.style.width);
const chartBox = document.getElementsByClassName('chartBox');
chartBox[_this.chartIndex].style.width = (containerWidth+chartBoxPadding)+'px';
//chartBox[_this.chartIndex].style.height = `${containerHeight}px`;
//表格的高度
const tableBox = document.getElementById('urlContainer'+_this.chartIndex);
tableBox.style.height = `${containerHeight-_this.titleHeight}px`;//-75-32+25
}
document.onmouseup=function(){
document.onmousemove=null;
document.onmouseup = null;
let targetDivHeightNew = parseInt(targetDiv.style.height);
//let targetDivHeightNew = heightTmp
let targetDivWidthNew = parseInt(targetDiv.style.width);
//let targetDivWidthNew = widthTmp;
let diffHeight = Math.abs(targetDivHeight-targetDivHeightNew);
if(targetDivHeight>targetDivHeightNew){
let finalDiffHeight = Math.floor(diffHeight/stepHeight)*stepHeight;
targetDiv.style.height = (targetDivHeight-finalDiffHeight)+'px';
}
if(targetDivHeight<targetDivHeightNew){
let finalDiffHeight = Math.ceil(diffHeight/stepHeight)*stepHeight;
targetDiv.style.height = (targetDivHeight+finalDiffHeight)+'px';
}
var span = _this.data.span;
if(targetDivWidth>targetDivWidthNew){
span = Math.floor((targetDivWidthNew*12)/maxWidth);
let finalWidth = Math.floor((targetDivWidthNew*12)/maxWidth)*stepWidth;
if((finalWidth)<minWidth){
targetDiv.style.width=minWidth+'px';
span = 1;
}else {
targetDiv.style.width = finalWidth+'px';
}
}
if(targetDivWidth<targetDivWidthNew){
span = Math.ceil((targetDivWidthNew*12)/maxWidth);
let spanUnit = Math.ceil((targetDivWidthNew*12)/maxWidth);
let finalWidth = spanUnit*stepWidth;
if(finalWidth>maxWidth || spanUnit===12){
targetDiv.style.width=maxWidth+'px';
span = 12;
}else {
targetDiv.style.width = finalWidth+'px';
}
}
//调整表格大小
let containerHeight = parseInt(targetDiv.style.height);
let containerWidth = parseInt(targetDiv.style.width);
const chartBox = document.getElementsByClassName('chartBox');
chartBox[_this.chartIndex].style.width = (containerWidth+chartBoxPadding)+'px';
//chartBox[_this.chartIndex].style.height = `${containerHeight}px`;
//表格的高度
const tableBox = document.getElementById('urlContainer'+_this.chartIndex);
tableBox.style.height = `${containerHeight-_this.titleHeight}px`;
const modifyParams = {
id:_this.data.id,
span:span,
height:(containerHeight+_this.chartSpaceHeight),
prev:parseInt(_this.data.prev),
next:parseInt(_this.data.next),
}
console.log('========2',_this.data)
_this.$put('panel/'+ _this.panelIdInner+'/charts/modify',modifyParams).then(response => {
console.log('========3',_this.data)
if (response.code === 200) {
//更新当前图表数据
_this.data.span= span;
_this.data.height= containerHeight+_this.chartSpaceHeight;
_this.$emit('on-drag-chart', _this.data);
}else {
if(response.msg){
_this.$message.error(response.msg);
}else if(response.error){
_this.$message.error(response.error);
}else {
_this.$message.error(response);
}
}
});
}
},
startLoading(area){
if(area==='screen'){
this.$refs['localLoadingScreen'+this.chartIndex].startLoading();
}else {
this.$refs['localLoading'+this.chartIndex].startLoading();
}
},
endLoading(area){
if(area==='screen'){
this.$refs['localLoadingScreen'+this.chartIndex].endLoading();
}else {
this.$refs['localLoading'+this.chartIndex].endLoading();
}
},
clearData(){
},
// 重新请求数据 刷新操作-local
refreshChart() {
this.dropdownMenuShow=false;
this.startLoading();
this.firstShow = false;
let iframe = document.querySelector('#urlContainer'+this.chartIndex);
iframe.src = '';
iframe.src = this.data.param.url;
},
// 编辑图表
editChart() {
this.dropdownMenuShow=false;
this.$emit('on-edit-chart-block', this.data.id);
},
// 删除该图表
removeChart() {
this.dropdownMenuShow=false;
this.$emit('on-remove-chart-block', this.data.id);
},
clickos() {
this.dropdownMenuShow=false;
},
// 全屏查看
showAllScreen() {
this.dropdownMenuShow=false;
this.screenModal = true;
},
setLoadFrameFull(){
let that = this;
this.$nextTick(() => {
let iframe = document.querySelector('#urlContainerFull'+this.chartIndex);
// 处理兼容行问题
if (iframe.attachEvent) {
iframe.attachEvent('onload', function () {
// iframe加载完毕以后执行操作
that.firstShow = true;
console.log('iframe已加载完毕');
that.endLoading('screen');
})
} else {
iframe.onload = function () {
// iframe加载完毕以后执行操作
that.firstShow = true;
console.log('iframe已加载完毕');
that.endLoading('screen');
}
}
iframe.src = this.data.param.url;
});
},
},
mounted() {
this.firstLoad = false;
},
beforeDestroy() {},
};
</script>

View File

@@ -12,6 +12,11 @@
visibility: visible; visibility: visible;
} }
</style> </style>
<style>
.char-url-preview html{
}
</style>
<template> <template>
<el-dialog class="chart-preview-dialog nz-dialog" id="chartPreviewDailog" <el-dialog class="chart-preview-dialog nz-dialog" id="chartPreviewDailog"
:visible.sync="screenModal" :visible.sync="screenModal"
@@ -21,7 +26,7 @@
@opened="initDialog"> @opened="initDialog">
<div slot="title"> <div slot="title">
<span class="nz-dialog-title">{{chart.title}}</span> <span class="nz-dialog-title">{{chart.title}}</span>
<div class="float-right panel-calendar dialog-tool"> <div class="float-right panel-calendar dialog-tool" v-if="chart.type!=='url'">
<el-date-picker ref="calendar" prefix-icon=" " size="mini" class="nz-preview-picker" <el-date-picker ref="calendar" prefix-icon=" " size="mini" class="nz-preview-picker"
format="yyyy/MM/dd HH:mm" format="yyyy/MM/dd HH:mm"
@change="dateChange" @change="dateChange"
@@ -69,6 +74,14 @@
</div> </div>
</template> </template>
<template v-if="chart.type==='url'">
<div id="chartUrlPreview" :class="{'visible':urlShow,'hidden':!urlShow}" class="char-url-preview">
<iframe id="chartUrlFrame" frameborder="0" width="100%" height="100%" name="showHere" scrolling=auto
style="z-index:5000;"
></iframe><!-- style=" position: absolute; width: 100%; height: 100%; top: 0;left:0;" :src="chart.url" v-scrollBar:char-url-preview-->
</div>
</template>
<loading ref="loadingPreview"></loading> <loading ref="loadingPreview"></loading>
</el-dialog> </el-dialog>
</template> </template>
@@ -108,12 +121,6 @@
xAxis: [], xAxis: [],
theData: [], // series数据组 theData: [], // series数据组
}, },
//panelIdInner: '', // 看板id=panelId,原写作chart,由set_data获取
//chartName: '',
//firstLoad: false, // 是否第一次加载
//divFirstShow:false,
//highchartStore: null, // 保存图表数据
//echartStore:null,// 保存图表数据
echartModalStore: null, // 全屏查看时数据 echartModalStore: null, // 全屏查看时数据
chartType: 'line', // 图表类型 chartType: 'line', // 图表类型
screenModal: false, screenModal: false,
@@ -136,6 +143,7 @@
//dropdownMenuShow:false, //dropdownMenuShow:false,
showLegend:true, showLegend:true,
tableShow:true, tableShow:true,
urlShow:true,
searchTime:[new Date().setHours(new Date().getHours()-1),new Date()], searchTime:[new Date().setHours(new Date().getHours()-1),new Date()],
//oldSearchTime:[], //oldSearchTime:[],
minHeight:200, minHeight:200,
@@ -234,25 +242,19 @@
show(chartInfo) { show(chartInfo) {
this.searchTime = [new Date().setHours(new Date().getHours()-1),new Date()]; this.searchTime = [new Date().setHours(new Date().getHours()-1),new Date()];
this.chart=chartInfo; this.chart=chartInfo;
let chartType= chartInfo.type; let chartType= chartInfo.type;
let chartContainerId = 'chartEchartPreview' let chartContainerId = 'chartEchartPreview'
if(chartType==='table'){ if(chartType==='table'){
/*
for(let i=0;i<8;i++){
this.seriesItemScreen.push({//表格数据
// label: '',//label
// metric: '',//metric列
element:'',
time: '',//采集时间
value: '',//数值
});
}*/
this.tableShow = false; this.tableShow = false;
chartContainerId = 'chartTablePreview'; chartContainerId = 'chartTablePreview';
}else if (chartType === 'line' || chartType === 'bar' || chartType === 'stackArea' || chartType === 4) { }else if (chartType === 'line' || chartType === 'bar' || chartType === 'stackArea' || chartType === 4) {
this.isGreyScreen=[]; this.isGreyScreen=[];
this.showLegend = false; this.showLegend = false;
chartContainerId = 'chartEchartPreview'; chartContainerId = 'chartEchartPreview';
}else if(chartType==='url'){
this.urlShow = false;
chartContainerId = 'chartUrlPreview';
} }
//设置高度 chart-table //设置高度 chart-table
@@ -275,6 +277,33 @@
this.setSize(chartInfo.span); // 设置该图表宽度 this.setSize(chartInfo.span); // 设置该图表宽度
this.screenModal = true; this.screenModal = true;
},
setLoadFrame(){
if(this.chart.type==='url'){
let that = this;
this.$nextTick(() => {
let iframeBox = document.querySelector('#chartUrlPreview');
let iframe = document.querySelector('#chartUrlFrame');
// 处理兼容行问题
if (iframe.attachEvent) {
iframe.attachEvent('onload', function () {
// iframe加载完毕以后执行操作
console.log('iframe已加载完毕');
that.$refs.loadingPreview.endLoading();
})
} else {
iframe.onload = function () {
// iframe加载完毕以后执行操作
console.log('iframe已加载完毕');
that.$refs.loadingPreview.endLoading();
}
}
console.log('=======',this.chart)
iframe.src = this.chart.param.url;
});
}
}, },
filterShowData(source,pageObj){ filterShowData(source,pageObj){
return source.slice((pageObj.pageNo-1)*pageObj.pageSize,pageObj.pageNo*pageObj.pageSize) return source.slice((pageObj.pageNo-1)*pageObj.pageSize,pageObj.pageNo*pageObj.pageSize)
@@ -288,10 +317,18 @@
if(this.echartModalStore){ if(this.echartModalStore){
this.echartModalStore.clear(); this.echartModalStore.clear();
} }
}else if(chartType==='url'){
} }
//后台获得数据 //后台获得数据
this.$refs.loadingPreview.startLoading(); if(this.chart.type!=='url'){
this.getChartData(); this.$refs.loadingPreview.startLoading();
this.getChartData();
}else {
this.$refs.loadingPreview.startLoading();
this.urlShow = true;
this.setLoadFrame();
}
}, },
// 设置图表的宽度 // 设置图表的宽度
setSize(size) { setSize(size) {
@@ -789,6 +826,12 @@
this.seriesItemScreen = []; this.seriesItemScreen = [];
this.searchTime[0] = new Date().setHours(new Date().getHours()-1); this.searchTime[0] = new Date().setHours(new Date().getHours()-1);
this.searchTime[1] =new Date(); this.searchTime[1] =new Date();
let iframe = document.querySelector('#chartUrlFrame');
if(iframe){
iframe.src="";
}
}, },
// 重新请求数据 刷新操作 // 重新请求数据 刷新操作
/* /*
@@ -955,6 +998,7 @@
}, },
}, },
mounted() { mounted() {
}, },
beforeDestroy() { beforeDestroy() {
this.clearChart(); this.clearChart();

View File

@@ -61,6 +61,19 @@
} }
} }
} }
.nz-chart-dropdown-one {
height: 36px;
li {
/*padding: 0 20px !important;*/
padding-left:15px !important;
padding-right:0px !important;
width:140px;
text-align: left;
i {
margin-right: 10px;
}
}
}
.line-chart-block { .line-chart-block {
height: 100%; height: 100%;
//min-height: 0px; //min-height: 0px;

View File

@@ -38,12 +38,12 @@
<el-dropdown-item @click.native="showAllScreen" ><i style="font-size: 16px;" class="el-icon-full-screen"></i>{{$t('dashboard.screen')}}</el-dropdown-item> <el-dropdown-item @click.native="showAllScreen" ><i style="font-size: 16px;" class="el-icon-full-screen"></i>{{$t('dashboard.screen')}}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
--> -->
<ul slot="dropdown" v-show="dropdownMenuShow" :id="'dropdownUl'+chartIndex" class="el-dropdown-menu nz-chart-dropdown" style="position: absolute; top: 30px; left: calc(50% - 79px); transform-origin: center top; z-index: 1000;" > <ul slot="dropdown" v-show="dropdownMenuShow" :id="'dropdownUl'+chartIndex" :class="{'el-dropdown-menu nz-chart-dropdown':!isExplore,'el-dropdown-menu nz-chart-dropdown-one':isExplore}" style="position: absolute; top: 30px; left: calc(50% - 79px); transform-origin: center top; z-index: 1000;" >
<li @click="refreshChart" class="el-dropdown-menu__item"> <li v-show="!isExplore" @click="refreshChart" class="el-dropdown-menu__item">
<i class="global-active-color el-icon-refresh-right" style="font-size: 16px;"></i><span>{{$t('dashboard.refresh')}}</span></li> <i class="global-active-color el-icon-refresh-right" style="font-size: 16px;"></i><span>{{$t('dashboard.refresh')}}</span></li>
<li @click="editChart" class="el-dropdown-menu__item"> <li v-show="!isExplore" @click="editChart" class="el-dropdown-menu__item">
<i class="nz-icon nz-icon-edit" style="font-size: 14px; margin-right: 11px; margin-left: 1px;"></i>{{$t('dashboard.edit')}}</li> <i class="nz-icon nz-icon-edit" style="font-size: 14px; margin-right: 11px; margin-left: 1px;"></i>{{$t('dashboard.edit')}}</li>
<li @click="removeChart" class="el-dropdown-menu__item"> <li v-show="!isExplore" @click="removeChart" class="el-dropdown-menu__item">
<i class="el-icon-delete" style="font-size: 16px;"></i>{{$t('dashboard.delete')}}</li> <i class="el-icon-delete" style="font-size: 16px;"></i>{{$t('dashboard.delete')}}</li>
<li @click="showAllScreen" class="el-dropdown-menu__item"> <li @click="showAllScreen" class="el-dropdown-menu__item">
<i class="el-icon-full-screen" style="font-size: 16px;"></i>{{$t('dashboard.screen')}}</li> <i class="el-icon-full-screen" style="font-size: 16px;"></i>{{$t('dashboard.screen')}}</li>
@@ -80,8 +80,9 @@
width="90%" width="90%"
@close="screenModal = false" @close="screenModal = false"
@opened="initDialog"> @opened="initDialog">
<div slot="title"> <div slot="title" >
<span class="nz-dialog-title">{{data.title}}</span> <span class="nz-dialog-title" v-show="!isExplore">{{data.title}}</span>
<span class="nz-dialog-title" v-show="isExplore">&nbsp;</span>
<div class="float-right panel-calendar dialog-tool"> <div class="float-right panel-calendar dialog-tool">
<el-date-picker ref="calendar" prefix-icon=" " size="mini" class="nz-dashboard-picker" <el-date-picker ref="calendar" prefix-icon=" " size="mini" class="nz-dashboard-picker"
format="yyyy/MM/dd HH:mm" format="yyyy/MM/dd HH:mm"
@@ -144,6 +145,10 @@
type: Boolean, type: Boolean,
default: true, default: true,
}, },
isExplore:{
type:Boolean,
default:false,
}
}, },
data() { data() {
return { return {

View File

@@ -537,6 +537,29 @@
if(_this.consoleHeight===null || !_this.consoleHeight){_this.consoleHeight = _this.initConsoleHeight;} if(_this.consoleHeight===null || !_this.consoleHeight){_this.consoleHeight = _this.initConsoleHeight;}
} }
}, },
debounce(operate, delay) {
let time = null
let timer = null
let newTime = null
function task() {
newTime = +new Date()
if(newTime - time < delay){
timer = setTimeout(task, delay)
}else {
operate()
timer = null
}
time = newTime
}
return function () {
// 更新时间戳
time = +new Date()
if(!timer){
timer = setTimeout(task, delay)
}
}
},
windowChange(){ windowChange(){
//alert('winChange'); //alert('winChange');
if(this.editableTabs&&this.editableTabs.length>0){ if(this.editableTabs&&this.editableTabs.length>0){
@@ -576,7 +599,8 @@
} }
}, },
created() { created() {
window.addEventListener('resize',this.windowChange); //window.addEventListener('resize',this.windowChange);
window.addEventListener('resize',this.debounce(this.windowChange, 1000),false);
}, },
mounted() { mounted() {

View File

@@ -0,0 +1,150 @@
<style scoped lang="scss">
.loading-font{
color:#232f3e !important;
}
.calendar{
}
.nz-dashboard-dropdown-bg {
background: $global-text-color-active;
color: #fff;
}
.calendar-dropdown-title {
line-height:24px;
padding-left:5px;
margin-left:0px;
margin-top: 3px;
text-align:left;
border-radius:4px;
width:140px;
height:24px;
border:solid 1px #d8dce1;
white-space: nowrap;
overflow-x: hidden;
text-overflow: ellipsis;
}
.el-dropdown-link {
cursor: pointer;
}
.calendar-popover{
line-height:22px;
text-align:center;
}
.el-popper{
}
</style>
<template>
<div class="calendar top-tools">
<el-dropdown @command="timeChange" class="calendar-dropdown-title" trigger="click" v-scrollBar:el-dropdown>
<el-popover
placement="bottom-end"
width="80"
trigger="hover">
<el-row :gutter="10" class="calendar-popover">
<el-col :span="24">{{searchTime[0]}}</el-col>
</el-row>
<el-row :gutter="10" class="calendar-popover">
<el-col :span="24">to</el-col>
</el-row>
<el-row :gutter="10" class="calendar-popover">
<el-col :span="24">{{searchTime[1]}}</el-col>
</el-row>
<el-row :gutter="10" class="el-dropdown-link" slot="reference">
<el-col :span="3" ><i class="el-icon-time"></i></el-col>
<el-col :span="16" class="panel-list-title" >{{showTime.text}}</el-col>
<el-col :span="5" style="padding-left:0px !important;"><i class="el-icon-arrow-down el-icon--right"></i></el-col>
</el-row>
</el-popover>
<el-dropdown-menu class="nz-dashboard-dropdown" slot="dropdown">
<el-dropdown-item>{{$t('dashboard.panel.customTimeRange')}}</el-dropdown-item>
<el-dropdown-item v-for="item in timeData" :key="item.id+1"
:class="showTime.id==item.id?'nz-dashboard-dropdown-bg':''" :command="item">
{{item.text}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</template>
<script>
import bus from '../../libs/bus';
export default {
name: "calendar",
props: {
},
data() {
return {
searchTime:[
bus.timeFormate(new Date(bus.computeTimezone(new Date().getTime())).setMinutes(new Date(bus.computeTimezone(new Date().getTime())).getMinutes() - 15),'yyyy-MM-dd hh:mm:ss'),
bus.timeFormate(new Date(bus.computeTimezone(new Date().getTime())),'yyyy-MM-dd hh:mm:ss')
],
showTime: {
id: 1,
text: this.$t("dashboard.panel.lastFiveMin"),
},
timeData: [
{
id:1,
text:this.$t("dashboard.panel.lastFiveMin"),
},
{
id:2,
text:this.$t("dashboard.panel.lastFifteenMin"),
},
{
id:3,
text:this.$t("dashboard.panel.lastThirtyMin"),
},
{
id:4,
text:this.$t("dashboard.panel.lastOneHour"),
},
{
id:5,
text:this.$t("dashboard.panel.lastThreeHour"),
},
{
id:6,
text:this.$t("dashboard.panel.lastSixHour"),
},
{
id:7,
text:this.$t("dashboard.panel.lastTwelveHour"),
},
{
id:8,
text:this.$t("dashboard.panel.lastTwentyFourHour"),
},
{
id:9,
text:this.$t("dashboard.panel.lastTwoDay"),
},
{
id:10,
text:this.$t("dashboard.panel.lastSevenDay"),
},
{
id:11,
text:this.$t("dashboard.panel.lastThirtyDay"),
}
],
};
},
methods: {
timeChange(val) {
if (!val) {
//this.toAdd();
return false;
}
this.showTime = val;
//this.showPanel = val
//this.filter.panelId = this.showPanel.id;
//this.$emit('on-remove-chart-block', this.searchTime);
},
}
};
</script>

View File

@@ -82,6 +82,7 @@ const cn = {
chartId:"ID", chartId:"ID",
chartName:"图表名称", chartName:"图表名称",
type:"类型", type:"类型",
url:"Url",
typeVal:{ typeVal:{
line:{ line:{
label:"曲线图" label:"曲线图"
@@ -91,7 +92,13 @@ const cn = {
}, },
table:{ table:{
label:"表格" label:"表格"
} },
stackArea:{
label:"面积图"
},
url:{
label:"Url"
},
}, },
width:"宽", width:"宽",
high:"高", high:"高",
@@ -115,6 +122,18 @@ const cn = {
recOneMonth:'最近1月', recOneMonth:'最近1月',
curMonth:'本月', curMonth:'本月',
lastMonth:'上月', lastMonth:'上月',
customTimeRange:'Custom time range',
lastFiveMin:'最近5分钟',
lastFifteenMin:'最近15分钟',
lastThirtyMin:'最近30分钟',
lastOneHour:'最近1小时',
lastThreeHour:'最近3小时',
lastSixHour:'最近6小时',
lastTwelveHour:'最近12小时',
lastTwentyFourHour:'最近24小时',
lastTwo:'最近2天',
lastSevenDay:'最近7天',
lastThirtyDay:'最近30天',
refreshInterval:{ refreshInterval:{
never:'从不', never:'从不',
oneMinute:'1分钟', oneMinute:'1分钟',

View File

@@ -71,8 +71,7 @@ const en = {
failedDetail:'Failed Detail' failedDetail:'Failed Detail'
}, },
reset:'Reset', reset:'Reset',
submit:'Submit', submit:'Submit'
noData:'No data',
}, },
pageSize: '/page', pageSize: '/page',
webshell:{ webshell:{
@@ -117,6 +116,7 @@ const en = {
chartName:"Chart Name", chartName:"Chart Name",
type:"Type", type:"Type",
unit:"Unit", unit:"Unit",
url:"Url",
legend:'Legend', legend:'Legend',
legendTip:'Controls the name of the time series, using name or pattern. For example {{hostname}} will be replaced with label value for the label hostname.', legendTip:'Controls the name of the time series, using name or pattern. For example {{hostname}} will be replaced with label value for the label hostname.',
typeVal:{ typeVal:{
@@ -131,6 +131,9 @@ const en = {
}, },
stackArea:{ stackArea:{
label:"Stack Area" label:"Stack Area"
},
url:{
label:"Url"
} }
}, },
width:'Width', //"宽" width:'Width', //"宽"
@@ -157,6 +160,18 @@ const en = {
recOneMonth:'Last 1 month',//'最近1月' recOneMonth:'Last 1 month',//'最近1月'
curMonth:'This month',//'本月' curMonth:'This month',//'本月'
lastMonth:'Last month',//'上月' lastMonth:'Last month',//'上月'
customTimeRange:'Custom time range',
lastFiveMin:'Last 5 minutes',
lastFifteenMin:'Last 15 minutes',
lastThirtyMin:'Last 30 minutes',
lastOneHour:'Last 1 hour',
lastThreeHour:'Last 3 hours',
lastSixHour:'Last 6 hours',
lastTwelveHour:'Last 12 hours',
lastTwentyFourHour:'Last 24 hours',
lastTwoDay:'Last 2 days',
lastSevenDay:'Last 7 days',
lastThirtyDay:'Last 30 days',
refreshInterval:{ refreshInterval:{
never:'Never', //'从不' never:'Never', //'从不'
oneMinute:'1 minute', // 1 minute oneMinute:'1 minute', // 1 minute
@@ -284,7 +299,6 @@ const en = {
assetConfirmDelete: 'Related endpoints and alerts will be removed, are you sure you want to delete this asset?',//Related endpoints and alerts will be removed, are you sure you want to delete this asset? assetConfirmDelete: 'Related endpoints and alerts will be removed, are you sure you want to delete this asset?',//Related endpoints and alerts will be removed, are you sure you want to delete this asset?
yes: 'Yes', //"是" yes: 'Yes', //"是"
no: "No",//No no: "No",//No
success: "Success",
deleteSuccess: 'Delete success',//"删除成功" deleteSuccess: 'Delete success',//"删除成功"
saveSuccess: 'Save success', //"保存成功" saveSuccess: 'Save success', //"保存成功"
coverSuccess: 'Override success',//'覆盖成功' coverSuccess: 'Override success',//'覆盖成功'
@@ -574,12 +588,8 @@ const en = {
username: 'User', username: 'User',
operation: 'Operation', operation: 'Operation',
type: 'Type', type: 'Type',
createDate: 'Date', createDate: 'CreateDate',
ip: "IP", ip: "IP"
userId: "UserId",
operaId: "OperaId",
time: "time(ms)",
params: "Params"
}, },
mib:{ mib:{
mib:'SNMP mib', mib:'SNMP mib',
@@ -591,12 +601,11 @@ const en = {
models:'Models', models:'Models',
modelTip:'please select models', modelTip:'please select models',
createMib:'Create Mib', createMib:'Create Mib',
mibFiles:'Mib Files', mibFile:'Mib File',
uploadTip:'please upload mib file', uploadTip:'please upload mib file',
requiredMibFile:'mib file is required', requiredMibFile:'mib file is required',
vendor:'Vendor', vendor:'Vendor',
type:'Type', type:'Type',
mibBrowser: 'Mib browser',
}, },
system:{ system:{
system:'System', system:'System',

View File

@@ -75,34 +75,34 @@
<el-scrollbar class="right-box-form-box" ref="scrollbar"> <el-scrollbar class="right-box-form-box" ref="scrollbar">
<el-form class="right-box-form" :model="chart" label-position="top" :rules="rules" ref="chartForm"> <el-form class="right-box-form" :model="chart" label-position="top" :rules="rules" ref="chartForm">
<el-form-item :label="$t('dashboard.panel.title')" prop="panel"> <el-form-item :label="$t('dashboard.panel.title')" prop="panel">
<el-autocomplete <el-autocomplete
:fetch-suggestions="panelSuggestion" :fetch-suggestions="panelSuggestion"
v-model.trim="panelName2" v-model.trim="panelName2"
placeholder="" placeholder=""
size="small" size="small"
value-key="name" value-key="name"
v-if="!chart.id" v-if="!chart.id"
popper-class="chart-box-autocomplete no-style-class" popper-class="chart-box-autocomplete no-style-class"
> >
</el-autocomplete> </el-autocomplete>
<el-input size="small" v-if="chart.id" readonly="readonly" :value="panelName2"></el-input> <el-input size="small" v-if="chart.id" readonly="readonly" :value="panelName2"></el-input>
<!--<el-select popper-class="chart-box-dropdown" <!--<el-select popper-class="chart-box-dropdown"
v-model="panelId" placeholder="" v-if="rightBox.show" size="small"> v-model="panelId" placeholder="" v-if="rightBox.show" size="small">
<el-option v-for="item in panelData" :key="item.id" :label="item.name" <el-option v-for="item in panelData" :key="item.id" :label="item.name"
:value="item.id" :id="'chart-box-panel-'+item.id"> :value="item.id" :id="'chart-box-panel-'+item.id">
<span class="config-dropdown-label-txt">{{item.name}}</span> <span class="config-dropdown-label-txt">{{item.name}}</span>
<div class="config-dropdown-label-icons"> <div class="config-dropdown-label-icons">
<span class="config-dropdown-btn config-dropdown-btn-delete" @click.stop="deletePanel(item)" <span class="config-dropdown-btn config-dropdown-btn-delete" @click.stop="deletePanel(item)"
:id="'chart-box-panel-op-del-'+item.id"><i class="el-icon-delete"></i></span> :id="'chart-box-panel-op-del-'+item.id"><i class="el-icon-delete"></i></span>
<span class="config-dropdown-btn" @click.stop="editPanel(item)" <span class="config-dropdown-btn" @click.stop="editPanel(item)"
:id="'chart-box-panel-op-edit-'+item.id"><i class="nz-icon nz-icon-edit"></i></span> :id="'chart-box-panel-op-edit-'+item.id"><i class="nz-icon nz-icon-edit"></i></span>
</div> </div>
</el-option> </el-option>
</el-select> </el-select>
<div class="right-box-row-btn" v-if="rightBox.show" @click="toAddPanel"> <div class="right-box-row-btn" v-if="rightBox.show" @click="toAddPanel">
<i class="el-icon-plus" id="chart-box-panel-plus"></i> <i class="el-icon-plus" id="chart-box-panel-plus"></i>
</div>--> </div>-->
</el-form-item> </el-form-item>
<el-form-item :label='$t("dashboard.panel.chartForm.chartName")' prop="title"> <el-form-item :label='$t("dashboard.panel.chartForm.chartName")' prop="title">
@@ -120,7 +120,7 @@
<el-col :span="10" style="margin-left:-7px;"> <el-col :span="10" style="margin-left:-7px;">
<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" 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">
<el-option v-for="item in chartTypeList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in chartTypeList" :key="item.id" :label="item.name" :value="item.id">
<span class="panel-dropdown-label-txt" >{{item.name}}</span> <span class="panel-dropdown-label-txt" >{{item.name}}</span>
</el-option> </el-option>
@@ -128,10 +128,10 @@
</el-form-item> </el-form-item>
</div> </div>
</el-col> </el-col>
<el-col :span="2" style="margin-left: 7px"> <el-col v-show="!isUrl" :span="2" style="margin-left: 7px">
<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 :span="10"> <el-col v-show="!isUrl" :span="10">
<el-cascader filterable placeholder="" popper-class="dc-dropdown" size="mini" <el-cascader filterable placeholder="" popper-class="dc-dropdown" size="mini"
:options="unitOptions" :options="unitOptions"
:props="{ expandTrigger: 'hover' }" :props="{ expandTrigger: 'hover' }"
@@ -183,10 +183,14 @@
</el-col> </el-col>
</el-row> </el-row>
<div class="right-box-sub-title">{{$t('dashboard.panel.chartForm.metric')}}</div> <el-form-item v-if="isUrl" :label='$t("dashboard.panel.chartForm.url")' prop="param.url" :rules="{ required: true, message: $t('validate.required'), trigger: 'blur' }">
<div class="line-100"></div> <el-input size="small" maxlength="64" show-word-limit v-model="chart.param.url"></el-input>
</el-form-item>
<el-row class="element-item" v-for="(elem, index) in elements" :key="'ele' + index"> <div v-if="!isUrl" class="right-box-sub-title">{{$t('dashboard.panel.chartForm.metric')}}</div>
<div v-if="!isUrl" class="line-100"></div>
<el-row v-if="!isUrl" class="element-item" v-for="(elem, index) in elements" :key="'ele' + index">
<chart-metric ref="chartTag" <chart-metric ref="chartTag"
:pointer="index" :pointer="index"
:metric-list="metricList" :metric-list="metricList"
@@ -200,7 +204,7 @@
</el-row> </el-row>
<button type="button" @click="addTarget" class="nz-btn nz-btn-size-normal nz-btn-style-light" style="margin-left: 1px;"> <button v-if="!isUrl" type="button" @click="addTarget" class="nz-btn nz-btn-size-normal nz-btn-style-light" style="margin-left: 1px;">
<span class="top-tool-btn-txt">{{$t('dashboard.panel.chartForm.addMetric')}}</span> <span class="top-tool-btn-txt">{{$t('dashboard.panel.chartForm.addMetric')}}</span>
</button> </button>
@@ -250,6 +254,9 @@
span:12, span:12,
height:'400', height:'400',
unit:2, unit:2,
param:{
url:''
},
elements:{ elements:{
id: '', id: '',
expression: '', expression: '',
@@ -258,9 +265,13 @@
}, },
panel: '' panel: ''
}, },
isUrl:false,
rules: { rules: {
title: [ title: [
{required: true, message: this.$t('validate.required'), trigger: 'blur'} {required: true, message: this.$t('validate.required'), trigger: 'blur'}
],
url: [
{required: true, message: this.$t('validate.required'), trigger: 'blur'}
] ]
}, },
chartTypeList: [ chartTypeList: [
@@ -279,6 +290,10 @@
{ {
id:'stackArea', id:'stackArea',
name:this.$t("dashboard.panel.chartForm.typeVal.stackArea.label") name:this.$t("dashboard.panel.chartForm.typeVal.stackArea.label")
},
{
id:'url',
name:this.$t("dashboard.panel.chartForm.typeVal.url.label")
} }
], ],
elements: [1], // 指标部分 tarNum elements: [1], // 指标部分 tarNum
@@ -311,6 +326,7 @@
methods: { methods: {
show(show) { show(show) {
this.rightBox.show = show; this.rightBox.show = show;
this.isUrl = false;
}, },
clickos() { clickos() {
this.esc(); this.esc();
@@ -452,12 +468,12 @@
if (this.subCount === this.elements.length) { if (this.subCount === this.elements.length) {
this.subCount = 0; this.subCount = 0;
// 保存完成,进行删除操作 // 保存完成,进行删除操作
console.log('box第二步deleteIndex='+this.deleteIndex+'=开始删除一个元素') //('box第二步deleteIndex='+this.deleteIndex+'=开始删除一个元素')
console.log('box第二步删除之前elements='+JSON.stringify(this.elements)+' elementTarget='+JSON.stringify(this.elementTarget)+' bus='+JSON.stringify(bus.chartAddInfo.metricTarget)); //console.log('box第二步删除之前elements='+JSON.stringify(this.elements)+' elementTarget='+JSON.stringify(this.elementTarget)+' bus='+JSON.stringify(bus.chartAddInfo.metricTarget));
this.elements.splice(this.deleteIndex, 1); this.elements.splice(this.deleteIndex, 1);
this.elementTarget.splice(this.deleteIndex, 1);//没有作用,此处是[] this.elementTarget.splice(this.deleteIndex, 1);//没有作用,此处是[]
bus.chartAddInfo.metricTarget.splice(this.deleteIndex, 1); bus.chartAddInfo.metricTarget.splice(this.deleteIndex, 1);
console.log('box第二步删除完毕elements='+JSON.stringify(this.elements),' elementTarget='+JSON.stringify(this.elementTarget),' bus='+JSON.stringify(bus.chartAddInfo.metricTarget)); //console.log('box第二步删除完毕elements='+JSON.stringify(this.elements),' elementTarget='+JSON.stringify(this.elementTarget),' bus='+JSON.stringify(bus.chartAddInfo.metricTarget));
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.chartTag.forEach((item, index) => { this.$refs.chartTag.forEach((item, index) => {
@@ -522,7 +538,12 @@
this.$emit("reloadOnlyPanel"); this.$emit("reloadOnlyPanel");
this.$store.commit('panelListChange', true); this.$store.commit('panelListChange', true);
} else { } else {
this.$message.error(response.msg); if(response.msg){
this.$message.error(response.msg);
}else {
this.$message.error(response);
}
} }
}); });
} }
@@ -541,7 +562,11 @@
let panel = this.panelData.find(p => p.id === this.panelId); let panel = this.panelData.find(p => p.id === this.panelId);
this.$emit('on-create-success', 'create', response.data,params, panel); this.$emit('on-create-success', 'create', response.data,params, panel);
} else { } else {
this.$message.error(response.msg); if(response.msg){
this.$message.error(response.msg);
}else {
this.$message.error(response);
}
} }
}); });
clearInterval(interval); clearInterval(interval);
@@ -555,7 +580,6 @@
}, },
// 更新图表 // 更新图表
updateCharts(params) { updateCharts(params) {
console.log('))))))))))))=',params)
this.$put('panel/' + this.panelId + '/charts', params).then(response2 => { this.$put('panel/' + this.panelId + '/charts', params).then(response2 => {
if (response2.code === 200) { if (response2.code === 200) {
this.esc(); this.esc();
@@ -564,7 +588,11 @@
this.panelName2 = ''; this.panelName2 = '';
this.$emit('on-create-success', 'update', response2.data, params); this.$emit('on-create-success', 'update', response2.data, params);
} else { } else {
this.$message.error(response2.msg); if(response2.msg){
this.$message.error(response2.msg);
}else {
this.$message.error(response2);
}
} }
}); });
}, },
@@ -626,19 +654,41 @@
}, },
confirmAdd() { confirmAdd() {
this.elementTarget = []; // 初始化清空参数 this.elementTarget = []; // 初始化清空参数
this.$refs.chartTag.forEach((item, index) => {//循环指标列表 if(this.chart.type!=='url'){
// 触发每个tag组件内部进行校验 this.$refs.chartTag.forEach((item, index) => {//循环指标列表
item.saveTarget(index); // 触发每个tag组件内部进行校验
}); item.saveTarget(index);
this.$refs.chartForm.validate(); });
}else {
this.$refs.chartForm.validate((valid) => {
const params = {
title: this.chart.title,//this.chart
span: this.chart.span,
height: this.chart.height,
type: this.chart.type,
unit:this.chart.unit,
param:{
url:this.chart.param.url,
}
};
if (valid) {
params.elements = [];
if (this.isedit) {
params.id = this.chart.id;
this.updateCharts(params);
} else {
this.addCharts(params);
}
}
});
}
}, },
// 获取metric列表 // 获取metric列表
getSuggestMetric() { getSuggestMetric() {
//this.$get('/prom/api/v1/label/__name__/values').then(response => { //this.$get('/prom/api/v1/label/__name__/values').then(response => {
this.$get('/module?pageSize=-1').then(response => { this.$get('/module?pageSize=-1').then(response => {
console.log('---response---',response);
if (response.code === 200) { if (response.code === 200) {
console.log('---response200---',response);
this.metricList = response.data.list; this.metricList = response.data.list;
const cascaderMap = new Map(); const cascaderMap = new Map();
this.metricList.forEach((item,index) => { this.metricList.forEach((item,index) => {
@@ -682,7 +732,6 @@
}); });
this.metricCascaderList = metricCascaderArr; this.metricCascaderList = metricCascaderArr;
console.log('---response200metricCascaderList---',this.metricCascaderList);
}else { }else {
this.metricList = []; this.metricList = [];
this.metricCascaderList = []; this.metricCascaderList = [];
@@ -714,7 +763,6 @@
} else { } else {
this.$nextTick(() => { this.$nextTick(() => {
console.log('1_+_+_+_+_+_+',JSON.stringify(elementInfo.elements[0]));
this.$refs.chartTag[0].setMdata(elementInfo.elements[0]); this.$refs.chartTag[0].setMdata(elementInfo.elements[0]);
}); });
} }
@@ -742,20 +790,26 @@
this.chart.height = data.height+''; this.chart.height = data.height+'';
this.chart.type = data.type; this.chart.type = data.type;
this.chart.unit=data.unit; this.chart.unit=data.unit;
//this.getSuggestMetric();//获得指标列表 if(this.chart.type==='url'){
// 指标 this.chart.param.url = data.param.url;
this.elements = []; this.isUrl = true;
bus.chartAddInfo.metricTarget = []; this.elements = [1];
data.elements.forEach((item, index) => { }else{
this.elements.push(index); //this.getSuggestMetric();//获得指标列表
}); // 指标
this.$nextTick(() => { this.elements = [];
const cSet = this.$refs.chartTag; bus.chartAddInfo.metricTarget = [];
// 派发charttag数据 data.elements.forEach((item, index) => {
cSet.forEach((item, index) => { this.elements.push(index);
item.setMdata(data.elements[index]);
}); });
}); this.$nextTick(() => {
const cSet = this.$refs.chartTag;
// 派发charttag数据
cSet.forEach((item, index) => {
item.setMdata(data.elements[index]);
});
});
}
}, },
// 初始化信息 // 初始化信息
@@ -797,7 +851,15 @@
unitSelected:function(value){ unitSelected:function(value){
this.chart.unit=value[value.length-1]; this.chart.unit=value[value.length-1];
}, },
chartTypeChange(){
let chartType = this.chart.type;
this.chart.param.url='';
if(chartType==='url'){
this.isUrl = true;
}else {
this.isUrl = false;
}
},
/*panel搜索建议*/ /*panel搜索建议*/
panelSuggestion(queryString, callback) { panelSuggestion(queryString, callback) {
let data = []; let data = [];
@@ -818,11 +880,41 @@
preview(){ preview(){
//验证图表数据是否合法??,合法了再显示预览窗口 //验证图表数据是否合法??,合法了再显示预览窗口
this.elementTarget = []; // 初始化清空参数 this.elementTarget = []; // 初始化清空参数
this.$refs.chartTag.forEach((item, index) => {//循环指标列表 if(this.chart.type!=='url'){
// 触发每个tag组件内部进行校验 this.$refs.chartTag.forEach((item, index) => {//循环指标列表
item.saveTarget(index,'preview'); // 触发每个tag组件内部进行校验
}); item.saveTarget(index,'preview');
this.$refs.chartForm.validate(); });
}else {
this.$refs.chartForm.validate((valid) => {
const params = {
title: this.chart.title,//this.chart
span: this.chart.span,
height: this.chart.height,
type: this.chart.type,
unit:this.chart.unit,
param:{
url:this.chart.param.url,
}
};
if (valid) {
if (this.isedit) {
params.id = this.chart.id;
}
this.$refs.chartsPreview.show(params);
/*
if (this.isedit) {
params.id = this.chart.id;
this.updateCharts(params);
} else {
this.addCharts(params);
}
*/
}
});
}
//this.$refs.chartForm.validate();
}, },
//preview--end //preview--end
@@ -854,6 +946,7 @@
item.clearSelectedTagList(); item.clearSelectedTagList();
}); });
} }
this.isUrl = false;
}, },
} }
</script> </script>

View File

@@ -343,7 +343,6 @@ export default {
let module = node.data.label; let module = node.data.label;
let metricArr = []; let metricArr = [];
let metricArrTmp = []; let metricArrTmp = [];
console.log('success=3',project,module,_this.metricCascaderList);
let metricLabelValMap = new Map(); let metricLabelValMap = new Map();
let projectItem = _this.metricAllData.get(project); let projectItem = _this.metricAllData.get(project);
@@ -363,10 +362,8 @@ export default {
}; };
metricArr.push(childOption); metricArr.push(childOption);
}); });
console.log('success=111',metricArr);
resolve(metricArr); resolve(metricArr);
}else { }else {
console.log('success=222');
_this.metricCascaderList.map((item, index) => { _this.metricCascaderList.map((item, index) => {
if(item.label===project){//选择的project if(item.label===project){//选择的project
item.children.map((innerItem, innerIndex) => { item.children.map((innerItem, innerIndex) => {
@@ -375,7 +372,6 @@ export default {
// 当二级分类的的child为空时才请求一次数据 // 当二级分类的的child为空时才请求一次数据
let match = '{project="'+project+'",module="'+module+'"}'; let match = '{project="'+project+'",module="'+module+'"}';
_this.$get('/prom/api/v1/series?match[]='+match).then(res => { _this.$get('/prom/api/v1/series?match[]='+match).then(res => {
console.log('success=5',res)
if (res.status === 'success') { if (res.status === 'success') {
res.data.forEach((tag, i) => { res.data.forEach((tag, i) => {
let metricName = tag.__name__; let metricName = tag.__name__;
@@ -432,12 +428,10 @@ export default {
}); });
resolve(metricArr); resolve(metricArr);
}else { }else {
console.log('success=999')
resolve([]); resolve([]);
} }
}) })
}else {//已经加载过了 }else {//已经加载过了
console.log('success=78')
resolve([]); resolve([]);
} }
} }
@@ -474,11 +468,11 @@ export default {
}, },
// 第三步,将数据重新赋值,sub-save-ok回调 // 第三步,将数据重新赋值,sub-save-ok回调
setSubdata(index) { setSubdata(index) {
console.log('metric第三步bus='+JSON.stringify(bus.chartAddInfo.metricTarget)); //('metric第三步bus='+JSON.stringify(bus.chartAddInfo.metricTarget));
console.log('metric第三步bus('+this.pointer+')='+JSON.stringify(bus.chartAddInfo.metricTarget[this.pointer])); //console.log('metric第三步bus('+this.pointer+')='+JSON.stringify(bus.chartAddInfo.metricTarget[this.pointer]));
this.elementInfo = bus.chartAddInfo.metricTarget[this.pointer]; this.elementInfo = bus.chartAddInfo.metricTarget[this.pointer];
console.log('metric第三步index'+index+',如果index是当前pointer('+this.pointer+')则继续把bus中的值赋值给当前metric') //console.log('metric第三步index'+index+',如果index是当前pointer('+this.pointer+')则继续把bus中的值赋值给当前metric')
console.log('metric第三步elementInfo='+JSON.stringify(this.elementInfo)); //console.log('metric第三步elementInfo='+JSON.stringify(this.elementInfo));
if(this.elementInfo.type==='expert'){ if(this.elementInfo.type==='expert'){
//alert('metric第三步expert'); //alert('metric第三步expert');
// 当该项expression为空时重置一下 // 当该项expression为空时重置一下
@@ -497,36 +491,29 @@ export default {
} }
}, },
clearSelectedTagList(){ clearSelectedTagList(){
console.log('--------clear selected')
this.elementInfo.selectedTagList.forEach((selectItem)=>{ this.elementInfo.selectedTagList.forEach((selectItem)=>{
selectItem.value = [];//清空值,再进行赋值 selectItem.value = [];//清空值,再进行赋值
}); });
}, },
convertLabelValueCascadeVal(){ convertLabelValueCascadeVal(){
//把级联选择label及value转换为selectedTagList里的value //把级联选择label及value转换为selectedTagList里的value
this.clearSelectedTagList(); this.clearSelectedTagList();
console.log('*** this.labelValueCascaderVal***',JSON.stringify(this.labelValueCascaderVal))
this.labelValueCascaderVal.forEach((item)=>{//[label,value] this.labelValueCascaderVal.forEach((item)=>{//[label,value]
let casLabel = item[0]; let casLabel = item[0];
let casValue = item[1]; let casValue = item[1];
console.log('*** this.elementInfo.selectedTagList***',JSON.stringify(this.elementInfo.selectedTagList))
this.elementInfo.selectedTagList.forEach((selectItem)=>{ this.elementInfo.selectedTagList.forEach((selectItem)=>{
let selectLabel = selectItem.name; let selectLabel = selectItem.name;
let selectValue = selectItem.value; let selectValue = selectItem.value;
console.log('111',selectLabel,casLabel)
if(selectLabel===casLabel){ if(selectLabel===casLabel){
console.log('222',selectValue.indexOf(casValue),selectValue,casValue)
if(selectValue.indexOf(casValue)===-1){ if(selectValue.indexOf(casValue)===-1){
selectValue.push(casValue); selectValue.push(casValue);
} }
} }
}); });
console.log('*** this.elementInfo.selectedTagList***end',JSON.stringify(this.elementInfo.selectedTagList))
}); });
}, },
// (最后整体保存添加的图标的时候执行)保存, chartdata点击确认后保存本身数据并返回给chartdata // (最后整体保存添加的图标的时候执行)保存, chartdata点击确认后保存本身数据并返回给chartdata
saveTarget(pointer,optType) { saveTarget(pointer,optType) {
console.log(this.pointer,pointer,'this.labelValueCascaderVal=====',JSON.stringify(this.labelValueCascaderVal));
if (this.pointer === pointer) { if (this.pointer === pointer) {
this.$refs.elementInfo.validate((valid) => { this.$refs.elementInfo.validate((valid) => {
if (valid) {//根据设置的rules进行验证验证通过则返回继续进行保存每个el-form-item都需要验证 if (valid) {//根据设置的rules进行验证验证通过则返回继续进行保存每个el-form-item都需要验证
@@ -536,7 +523,6 @@ export default {
if(this.elementInfo.type==='normal' && this.elementInfo.metric instanceof Array){ if(this.elementInfo.type==='normal' && this.elementInfo.metric instanceof Array){
this.elementInfo.metric = this.elementInfo.metric[2]; this.elementInfo.metric = this.elementInfo.metric[2];
} }
console.log('+++++++',JSON.stringify(this.labelValueCascaderVal));
this.convertLabelValueCascadeVal();//将labelvalue级联选择的值转换为selectTagList里 this.convertLabelValueCascadeVal();//将labelvalue级联选择的值转换为selectTagList里
this.$emit('on-add-target-success', this.elementInfo, pointer,optType); this.$emit('on-add-target-success', this.elementInfo, pointer,optType);
} }
@@ -785,7 +771,6 @@ export default {
} }
this.labelValueCascaderOptions.push(labelOption); this.labelValueCascaderOptions.push(labelOption);
console.log('++++item.val.length',item.value);
if(item.value.length>0){ if(item.value.length>0){
item.value.forEach((valueItem)=>{ item.value.forEach((valueItem)=>{
let labelVal = []; let labelVal = [];
@@ -795,8 +780,6 @@ export default {
}); });
} }
}); });
console.log('++++val',this.labelValueCascaderVal);
console.log('++++22',this.labelValueCascaderOptions);
}, },
changeTag(){ changeTag(){
this.$emit('on-change-condition'); this.$emit('on-change-condition');
@@ -806,7 +789,6 @@ export default {
}, },
// 选择metric // 选择metric
selectMetric() { selectMetric() {
console.log('---setMetricToLabelValue---start')
if (this.elementInfo.metric) {//选择了metric则设置tagList否则设置为空 if (this.elementInfo.metric) {//选择了metric则设置tagList否则设置为空
this.getSuggestTags(this.elementInfo.metric); this.getSuggestTags(this.elementInfo.metric);
this.setLabelValueCascader(); this.setLabelValueCascader();
@@ -858,14 +840,12 @@ export default {
}, },
// 获取tags列表 // 获取tags列表
getSuggestTags(metricArr) { getSuggestTags(metricArr) {
console.log('---getSuggestTags---start',this.metricLabelValInfo)
let metric = metricArr[2]; let metric = metricArr[2];
let proTmp = metricArr[0]; let proTmp = metricArr[0];
let project = proTmp.substring(0, proTmp.length - 4); let project = proTmp.substring(0, proTmp.length - 4);
let module = metricArr[1]; let module = metricArr[1];
this.elementInfo.selectedTagList = []; this.elementInfo.selectedTagList = [];
if(this.metricLabelValInfo.has(metric)){ if(this.metricLabelValInfo.has(metric)){
console.log('---metricLabelValInfo--has---start')
let tagListTmp = []; let tagListTmp = [];
tagListTmp = [...this.metricLabelValInfo.get(metric)]; tagListTmp = [...this.metricLabelValInfo.get(metric)];
tagListTmp.forEach((selectItem)=>{ tagListTmp.forEach((selectItem)=>{
@@ -988,7 +968,6 @@ export default {
}); });
//排序label顺序 //排序label顺序
this.sortLabel(tagListTmp,this.elementInfo.selectedTagList); this.sortLabel(tagListTmp,this.elementInfo.selectedTagList);
console.log('11111111111111');
this.setLabelValueCascader(); this.setLabelValueCascader();
} }
}else { }else {
@@ -1062,7 +1041,6 @@ export default {
}); });
this.elementInfo.selectedTagList = []; this.elementInfo.selectedTagList = [];
console.log('---response---start',this.metricLabelValInfo)
if(this.metricLabelValInfo.has(metric)){ if(this.metricLabelValInfo.has(metric)){
let tagListTmp = []; let tagListTmp = [];
tagListTmp = [...this.metricLabelValInfo.get(metric)];//[...this.metricList], tagListTmp = [...this.metricLabelValInfo.get(metric)];//[...this.metricList],
@@ -1133,7 +1111,6 @@ export default {
// 编辑已有图表状态时,先填充数据 // 编辑已有图表状态时,先填充数据
setMdata(data) { setMdata(data) {
console.log('-------data******',JSON.stringify(data))
this.setDataFlag = true; this.setDataFlag = true;
this.target = Object.assign({}, data); this.target = Object.assign({}, data);
//this.pointer = //this.pointer =
@@ -1344,7 +1321,6 @@ export default {
bus.$on('clear_history', () => { bus.$on('clear_history', () => {
this.clearHistory(); this.clearHistory();
}); });
console.log('@#$%%',this.metricCascaderList);
//this.metricCascaderList = [...this.metricCascaderListTmp]; //this.metricCascaderList = [...this.metricCascaderListTmp];
}, },
beforeDestroy() { beforeDestroy() {

View File

@@ -33,10 +33,10 @@
<div class="box-content" > <div class="box-content" >
<el-row :gutter="20" class="row-width" style="height: calc(100% - 65px);"> <el-row :gutter="20" class="row-width" style="height: calc(100% - 65px);">
<el-col :span="10" > <el-col :span="10" >
<metric-set :panelData="panelData" ref="metricSet" @on-view-chart="getChartParam" @reloadPanel="getPanelData"></metric-set> <metric-set :panelData="panelData" ref="metricSet" @on-view-chart="getChartParam" @reloadPanel="getPanelData"></metric-set>
</el-col> </el-col>
<el-col :span="0.5"><div>&nbsp;</div></el-col> <el-col :span="0.5" ><div>&nbsp;</div></el-col>
<el-col :span="13" class="chart-preview-area"> <el-col :span="13" class="chart-preview-area" >
<el-date-picker size="mini" ref="calendar" <el-date-picker size="mini" ref="calendar"
format="yyyy/MM/dd HH:mm" format="yyyy/MM/dd HH:mm"
@change="dateChange" @change="dateChange"
@@ -53,6 +53,7 @@
<div class="chartBox"> <div class="chartBox">
<line-chart-block <line-chart-block
:show-setting="false" :show-setting="false"
:isExplore="true"
ref="editChartSingle" ref="editChartSingle"
@on-refresh-data="refreshChart" @on-refresh-data="refreshChart"
@on-remove-chart-block="removeChart" @on-remove-chart-block="removeChart"

View File

@@ -46,10 +46,13 @@
:start-placeholder="$t('dashboard.panel.startTime')" :start-placeholder="$t('dashboard.panel.startTime')"
:end-placeholder="$t('dashboard.panel.endTime')" align="right"> :end-placeholder="$t('dashboard.panel.endTime')" align="right">
</el-date-picker> </el-date-picker>
<!--
<calendar ref="calendarPanel" class="nz-dashboard-picker"></calendar>
-->
</div> </div>
</div> </div>
<div class="nz-btn-group nz-btn-group-size-small nz-btn-group-light margin-r-20"> <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" <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()"> 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> <i style="font-size: 12px" class="global-active-color nz-icon nz-icon-refresh"></i>
@@ -85,7 +88,7 @@
ref="chartList"></chart-list> ref="chartList"></chart-list>
</div> </div>
</el-scrollbar> </el-scrollbar>
</div> </div>
<button class="to-top" v-show="showTopBtn" @click="$toTop('el', $refs.dashboardScrollbar.wrap)"><i class="nz-icon nz-icon-top"></i></button> <button class="to-top" v-show="showTopBtn" @click="$toTop('el', $refs.dashboardScrollbar.wrap)"><i class="nz-icon nz-icon-top"></i></button>
</div> </div>
@@ -98,6 +101,7 @@
import ChartBox from "./chartBox"; import ChartBox from "./chartBox";
import ChartList from '../../charts/chart-list'; import ChartList from '../../charts/chart-list';
import bus from '../../../libs/bus'; import bus from '../../../libs/bus';
//import calendar from '../../common/calendar'
export default { export default {
name: "panel", name: "panel",
@@ -267,7 +271,8 @@
}, },
components: { components: {
'chart-box': ChartBox, 'chart-box': ChartBox,
'chart-list': ChartList 'chart-list': ChartList,
//'calendar':calendar
}, },
methods: { methods: {
//刷新 //刷新
@@ -366,14 +371,14 @@
type: 'success', type: 'success',
message: this.$t("tip.deleteSuccess") message: this.$t("tip.deleteSuccess")
}); });
let chartList=this.$refs.chartList.dataList; let chartList=this.$refs.chartList.dataList;
for (let i =0;i< chartList.length;i++){ for (let i =0;i< chartList.length;i++){
if(chartList[i].id === data.id){ if(chartList[i].id === data.id){
chartList.splice(i,1); chartList.splice(i,1);
break; break;
}
} }
// this.getTableData(); //删除相关图表后,刷新面板数据 }
// this.getTableData(); //删除相关图表后,刷新面板数据
} else { } else {
this.$message.error(response.msg); this.$message.error(response.msg);
} }