CN-368 Detection--服务质量事件 活跃实体图表错乱

This commit is contained in:
hanyuxia
2022-03-11 15:40:33 +08:00
parent 5924b5d050
commit fdd5a97e1f
4 changed files with 79 additions and 14 deletions

View File

@@ -461,12 +461,71 @@ export function humpToLine (name) {
} }
return name.replace(/([A-Z])/g, '_$1').toLowerCase() return name.replace(/([A-Z])/g, '_$1').toLowerCase()
} }
//排序功能 //排序功能:从大到小,降序排列
export function sortBy (i) { export function reverseSortBy (i) {
return function (a, b) { return function (a, b) {
return b[i] - a[i] return b[i] - a[i]
} }
} }
//排序功能:从小到大,升序排列
export function sortBy (i) {
return function (a, b) {
return a[i] - b[i]
}
}
//echart图标y轴鼠标悬浮时显示标签所有内容
export function extensionEchartY(chart){
//判断是否创建过div框,如果创建过就不再创建了
//该div用来盛放文本显示内容的方便对其悬浮位置进行处理
let id = document.getElementById("extension")
if(!id) {
let div = "<div id = 'extension' style=\"display:block\"></div>"
let contentDiv = document.createElement("div")
contentDiv.setAttribute('id','extension')
contentDiv.setAttribute('style','display:block')
document.documentElement.append(contentDiv)
}
chart.on('mouseover', function(params) {
//注意这里我是以Y轴显示内容过长为例如果是x轴的话需要改为xAxis
if(params.componentType === "yAxis") {
//设置悬浮文本的位置以及样式
let extEle = document.getElementById("extension")
extEle.style.cssText = "display:inline;position:absolute;" +
" padding: 12px;" +
" max-width: 400px !important;" +
" color: #666;" +
" background-color: rgb(255, 255, 255);" +
" font-size: 14px;" +
" line-height: 20px;" +
" font-weight:400; " +
" font-family: \"Microsoft YaHei\"" +
" border-style: solid;" +
" border-width: 1px;" +
" border-radius: 4px;" +
" border-color: transparent !important;" +
" box-shadow: rgb(0 0 0 / 30%) 0px 0px 3px;" +
" white-space: nowrap;" +
" z-index: 99999999;"
extEle.innerHTML = params.value;
document.documentElement.onmousemove = function(event) {
let extEle = document.getElementById("extension")
let xx = event.pageX - extEle.offsetWidth - 20
let yy = event.pageY + 20
extEle.style.cssText = extEle.style.cssText+"top:"+yy+"px;left:"+xx+"px;"
}
}
})
chart.on('mouseout', function(params) {
//注意这里我是以Y轴显示内容过长为例如果是x轴的话需要改为xAxis
if(params.componentType == "yAxis") {
let extEle = document.getElementById("extension")
extEle.style.cssText = "display:none;"
}
})
}
// 搜索功能:对象转字符串 // 搜索功能:对象转字符串
export function objToStr (obj) { export function objToStr (obj) {
return Object.keys(obj).map(k => { return Object.keys(obj).map(k => {

View File

@@ -5,7 +5,7 @@
<script> <script>
import unitConvert from '@/utils/unit-convert' import unitConvert from '@/utils/unit-convert'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { lineToSpace, sortBy, humpToSpace } from '@/utils/tools' import { lineToSpace, reverseSortBy, humpToSpace } from '@/utils/tools'
import { unitTypes } from '@/utils/constants' import { unitTypes } from '@/utils/constants'
import chartEchartMixin from './chart-echart-mixin' import chartEchartMixin from './chart-echart-mixin'
import { isEchartsPie } from './tools' import { isEchartsPie } from './tools'
@@ -68,7 +68,7 @@ export default {
} }
let chartDataTmp = [] let chartDataTmp = []
let otherData = [] let otherData = []
this.chartData.sort(sortBy('num')) this.chartData.sort(reverseSortBy('num'))
if(this.chartData.length>5){ if(this.chartData.length>5){
chartDataTmp = this.chartData.slice(0, 5) chartDataTmp = this.chartData.slice(0, 5)

View File

@@ -67,7 +67,7 @@
<div class="no-data chart-content" >No data</div> <div class="no-data chart-content" >No data</div>
</template> </template>
<template v-if="!isStatisticsActiveAttackNoData"> <template v-if="!isStatisticsActiveAttackNoData">
<div class="chart-content" :id="`detectionActiveAttacker${pageType}`"> <div class="chart-content" style="padding-left: 5px;" :id="`detectionActiveAttacker${pageType}`">
</div> </div>
</template> </template>
</div> </div>
@@ -112,6 +112,7 @@ import { ref } from 'vue'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { multipleBarOption, pieForSeverity, activeAttackBar, getAttackColor, getSeverityColor, getSeriesIndex } from '@/views/detections/options/detectionOptions' import { multipleBarOption, pieForSeverity, activeAttackBar, getAttackColor, getSeverityColor, getSeriesIndex } from '@/views/detections/options/detectionOptions'
import { api, getData } from '@/utils/api' import { api, getData } from '@/utils/api'
import { reverseSortBy ,sortBy ,extensionEchartY} from '@/utils/tools'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import DetectionNoData from '@/views/detections/DetectionNoData' import DetectionNoData from '@/views/detections/DetectionNoData'
@@ -538,7 +539,7 @@ export default {
const chartDom = document.getElementById(`detectionActiveAttacker${this.pageType}`) const chartDom = document.getElementById(`detectionActiveAttacker${this.pageType}`)
const detectionChart = echarts.init(chartDom) const detectionChart = echarts.init(chartDom)
const offenderIpOption = this.$_.cloneDeep(activeAttackBar) const offenderIpOption = this.$_.cloneDeep(activeAttackBar)
data.sort(this.sortBy('count')) data.sort(reverseSortBy('count'))
data = data.slice(0, 5) data = data.slice(0, 5)
offenderIpOption.series[0].data = data.map(d => { offenderIpOption.series[0].data = data.map(d => {
return [d.count, d.offenderIp] return [d.count, d.offenderIp]
@@ -550,11 +551,7 @@ export default {
}) })
}, },
sortBy (i) {
return function (a, b) {
return b[i] - a[i]
}
},
initVictimIpData (params) { initVictimIpData (params) {
getData(api.detection[this.pageType].victimIp, params).then(data => { getData(api.detection[this.pageType].victimIp, params).then(data => {
/* data = [ /* data = [
@@ -704,14 +701,19 @@ export default {
const chartDom = document.getElementById(`detectionActiveAttacker${this.pageType}`) const chartDom = document.getElementById(`detectionActiveAttacker${this.pageType}`)
const detectionChart = echarts.init(chartDom) const detectionChart = echarts.init(chartDom)
const option = this.$_.cloneDeep(activeAttackBar) const option = this.$_.cloneDeep(activeAttackBar)
data.sort(reverseSortBy('count'))
data = data.slice(0, 5)
option.series[0].data = data.map(d => { option.series[0].data = data.map(d => {
return [d.count, d.name] return [d.count, d.name]
}).reverse() }).reverse()
detectionChart.setOption(option) detectionChart.setOption(option)
extensionEchartY(detectionChart)//y轴标签过长时鼠标悬浮显示所有内容
} }
}).catch(error => { }).catch(error => {
}) })
}, },
computeFilterPage (data) { computeFilterPage (data) {
return { return {
showMore: data.length > 10, showMore: data.length > 10,

View File

@@ -229,7 +229,7 @@ export const activeAttackBar = {
}, },
show: true, show: true,
className: 'nz-chart-tooltip', className: 'nz-chart-tooltip',
extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);max-width: 300px !important' extraCssText: 'box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);max-width: 400px !important'
}, },
xAxis: { xAxis: {
axisTick: { show: false }, axisTick: { show: false },
@@ -252,11 +252,15 @@ export const activeAttackBar = {
axisTick: { show: false }, axisTick: { show: false },
axisLine: { show: false }, axisLine: { show: false },
axisLabel: { axisLabel: {
show: true show: true,
width:95,
overflow:'truncate',
}, },
splitLine: { splitLine: {
show: false show: false
} },
triggerEvent: true,
}, },
series: [{ series: [{
barWidth: 5, barWidth: 5,