diff --git a/src/assets/css/components/index.scss b/src/assets/css/components/index.scss index 0bd6351e..60017f7b 100644 --- a/src/assets/css/components/index.scss +++ b/src/assets/css/components/index.scss @@ -62,4 +62,7 @@ @import './views/charts2/npmAppEventTable'; @import './views/charts2/npmRelatedSessions'; @import './views/charts2/npmTrafficLine'; +@import './views/charts2/linkBlock'; +@import './views/charts2/linkTrafficSankey'; +@import './views/charts2/linkDirectionGrid'; //@import '../chart'; diff --git a/src/assets/css/components/views/charts2/linkBlock.scss b/src/assets/css/components/views/charts2/linkBlock.scss new file mode 100644 index 00000000..16a4bc3d --- /dev/null +++ b/src/assets/css/components/views/charts2/linkBlock.scss @@ -0,0 +1,85 @@ +.link-blocks { + $blue: #046ECA; + $grey: #353636; + + border: 1px solid #E2E5EC; + height: 100%; + width: 100%; + border-radius: 4px; + background-color: #F7F7F7; + + .el-tabs { + margin-left: 20px; + + .el-tabs__nav-wrap { + padding-top: 5px; + + &::after { + height: 1px; + background-color: transparent ; + } + } + .el-tabs__nav.is-top { + height: 33px; + + .el-tabs__active-bar { + background-color: $blue; + } + .el-tabs__item { + padding: 0 10px; + height: 33px; + color: $grey; + font-size: 14px; + + &.el-tabs__item.is-top.is-active { + color: $blue; + } + &:nth-child(2) { + padding-left: 0; + } + } + } + } + + .block-list { + display: flex; + flex-wrap: wrap; + padding: 8px 14px 0 20px; + + .link-block { + height: 30px; + width: 30px; + border-radius: 2px; + margin: 0 6px 6px 0; + } + } +} +.link-block__popper { + background-color: #1F2B33 !important; + border-color: #F7F7F7 !important; + + .el-popper__arrow::before { + background-color: #1F2B33 !important; + border-color: #F7F7F7 !important; + } + + .popper-content { + .popper-content__link-id { + padding-bottom: 4px; + font-size: 14px; + color: white; + } + .popper-content__link-info { + display: flex; + font-size: 12px; + + .info__label { + color: #D8D8D8; + flex-basis: 110px; + } + .info__value { + color: white; + } + } + } +} diff --git a/src/assets/css/components/views/charts2/linkDirectionGrid.scss b/src/assets/css/components/views/charts2/linkDirectionGrid.scss new file mode 100644 index 00000000..a292a045 --- /dev/null +++ b/src/assets/css/components/views/charts2/linkDirectionGrid.scss @@ -0,0 +1,3 @@ +.link-direction-grid { + +} diff --git a/src/assets/css/components/views/charts2/linkTrafficSankey.scss b/src/assets/css/components/views/charts2/linkTrafficSankey.scss new file mode 100644 index 00000000..0417d3b8 --- /dev/null +++ b/src/assets/css/components/views/charts2/linkTrafficSankey.scss @@ -0,0 +1,42 @@ +.link-traffic-sankey { + $blue: #046ECA; + $grey: #353636; + + border: 1px solid #E2E5EC; + height: 100%; + width: 100%; + border-radius: 4px; + + .el-tabs { + margin-left: 20px; + + .el-tabs__nav-wrap { + padding-top: 5px; + + &::after { + height: 1px; + background-color: transparent ; + } + } + .el-tabs__nav.is-top { + height: 33px; + + .el-tabs__active-bar { + background-color: $blue; + } + .el-tabs__item { + padding: 0 10px; + height: 33px; + color: $grey; + font-size: 14px; + + &.el-tabs__item.is-top.is-active { + color: $blue; + } + &:nth-child(2) { + padding-left: 0; + } + } + } + } +} diff --git a/src/assets/css/components/views/charts2/networkOverviewTabs.scss b/src/assets/css/components/views/charts2/networkOverviewTabs.scss index 731d925e..ef225369 100644 --- a/src/assets/css/components/views/charts2/networkOverviewTabs.scss +++ b/src/assets/css/components/views/charts2/networkOverviewTabs.scss @@ -1,5 +1,5 @@ .tabs { - $blue: #2C72C6; + $blue: #046ECA; $grey: #353636; height:calc(100% - 64px); font-size:12px; @@ -84,7 +84,7 @@ } } .el-tabs__header { - margin-bottom: 3px; + margin-bottom: 10px; width: calc(100% - 272px); } .el-tabs__nav-wrap::after { @@ -92,24 +92,25 @@ background-color: transparent ; } .el-tabs__nav.is-top { + height: 33px; + .el-tabs__active-bar { - display: none; + background-color: $blue; } .el-tabs__item { - margin: 0 20px 0 0; - padding:0px; - font-weight: 400; - color:$grey; - font-size:14px; - } - .el-tabs__item.is-top.is-active { - border-bottom: 2px solid $blue; - color:$blue; + padding: 0 10px; height: 33px; - margin:0 20px 7px 0; - padding:0px; - font-weight:400; + color: $grey; + font-size: 14px; + + &.el-tabs__item.is-top.is-active { + color:$blue; + } + &:nth-child(2) { + padding-left: 0; + } } + } .el-tabs__content { height: calc(100% - 40px); @@ -326,4 +327,4 @@ } .btn-up{ margin-top:40px; -} \ No newline at end of file +} diff --git a/src/mock/index.js b/src/mock/index.js index 7704277b..03813522 100644 --- a/src/mock/index.js +++ b/src/mock/index.js @@ -1 +1,2 @@ import './npm' +import './linkMonitor' diff --git a/src/mock/linkMonitor.js b/src/mock/linkMonitor.js new file mode 100644 index 00000000..86bc859f --- /dev/null +++ b/src/mock/linkMonitor.js @@ -0,0 +1,18 @@ +import Mock from 'mockjs' + +const openMock = true +if (openMock) { + Mock.mock(BASE_CONFIG.baseUrl + 'interface/linkMonitor/links', 'get', function (requestObj) { + const linkData = [] + for (let i = 0; i < 94; i++) { + linkData.push({ linkId: 20 * (i + 300), totalBitsRate: Math.floor(Math.pow(1.1, i) * 10000) }) + } + return { + msg: 'success', + code: 200, + data: { + result: linkData + } + } + }) +} diff --git a/src/utils/api.js b/src/utils/api.js index 9200ad36..fb29e8fc 100644 --- a/src/utils/api.js +++ b/src/utils/api.js @@ -194,6 +194,9 @@ export const api = { recentEventsD: '/interface/application/performance/overview/drilldown/dimension/recentEvents', dimensionEvents: '/interface/overview/event/dimensionEvents' } + }, + linkMonitor: { + links: '/interface/linkMonitor/links' } } diff --git a/src/utils/constants.js b/src/utils/constants.js index e4693f58..95e67e59 100644 --- a/src/utils/constants.js +++ b/src/utils/constants.js @@ -54,7 +54,8 @@ export const panelTypeAndRouteMapping = { domainEntityDetail: 5, appEntityDetail: 6, cryptocurrency: 7, - ipDrillDownTest: 8 + ipDrillDownTest: 8, + linkMonitor: 14 } /* operationLog state 执行状态属性 值与名称之间的映射 */ diff --git a/src/utils/tools.js b/src/utils/tools.js index 9f1d8365..c0b29353 100644 --- a/src/utils/tools.js +++ b/src/utils/tools.js @@ -859,3 +859,30 @@ export function urlParamsHandler (url, oldParams, newParams, cleanOldParams) { export function overwriteUrl (url) { window.history.pushState('', '', url) } + +/* +startColor: 渐变起始颜色,对应最大值 +endColor: 渐变结束颜色,对应最小值 +values: 从大到小排好序的数值 + */ +export function colorGradientCalculation (startColor, endColor, values) { + const colors = [] + const startRgbArr = colorHexToRgbArr(startColor) + const endRgbArr = colorHexToRgbArr(endColor) + const rDiff = endRgbArr[0] - startRgbArr[0] + const gDiff = endRgbArr[1] - startRgbArr[1] + const bDiff = endRgbArr[2] - startRgbArr[2] + const valueDiff = values[0] - values[values.length - 1] + values.forEach((v, i) => { + colors.push(`rgb(${startRgbArr[0] + Math.floor(rDiff * (valueDiff - diff(v)) / valueDiff)},${startRgbArr[1] + Math.floor(gDiff * (valueDiff - diff(v)) / valueDiff)},${startRgbArr[2] + Math.floor(bDiff * (valueDiff - diff(v)) / valueDiff)})`) + }) + function diff (v) { + return v - values[values.length - 1] + } + return colors +} + +// returns an array like [11,22,33] +export function colorHexToRgbArr (hex) { + return [1, 3, 5].map((h) => parseInt(hex.substring(h, h + 2), 16)) +} diff --git a/src/views/charts2/Chart.vue b/src/views/charts2/Chart.vue index b2f6d6e9..0c3409ee 100644 --- a/src/views/charts2/Chart.vue +++ b/src/views/charts2/Chart.vue @@ -110,6 +110,18 @@ :chart="chart" @toggleLoading="toggleLoading" > + + @@ -133,6 +145,8 @@ import NpmEventsHeader from '@/views/charts2/charts/npm/NpmEventsHeader' import RelatedSessions from '@/views/charts2/charts/npm/RelatedSessions' import NpmIpMap from '@/views/charts2/charts/npm/NpmIpMap' import NpmTrafficLine from '@/views/charts2/charts/npm/NpmTrafficLine' +import LinkBlock from '@/views/charts2/charts/linkMonitor/LinkBlock' +import LinkTrafficSankey from '@/views/charts2/charts/linkMonitor/LinkTrafficSankey' import { get } from '@/utils/http' import { getNowTime, getSecond } from '@/utils/date-util' import { ref } from 'vue' @@ -156,7 +170,9 @@ export default { NpmAppEventTable, RelatedSessions, NpmIpMap, - NpmTrafficLine + NpmTrafficLine, + LinkBlock, + LinkTrafficSankey }, props: { chart: Object, diff --git a/src/views/charts2/chart-tools.js b/src/views/charts2/chart-tools.js index b17ddf63..ad500bb0 100644 --- a/src/views/charts2/chart-tools.js +++ b/src/views/charts2/chart-tools.js @@ -19,5 +19,9 @@ export const typeMapping = { npmNetworkQuantity: 703, npmRecentEvents: 602, appEventTable: 603 + }, + linkMonitor: { + linkBlock: 707, + linkTrafficSankey: 708 } } diff --git a/src/views/charts2/charts/linkMonitor/LinkBlock.vue b/src/views/charts2/charts/linkMonitor/LinkBlock.vue new file mode 100644 index 00000000..340b1b04 --- /dev/null +++ b/src/views/charts2/charts/linkMonitor/LinkBlock.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/views/charts2/charts/linkMonitor/LinkDirectionGrid.vue b/src/views/charts2/charts/linkMonitor/LinkDirectionGrid.vue new file mode 100644 index 00000000..5394f478 --- /dev/null +++ b/src/views/charts2/charts/linkMonitor/LinkDirectionGrid.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/charts2/charts/linkMonitor/LinkTrafficSankey.vue b/src/views/charts2/charts/linkMonitor/LinkTrafficSankey.vue new file mode 100644 index 00000000..9dede4a0 --- /dev/null +++ b/src/views/charts2/charts/linkMonitor/LinkTrafficSankey.vue @@ -0,0 +1,29 @@ + + +