Compare commits

...

17 Commits

Author SHA1 Message Date
lijinyang
53c24fe51b Update .gitlab-ci.yml 2023-02-14 15:02:20 +08:00
chenjinsong
2aa7f6edfb fix: 修复ip实体详情右上角饼图请求参数太长导致请求失败的问题 2023-02-10 15:23:19 +08:00
chenjinsong
6ed9c4f5fe fix: 修复detection顶部柱状图数据没有按时间排序的问题,修复app图逻辑问题 2023-02-10 14:20:07 +08:00
chenjinsong
6f8631f947 fix: whois字段问题 2023-02-09 17:15:21 +08:00
chenjinsong
63ab36f4d2 fix: 单位转换方法参数为0时不返回单位 2023-02-08 15:54:32 +08:00
chenjinsong
cccc1f0e6a CN-885 feat: whois字段调整 2023-02-08 15:24:18 +08:00
chenjinsong
4651709529 fix: logo变更、国际化切换按钮隐藏 2023-02-08 11:30:23 +08:00
chenjinsong
6ab98be4c8 fix: 修复加密DNS协议支持情况统计图表数据颠倒的问题 2023-02-08 10:55:11 +08:00
陈劲松
7b96f979a4 Merge branch 'cherry-pick-2b67cb4a' into '6suo'
fix: detection-performanceEvent去除对eventId的格式转换

See merge request cyber-narrator/cn-ui!20
2023-02-07 09:18:19 +00:00
刘洪洪
a59bff2cb7 fix: detection-performanceEvent去除对eventId的格式转换
(cherry picked from commit 2b67cb4a0b)
2023-02-07 17:18:13 +08:00
chenjinsong
04651581fe fix: 更新log外链链接 2023-02-03 18:46:08 +08:00
chenjinsong
84ca05dccc fix: 修复dns仪表盘切换时间不生效的问题 2023-02-03 16:38:24 +08:00
chenjinsong
780de66ddf fix: 隐藏代理和chart入口 2023-02-03 16:28:02 +08:00
chenjinsong
9205d7645d fix: 优化折线图效果 2023-02-03 16:26:46 +08:00
chenjinsong
ec486fe930 fix: 修复地图资源路径拼写错误的问题 2023-02-03 11:08:35 +08:00
chenjinsong
12c31b5bf6 feat: 6所相关内容,增加折线图左侧边距 2023-02-02 18:38:33 +08:00
chenjinsong
96591cb9ef feat: 6所相关内容 2023-02-02 17:55:03 +08:00
25 changed files with 117 additions and 76 deletions

View File

@@ -29,7 +29,7 @@ generate_git-log:
- public/index.html
- public/git-log.html
only:
- dev
- 6suo
tags:
- galaxy
@@ -42,7 +42,7 @@ build_project:
- echo "npm run build"
- cnpm run build
only:
- dev
- 6suo
- tags
tags:
- galaxy
@@ -51,14 +51,14 @@ build_image:
stage: build_image
script:
- echo "docker build"
- sudo docker build --no-cache -t cn-ui:$CNUI_TAG .
- sudo docker build --no-cache -t cn-ui-$CI_COMMIT_REF_NAME:$CNUI_TAG .
- echo "docker tag"
- sudo docker tag cn-ui:$CNUI_TAG 192.168.40.153:9080/cyber-narrator/cn-ui:$CNUI_TAG
- sudo docker tag cn-ui-$CI_COMMIT_REF_NAME:$CNUI_TAG 192.168.40.153:9080/cyber-narrator/cn-ui-$CI_COMMIT_REF_NAME:$CNUI_TAG
- echo "docker push"
- sudo docker push 192.168.40.153:9080/cyber-narrator/cn-ui:$CNUI_TAG
- sudo docker push 192.168.40.153:9080/cyber-narrator/cn-ui-$CI_COMMIT_REF_NAME:$CNUI_TAG
when: on_success
only:
- dev
- 6suo
tags:
- galaxy
@@ -71,11 +71,11 @@ build_release_image:
- echo '提交的版本是'
- echo $CI_COMMIT_REF_NAME
- echo "docker build"
- sudo docker build --no-cache -t cn-ui:$CI_COMMIT_TAG .
- sudo docker build --no-cache -t cn-ui-$CI_COMMIT_REF_NAME:$CI_COMMIT_TAG .
- echo "docker tag"
- sudo docker tag cn-ui:$CI_COMMIT_TAG 192.168.40.153:9080/cyber-narrator/cn-ui:$CI_COMMIT_TAG
- sudo docker tag cn-ui-$CI_COMMIT_REF_NAME:$CI_COMMIT_TAG 192.168.40.153:9080/cyber-narrator/cn-ui-$CI_COMMIT_REF_NAME:$CI_COMMIT_TAG
- echo "docker push"
- sudo docker push 192.168.40.153:9080/cyber-narrator/cn-ui:$CI_COMMIT_TAG
- sudo docker push 192.168.40.153:9080/cyber-narrator/cn-ui-$CI_COMMIT_REF_NAME:$CI_COMMIT_TAG
only:
- tags
tags:

View File

@@ -1,4 +1,5 @@
var BASE_CONFIG = {
baseUrl: 'http://192.168.44.54:8090/',
version: '2.0.2021.05.11.19.43'
baseUrl: 'http://192.168.44.54:8093/',
version: '23.02.08',
logUrl: 'http://192.168.44.114:8088/superset/explore/?r=12&standalone=1'
}

View File

@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>images/logo.svg">
<script src="config.js"></script>
<title>Cyber Narrator</title>
<title>域名解析服务监测系统</title>
</head>
<body class="theme-light">
<noscript>

View File

@@ -1,9 +1,7 @@
<template>
<div class="logins">
<div class="inside">
<div class="title">
<img src="../public/images/logo-title.svg" />
</div>
<div class="title">域名解析服务监测系统</div>
<el-form class="login__box">
<el-form-item>
<el-input
@@ -193,12 +191,12 @@ export default {
}
.title {
margin-top: 65px;
margin-top: 90px;
padding: 0 70px;
color: white;
font-size: 40px;
text-align: center;
}
.title > img {
height: 135px;
}
.login__box {
display: flex;
justify-content: center;

View File

@@ -98,6 +98,8 @@
.domain-detail-list {
display: table;
width: 100%;
height: 100%;
overflow: auto;
.domain-detail-list__row {
display: table-row;

View File

@@ -1,4 +1,5 @@
.cn-chart__whois {
overflow: auto;
height: 100%;
}

View File

@@ -7,7 +7,7 @@
display: flex;
&.panel__time--scrolled-out {
position: fixed;
top: 70px;
top: 120px;
padding-right: 10px;
}
&>div {
@@ -18,7 +18,7 @@
.chart-list {
&.chart-list--screen {
display: grid;
height: calc(100vh - 90px);
height: calc(100vh - 130px);
width: 100%;
grid-template-columns: repeat(30,1fr);
grid-template-rows: repeat(19,1fr);

View File

@@ -4,12 +4,12 @@
<div class="banner__left">
<span @click="shrink" class="shrink-button" :class="{'shrink-button--collapse': showMenu}"><i
class="cn-icon cn-icon-navigation"></i></span>
<img alt="loading..." height="26" :src="logo?logo:require('../../assets/img/logo-header.svg')" @click="jump('/panel/networkOverview', '', '', 0)" style="cursor: pointer"/>
<span style="color: white; font-size: 20px;">域名解析服务监测系统</span>
</div>
<!--个人操作-->
<div class="personal">
<el-dropdown>
<div class="header-menu--item"><i class="cn-icon cn-icon-language"></i></div>
<!-- <el-dropdown>
<div class="header-menu&#45;&#45;item"><i class="cn-icon cn-icon-language"></i></div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
@@ -24,7 +24,7 @@
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-dropdown>-->
<el-dropdown>
<div class='login-user header-menu--item'>{{ username }}&nbsp;<i class="cn-icon cn-icon-arrow-down"></i></div>
<template #dropdown>

View File

@@ -19,6 +19,11 @@ const routes = [
path: '/panel/:typeName',
component: () => import('@/views/charts2/Panel')
},
{
name: 'dns6',
path: '/dns6/:typeName',
component: () => import('@/views/charts/Panel')
},
{
path: '/report/builtIn',
component: () => import('@/views/report/reportTest')

View File

@@ -318,11 +318,12 @@ export async function getI18n () {
/* 获得原始的3611-2 json字符串数据 */
export async function getIso36112JsonData (suffix) {
const url = `${window.location.protocol}//${window.location.host}/geojson/${suffix}.json`
const request = new Promise(resolve => {
axios({
url: `${window.location.protocol}//${window.location.host}:${window.location.port}/geojson/${suffix}.json`
}).then(response => {
axios({ url }).then(response => {
resolve(response.data || response || null)
}).catch(err => {
console.error(err)
})
})
return await request

View File

@@ -63,7 +63,8 @@ export const panelTypeAndRouteMapping = {
cryptocurrency: 7,
ipDrillDownTest: 8,
linkMonitor: 14,
linkMonitorDrillDown: 15
linkMonitorDrillDown: 15,
dns6: 18
}
/* operationLog state 执行状态属性 值与名称之间的映射 */
@@ -1554,7 +1555,7 @@ export const npmCategoryInfoMapping = [
// 整屏滚动的路径映射
export const wholeScreenRouterMapping = {
dns: '/panel/dnsServiceInsights'
dns: '/dns6/dns6'
}
export const themeData = [

View File

@@ -17,6 +17,9 @@ function asciiCompute (num, ascii = 1000, units, dot = 2) {
return ['', '']
}
num = Number(num)
if (num === 0) {
return [0, '']
}
let carry = 0
if (num > 1) {
const log = Math.log(num) / Math.log(ascii)

View File

@@ -38,21 +38,6 @@ export default {
i18n: 'overall.operationLog',
path: '/administration/operationLog',
icon: 'cn-icon cn-icon-operation-log'
},
{
i18n: 'I18n',
path: '/administration/i18n',
icon: 'cn-icon cn-icon-i18n'
},
{
i18n: 'galaxyProxy.galaxyProxy',
path: '/administration/galaxyProxy',
icon: 'cn-icon cn-icon-proxy'
},
{
i18n: 'overall.chart',
path: '/administration/chart',
icon: 'cn-icon cn-icon-chart'
}
]
}

View File

@@ -23,7 +23,7 @@ export default {
const boxDom = document.getElementById('frame-box')
const dom = document.getElementById('frame')
const height = boxDom.offsetHeight
dom.src = `http://192.168.44.114:8088/superset/explore/?r=15&standalone=1&height=${height || 800}`
dom.src = BASE_CONFIG.logUrl + '&height=' + (height + 100)
}
}
</script>

View File

@@ -114,8 +114,8 @@ export default {
},
reload () {
this.copyDataList.forEach(item => {
if (this.$refs['chart' + item.id]) {
this.$refs['chart' + item.id].reload()
if (this.$refs['chart' + item.id] && this.$refs['chart' + item.id][0]) {
this.$refs['chart' + item.id][0].reload()
}
})
},

View File

@@ -11,20 +11,40 @@
<div class="domain-detail-list__content">{{ $_.get(chartData, "org") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">Email</div>
<div class="domain-detail-list__label">注册机构邮箱</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "email") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('overall.country')}}</div>
<div class="domain-detail-list__label">注册机构电话</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "domainWhoisPhone") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">注册国家</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "country") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('entities.creationDate')}}</div>
<div class="domain-detail-list__content">{{ dateFormatByAppearance($_.get(chartData, "createTime") * 1) || '-'}}</div>
<div class="domain-detail-list__label">注册地邮编</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "domainWhoisPostcode") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">{{$t('entities.expirationDate')}}</div>
<div class="domain-detail-list__content">{{ dateFormatByAppearance($_.get(chartData, "expirationTime") * 1) || '-'}}</div>
<div class="domain-detail-list__label">{{$t('entities.creationDate')}}</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "createTime") ? dateFormatByAppearance($_.get(chartData, "createTime") * 1) : '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">过期时间</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "expirationTime") ? dateFormatByAppearance($_.get(chartData, "expirationTime") * 1) : '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">主办单位名称</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "domainIcpCompanyName") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">主办单位性质</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "domainIcpCompanyType") || '-'}}</div>
</div>
<div class="domain-detail-list__row">
<div class="domain-detail-list__label">网站备案号</div>
<div class="domain-detail-list__content">{{ $_.get(chartData, "domainIcpSiteLicense") || '-'}}</div>
</div>
</div>
</div>

View File

@@ -126,7 +126,7 @@ export default {
? legendMapping[
`${this.entity && this.entity.ip ? 'ip_' : ''}${r.legend}`
]
: (legendMapping[r.legend] ? legendMapping[r.legend] : humpToSpace(r.legend)),
: (legendMapping[r.legend] ? legendMapping[r.legend] : r.legend),
data: r.values.map((v) => [
Number(v[0]) * 1000,
Number(v[1]),

View File

@@ -35,10 +35,12 @@ export default {
initEcharts (id) {
this.initDom(id, 2)
const chartParams = this.chartInfo.params
const domains = this.chartData.map(function (item, i) {
let domains = this.chartData.map(function (item, i) {
return item.domain
}).join(',')
// 参数字符串限制长度在4300以内。经测试超过4600左右会报错
domains = domains.substring(0, 4300)
domains = domains.substring(0, domains.lastIndexOf(','))
const byType = new Promise(resolve => {
get(replaceUrlPlaceholder(chartParams.byCategoryUrl, { domains: domains })).then(response => {
if (response.code === 200) {
@@ -47,7 +49,7 @@ export default {
} else {
// this.noData0 = false
// chartOption = this.$_.cloneDeep(this.chartOption)
const data = response.data.result.sort(reverseSortBy('uniqDomains')).map(d => {
const originalData = response.data.result.sort(reverseSortBy('uniqDomains')).map(d => {
return {
data: d,
name: d.categoryName,
@@ -55,6 +57,22 @@ export default {
unitType: chartParams.unitType
}
})
const data = originalData.filter((d, i) => i < 5)
let otherValue = 0
originalData.forEach((d, i) => {
if (i > 4) {
otherValue += parseInt(d.uniqDomains)
}
})
data.push({
data: {
uniqDomains: otherValue,
categoryName: 'other'
},
name: 'other',
value: otherValue,
unitType: chartParams.unitType
})
this.chartOption.series[0].data = data
}
}

View File

@@ -202,10 +202,10 @@
</div>
</div>
<div class="content__data-protocol-value">
<div class="content__data-protocol-value-title">{{$t('protocol.requestVolume')}}</div>
<div class="content__data-protocol-value-num">{{unitConvert($_.get(chartData, 'bytes'), chartInfo.params.unitType).join('')}}</div>
<div class="content__data-protocol-value-title">{{$t('protocol.totalFlow')}}</div>
<div class="content__data-protocol-value-num">{{unitConvert($_.get(chartData, 'count'), chartInfo.params.unitType).join('')}}</div>
</div>
<div class="content__data-protocol-percent"><span>{{$t('protocol.proportion')}}</span>&nbsp;<span>{{unitConvert($_.get(chartData, 'bytesPercent'), unitTypes.percent).join('')}}</span></div>
<div class="content__data-protocol-percent"><span>{{$t('protocol.proportion')}}</span>&nbsp;<span>{{unitConvert($_.get(chartData, 'countPercent'), unitTypes.percent).join('')}}</span></div>
</div>
<div class="content__data-protocol">
<div class="content__data-protocol-all">
@@ -214,10 +214,10 @@
</div>
</div>
<div class="content__data-protocol-value">
<div class="content__data-protocol-value-title">{{$t('protocol.totalFlow')}}</div>
<div class="content__data-protocol-value-num">{{unitConvert($_.get(chartData, 'count'), chartInfo.params.unitType).join('')}}</div>
<div class="content__data-protocol-value-title">{{$t('protocol.requestVolume')}}</div>
<div class="content__data-protocol-value-num">{{unitConvert($_.get(chartData, 'bytes'), unitTypes.byte).join('')}}</div>
</div>
<div class="content__data-protocol-percent"><span>{{$t('protocol.proportion')}}</span>&nbsp;<span>{{unitConvert($_.get(chartData, 'countPercent'), unitTypes.percent).join('')}}</span></div>
<div class="content__data-protocol-percent"><span>{{$t('protocol.proportion')}}</span>&nbsp;<span>{{unitConvert($_.get(chartData, 'bytesPercent'), unitTypes.percent).join('')}}</span></div>
</div>
</div>
</div>

View File

@@ -64,11 +64,11 @@ export const legendMapping = {
ip_packets_sent_rate: i18n.global.t('trafficSummary.packetsPerSecondS2c'),
dnsLatency: i18n.global.t('dns.latency'),
queryRate: i18n.global.t('dns.query.rate'),
formatErrorRate: i18n.global.t('dns.formatErrorRate'),
serverFailureRate: i18n.global.t('dns.serverFailureRate'),
nonExistentDomainRate: i18n.global.t('dns.nonExistentDomainRate'),
notImplementedRate: i18n.global.t('dns.notImplementedRate'),
queryRefusedRate: i18n.global.t('dns.queryRefusedRate'),
formatErrorRate: 'FormErr',
serverFailureRate: 'ServFail',
nonExistentDomainRate: 'NXDomain',
notImplementedRate: 'NotImp',
queryRefusedRate: 'Refused',
sequenceGapLossPercent: i18n.global.t('entity.ip.sequenceGapLossPercent'),
establishLatency: i18n.global.t('entity.ip.establishLatency'),
httpResponseLatency: i18n.global.t('entity.ip.httpResponseLatency'),

View File

@@ -22,6 +22,9 @@ export const line = {
},
yAxis: {
type: 'value',
splitLine: {
show: false
},
axisLabel: {
formatter: function (value) {
return unitConvert(value, unitTypes.number, null, null, 0).join(' ')
@@ -30,7 +33,7 @@ export const line = {
},
animation: false,
grid: {
left: 55,
left: 60,
bottom: 30,
top: 20,
right: 25
@@ -62,7 +65,7 @@ export const line = {
{
name: '',
type: 'line',
smooth: false,
smooth: true,
symbol: 'none',
data: [],
markLine: {}

View File

@@ -32,8 +32,8 @@ export default {
methods: {
reload () {
this.dnsScreenDataList.forEach(item => {
if (this.$refs['chart' + item.id]) {
this.$refs['chart' + item.id].getChartData()
if (this.$refs['chart' + item.id] && this.$refs['chart' + item.id][0]) {
this.$refs['chart' + item.id][0].getChartData()
}
})
}

View File

@@ -247,7 +247,7 @@ export default {
handleData (prevRequest, request, _t) {
this.toggleLoading(true)
Promise.all([prevRequest, request]).then(res => {
this.isNoData = (res[0].data.result.length && res[1].data.result.length) === 0
this.isNoData = res[0].data.result.length === 0 && res[1].data.result.length === 0
if (this.isNoData) {
this.appData = this.appData.map(t => {
return {

View File

@@ -205,7 +205,7 @@ export default {
*/
initExpendTab () {
if (this.$route.query.eventId) {
if (parseFloat(this.$route.query.eventId) === this.detection.eventId) {
if (this.$route.query.eventId === this.detection.eventId) {
const container = document.getElementById('cnContainer')
const dom = document.getElementsByClassName('cn-detection__case')
// 未展开的item折叠块高度67+下边距10+底部线高度1兼容不同分辨率下的tab高度

View File

@@ -294,7 +294,7 @@ export default {
const chartDom = document.getElementById(`eventSeverityTrendBar${this.pageType}`)
const eventSeverityTrendOption = this.$_.cloneDeep(multipleBarOption)
const xData = []
let xData = []
dataMap.forEach(function (value) {
// eventSeverityTrendOption.series[Number(getSeriesIndex(key))].data = value.map(v => Number(v[1]))
value.forEach(item => {
@@ -303,6 +303,9 @@ export default {
}
})
})
xData = xData.sort((a, b) => {
return new Date(a) - new Date(b)
})
eventSeverityTrendOption.series.forEach(serie => {
const seriesData = []
xData.forEach(item => {