CN-1728 fix: 动态调整y轴起点

This commit is contained in:
chenjinsong
2024-11-14 19:55:57 +08:00
parent 5e18ec9021
commit 925e9866d6
7 changed files with 624 additions and 57 deletions

View File

@@ -135,10 +135,10 @@ import table from '@/mixins/table'
import Loading from '@/components/common/Loading'
import axios from 'axios'
import { api } from '@/utils/api'
import { storageKey, tagIntent, chartColor3 } from '@/utils/constants'
import { urlParamsHandler, overwriteUrl, headerCellClass } from '@/utils/tools'
import { storageKey, tagIntent } from '@/utils/constants'
import { urlParamsHandler, overwriteUrl, headerCellClass, getYAxisBeginValue } from '@/utils/tools'
import { ref, shallowRef } from 'vue'
import { dateFormatToUTC, getNowTime, getSecond } from '@/utils/date-util'
import { getNowTime, getSecond } from '@/utils/date-util'
import chartDetectionPagination from '@/views/charts/charts/chartDetectionPagination'
import ChartNoData from '@/views/charts/charts/ChartNoData'
import { useRoute } from 'vue-router'
@@ -385,7 +385,6 @@ export default {
if (data.length > 1 && data[0].ipCount === 0 && data[0].domainCount === 0) {
data.splice(0, 1)
}
this.myChart = echarts.init(dom)
this.chartOption = tagLineChartOption
const series = []
@@ -401,7 +400,6 @@ export default {
}
},
name: 'IP',
stack: 'Total',
lineStyle: {
color: '#35ADDA',
width: 1
@@ -428,7 +426,6 @@ export default {
}
},
name: this.$t('overall.domain'),
stack: 'Total',
lineStyle: {
color: '#E48F3E',
width: 1
@@ -444,12 +441,25 @@ export default {
})
}
this.chartOption.series = series
this.chartOption.yAxis[0].startValue = getYAxisBeginValue(series)
this.chartOption.yAxis[0].axisLabel.formatter = (value) => {
return unitConvert(value, 'number').join('')
}
this.myChartArray.push(this.myChart)
this.myChart.setOption(this.chartOption)
const _this = this
this.myChart.on('legendselectchanged', function (params) {
const newSeries = []
if (params.selected.IP) {
newSeries.push(series[0])
}
if (params.selected.Domain) {
newSeries.push(series[1])
}
const _option = _this.myChart.getOption()
_option.yAxis[0].startValue = getYAxisBeginValue(newSeries)
_this.myChart.setOption(_option)
})
this.$nextTick(() => {
this.myChart.resize()
})
@@ -682,7 +692,319 @@ export default {
lineUrl = lineUrl.replace('{{name}}', item.name)
this.loadingDown = true
axios.get(lineUrl, { params: params }).then(response => {
const res = response.data
const res = {
"data": {
"resultType": "table",
"result": [
{
"statTime": 1731571020,
"domainCount": 0,
"ipCount": 0
},
{
"statTime": 1731571080,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731571140,
"ipCount": 8362,
"domainCount": 0
},
{
"statTime": 1731571200,
"ipCount": 8386,
"domainCount": 0
},
{
"statTime": 1731571260,
"ipCount": 8373,
"domainCount": 0
},
{
"statTime": 1731571320,
"ipCount": 8362,
"domainCount": 0
},
{
"statTime": 1731571380,
"ipCount": 8369,
"domainCount": 0
},
{
"statTime": 1731571440,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731571500,
"ipCount": 8374,
"domainCount": 0
},
{
"statTime": 1731571560,
"ipCount": 8364,
"domainCount": 0
},
{
"statTime": 1731571620,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731571680,
"ipCount": 8397,
"domainCount": 0
},
{
"statTime": 1731571740,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731571800,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731571860,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731571920,
"ipCount": 8405,
"domainCount": 0
},
{
"statTime": 1731571980,
"ipCount": 8403,
"domainCount": 0
},
{
"statTime": 1731572040,
"ipCount": 8403,
"domainCount": 0
},
{
"statTime": 1731572100,
"ipCount": 8397,
"domainCount": 0
},
{
"statTime": 1731572160,
"ipCount": 8405,
"domainCount": 0
},
{
"statTime": 1731572220,
"ipCount": 8404,
"domainCount": 0
},
{
"statTime": 1731572280,
"ipCount": 8374,
"domainCount": 0
},
{
"statTime": 1731572340,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731572400,
"ipCount": 8359,
"domainCount": 0
},
{
"statTime": 1731572460,
"ipCount": 8369,
"domainCount": 0
},
{
"statTime": 1731572520,
"ipCount": 8386,
"domainCount": 0
},
{
"statTime": 1731572580,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731572640,
"ipCount": 8373,
"domainCount": 0
},
{
"statTime": 1731572700,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731572760,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731572820,
"ipCount": 8380,
"domainCount": 0
},
{
"statTime": 1731572880,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731572940,
"ipCount": 8386,
"domainCount": 0
},
{
"statTime": 1731573000,
"ipCount": 8373,
"domainCount": 0
},
{
"statTime": 1731573060,
"ipCount": 8390,
"domainCount": 0
},
{
"statTime": 1731573120,
"ipCount": 8380,
"domainCount": 0
},
{
"statTime": 1731573180,
"ipCount": 8397,
"domainCount": 0
},
{
"statTime": 1731573240,
"ipCount": 8405,
"domainCount": 0
},
{
"statTime": 1731573300,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731573360,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731573420,
"ipCount": 8380,
"domainCount": 0
},
{
"statTime": 1731573480,
"ipCount": 8370,
"domainCount": 0
},
{
"statTime": 1731573540,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731573600,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731573660,
"ipCount": 8373,
"domainCount": 0
},
{
"statTime": 1731573720,
"ipCount": 8405,
"domainCount": 0
},
{
"statTime": 1731573780,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731573840,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731573900,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731573960,
"ipCount": 8380,
"domainCount": 0
},
{
"statTime": 1731574020,
"ipCount": 8403,
"domainCount": 0
},
{
"statTime": 1731574080,
"ipCount": 8362,
"domainCount": 0
},
{
"statTime": 1731574140,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731574200,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731574260,
"ipCount": 8399,
"domainCount": 0
},
{
"statTime": 1731574320,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731574380,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731574440,
"ipCount": 8389,
"domainCount": 0
},
{
"statTime": 1731574500,
"ipCount": 8369,
"domainCount": 0
},
{
"statTime": 1731574560,
"ipCount": 8378,
"domainCount": 0
},
{
"statTime": 1731574620,
"ipCount": 8374,
"domainCount": 0
}
]
}
}
// const res = response.data
if (response.status === 200) {
this.showError = false
this.isNoData = res.data.result.length === 0

View File

@@ -1268,24 +1268,6 @@ export function getIndexByEventSeverity (type) {
}
}
export function getQueryByFlag2 (type, condition) {
switch (type) {
case 'country':
case 'asn':
case 'province':
case 'city':
case 'isp': {
return `${type}='${condition[1]}'`
}
case 'idcRenter': {
return `idc_renter='${condition[1]}'`
}
default: {
return `${condition[0]}'${condition[1]}'`
}
}
}
/**
根据语言环境获取字符所占像素px
*/
@@ -1581,9 +1563,7 @@ const tagValueHandler = (value) => {
return find ? find.name : value
}
export const headerCellClass = (row) => {
return 'my-header-cell-class'
}
export const headerCellClass = 'my-header-cell-class'
/**
* & 被转译为& 将转义后的值转为 &
@@ -1621,3 +1601,26 @@ export const getSeverityByCode = (code) => {
}
}
}
export function getYAxisBeginValue (data) {
let max
let min
data.forEach(line => {
line.data && line.data.forEach(value => {
if (max === undefined || max < value[1]) {
max = value[1]
}
if (min === undefined || min > value[1]) {
min = value[1]
}
})
})
if (_.isNumber(min) && min >= 100) {
const diff = max - min
if (diff / min < 0.5) {
const minMDiff = min - diff > 0.8 * min ? min - diff : 0.8 * min
return Math.floor(minMDiff / Math.pow(10, `${Math.floor(minMDiff)}`.length - 2)) * Math.pow(10, `${Math.floor(minMDiff)}`.length - 2)
}
}
return 0
}

View File

@@ -83,7 +83,7 @@ import { getSecond } from '@/utils/date-util'
import ChartNoData from '@/views/charts/charts/ChartNoData'
import chartMixin from '@/views/charts2/chart-mixin'
import { useRoute } from 'vue-router'
import { getLineType, getMarkLineByLineRefer, overwriteUrl, urlParamsHandler } from '@/utils/tools'
import {getLineType, getMarkLineByLineRefer, getYAxisBeginValue, overwriteUrl, urlParamsHandler} from '@/utils/tools'
import { dataForDnsTrafficLine } from '@/utils/static-data'
export default {
name: 'DnsTrafficLine',
@@ -292,6 +292,7 @@ export default {
}
}
})
this.chartOption.yAxis[0].startValue = getYAxisBeginValue(this.chartOption.series)
if (!show) {
this.chartOption.series.forEach((t) => {
t.markLine.label.show = false
@@ -378,6 +379,13 @@ export default {
this.dispatchSelectAction('legendUnSelect', t.name)
}
})
const series = this.tabs.filter(tab => tab.show)
const yAxisStartValue = getYAxisBeginValue(series)
if (this.myChart) {
const _option = this.myChart.getOption()
_option.yAxis[0].startValue = yAxisStartValue
this.myChart.setOption(_option)
}
}
if (val === 'active') {
this.tabs.forEach(t => {

View File

@@ -72,7 +72,7 @@ import { getSecond } from '@/utils/date-util'
import ChartNoData from '@/views/charts/charts/ChartNoData'
import chartMixin from '@/views/charts2/chart-mixin'
import { useRoute } from 'vue-router'
import { getLineType, getMarkLineByLineRefer, overwriteUrl, urlParamsHandler } from '@/utils/tools'
import { getLineType, getMarkLineByLineRefer, overwriteUrl, urlParamsHandler, getYAxisBeginValue } from '@/utils/tools'
import ChartError from '@/components/common/Error'
import { dataForNetworkOverviewLine } from '@/utils/static-data'
@@ -202,6 +202,7 @@ export default {
this.toggleLoading(true)
axios.get(url, { params: params }).then(response => {
const res = response.data
console.info(res)
if (response.status === 200) {
this.chartDateObject = res.data.result
this.isNoData = res.data.result.length === 0
@@ -319,6 +320,7 @@ export default {
}
}
})
this.chartOption.yAxis[0].startValue = getYAxisBeginValue(this.chartOption.series)
if (!show && !this.lineTab) {
this.chartOption.series.forEach((t) => {
t.markLine.label.show = false
@@ -423,13 +425,18 @@ export default {
}
})
}
const series = this.tabs.filter(tab => tab.show)
const yAxisStartValue = getYAxisBeginValue(series)
const _option = this.myChart.getOption()
_option.yAxis[0].startValue = yAxisStartValue
this.myChart.setOption(_option)
}
if (val === 'active') {
this.tabs.forEach(t => {
t.invertTab = item.name === t.name ? !t.invertTab : true
if (t.invertTab && item.name === t.name) {
this.lineTab = this.lineTab ? '' : t.class
this.tabs.forEach((e) => {
this.tabs.forEach(e => {
this.dispatchSelectAction('legendSelect', e.name)
})
}
@@ -541,12 +548,11 @@ export default {
}
}
// 判断total曲线的头部数据若第一个值是0则删除第一个值
if (totalData.values[0].length > 1 && totalData.values[0][1] === 0) {
if (totalData && totalData.values && totalData.values[0] && totalData.values[0].length > 1 && totalData.values[0][1] === 0) {
lineData.forEach(l => {
l.values.splice(0, 1)
})
}
if (val === metricType.Sessions) {
const tabs = _.cloneDeep(this.tabsTemplate)
lineData.forEach((d, i) => {

View File

@@ -69,6 +69,7 @@ import chartMixin from '@/views/charts2/chart-mixin'
import unitConvert from '@/utils/unit-convert'
import ChartError from '@/components/common/Error'
import { dataForNpmLine } from '@/utils/static-data'
import { getYAxisBeginValue } from '@/utils/tools'
export default {
name: 'NpmLine',
@@ -135,7 +136,221 @@ export default {
if (url) {
axios.get(url, { params: params }).then(response => {
const res = response.data
const res = {
"data": {
"resultType": "matrix",
"result": [
{
"values": [
[
1731574080,
0.0
],
[
1731574140,
17826.96
],
[
1731574200,
4890.96
],
[
1731574260,
4667.6
],
[
1731574320,
4504.24
],
[
1731574380,
3907.2
],
[
1731574440,
3943.2
],
[
1731574500,
6414.4
],
[
1731574560,
3310.24
],
[
1731574620,
9168.4
],
[
1731574680,
575.2
],
[
1731574740,
2633.44
],
[
1731574800,
8965.04
],
[
1731574860,
622.24
],
[
1731574920,
2636.56
],
[
1731574980,
0.0
]
],
"type": "totalBitsRate"
},
{
"values": [
[
1731574080,
0.0
],
[
1731574140,
14262.96
],
[
1731574200,
3917.2
],
[
1731574260,
3808.4
],
[
1731574320,
3649.84
],
[
1731574380,
3159.2
],
[
1731574440,
3096.8
],
[
1731574500,
5166.0
],
[
1731574560,
2644.16
],
[
1731574620,
7310.16
],
[
1731574680,
476.4
],
[
1731574740,
2108.4
],
[
1731574800,
7193.84
],
[
1731574860,
501.04
],
[
1731574920,
2124.56
],
[
1731574980,
0.0
]
],
"type": "inboundBitsRate"
},
{
"values": [
[
1731574080,
0.0
],
[
1731574140,
1764.0
],
[
1731574200,
1773.76
],
[
1731574260,
1759.2
],
[
1731574320,
1754.4
],
[
1731574380,
1748.0
],
[
1731574440,
1746.4
],
[
1731574500,
1748.4
],
[
1731574560,
1766.16
],
[
1731574620,
1758.24
],
[
1731574680,
1798.8
],
[
1731574740,
1725.04
],
[
1731574800,
1771.2
],
[
1731574860,
1721.2
],
[
1731574920,
1712.0
],
[
1731574980,
0.0
]
],
"type": "outboundBitsRate"
}
]
}
}
// const res = response.data
if (response.status === 200) {
this.showError = false
this.isNoData = res.data.result.length === 0
@@ -197,8 +412,6 @@ export default {
}
this.chartOption = npmLineChartOption
this.chartOption.color = this.chartData.params.color
// this.chartOption.color = this.chartOption.color.reverse()
// data = data.reverse()
this.chartOption.series = data.map(t => {
return {
@@ -225,7 +438,7 @@ export default {
data: t.values.map((v) => [Number(v[0]) * 1000, Number(v[1]), type])
}
})
this.chartOption.yAxis[0].startValue = getYAxisBeginValue(this.chartOption.series)
this.chartOption.yAxis[0].axisLabel.formatter = (value) => {
if (type === 'percent') {
return unitConvert(value, type)[0]
@@ -302,6 +515,7 @@ export default {
this.legendSelectChange(legendList, legend)
},
legendSelectChange (legendList, legend) {
const showLegend = []
if (legendList.length > 0) {
this.chartOptionLineData.forEach(t => {
legendList.forEach(r => {
@@ -309,6 +523,7 @@ export default {
this.dispatchSelectAction('legendUnSelect', t.legend)
}
if (!t.show) {
showLegend.push(t.legend)
this.dispatchSelectAction('legendSelect', t.legend)
}
})
@@ -317,11 +532,16 @@ export default {
this.chartOptionLineData.forEach(t => {
legend.forEach(r => {
if (t.legend !== r.legend) {
showLegend.push(t.legend)
this.dispatchSelectAction('legendSelect', t.legend)
}
})
})
}
const _option = this.myChart.getOption()
const _series = _option.series.filter(s => showLegend.includes(s.name))
_option.yAxis[0].startValue = getYAxisBeginValue(_series)
this.myChart.setOption(_option)
},
resize () {
this.myChartArray.forEach(t => {

View File

@@ -30,28 +30,30 @@
<script>
import * as echarts from 'echarts'
import { trafficLineChartOption } from '@/views/charts2/charts/options/echartOption'
import {trafficLineChartOption} from '@/views/charts2/charts/options/echartOption'
import unitConvert from '@/utils/unit-convert'
import { chartColor3, chartColor4, unitTypes } from '@/utils/constants.js'
import { ref, shallowRef } from 'vue'
import { stackedLineTooltipFormatter } from '@/views/charts/charts/tools'
import {chartColor3, chartColor4, unitTypes} from '@/utils/constants.js'
import {ref, shallowRef} from 'vue'
import {stackedLineTooltipFormatter} from '@/views/charts/charts/tools'
import axios from 'axios'
import { api } from '@/utils/api'
import { getSecond } from '@/utils/date-util'
import {api} from '@/utils/api'
import {getSecond} from '@/utils/date-util'
import ChartNoData from '@/views/charts/charts/ChartNoData'
import _ from 'lodash'
import i18n from '@/i18n'
import chartMixin from '@/views/charts2/chart-mixin'
import { useRoute } from 'vue-router'
import {useRoute} from 'vue-router'
import {
getLineType,
getLineIndexUnit,
getLineIndexUnit2,
getLineType,
getYAxisBeginValue,
overwriteUrl,
urlParamsHandler
} from '@/utils/tools'
import ChartError from '@/components/common/Error'
import { dataForNpmTrafficLine } from '@/utils/static-data'
import {dataForNpmTrafficLine} from '@/utils/static-data'
export default {
name: 'NpmTrafficLine',
@@ -293,7 +295,7 @@ export default {
data: t.data.map(v => [Number(v[0]) * 1000, Number(v[1]), t.unitType])
}
})
this.chartOption.yAxis[0].startValue = getYAxisBeginValue(this.chartOption.series)
this.chartOption.tooltip.formatter = (params) => {
params.forEach(t => {
this.tabs.forEach(e => {
@@ -431,7 +433,6 @@ export default {
if (lineData[0] && lineData[0].values.length > 1 && lineData[0].values[0][1] === 0) {
lineData[0].values.splice(0, 1)
}
const tabs = _.cloneDeep(this.tabs)
const npmQuantity = _.cloneDeep(this.npmQuantity)
if (val === 'Sessions/s') {
@@ -445,7 +446,7 @@ export default {
}
})
this.tabs = tabs
this.initEchartsOption(this.tabs)
this.initEchartsOption(this.tabs, null)
} else if (val !== 'Bits/s' && val !== 'Packets/s') {
this.initLegend(lineData, npmQuantity, true)
} else {
@@ -480,13 +481,14 @@ export default {
e.show = true
})
this.tabs = newNpmData
this.initEchartsOption(this.tabs)
this.initEchartsOption(this.tabs, null)
}
},
httpError (e) {
this.isNoData = false
this.showError = true
this.errorMsg = this.errorMsgHandler(e)
console.error(e)
},
/**
* echarts框选

View File

@@ -26,32 +26,38 @@ const mockData = {
totalBitsRate: {
analysis: {
avg: '0'
}
},
values: []
},
inboundBitsRate: {
analysis: {
avg: '0'
}
},
values: []
},
outboundBitsRate: {
analysis: {
avg: '95229000000000000000'
}
},
values: []
},
internalBitsRate: {
analysis: {
avg: '0'
}
},
values: []
},
throughBitsRate: {
analysis: {
avg: '0'
}
},
values: []
},
other: {
analysis: {
avg: '0.01'
}
},
values: []
}
},
{