This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
cyber-narrator-cn-ui/src/views/entityExplorer/EntityExplorer.vue

994 lines
33 KiB
Vue
Raw Normal View History

<template>
<div
class="entity-explorer"
:class="{'entity-explorer--show-list': showList}">
<!-- 顶部工具栏在列表页显示 -->
2023-07-07 17:22:51 +08:00
<div class="explorer-top-tools explorer-top-tools-new" style="margin: 2px 0;" v-show="showList">
<div class="explorer-detection-top-tools">
<div class="explorer-top-tools-title" style="padding: 0;margin-left: -10px;">{{$t('network.entity')}}</div>
</div>
2023-07-07 17:22:51 +08:00
</div>
<!-- 搜索组件 -->
<explorer-search
2023-07-07 17:22:51 +08:00
v-if="!showList"
ref="search"
:class="{'explorer-search--show-list': showList}"
:show-list="showList"
@search="search"
></explorer-search>
<!-- 内容区 -->
2023-07-07 17:22:51 +08:00
<div v-if="showList" style="display: flex;flex-direction: row;">
<entity-filter
:filter-data="newFilterData"
:loading-left="loadingLeft"
:q="q"
:time-filter="timeFilter"
@filter="filter"
></entity-filter>
<div class="explorer-container explorer-container-new">
2023-07-07 17:22:51 +08:00
<explorer-search
ref="search"
:class="{'explorer-search--show-list': showList}"
:show-list="showList"
@search="search"
></explorer-search>
<div style="display: flex;flex-direction: column;height: calc(100% - 42px);">
<div class="explorer-result" v-if="showList" style="position: relative;">
<loading :loading="loadingCount" style="width: 240px"></loading>
<span>{{ summaryCount.total }}&nbsp;</span>resultsIP
2023-07-07 17:22:51 +08:00
<span>{{ summaryCount.ipCount }}</span>Domain
<span>{{ summaryCount.domainCount }}</span>APP
2023-07-07 17:22:51 +08:00
<span>{{ summaryCount.appCount }}</span>
</div>
<entity-list
style="width: 100%;"
:list-data="listData"
:list-mode="listMode"
:pageObj="pageObj"
:time-filter="timeFilter"
@pageSize="pageSize"
@pageNo="pageNo"
:loading="listLoading"
></entity-list>
</div>
</div>
</div>
2023-07-07 17:22:51 +08:00
<div class="explorer-foot" v-if="!showList">
<div>
<el-divider direction="vertical"></el-divider>
<div class="entity-overview">
<div class="overview-left">
<span class="overview-left-loading">
<span class="overview-left-loading-span">APP</span>
</span>
</div>
<div class="overview-right">
<div class="right-row margin-b-6">
<i class="cn-icon cn-icon-_zhanbi entity-explorer-total__icon"></i>
<div class="right-label">{{ $t('network.total') }}</div>
<div class="right-label-loading">
<loading :loading="loadingAppActive" size="small"></loading>
<div class="right-value">{{ numberWithCommas(entityAppTotal) }}</div>
</div>
</div>
<div class="right-row">
<i class="cn-icon cn-icon-active"></i>
<div class="right-label">{{ $t('entity.active') }}</div>
<div class="right-label-loading">
2022-09-02 09:40:47 +08:00
<loading :loading="loadingAppActive" size="small"></loading>
<div class="right-value-block">
<span class="margin-r-6">{{ numberWithCommas(entityAppActive) }}</span>
<span class="last-hour">{{ $t('entity.inLastHour') }}</span>
</div>
</div>
</div>
</div>
</div>
<el-divider direction="vertical"></el-divider>
<div class="entity-overview">
<div class="overview-left">
<span class="overview-left-loading">
<span class="overview-left-loading-span">Domain</span>
</span>
</div>
<div class="overview-right">
<div class="right-row margin-b-6">
<i class="cn-icon cn-icon-_zhanbi entity-explorer-total__icon"></i>
<div class="right-label">{{ $t('network.total') }}</div>
<div class="right-label-loading">
<loading :loading="loadingAppActive" size="small"></loading>
<div class="right-value">{{ numberWithCommas(entityDomainTotal) }}</div>
</div>
</div>
<div class="right-row">
<i class="cn-icon cn-icon-active"></i>
<div class="right-label">{{ $t('entity.active') }}</div>
<div class="right-label-loading">
2022-09-02 09:40:47 +08:00
<loading :loading="loadingDomainActive" size="small"></loading>
<div class="right-value-block">
<span class="margin-r-6">{{ numberWithCommas(entityDomainActive) }}</span>
<span class="last-hour">{{ $t('entity.inLastHour') }}</span>
</div>
</div>
</div>
</div>
</div>
<el-divider direction="vertical"></el-divider>
<div class="entity-overview">
<div class="overview-left">
<span class="overview-left-loading">
<span class="overview-left-loading-span">IP</span>
</span>
</div>
<div class="overview-right">
<div class="right-row margin-b-6">
<i class="cn-icon cn-icon-_zhanbi entity-explorer-total__icon"></i>
<div class="right-label">{{ $t('network.total') }}</div>
<div class="right-label-loading">
<loading :loading="loadingAppActive" size="small"></loading>
<div class="right-value">{{ numberWithCommas(entityIpTotal) }}</div>
</div>
</div>
<div class="right-row">
<i class="cn-icon cn-icon-active"></i>
<div class="right-label">{{ $t('entity.active') }}</div>
<div class="right-label-loading">
2022-09-02 09:40:47 +08:00
<loading :loading="loadingIpActive" size="small"></loading>
<div class="right-value-block">
<span class="margin-r-6">{{ numberWithCommas(entityIpActive) }}</span>
<span class="last-hour">{{ $t('entity.inLastHour') }}</span>
</div>
</div>
</div>
</div>
</div>
<el-divider direction="vertical"></el-divider>
</div>
</div>
</div>
</template>
<script>
import ExplorerSearch from '@/views/entityExplorer/search/ExplorerSearch'
import EntityFilter from '@/views/entityExplorer/EntityFilter'
import EntityList from '@/views/entityExplorer/entityList/EntityList'
import { entityType, defaultPageSize, riskLevelMapping } from '@/utils/constants'
2021-12-31 10:40:37 +08:00
import { get } from '@/utils/http'
import { api } from '@/utils/api'
import { getNowTime, getSecond } from '@/utils/date-util'
2022-01-05 20:24:02 +08:00
import { ref } from 'vue'
2022-06-06 17:34:55 +08:00
import _ from 'lodash'
import Loading from '@/components/common/Loading'
2023-08-18 09:32:58 +08:00
import {
overwriteUrl,
urlParamsHandler,
numberWithCommas,
comparedEntityKey,
handleEntityTypeByStr
} from '@/utils/tools'
import Parser from '@/components/advancedSearch/meta/parser'
import { handleErrorTip } from '@/components/advancedSearch/meta/error'
import { columnList } from '@/utils/static-data'
import { useRoute } from 'vue-router'
export default {
name: 'entity-explorer',
components: {
Loading,
ExplorerSearch,
EntityFilter,
EntityList
},
data () {
return {
showList: false,
2021-12-17 20:56:25 +08:00
listMode: 'list', // entity列表的模式list|block
2021-12-31 10:40:37 +08:00
entityAppTotal: '-',
entityAppNew: '-',
entityAppActive: '-',
entityDomainTotal: '-',
entityDomainNew: '-',
entityDomainActive: '-',
entityIpTotal: '-',
entityIpNew: '-',
entityIpActive: '-',
pageObj: {
pageNo: 1,
// 是否重置pageNo在执行新搜索时是true
resetPageNo: true,
2022-01-05 20:24:02 +08:00
pageSize: defaultPageSize,
total: 0
},
filterData: [
{
type: 'ip',
title: entityType.ip,
totalCount: 0,
data: [
{
label: this.$t('overall.country'),
2022-01-03 22:46:22 +08:00
column: 'countryDistinctCount',
topColumn: 'Country', // top弹框查询字段
icon: 'cn-icon cn-icon-country',
showTopTen: false,
value: 0
},
{
label: this.$t('overall.city'),
2022-01-03 22:46:22 +08:00
column: 'cityDistinctCount',
topColumn: 'City', // top弹框查询字段
icon: 'cn-icon cn-icon-city',
showTopTen: false,
value: 0
},
{
label: this.$t('entities.asn'),
2022-01-03 22:46:22 +08:00
column: 'asnDistinctCount',
topColumn: 'ASN', // top弹框查询字段
icon: 'cn-icon cn-icon-cloud',
showTopTen: false,
value: 0
}
]
},
{
type: 'app',
title: entityType.app,
totalCount: 0,
data: [
{
label: this.$t('entities.category'),
2022-01-03 22:46:22 +08:00
column: 'categoryDistinctCount',
topColumn: 'app_category', // top弹框查询字段
icon: 'cn-icon cn-icon-category',
showTopTen: false,
value: 0
},
{
label: this.$t('entities.subcategory'),
2022-01-03 22:46:22 +08:00
column: 'subcategoryDistinctCount',
topColumn: 'app_subcategory', // top弹框查询字段
icon: 'cn-icon cn-icon-sub-category',
showTopTen: false,
value: 0
},
{
label: this.$t('entities.risk'),
2022-01-03 22:46:22 +08:00
column: 'riskDistinctCount',
topColumn: 'app_risk', // top弹框查询字段
icon: 'cn-icon cn-icon-risk',
showTopTen: false,
value: 0
}
]
},
{
type: 'domain',
title: entityType.domain,
totalCount: 0,
data: [
{
label: this.$t('entities.domainDetail.categoryGroup'),
2022-01-03 22:46:22 +08:00
column: 'categoryGroupDistinctCount',
topColumn: 'domain_category_group', // top弹框查询字段
icon: 'cn-icon cn-icon-category',
showTopTen: false,
value: 0
},
{
label: this.$t('entities.category'),
2022-01-03 22:46:22 +08:00
column: 'categoryDistinctCount',
topColumn: 'domain_category', // top弹框查询字段
icon: 'cn-icon cn-icon-sub-category',
showTopTen: false,
value: 0
},
{
label: this.$t('entities.reputationLevel'),
2022-01-03 22:46:22 +08:00
column: 'reputationLevelDistinctCount',
topColumn: 'domain_reputation_level', // top弹框查询字段
icon: 'cn-icon cn-icon-credit',
showTopTen: false,
value: 0
}
]
},
{
type: 'dns',
title: this.$t('dns.dnsServer'),
totalCount: 0,
osTotalCount: 0,
orgTotalCount: 0,
softwareTotalCount: 0,
data: [
{
label: this.$t('overall.dnsServerInfo.role'),
column: 'dnsServerRoleCount',
topColumn: 'dns_server_role',
icon: 'cn-icon cn-icon-role',
showTopTen: false,
value: 0
},
{
label: this.$t('dns.managementOrganization'),
column: 'dnsServerOrgCount',
topColumn: 'dns_server_org',
icon: 'cn-icon cn-icon-org',
showTopTen: false,
value: 0
},
{
label: this.$t('overall.dnsServerInfo.software'),
column: 'dnsServerSoftwareCount',
topColumn: 'dns_server_software',
icon: 'cn-icon cn-icon-software',
showTopTen: false,
value: 0
},
{
label: this.$t('overall.dnsServerInfo.system'),
column: 'dnsServerOsCount',
topColumn: 'dns_server_os',
icon: 'cn-icon cn-icon-os',
showTopTen: false,
value: 0
}
]
}
],
2023-07-07 17:22:51 +08:00
newFilterData: [
{
icon: 'cn-icon cn-icon-registration-country',
title: 'Top Countries',
topColumn: 'Country',
2023-07-07 17:22:51 +08:00
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-city',
title: 'Top Cities',
topColumn: 'City',
2023-07-07 17:22:51 +08:00
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-as',
title: 'Top ASNs',
topColumn: 'ASN',
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-operator',
title: 'Top ISPs',
topColumn: 'ISP',
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-open-port',
title: 'Top Ports',
topColumn: 'DR.Port',
topColumn1: 'DR.L7Protocol',
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-FQDN',
title: 'Top FQDN Categories',
topColumn: 'DomainCategoryName',
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-category2',
title: 'Top App Categories',
topColumn: 'AppCategory',
totalCount: 0,
data: []
},
{
icon: 'cn-icon cn-icon-tag1',
title: 'Top Tags',
topColumn: 'Tags',
2023-07-07 17:22:51 +08:00
totalCount: 0,
data: []
}
],
listData: [],
q: '',
metaList: [],
limitFilterType: true, // 是否限定了filter的类型
listLoading: false,
// 实体详情搜索页面 底部列表
loadingApp: false,
loadingDomain: false,
loadingIp: false,
// New
loadingAppNew: false,
loadingDomainNew: false,
loadingIpNew: false,
// Active
loadingAppActive: false,
loadingDomainActive: false,
loadingIpActive: false,
// 实体详情列表页面 左侧筛选条件
loadingLeft: false,
initFlag: false, // 初始化标志避免初始化时pageSize和pageNo会调用搜索
2023-07-07 17:22:51 +08:00
timer: null, // 初始化标志的延时器,需要销毁
summaryCount: {
total: 0,
domainCount: 0,
2023-07-07 17:22:51 +08:00
ipCount: 0,
appCount: 0
},
loadingCount: false // 实体基数统计的loading
}
},
methods: {
numberWithCommas,
timeRefreshChange () {
2022-01-04 17:04:05 +08:00
if (!this.$refs.dateTimeRange.isCustom) {
const value = this.timeFilter.dateRangeValue
this.$refs.dateTimeRange.quickChange(value)
}
},
2022-01-04 17:04:05 +08:00
reload (s, e, v) {
this.dateTimeRangeChange(s, e, v)
},
// methods
dateTimeRangeChange (s, e, v) {
this.timeFilter = { startTime: s, endTime: e, dateRangeValue: v }
},
2022-02-14 16:04:08 +08:00
// sql特殊字段转换
specialColumnHandle (sql) {
const columns = [
{
target: "app_risk='1'",
original: `app_risk='${riskLevelMapping[0].name.toLowerCase()}'`
},
{
target: "app_risk='2'",
original: `app_risk='${riskLevelMapping[1].name.toLowerCase()}'`
},
{
target: "app_risk='3'",
original: `app_risk='${riskLevelMapping[2].name.toLowerCase()}'`
},
{
target: "app_risk='4'",
original: `app_risk='${riskLevelMapping[3].name.toLowerCase()}'`
},
{
target: "app_risk='5'",
original: `app_risk='${riskLevelMapping[4].name.toLowerCase()}'`
},
{
target: "=''",
original: "='unknown'"
}
]
let result = sql
columns.forEach(c => {
2022-06-06 17:34:55 +08:00
result = _.replace(result, c.original, c.target)
2022-02-14 16:04:08 +08:00
})
return result
},
2022-06-09 18:20:28 +08:00
search (param) {
2023-07-07 17:22:51 +08:00
// todo 下版本08版本删除 ---- start
if (param && param.q.indexOf("QUERY('") > -1) {
this.$message.error(this.$t('overall.versionNotSupportThisFormat'))
return true
}
// 下版本08版本删除 ---- end
2022-06-09 18:20:28 +08:00
let q
let metaList
if (param) {
q = param.q
metaList = param.metaList
}
2022-06-06 17:34:55 +08:00
if (q) {
this.q = this.specialColumnHandle(q)
this.metaList = metaList
} else {
this.q = ''
this.metaList = []
2022-01-04 17:04:05 +08:00
}
// 在非列表模式下选择tag模式在地址栏输入内容时将mode添加到地址栏
const mode = this.$route.query.mode || 'text'
this.reloadUrl({
listMode: this.listMode,
q: param.str,
mode: mode,
startTime: getSecond(this.timeFilter.startTime),
endTime: getSecond(this.timeFilter.endTime),
range: this.timeFilter.dateRangeValue
})
if (!this.showList) {
// 首页进入搜索时重载页面,视觉上进入列表页面
this.$router.push({
path: '/entityExplorer',
query: {
listMode: this.listMode,
q: param.str,
mode: mode,
startTime: getSecond(this.timeFilter.startTime),
endTime: getSecond(this.timeFilter.endTime),
range: this.timeFilter.dateRangeValue
}
})
this.showList = true
// 跳转页面,则不执行搜索功能
return true
}
if (this.pageObj.resetPageNo) {
this.pageObj.pageNo = 1
} else {
this.pageObj.resetPageNo = true
}
// 带参数时只查询对应类型的entity不带参数时3种entity都查
2022-06-06 17:34:55 +08:00
if (q) {
// entity_type处理不查其他两种entity_type对应的左侧筛选
const entityTypeMeta = metaList.find(meta => {
return meta.column && meta.column.name === 'entity_type'
})
2022-01-26 18:27:12 +08:00
if (entityTypeMeta && entityTypeMeta.operator.value === '=') {
let entityType = ''
this.limitFilterType = false
2022-06-15 20:41:21 +08:00
if (entityTypeMeta.value.value.toLowerCase() === 'ip') {
this.limitFilterType = true
entityType = 'ip'
2022-06-15 20:41:21 +08:00
} else if (entityTypeMeta.value.value.toLowerCase() === 'domain') {
this.limitFilterType = true
entityType = 'domain'
2022-06-15 20:41:21 +08:00
} else if (entityTypeMeta.value.value.toLowerCase() === 'app') {
this.limitFilterType = true
entityType = 'app'
} else {
this.limitFilterType = false
}
2023-07-07 17:22:51 +08:00
// this.queryFilter({ entityType: entityType, q: this.q, ...this.timeFilter })
// if (entityType === 'ip') {
// this.queryFilter({ entityType: 'dns', q: this.q, ...this.timeFilter })
// }
this.queryFilterNew({ q: this.q, ...this.pageObj, ...this.timeFilter })
this.queryList({ q: this.q, ...this.pageObj, ...this.timeFilter })
2023-07-07 17:22:51 +08:00
this.queryCount({ q: this.q, ...this.pageObj, ...this.timeFilter })
// this.queryListTotal({ q: this.q, ...this.timeFilter })
} else {
this.limitFilterType = false
2023-07-07 17:22:51 +08:00
// this.queryFilter({ entityType: 'ip', q: this.q, ...this.timeFilter })
// this.queryFilter({ entityType: 'domain', q: this.q, ...this.timeFilter })
// this.queryFilter({ entityType: 'app', q: this.q, ...this.timeFilter })
// this.queryFilter({ entityType: 'dns', q: this.q, ...this.timeFilter })
this.queryFilterNew({ q: this.q, ...this.pageObj, ...this.timeFilter })
this.queryList({ q: this.q, ...this.pageObj, ...this.timeFilter })
2023-07-07 17:22:51 +08:00
this.queryCount({ q: this.q, ...this.pageObj, ...this.timeFilter })
// this.queryListTotal({ q: this.q, ...this.timeFilter })
}
} else {
this.limitFilterType = false
2023-07-07 17:22:51 +08:00
// this.queryFilter({ entityType: 'ip', ...this.timeFilter })
// this.queryFilter({ entityType: 'app', ...this.timeFilter })
// this.queryFilter({ entityType: 'domain', ...this.timeFilter })
// this.queryFilter({ entityType: 'dns', ...this.timeFilter })
this.queryFilterNew({ ...this.pageObj, ...this.timeFilter })
this.queryList({ ...this.pageObj, ...this.timeFilter })
2023-07-07 17:22:51 +08:00
this.queryCount({ ...this.pageObj, ...this.timeFilter })
// this.queryListTotal({ ...this.timeFilter })
// 延时一秒避免初始化时pageSize为20pageNo为1也会调用“搜索”的情况
if (!this.initFlag) {
this.timer = setTimeout(() => {
this.initFlag = true
}, 1000)
}
}
},
2022-01-05 20:24:02 +08:00
pageSize (val) {
this.pageObj.pageSize = val
if (this.initFlag) {
this.search({ metaList: this.metaList, q: this.q })
} else {
if (val !== 20) {
this.search({ metaList: this.metaList, q: this.q })
}
}
2022-01-05 20:24:02 +08:00
},
pageNo (val) {
this.pageObj.pageNo = val
this.pageObj.resetPageNo = false
if (this.initFlag) {
this.search({ metaList: this.metaList, q: this.q })
} else {
if (val !== 1) {
this.search({ metaList: this.metaList, q: this.q })
}
}
2022-01-05 20:24:02 +08:00
},
// 点击上一页箭头
prev () {
this.scrollbarToTop()
},
// 点击下一页箭头
next () {
this.scrollbarToTop()
},
// currentPage 改变时会触发
current (val) {
this.$emit('pageNo', val)
this.scrollbarToTop()
},
scrollbarToTop () {
this.$nextTick(() => {
const wraps = document.querySelector('#entityList')
wraps.scrollTop = 0
})
},
/* filter组件内点击后查询 */
filter (name, topData) {
if (topData.topColumn === 'DR.Port') {
const params = [
{
column: topData.topColumn,
operator: '=',
value: topData.port
},
{
column: topData.topColumn1,
operator: '=',
value: topData.l7Protocol
}
]
this.$refs.search.addParams(params)
} else {
const params = {
column: topData.topColumn,
operator: '=',
value: name
}
this.$refs.search.addParams([params])
2022-02-18 10:07:43 +08:00
}
this.$nextTick(() => {
this.emitter.emit('advanced-search')
})
},
/* 查询filter数据 */
queryFilter (params) {
2022-01-04 17:04:05 +08:00
const queryParams = {
...params,
startTime: getSecond(params.startTime),
endTime: getSecond(params.endTime)
2022-01-04 17:04:05 +08:00
}
this.loadingLeft = true
2022-01-04 17:04:05 +08:00
get(api.entityFilter, queryParams).then(response => {
2023-06-07 15:58:59 +08:00
if (response.code === 200 && response.data && response.data.result) {
switch (params.entityType) {
case 'ip': {
this.filterData[0].data.forEach(d => {
d.value = response.data.result[d.column] || 0
})
this.filterData[0].totalCount = response.data.result.count
if (this.limitFilterType) {
this.cleanFilterData(1)
this.cleanFilterData(2)
}
break
}
case 'app': {
this.filterData[1].data.forEach(d => {
d.value = response.data.result[d.column] || 0
})
this.filterData[1].totalCount = response.data.result.count
if (this.limitFilterType) {
this.cleanFilterData(0)
this.cleanFilterData(2)
this.cleanFilterData(3)
}
break
}
case 'domain': {
this.filterData[2].data.forEach(d => {
d.value = response.data.result[d.column] || 0
})
this.filterData[2].totalCount = response.data.result.count
if (this.limitFilterType) {
this.cleanFilterData(0)
this.cleanFilterData(1)
this.cleanFilterData(3)
}
break
}
case 'dns': {
this.filterData[3].data.forEach(d => {
d.value = response.data.result[d.column] || 0
})
this.filterData[3].totalCount = response.data.result.count
this.filterData[3].osTotalCount = response.data.result.osTotalCount
this.filterData[3].orgTotalCount = response.data.result.orgTotalCount
this.filterData[3].softwareTotalCount = response.data.result.softwareTotalCount
break
}
}
this.loadingLeft = false
2022-04-28 11:24:04 +08:00
} else {
this.loadingLeft = false
}
})
},
2023-07-07 17:22:51 +08:00
/** 新版查询filter数据 */
queryFilterNew (params) {
const queryParams = {
// startTime: getSecond(params.startTime),
// endTime: getSecond(params.endTime),
resource: params.q || ''
}
this.loadingLeft = true
const aggCountry = get(api.entity.entityList.aggCountry, queryParams)
const aggCity = get(api.entity.entityList.aggCity, queryParams)
const aggIPAsn = get(api.entity.entityList.aggIPAsn, queryParams)
const aggIPIsp = get(api.entity.entityList.aggIPIsp, queryParams)
const aggPort = get(api.entity.entityList.aggPort, queryParams)
const aggDomain = get(api.entity.entityList.aggDomain, queryParams)
const aggAppCategory = get(api.entity.entityList.aggAppCategory, queryParams)
const aggTag = get(api.entity.entityList.aggTag, queryParams)
2023-07-07 17:22:51 +08:00
Promise.all([aggCountry, aggCity, aggIPAsn, aggIPIsp, aggPort, aggDomain, aggAppCategory, aggTag]).then(response => {
2023-07-07 17:22:51 +08:00
response.forEach((item, index) => {
if (item.code === 200 && item.data.list) {
this.newFilterData[index].data = []
item.data.list.forEach(item => {
let obj = {
label: item.value,
topColumn: this.newFilterData[index].topColumn,
value: item.uniqueEntities
}
2023-07-07 17:22:51 +08:00
if (index === 0) {
obj.flag = item.value // 接口字段名称为'China'svg名称为'CN'通过countryNameIdMapping进行转换
2023-07-07 17:22:51 +08:00
}
if (index === 4) {
obj = {
topColumn: this.newFilterData[index].topColumn,
topColumn1: this.newFilterData[index].topColumn1,
port: item.port,
l7Protocol: item.l7Protocol,
value: item.uniqueEntities
}
2023-07-07 17:22:51 +08:00
}
this.newFilterData[index].data.push(obj)
})
}
})
}).catch(e => {
// e
}).finally(() => {
this.loadingLeft = false
})
},
/** 实体列表查询 */
queryList (params) {
2022-01-06 16:28:16 +08:00
this.listLoading = true
2022-01-04 17:04:05 +08:00
const queryParams = {
pageSize: params.pageSize,
pageNo: params.pageNo,
2023-07-07 17:22:51 +08:00
// startTime: getSecond(params.startTime),
// endTime: getSecond(params.endTime),
resource: params.q || ''
2022-01-04 17:04:05 +08:00
}
2023-07-07 17:22:51 +08:00
get(api.entity.entityList.list, queryParams).then(response => {
2022-01-05 20:24:02 +08:00
if (response.code === 200) {
2022-01-06 16:28:16 +08:00
this.listData = []
this.$nextTick(() => {
2023-07-07 17:22:51 +08:00
this.listData = response.data.list
this.pageObj.total = response.data.total
2022-01-06 16:28:16 +08:00
})
2023-06-07 15:58:59 +08:00
} else {
this.$message.error(response.message)
2022-01-05 20:24:02 +08:00
}
}).finally(() => {
this.listLoading = false
2022-01-05 20:24:02 +08:00
})
},
2023-07-07 17:22:51 +08:00
/** 实体基数统计 */
queryCount (params) {
this.loadingCount = true
const queryParams = {
// startTime: getSecond(params.startTime),
// endTime: getSecond(params.endTime),
resource: params.q || '' // 目前版本搜索不支持实体名称搜索,下版本改进
}
get(api.entity.entityList.summaryCount, queryParams).then(response => {
if (response.code === 200) {
this.summaryCount = response.data
} else {
this.summaryCount = { total: 0, domainCount: 0, ipCount: 0, appCount: 0 }
2023-07-07 17:22:51 +08:00
}
}).catch(e => {
console.log(e)
this.summaryCount = { total: 0, domainCount: 0, ipCount: 0, appCount: 0 }
2023-07-07 17:22:51 +08:00
}).finally(() => {
this.loadingCount = false
})
},
2022-01-05 20:24:02 +08:00
queryListTotal (params) {
const queryParams = {
...params,
startTime: getSecond(params.startTime),
endTime: getSecond(params.endTime)
2022-01-05 20:24:02 +08:00
}
get(api.entityListTotal, queryParams).then(response => {
if (response.code === 200) {
this.pageObj.total = response.data.result
}
})
},
handleQ (params) {
return Object.keys(params).map(param => {
return `${param}='${params[param]}'`
}).join(' AND ')
2021-12-31 10:40:37 +08:00
},
getEntityIndexData () {
// Total
this.loadingApp = true
this.loadingDomain = true
this.loadingIp = true
// New
this.loadingAppNew = true
this.loadingDomainNew = true
this.loadingIpNew = true
// Active
this.loadingAppActive = true
this.loadingDomainActive = true
this.loadingIpActive = true
2023-07-07 17:22:51 +08:00
get(api.entity.entityList.entityActive).then(response => {
2021-12-31 10:40:37 +08:00
if (response.code === 200) {
2023-07-07 17:22:51 +08:00
this.entityDomainTotal = response.data.domainCount
this.entityIpTotal = response.data.ipCount
this.entityAppTotal = response.data.appCount
2021-12-31 10:40:37 +08:00
}
this.loadingDomain = false
this.loadingIp = false
2023-07-07 17:22:51 +08:00
this.loadingApp = false
})
2021-12-31 10:40:37 +08:00
// New
2023-07-07 17:22:51 +08:00
get(api.entity.entityList.entityNew).then(response => {
2021-12-31 10:40:37 +08:00
if (response.code === 200) {
2023-07-07 17:22:51 +08:00
this.entityDomainNew = response.data.domainCount
this.entityIpNew = response.data.ipCount
this.entityAppNew = response.data.appCount
2021-12-31 10:40:37 +08:00
}
this.loadingDomainNew = false
this.loadingIpNew = false
2023-07-07 17:22:51 +08:00
this.loadingAppNew = false
2021-12-31 10:40:37 +08:00
})
// Active
2023-07-07 17:22:51 +08:00
get(api.entity.entityList.entityActive).then(response => {
2021-12-31 10:40:37 +08:00
if (response.code === 200) {
2023-07-07 17:22:51 +08:00
this.entityDomainActive = response.data.domainCount
this.entityIpActive = response.data.ipCount
this.entityAppActive = response.data.appCount
2021-12-31 10:40:37 +08:00
}
this.loadingDomainActive = false
this.loadingIpActive = false
2023-07-07 17:22:51 +08:00
this.loadingAppActive = false
2021-12-31 10:40:37 +08:00
})
},
cleanFilterData (index) {
this.filterData[index].data.forEach(d => {
d.value = 0
})
this.filterData[index].totalCount = 0
},
setListMode (mode) {
this.listMode = mode
const newParam = {
listMode: mode
}
this.reloadUrl(newParam)
},
/**
* 向地址栏添加/删除参数
*/
reloadUrl (newParam, clean) {
const { query } = this.$route
let newUrl = urlParamsHandler(window.location.href, query, newParam)
if (clean) {
newUrl = urlParamsHandler(window.location.href, query, newParam, clean)
}
overwriteUrl(newUrl)
},
/**
* 初始化搜索分享url或者刷新界面保留本次搜索结果
* @param q
*/
initSearch (q) {
let str = q
// 此处的mode不做text和tag区分是因为text和tag构造搜索参数过程不一样但结果的参数一致
// 故采用text的参数形式进行搜索tag形式在tagMode.vue的mounted里根据地址栏的参数q构造metaList
if (str) {
// 为避免地址栏任意输入导致全查询的q带QUERY解析时不识别导致的语法错误
// 如地址栏输入116.178.222.171此时的q很长刷新界面时需要把q里的116.178.222.171拿出来进行搜索
if (str.indexOf('QUERY') > -1) {
const strList = str.split(' ')
if (strList.length > 0) {
// 此时strList[1]为ip_addr:116.178.222.171获取116.178.222.171
str = strList[1].slice(8)
}
}
const parser = new Parser(columnList)
2023-08-18 09:32:58 +08:00
const keyInfo = comparedEntityKey(handleEntityTypeByStr(str))
if (keyInfo.isKey) {
const errorList = parser.validateStr(keyInfo.key)
if (_.isEmpty(errorList)) {
this.search({ ...parser.parseStr(keyInfo.key), str: str })
} else {
this.$message.error(handleErrorTip(errorList[0]))
}
} else {
2023-08-18 09:32:58 +08:00
this.$message.error(this.$t('tip.invalidQueryField') + ' ' + keyInfo.key)
}
} else {
this.search({ q: '', str: '', metaList: [] })
}
}
2021-12-31 10:40:37 +08:00
},
mounted () {
this.getEntityIndexData()
const { q, listMode } = this.$route.query
// 如果地址栏有listMode即列表页并非首页则开始搜索
if (listMode) {
this.showList = true
this.initSearch(q)
this.listMode = listMode
}
2022-01-04 17:04:05 +08:00
},
watch: {
timeFilter () {
2022-06-06 17:34:55 +08:00
this.search({ metaList: this.metaList, q: this.q })
2022-01-04 17:04:05 +08:00
}
},
2022-01-04 17:04:05 +08:00
setup () {
const { query } = useRoute()
// 获取url携带的range、startTime、endTime
const rangeParam = query.range
const startTimeParam = query.startTime
const endTimeParam = query.endTime
// 若url携带了使用携带的值否则使用默认值。
const dateRangeValue = rangeParam ? parseInt(query.range) : 60
const timeFilter = ref({ dateRangeValue })
if (!startTimeParam || !endTimeParam) {
const { startTime, endTime } = getNowTime(60)
timeFilter.value.startTime = startTime
timeFilter.value.endTime = endTime
} else {
timeFilter.value.startTime = parseInt(startTimeParam)
timeFilter.value.endTime = parseInt(endTimeParam)
}
2022-01-04 17:04:05 +08:00
return {
timeFilter
}
},
beforeUnmount () {
clearTimeout(this.timer)
}
}
</script>