diff --git a/package.json b/package.json index 1ad2b0ea..9426b7cb 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@amcharts/amcharts4": "^4.10.24", "@amcharts/amcharts4-geodata": "^4.1.20", + "@antv/g6": "^4.8.17", "axios": "^0.21.1", "babel-plugin-lodash": "^3.3.4", "codemirror": "^5.65.1", @@ -27,7 +28,6 @@ "node-sass": "^4.14.1", "postcss-plugin-px2rem": "^0.8.1", "postcss-px2rem-exclude": "0.0.6", - "relation-graph": "^2.0.26", "sass-loader": "^8.0.2", "sass-resources-loader": "^2.2.1", "tiny-emitter": "^2.1.0", diff --git a/public/images/entity-symbol2/app-colored.svg b/public/images/entity-symbol2/app-colored.svg new file mode 100644 index 00000000..ba0c71e8 --- /dev/null +++ b/public/images/entity-symbol2/app-colored.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/entity-symbol2/app.svg b/public/images/entity-symbol2/app.svg new file mode 100644 index 00000000..313b0268 --- /dev/null +++ b/public/images/entity-symbol2/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/entity-symbol2/domain-colored.svg b/public/images/entity-symbol2/domain-colored.svg new file mode 100644 index 00000000..dd83f1db --- /dev/null +++ b/public/images/entity-symbol2/domain-colored.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/entity-symbol2/domain-colored2.svg b/public/images/entity-symbol2/domain-colored2.svg new file mode 100644 index 00000000..2bc41292 --- /dev/null +++ b/public/images/entity-symbol2/domain-colored2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/entity-symbol2/domain.svg b/public/images/entity-symbol2/domain.svg new file mode 100644 index 00000000..5944d4e1 --- /dev/null +++ b/public/images/entity-symbol2/domain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/entity-symbol2/ip-colored.svg b/public/images/entity-symbol2/ip-colored.svg new file mode 100644 index 00000000..9d5dcf23 --- /dev/null +++ b/public/images/entity-symbol2/ip-colored.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/entity-symbol2/ip.svg b/public/images/entity-symbol2/ip.svg new file mode 100644 index 00000000..326dd5e3 --- /dev/null +++ b/public/images/entity-symbol2/ip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/css/common/right-box-common.scss b/src/assets/css/common/right-box-common.scss index 92be6cc8..e7cd88f1 100644 --- a/src/assets/css/common/right-box-common.scss +++ b/src/assets/css/common/right-box-common.scss @@ -1,302 +1,304 @@ -.el-drawer.rtl { - width: 700px !important; -} -.el-drawer__body { +.common-right-box { height: 100%; -} -.right-box, .right-sub-box { - display: flex; - flex-direction: column; - padding: 0; - height: 100%; - width: 100%; - .el-date-editor { - .el-input__inner { - padding-left: 32px; - } + .el-drawer__body { + height: 100%; } -} -.right-box__header { - display: flex; - justify-content: space-between; - align-items: center; - height: 60px; - padding: 0 20px; - border-bottom: 1px solid $--right-box-border-color; + .right-box, .right-sub-box { + display: flex; + flex-direction: column; + padding: 0; + height: 100%; + width: 100%; - .header__title { - font-size: 16px; - font-weight: bold; - color: #333; - } - .header__operation { - i { - color: #999; - font-size: 14px; - } - } -} - -.right-box__container { - height: calc(100% - 130px); - padding: 0 30px; - overflow-x: hidden; - overflow-y: auto; - - .el-textarea__inner { - padding: 5px 70px 4px 15px; - } - .container__form-width.container__form{ - .input-box { - .el-textarea { - .el-textarea__inner { - width: 530px; - height: 32px; - padding: 5px 70px 4px 10px; - } - .el-input__count { - right: -40px; - line-height: 29px; - height: 25px; - } + .el-date-editor { + .el-input__inner { + padding-left: 32px; } } } - .el-form-item__content { - .input-box { - .el-textarea { - .el-textarea__inner { - width: 517px; - height: 32px; - padding: 5px 70px 4px 10px; - } - .el-input__count { - right: -40px; - line-height: 29px; - height: 25px; - } + + .right-box__header { + display: flex; + justify-content: space-between; + align-items: center; + height: 60px; + padding: 0 20px; + border-bottom: 1px solid $--right-box-border-color; + + .header__title { + font-size: 16px; + font-weight: bold; + color: #333; + } + .header__operation { + i { + color: #999; + font-size: 14px; } } } - .form-row-item { - .input-box { - .el-textarea { - .el-textarea__inner { - width: 466px; - height: 32px; - padding: 5px 70px 4px 10px; - } - .el-input__count { - right: 0; + + .right-box__container { + height: calc(100% - 130px); + padding: 0 30px; + overflow-x: hidden; + overflow-y: auto; + + .el-textarea__inner { + padding: 5px 70px 4px 15px; + } + .container__form-width.container__form{ + .input-box { + .el-textarea { + .el-textarea__inner { + width: 530px; + height: 32px; + padding: 5px 70px 4px 10px; + } + .el-input__count { + right: -40px; + line-height: 29px; + height: 25px; + } } } } - } - .el-form-item { - .el-input__count { - line-height: 29px; - height: 25px; + .el-form-item__content { + .input-box { + .el-textarea { + .el-textarea__inner { + width: 517px; + height: 32px; + padding: 5px 70px 4px 10px; + } + .el-input__count { + right: -40px; + line-height: 29px; + height: 25px; + } + } + } } - } - .el-form-item { - .el-input--small.not-fixed-height { - height: 32px; + .form-row-item { + .input-box { + .el-textarea { + .el-textarea__inner { + width: 466px; + height: 32px; + padding: 5px 70px 4px 10px; + } + .el-input__count { + right: 0; + } + } + } + } + .el-form-item { .el-input__count { line-height: 29px; height: 25px; } } - } - .el-input__inner, .el-textarea__inner { - padding: 0 10px; - border-radius: $--border-radius-primary; - border: 1px solid $--right-box-border-color; - } - .el-textarea__inner { - padding: 5px 70px 4px 15px; - } - .el-form { - padding-top: 20px; - .el-form-item { - margin-bottom: 16px; - .el-form-item__label{ - padding-bottom: 6px; - font-size: 14px; - line-height: 16px; - color: #666; - } - - .el-input__inner:hover { - border-color: darken($--right-box-border-color, 10%); - } - .el-input__inner:focus { - border-color: darken($--right-box-border-color, 20%); + .el-input--small.not-fixed-height { + height: 32px; + .el-input__count { + line-height: 29px; + height: 25px; + } } } - .el-form-item.is-error .el-input__inner, .el-form-item.is-error .el-input__inner:focus, .el-form-item.is-error .el-textarea__inner, .el-form-item.is-error .el-textarea__inner:focus, .el-message-box__input input.invalid, .el-message-box__input input.invalid:focus { - border-color: #F56C6C - } - - .form__sub-title { - display: flex; - justify-content: space-between; + .el-input__inner, .el-textarea__inner { padding: 0 10px; - margin-bottom: 20px; - line-height: 32px; - font-size: 14px; - font-weight: bold; - color: #555; - background-color: #F6F6F6; - } - /* 虚线框类型的form-item */ - .form__dotted-item { - padding: 10px 10px 6px 10px; - margin-bottom: 10px; - border: 1px dashed $--border-color-primary; border-radius: $--border-radius-primary; + border: 1px solid $--right-box-border-color; + } + .el-textarea__inner { + padding: 5px 70px 4px 15px; + } + .el-form { + padding-top: 20px; .el-form-item { - margin-bottom: 0; - - .el-form-item__label { - width: 100%; + margin-bottom: 16px; + .el-form-item__label{ + padding-bottom: 6px; + font-size: 14px; + line-height: 16px; + color: #666; } - .form__labels-label { - display: flex; - justify-content: space-between; + + .el-input__inner:hover { + border-color: darken($--right-box-border-color, 10%); + } + .el-input__inner:focus { + border-color: darken($--right-box-border-color, 20%); } } + .el-form-item.is-error .el-input__inner, .el-form-item.is-error .el-input__inner:focus, .el-form-item.is-error .el-textarea__inner, .el-form-item.is-error .el-textarea__inner:focus, .el-message-box__input input.invalid, .el-message-box__input input.invalid:focus { + border-color: #F56C6C + } + + .form__sub-title { + display: flex; + justify-content: space-between; + padding: 0 10px; + margin-bottom: 20px; + line-height: 32px; + font-size: 14px; + font-weight: bold; + color: #555; + background-color: #F6F6F6; + } + /* 虚线框类型的form-item */ + .form__dotted-item { + padding: 10px 10px 6px 10px; + margin-bottom: 10px; + border: 1px dashed $--border-color-primary; + border-radius: $--border-radius-primary; + + .el-form-item { + margin-bottom: 0; + + .el-form-item__label { + width: 100%; + } + .form__labels-label { + display: flex; + justify-content: space-between; + } + } + } + .form__create-btn { + margin-bottom: 20px; + width: 300px; + height: 28px; + border: 1px solid lighten($--color-primary, 60%); + border-radius: $--border-radius-primary; + background-color: lighten($--color-primary, 95%); + + i { + color: $--color-primary; + } + } + .form__flex-container { + display: flex; + justify-content: center; + align-items: center; + } + .one-third-form-item-left{ + display: inline-block; + width: calc(50% - 5px); + } + .one-third-form-item-right{ + display: inline-block; + width: calc(50% - 5px); + } + .form-item--half-width-other-two{ + display: inline-block; + width: calc(50% - 10px); + } + .form-item--half-width-other{ + display: inline-block; + width: calc(50% - 10px); + } } - .form__create-btn { - margin-bottom: 20px; + } + + .right-box__footer { + display: flex; + align-items: center; + justify-content: center; + height: 70px; + box-shadow: -3px 0 8px -3px rgba(205,205,205,0.77); + + .footer__btn { + margin: 0 15px; + height: 30px; + min-width: 74px; + padding: 0 15px; + color: white; + background-color: $--color-primary; + border: none; + border-radius: 4px; + outline: none; + font-size: 14px; + cursor: pointer; + transition: background-color linear .2s, color linear .1s; + } + .footer__btn:hover:not(.footer__btn--disabled) { + background-color: lighten($--color-primary, 10%); + } + .footer__btn--light { + background-color: white; + border: 1px solid $--border-color-primary; + color: #333; + } + .footer__btn.footer__btn--light:hover:not(.footer__btn--disabled) { + background-color: white; + border-color: lighten($--color-primary, 40%); + color: $--color-primary; + } + .footer__btn--disabled { + opacity: .6; + cursor: default; + } + } + /* 隐藏label新增按钮处级联选择器的input */ + .hide-casc-input { + position: relative; + + .hide-input { + position: absolute; + top: 0; width: 300px; - height: 28px; - border: 1px solid lighten($--color-primary, 60%); - border-radius: $--border-radius-primary; - background-color: lighten($--color-primary, 95%); + opacity: 0; + } + } + .label__multi-text { + display: flex; + justify-content: space-between; + } + .right-box__select { + width: 100%; + } + .el-select-last.right-box-select-dropdown { + left: 1698px; + } + .limit-height .el-cascader-menu { + max-height: 200px; + overflow: auto; + } - i { - color: $--color-primary; + .form-items--half-width-group { + display: flex; + justify-content: space-between; + flex-wrap: wrap; + + .form-item--half-width { + width: calc(50% - 10px); + + .el-select { + width: 100%; } } - .form__flex-container { - display: flex; - justify-content: center; - align-items: center; - } - .one-third-form-item-left{ - display: inline-block; - width: calc(50% - 5px); - } - .one-third-form-item-right{ - display: inline-block; - width: calc(50% - 5px); - } - .form-item--half-width-other-two{ - display: inline-block; - width: calc(50% - 10px); - } - .form-item--half-width-other{ - display: inline-block; - width: calc(50% - 10px); - } } -} - -.right-box__footer { - display: flex; - align-items: center; - justify-content: center; - height: 70px; - box-shadow: -3px 0 8px -3px rgba(205,205,205,0.77); - - .footer__btn { - margin: 0 15px; - height: 30px; - min-width: 74px; - padding: 0 15px; - color: white; - background-color: $--color-primary; - border: none; - border-radius: 4px; - outline: none; - font-size: 14px; - cursor: pointer; - transition: background-color linear .2s, color linear .1s; - } - .footer__btn:hover:not(.footer__btn--disabled) { - background-color: lighten($--color-primary, 10%); - } - .footer__btn--light { - background-color: white; - border: 1px solid $--border-color-primary; - color: #333; - } - .footer__btn.footer__btn--light:hover:not(.footer__btn--disabled) { - background-color: white; - border-color: lighten($--color-primary, 40%); - color: $--color-primary; - } - .footer__btn--disabled { - opacity: .6; - cursor: default; - } -} -/* 隐藏label新增按钮处级联选择器的input */ -.hide-casc-input { - position: relative; - - .hide-input { + .cn-icon-minus-position { + display: inline-flex; + flex-direction: column; position: absolute; - top: 0; - width: 300px; - opacity: 0; + right: 0; + top: 50%; + height: 100%; + transform: translateY(-50%); + justify-content: space-between; + } + .form-item--end-with-btn { // 末尾留出btn宽度空间的form item + + } + .el-form-item__content .el-autocomplete .el-input-group { + vertical-align: unset; } } -.label__multi-text { - display: flex; - justify-content: space-between; -} -.right-box__select { - width: 100%; -} -.el-select-last.right-box-select-dropdown { - left: 1698px; -} -.limit-height .el-cascader-menu { - max-height: 200px; - overflow: auto; -} - -.form-items--half-width-group { - display: flex; - justify-content: space-between; - flex-wrap: wrap; - - .form-item--half-width { - width: calc(50% - 10px); - - .el-select { - width: 100%; - } - } -} -.cn-icon-minus-position { - display: inline-flex; - flex-direction: column; - position: absolute; - right: 0; - top: 50%; - height: 100%; - transform: translateY(-50%); - justify-content: space-between; -} -.form-item--end-with-btn { // 末尾留出btn宽度空间的form item - -} -.el-form-item__content .el-autocomplete .el-input-group { - vertical-align: unset; -} diff --git a/src/views/administration/Chart.vue b/src/views/administration/Chart.vue index 1988f49e..aaa40154 100644 --- a/src/views/administration/Chart.vue +++ b/src/views/administration/Chart.vue @@ -50,6 +50,8 @@ diff --git a/src/views/administration/I18n.vue b/src/views/administration/I18n.vue index a30edabf..94b73ab1 100644 --- a/src/views/administration/I18n.vue +++ b/src/views/administration/I18n.vue @@ -51,6 +51,8 @@ diff --git a/src/views/administration/User.vue b/src/views/administration/User.vue index 644f7713..4d274805 100644 --- a/src/views/administration/User.vue +++ b/src/views/administration/User.vue @@ -49,6 +49,8 @@
- - -
-
- - - - - - +
+ + + + + + + +
@@ -54,104 +45,256 @@ import { ref, shallowRef } from 'vue' import _ from 'lodash' import { api } from '@/utils/api' import axios from 'axios' -import RelationGraph from 'relation-graph/vue3' +import G6 from '@antv/g6' +import testData from './testData' export default { name: 'EntityRelationship', components: { IpList, GraphDetail, - AppOrDomainList, - RelationGraph + AppOrDomainList }, data () { return { + rightBox: { + show: false + }, chartOption: { - debug: false + container: 'entityGraph', + layout: { + type: 'force', + preventOverlap: true, + linkDistance: (d) => { + if (!d.target.isRoot && d.target.data.level && d.target.data.level.length === 1) { + return 300 + } + return 80 + }, + nodeStrength: (d) => { + if (!d.isRoot && d.data.level && d.data.level.length === 1) { + return -50 + } + return -10 + }, + edgeStrength: (d) => { + if (!d.target.isRoot && d.target.data.level && d.target.data.level.length === 1) { + return 0.1 + } + return 0.7 + } + }, + modes: { + default: ['drag-nodes', 'click-select', 'zoom-canvas'] + } } } }, methods: { async init () { - /* 定义了以下几种节点类型和节点状态: - * 1.类型:根节点 root;状态:ip、app、domain; - * 2.类型:普通节点 primary;状态:normal、active; - * 3.类型:实体 entity;状态1:ip、app、domain;状态2:normal、active. - * - * ip基色#7E9F54,domain基色#38ACD2,app基色E5A219 - * - * 为方便在逻辑上区分实体列表(圆圈节点)和实体(纯图标节点),将层级分为整层和半层两种,实体列表为整层,实体为半层。 - * */ - this.graphData.rootId = this.entity.entityName - // 初始化时加载到2层半 - const rootNode = this.generateRootNode() + const _this = this + const graph = new G6.Graph(this.chartOption) + /*const rootNode = this.generateRootNode() const secondLevelNodes = await this.generateSecondLevelNodes(rootNode) const secondHalfLevelNodes = await this.generateHalfLevelNodes(secondLevelNodes) this.graphData.nodes = [rootNode, ...secondLevelNodes, ...secondHalfLevelNodes] - this.graphData.lines = this.generateLines(rootNode) - this.graphData.lines.push(...this.generateLines(secondLevelNodes)) + const rootEdges = this.generateEdges(rootNode) + const secondEdges = this.generateEdges(secondLevelNodes) + this.graphData.edges = [...rootEdges, ...secondEdges] + graph.data(this.graphData)*/ + graph.data(testData) + graph.render() - console.info(JSON.stringify(this.graphData)) - this.$refs.relationGraph.setJsonData(this.graphData) + graph.on('node:dragstart', function (e) { + graph.layout() + refreshDragedNodePosition(e) + }) + graph.on('node:drag', function (e) { + refreshDragedNodePosition(e) + }) + graph.on('node:dragend', function (e) { + e.item.get('model').fx = null + e.item.get('model').fy = null + }) + graph.on('node:click', function (e) { + const node = e.item.get('model') + if (!_this.rightBox.show) { + _this.rightBox.show = true + } + if (node.data.level && node.data.level.length === 1) { + _this.rightBox.mode = `${node.data.type}List` + } else { + _this.rightBox.mode = `${node.data.type}Detail` + } + }) + function refreshDragedNodePosition (e) { + const model = e.item.get('model') + model.fx = e.x + model.fy = e.y + } + }, + generateIconUrl (entityType, colored, isRoot) { + let subfix = '' + if (entityType === 'domain' && isRoot) { + subfix = '-colored2' + } else { + subfix = colored ? '-colored' : '' + } + return `${window.location.protocol}//${window.location.host}/images/entity-symbol2/${entityType}${subfix}.svg` }, generateRootNode () { - let iconClass = '' + let borderColor = '' + let shadowColor = '' + let width = 0 + let height = 0 switch (this.entity.entityType) { case 'ip': { - iconClass = 'cn-icon cn-icon-resolve-ip' + borderColor = '#CBD9BB' + shadowColor = 'rgba(126,159,84,0.14)' + width = 36 + height = 33 break } case 'domain': { - iconClass = 'cn-icon cn-icon-domain1' + borderColor = '#AFDEED' + shadowColor = 'rgba(56,172,210,0.14)' + width = 36 + height = 30 break } case 'app': { - iconClass = 'cn-icon cn-icon-app-name' + borderColor = '#F5DAA3' + shadowColor = 'rgba(229,162,25,0.14)' + width = 30 + height = 36 break } } return { + isRoot: true, + type: 'circle', id: this.entity.entityName, - text: this.entity.entityName, - nodeShape: 0, - styleClass: `graph-node graph-node--root graph-node--${this.entity.entityType}`, - data: { level: '1', iconClass } + label: this.entity.entityName, + size: 82, + x: 0, + y: 0, + icon: { + show: true, + img: this.generateIconUrl(this.entity.entityType, true, true), + width, + height + }, + style: { + fill: 'white', + stroke: borderColor, + lineWidth: 5 + }, + labelCfg: { + position: 'bottom', + offset: 10, + style: { + fill: '#353636', + fontSize: 12 + } + }, + data: { + level: '1' + } } }, generatePrimaryNode (props) { - const node = { - styleClass: 'graph-node graph-node--primary' - } - return { - ...node, - ...props - } - }, - generateEntityNode (level, relatedType, data) { - let iconClass = '' - switch (relatedType) { + let width = 0 + let height = 0 + switch (props.data.type) { case 'ip': { - iconClass = 'cn-icon cn-icon-resolve-ip' + width = 24 + height = 22 break } case 'domain': { - iconClass = 'cn-icon cn-icon-subdomain' + width = 24 + height = 24 break } case 'app': { - iconClass = 'cn-icon cn-icon-app-name' + width = 20 + height = 24 + break + } + } + return { + ...props, + type: 'circle', + size: 66, + icon: { + show: true, + img: this.generateIconUrl(props.data.type, false), + width, + height + }, + style: { + fill: 'white', + stroke: '#A7B0B9', + lineWidth: 1 + }, + labelCfg: { + position: 'bottom', + offset: 10, + style: { + fill: '#353636', + fontSize: 12 + } + } + } + }, + generateEntityNode (level, type, data) { + let width = 0 + let height = 0 + switch (type) { + case 'ip': { + width = 20 + height = 18 + break + } + case 'domain': { + width = 20 + height = 20 + break + } + case 'app': { + width = 17 + height = 20 break } } return { id: data.vertex, - text: data.vertex, - styleClass: `graph-node graph-node--entity graph-node--${relatedType}`, + type: 'circle', + size: 28, + icon: { + show: true, + img: this.generateIconUrl(type, true), + width, + height + }, + style: { + fill: 'transparent', + stroke: 'transparent', + lineWidth: 0 + }, + labelCfg: { + position: 'bottom', + offset: 10, + style: { + fill: '#353636', + fontSize: 12 + } + }, data: { level, - iconClass, - entityName: data.vertex, - entityType: relatedType + type, + name: data.vertex, + data } } }, @@ -164,56 +307,62 @@ export default { if (relatedEntityCount) { const ipNode = this.generatePrimaryNode({ id: 'ip-1', - text: this.$t('entities.graph.resolveIp'), + label: this.$t('entities.graph.resolveIp'), + x: 0, + y: 300, data: { level: '2', - iconClass: 'cn-icon cn-icon-resolve-ip', - entityName: this.entity.entityName, - entityType: this.entity.entityType, - relatedType: 'ip' + sourceName: this.entity.entityName, + sourceType: this.entity.entityType, + type: 'ip' } }) const domainNode = this.generatePrimaryNode({ id: 'domain-1', - text: this.$t('entity.graph.resolveDomain'), + label: this.$t('entity.graph.resolveDomain'), + x: 260, + y: -150, data: { level: '2', - iconClass: 'cn-icon cn-icon-subdomain', - entityName: this.entity.entityName, - entityType: this.entity.entityType, - relatedType: 'domain' + sourceName: this.entity.entityName, + sourceType: this.entity.entityType, + type: 'domain' } }) const subdomainNode = this.generatePrimaryNode({ id: 'domain-1', - text: this.$t('entities.subdomain'), + label: this.$t('entities.subdomain'), + x: 260, + y: -150, data: { level: '2', - iconClass: 'cn-icon cn-icon-subdomain', - entityName: this.entity.entityName, - entityType: this.entity.entityType, - relatedType: 'domain' + sourceName: this.entity.entityName, + sourceType: this.entity.entityType, + type: 'domain' } }) const appNode = this.generatePrimaryNode({ id: 'app-1', - text: this.$t('entities.tab.relatedApp'), + label: this.$t('entities.tab.relatedApp'), + x: -260, + y: -150, data: { level: '2', - iconClass: 'cn-icon cn-icon-app-name', - entityName: this.entity.entityName, - entityType: this.entity.entityType, - relatedType: 'app' + sourceName: this.entity.entityName, + sourceType: this.entity.entityType, + type: 'app' } }) switch (this.entity.entityType) { case 'ip': { if (relatedEntityCount.domainCount) { domainNode.data.count = relatedEntityCount.domainCount + domainNode.label += `(${relatedEntityCount.domainCount})` nodes.push(domainNode) } if (relatedEntityCount.appCount) { - domainNode.data.count = relatedEntityCount.appCount + appNode.data.count = relatedEntityCount.appCount + appNode.label += `(${relatedEntityCount.appCount})` nodes.push(appNode) } break @@ -221,14 +370,17 @@ export default { case 'domain': { if (relatedEntityCount.ipCount) { ipNode.data.count = relatedEntityCount.ipCount + ipNode.label += `(${relatedEntityCount.ipCount})` nodes.push(ipNode) } if (relatedEntityCount.subDomainCount) { subdomainNode.data.count = relatedEntityCount.subDomainCount + subdomainNode.label += `(${relatedEntityCount.subDomainCount})` nodes.push(subdomainNode) } if (relatedEntityCount.appCount) { appNode.data.count = relatedEntityCount.appCount + appNode.label += `(${relatedEntityCount.appCount})` nodes.push(appNode) } break @@ -236,10 +388,12 @@ export default { case 'app': { if (relatedEntityCount.ipCount) { ipNode.data.count = relatedEntityCount.ipCount + ipNode.label += `(${relatedEntityCount.ipCount})` nodes.push(ipNode) } if (relatedEntityCount.domainCount) { domainNode.data.count = relatedEntityCount.domainCount + domainNode.label += `(${relatedEntityCount.domainCount})` nodes.push(domainNode) } break @@ -247,17 +401,18 @@ export default { } rootNode.data.childNodes = nodes } + console.info(nodes) return nodes }, async generateHalfLevelNodes (nodes) { const newNodes = [] for (const node of nodes) { const newNodes2 = [] - const data = await this.queryRelatedEntity(node.data.entityType, node.data.entityName, node.data.relatedType) + const data = await this.queryRelatedEntity(node.data.sourceType, node.data.sourceName, node.data.type) if (data) { // 生成节点 data.list.forEach(d => { - newNodes2.push(this.generateEntityNode(String(parseInt(node.data.level) + 0.5), node.data.relatedType, d)) + newNodes2.push(this.generateEntityNode(String(parseInt(node.data.level) + 0.5), node.data.type, d)) }) // 更新源节点的已拓展数和列表 this.handleLoaded(node, data, newNodes2) @@ -281,12 +436,12 @@ export default { return null } }, - async queryRelatedEntity (entityType, entityName, relatedType) { - if (entityType === relatedType) { + async queryRelatedEntity (sourceType, sourceName, type) { + if (sourceType === type) { // 若源type和关联type都是domain,说明关联type是subdomain - relatedType = 'subdomain' + type = 'subdomain' } - const response = await axios.get(`${api.entity.entityGraph[`${entityType}Related${_.upperFirst(relatedType)}`]}?resource=${entityName}`).catch(e => { + const response = await axios.get(`${api.entity.entityGraph[`${sourceType}Related${_.upperFirst(type)}`]}?resource=${sourceName}`).catch(e => { console.error(e) this.showError = true this.errorMsg = this.errorMsgHandler(e) @@ -304,8 +459,8 @@ export default { * 若只有一个参数,则取参数的childNodes集合作为line终点; * 若有两个参数,则以第一个参数作为line起点,第二个参数作为终点 * */ - generateLines (source, target) { - const lines = [] + generateEdges (source, target) { + const edges = [] if (!target) { const sourceArr = [] @@ -316,20 +471,26 @@ export default { } sourceArr.forEach(s => { if (s.data && s.data.childNodes) { - const lines2 = [] + const edges2 = [] s.data.childNodes.forEach(c => { - lines2.push({ - from: s.id, - to: c.id, - color: '#BEBEBE' + edges2.push({ + id: `${s.id}-${c.id}`, + source: s.id, + target: c.id, + style: { + stroke: '#BEBEBE', + endArrow: { + path: G6.Arrow.triangle(5, 5) + } + } }) }) - s.lines = lines2 - lines.push(...lines2) + s.edges = edges2 + edges.push(...edges2) } }) } - return lines + return edges }, handleLoaded (node, data, childNodes) { if (!node.data.loaded) { @@ -344,10 +505,11 @@ export default { }, onCloseBlock () { // todo 关闭右侧graph面板 - this.mode = '' + this.rightBox.mode = '' + this.rightBox.show = false }, onExpandDetail (mode) { - this.mode = mode + this.rightBox.mode = mode }, onExpand (val) { // todo 调用接口,拓展关系 @@ -371,7 +533,10 @@ export default { entityType, entityName } - const mode = ref('ipList') // ipList, ipDetail, domainList, domainDetail, appList, appDetail + const rightBox = ref({ + mode: 'ipList', // ipList, ipDetail, domainList, domainDetail, appList, appDetail + show: false + }) // echarts关系图的节点和连线 const graphData = ref({}) @@ -381,7 +546,7 @@ export default { graphData, entity, myChart, - mode + rightBox } } } @@ -390,11 +555,8 @@ export default { .entity-graph { display: flex; - .rel-node-peel { - padding: 4px; - } .entity-graph__chart { - width: calc(100% - 360px); + width: 100%; .graph-node { display: flex; @@ -421,7 +583,7 @@ export default { } &.graph-node--ip { border-color: #CBD9BB !important; - box-shadow: 0 0 0 8px #EDF1E7; + box-shadow: 0 0 0 8px rgba(126,159,84,0.14); i { color: #7E9F54; } @@ -435,7 +597,7 @@ export default { } &.graph-node--app { border-color: #F5DAA3 !important; - box-shadow: 0 0 0 8px #FBF2DF; + box-shadow: 0 0 0 8px rgba(229,162,25,0.14); i { color: #E5A219; } @@ -497,12 +659,19 @@ export default { } } } - - .entity-graph__detail { - width: 360px; - border-left: 1px solid #E2E5EC; - overflow: auto; - padding: 20px; + .entity-graph__right-box { + & > div { + left: unset !important; + right: 0 !important; + width: 360px; + } + .entity-graph__detail { + height: calc(100% - 100px) !important; + top: 100px !important; + border-left: 1px solid #E2E5EC; + overflow: auto; + padding: 20px; + } } } diff --git a/src/views/entityExplorer/testData.js b/src/views/entityExplorer/testData.js new file mode 100644 index 00000000..aee796ff --- /dev/null +++ b/src/views/entityExplorer/testData.js @@ -0,0 +1,2687 @@ +export default { + "nodes": [ + { + "isRoot": true, + "type": "circle", + "id": "baidu.com", + "label": "baidu.com", + "size": 82, + "x": 0, + "y": 0, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored2.svg", + "width": 36, + "height": 30 + }, + "style": { + "fill": "white", + "stroke": "#AFDEED", + "lineWidth": 5 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "1", + "childNodes": [ + { + "id": "ip-1", + "label": "Resolve IP(3)", + "x": 0, + "y": 300, + "data": { + "level": "2", + "sourceName": "baidu.com", + "sourceType": "domain", + "type": "ip", + "count": 3, + "loaded": [ + { + "vertex": "116.178.71.35", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Xinjiang", + "lngwgs": 87.555502, + "city": "Urumqi City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 43.833288 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172831, + "asn": "4837" + } + } + }, + { + "vertex": "119.249.102.33", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Hebei", + "lngwgs": 115.481957, + "city": "Baoding City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 38.879992 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172932, + "asn": "4837" + } + } + }, + { + "vertex": "27.221.27.35", + "detail": { + "location": { + "continent": "Europe", + "owner": "Vodafone GmbH", + "knowledgeId": 1, + "country": "Germany", + "province": "Rheinland-Pfalz", + "lngwgs": 8.207885, + "city": "Freinsheim", + "isp": "Vodafone GmbH", + "isValid": 1, + "latwgs": 49.501895 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172121, + "asn": "4837" + } + } + } + ], + "childNodes": [ + { + "id": "116.178.71.35", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "116.178.71.35", + "data": { + "vertex": "116.178.71.35", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Xinjiang", + "lngwgs": 87.555502, + "city": "Urumqi City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 43.833288 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172831, + "asn": "4837" + } + } + } + } + }, + { + "id": "119.249.102.33", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "119.249.102.33", + "data": { + "vertex": "119.249.102.33", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Hebei", + "lngwgs": 115.481957, + "city": "Baoding City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 38.879992 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172932, + "asn": "4837" + } + } + } + } + }, + { + "id": "27.221.27.35", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "27.221.27.35", + "data": { + "vertex": "27.221.27.35", + "detail": { + "location": { + "continent": "Europe", + "owner": "Vodafone GmbH", + "knowledgeId": 1, + "country": "Germany", + "province": "Rheinland-Pfalz", + "lngwgs": 8.207885, + "city": "Freinsheim", + "isp": "Vodafone GmbH", + "isValid": 1, + "latwgs": 49.501895 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172121, + "asn": "4837" + } + } + } + } + } + ] + }, + "type": "circle", + "size": 66, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip.svg", + "width": 24, + "height": 22 + }, + "style": { + "fill": "white", + "stroke": "#A7B0B9", + "lineWidth": 1 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "edges": [ + { + "id": "ip-1-116.178.71.35", + "source": "ip-1", + "target": "116.178.71.35", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-119.249.102.33", + "source": "ip-1", + "target": "119.249.102.33", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-27.221.27.35", + "source": "ip-1", + "target": "27.221.27.35", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + }, + { + "id": "domain-1", + "label": "Subdomain(9)", + "x": 260, + "y": -150, + "data": { + "level": "2", + "sourceName": "baidu.com", + "sourceType": "domain", + "type": "domain", + "count": 9, + "loaded": [ + { + "vertex": "imeres.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "img0.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "img1.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "luimg.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "pics0.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "pics1.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "pn.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "ss0.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "wjz-cdn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + ], + "childNodes": [ + { + "id": "imeres.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "imeres.baidu.com", + "data": { + "vertex": "imeres.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "img0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "img0.baidu.com", + "data": { + "vertex": "img0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "img1.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "img1.baidu.com", + "data": { + "vertex": "img1.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "luimg.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "luimg.baidu.com", + "data": { + "vertex": "luimg.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pics0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pics0.baidu.com", + "data": { + "vertex": "pics0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pics1.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pics1.baidu.com", + "data": { + "vertex": "pics1.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pn.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pn.baidu.com", + "data": { + "vertex": "pn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "ss0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "ss0.baidu.com", + "data": { + "vertex": "ss0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "wjz-cdn.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "wjz-cdn.baidu.com", + "data": { + "vertex": "wjz-cdn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + } + ] + }, + "type": "circle", + "size": 66, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain.svg", + "width": 24, + "height": 24 + }, + "style": { + "fill": "white", + "stroke": "#A7B0B9", + "lineWidth": 1 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "edges": [ + { + "id": "domain-1-imeres.baidu.com", + "source": "domain-1", + "target": "imeres.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-img0.baidu.com", + "source": "domain-1", + "target": "img0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-img1.baidu.com", + "source": "domain-1", + "target": "img1.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-luimg.baidu.com", + "source": "domain-1", + "target": "luimg.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pics0.baidu.com", + "source": "domain-1", + "target": "pics0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pics1.baidu.com", + "source": "domain-1", + "target": "pics1.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pn.baidu.com", + "source": "domain-1", + "target": "pn.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-ss0.baidu.com", + "source": "domain-1", + "target": "ss0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-wjz-cdn.baidu.com", + "source": "domain-1", + "target": "wjz-cdn.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + }, + { + "id": "app-1", + "label": "Related APP(1)", + "x": -260, + "y": -150, + "data": { + "level": "2", + "sourceName": "baidu.com", + "sourceType": "domain", + "type": "app", + "count": 1, + "loaded": [ + { + "vertex": "baidu", + "detail": { + "category": { + "appName": "baidu", + "isValid": 1, + "appDescription": "Baidu is a Chinese search engine for websites, audio files and images. Baidu means \"\"One hundred degrees\"\" in English.", + "appTechnology": "network-protocol", + "appCategory": "general-internet", + "updateTime": "2023-06-21 06:39:57", + "knowledgeId": 12, + "appLongname": "Baidu.com", + "appCompanyCategory": "", + "createTime": "2023-06-21 06:39:57", + "appId": 548, + "appCompany": "Baidu", + "appRisk": 1, + "appSubcategory": "internet-utility" + } + } + } + ], + "childNodes": [ + { + "id": "baidu", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/app-colored.svg", + "width": 17, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "app", + "name": "baidu", + "data": { + "vertex": "baidu", + "detail": { + "category": { + "appName": "baidu", + "isValid": 1, + "appDescription": "Baidu is a Chinese search engine for websites, audio files and images. Baidu means \"\"One hundred degrees\"\" in English.", + "appTechnology": "network-protocol", + "appCategory": "general-internet", + "updateTime": "2023-06-21 06:39:57", + "knowledgeId": 12, + "appLongname": "Baidu.com", + "appCompanyCategory": "", + "createTime": "2023-06-21 06:39:57", + "appId": 548, + "appCompany": "Baidu", + "appRisk": 1, + "appSubcategory": "internet-utility" + } + } + } + } + } + ] + }, + "type": "circle", + "size": 66, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/app.svg", + "width": 20, + "height": 24 + }, + "style": { + "fill": "white", + "stroke": "#A7B0B9", + "lineWidth": 1 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "edges": [ + { + "id": "app-1-baidu", + "source": "app-1", + "target": "baidu", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + } + ] + }, + "edges": [ + { + "id": "baidu.com-ip-1", + "source": "baidu.com", + "target": "ip-1", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "baidu.com-domain-1", + "source": "baidu.com", + "target": "domain-1", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "baidu.com-app-1", + "source": "baidu.com", + "target": "app-1", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + }, + { + "id": "ip-1", + "label": "Resolve IP(3)", + "x": 0, + "y": 300, + "data": { + "level": "2", + "sourceName": "baidu.com", + "sourceType": "domain", + "type": "ip", + "count": 3, + "loaded": [ + { + "vertex": "116.178.71.35", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Xinjiang", + "lngwgs": 87.555502, + "city": "Urumqi City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 43.833288 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172831, + "asn": "4837" + } + } + }, + { + "vertex": "119.249.102.33", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Hebei", + "lngwgs": 115.481957, + "city": "Baoding City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 38.879992 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172932, + "asn": "4837" + } + } + }, + { + "vertex": "27.221.27.35", + "detail": { + "location": { + "continent": "Europe", + "owner": "Vodafone GmbH", + "knowledgeId": 1, + "country": "Germany", + "province": "Rheinland-Pfalz", + "lngwgs": 8.207885, + "city": "Freinsheim", + "isp": "Vodafone GmbH", + "isValid": 1, + "latwgs": 49.501895 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172121, + "asn": "4837" + } + } + } + ], + "childNodes": [ + { + "id": "116.178.71.35", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "116.178.71.35", + "data": { + "vertex": "116.178.71.35", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Xinjiang", + "lngwgs": 87.555502, + "city": "Urumqi City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 43.833288 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172831, + "asn": "4837" + } + } + } + } + }, + { + "id": "119.249.102.33", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "119.249.102.33", + "data": { + "vertex": "119.249.102.33", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Hebei", + "lngwgs": 115.481957, + "city": "Baoding City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 38.879992 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172932, + "asn": "4837" + } + } + } + } + }, + { + "id": "27.221.27.35", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "27.221.27.35", + "data": { + "vertex": "27.221.27.35", + "detail": { + "location": { + "continent": "Europe", + "owner": "Vodafone GmbH", + "knowledgeId": 1, + "country": "Germany", + "province": "Rheinland-Pfalz", + "lngwgs": 8.207885, + "city": "Freinsheim", + "isp": "Vodafone GmbH", + "isValid": 1, + "latwgs": 49.501895 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172121, + "asn": "4837" + } + } + } + } + } + ] + }, + "type": "circle", + "size": 66, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip.svg", + "width": 24, + "height": 22 + }, + "style": { + "fill": "white", + "stroke": "#A7B0B9", + "lineWidth": 1 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "edges": [ + { + "id": "ip-1-116.178.71.35", + "source": "ip-1", + "target": "116.178.71.35", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-119.249.102.33", + "source": "ip-1", + "target": "119.249.102.33", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-27.221.27.35", + "source": "ip-1", + "target": "27.221.27.35", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + }, + { + "id": "domain-1", + "label": "Subdomain(9)", + "x": 260, + "y": -150, + "data": { + "level": "2", + "sourceName": "baidu.com", + "sourceType": "domain", + "type": "domain", + "count": 9, + "loaded": [ + { + "vertex": "imeres.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "img0.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "img1.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "luimg.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "pics0.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "pics1.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "pn.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "ss0.baidu.com", + "detail": { + "whois": null, + "category": null + } + }, + { + "vertex": "wjz-cdn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + ], + "childNodes": [ + { + "id": "imeres.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "imeres.baidu.com", + "data": { + "vertex": "imeres.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "img0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "img0.baidu.com", + "data": { + "vertex": "img0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "img1.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "img1.baidu.com", + "data": { + "vertex": "img1.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "luimg.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "luimg.baidu.com", + "data": { + "vertex": "luimg.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pics0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pics0.baidu.com", + "data": { + "vertex": "pics0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pics1.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pics1.baidu.com", + "data": { + "vertex": "pics1.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pn.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pn.baidu.com", + "data": { + "vertex": "pn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "ss0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "ss0.baidu.com", + "data": { + "vertex": "ss0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "wjz-cdn.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "wjz-cdn.baidu.com", + "data": { + "vertex": "wjz-cdn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + } + ] + }, + "type": "circle", + "size": 66, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain.svg", + "width": 24, + "height": 24 + }, + "style": { + "fill": "white", + "stroke": "#A7B0B9", + "lineWidth": 1 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "edges": [ + { + "id": "domain-1-imeres.baidu.com", + "source": "domain-1", + "target": "imeres.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-img0.baidu.com", + "source": "domain-1", + "target": "img0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-img1.baidu.com", + "source": "domain-1", + "target": "img1.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-luimg.baidu.com", + "source": "domain-1", + "target": "luimg.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pics0.baidu.com", + "source": "domain-1", + "target": "pics0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pics1.baidu.com", + "source": "domain-1", + "target": "pics1.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pn.baidu.com", + "source": "domain-1", + "target": "pn.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-ss0.baidu.com", + "source": "domain-1", + "target": "ss0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-wjz-cdn.baidu.com", + "source": "domain-1", + "target": "wjz-cdn.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + }, + { + "id": "app-1", + "label": "Related APP(1)", + "x": -260, + "y": -150, + "data": { + "level": "2", + "sourceName": "baidu.com", + "sourceType": "domain", + "type": "app", + "count": 1, + "loaded": [ + { + "vertex": "baidu", + "detail": { + "category": { + "appName": "baidu", + "isValid": 1, + "appDescription": "Baidu is a Chinese search engine for websites, audio files and images. Baidu means \"\"One hundred degrees\"\" in English.", + "appTechnology": "network-protocol", + "appCategory": "general-internet", + "updateTime": "2023-06-21 06:39:57", + "knowledgeId": 12, + "appLongname": "Baidu.com", + "appCompanyCategory": "", + "createTime": "2023-06-21 06:39:57", + "appId": 548, + "appCompany": "Baidu", + "appRisk": 1, + "appSubcategory": "internet-utility" + } + } + } + ], + "childNodes": [ + { + "id": "baidu", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/app-colored.svg", + "width": 17, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "app", + "name": "baidu", + "data": { + "vertex": "baidu", + "detail": { + "category": { + "appName": "baidu", + "isValid": 1, + "appDescription": "Baidu is a Chinese search engine for websites, audio files and images. Baidu means \"\"One hundred degrees\"\" in English.", + "appTechnology": "network-protocol", + "appCategory": "general-internet", + "updateTime": "2023-06-21 06:39:57", + "knowledgeId": 12, + "appLongname": "Baidu.com", + "appCompanyCategory": "", + "createTime": "2023-06-21 06:39:57", + "appId": 548, + "appCompany": "Baidu", + "appRisk": 1, + "appSubcategory": "internet-utility" + } + } + } + } + } + ] + }, + "type": "circle", + "size": 66, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/app.svg", + "width": 20, + "height": 24 + }, + "style": { + "fill": "white", + "stroke": "#A7B0B9", + "lineWidth": 1 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "edges": [ + { + "id": "app-1-baidu", + "source": "app-1", + "target": "baidu", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] + }, + { + "id": "116.178.71.35", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "116.178.71.35", + "data": { + "vertex": "116.178.71.35", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Xinjiang", + "lngwgs": 87.555502, + "city": "Urumqi City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 43.833288 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172831, + "asn": "4837" + } + } + } + } + }, + { + "id": "119.249.102.33", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "119.249.102.33", + "data": { + "vertex": "119.249.102.33", + "detail": { + "location": { + "continent": "Asia", + "owner": "China Unicom", + "knowledgeId": 1, + "country": "China", + "province": "Hebei", + "lngwgs": 115.481957, + "city": "Baoding City", + "isp": "China Unicom", + "isValid": 1, + "latwgs": 38.879992 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172932, + "asn": "4837" + } + } + } + } + }, + { + "id": "27.221.27.35", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/ip-colored.svg", + "width": 20, + "height": 18 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "ip", + "name": "27.221.27.35", + "data": { + "vertex": "27.221.27.35", + "detail": { + "location": { + "continent": "Europe", + "owner": "Vodafone GmbH", + "knowledgeId": 1, + "country": "Germany", + "province": "Rheinland-Pfalz", + "lngwgs": 8.207885, + "city": "Freinsheim", + "isp": "Vodafone GmbH", + "isValid": 1, + "latwgs": 49.501895 + }, + "asn": { + "knowledgeId": 6, + "organization": "CHINA169-BACKBONE CHINA UNICOM China169 Backbone", + "isValid": 1, + "id": 172121, + "asn": "4837" + } + } + } + } + }, + { + "id": "imeres.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "imeres.baidu.com", + "data": { + "vertex": "imeres.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "img0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "img0.baidu.com", + "data": { + "vertex": "img0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "img1.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "img1.baidu.com", + "data": { + "vertex": "img1.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "luimg.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "luimg.baidu.com", + "data": { + "vertex": "luimg.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pics0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pics0.baidu.com", + "data": { + "vertex": "pics0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pics1.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pics1.baidu.com", + "data": { + "vertex": "pics1.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "pn.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "pn.baidu.com", + "data": { + "vertex": "pn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "ss0.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "ss0.baidu.com", + "data": { + "vertex": "ss0.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "wjz-cdn.baidu.com", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/domain-colored.svg", + "width": 20, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "domain", + "name": "wjz-cdn.baidu.com", + "data": { + "vertex": "wjz-cdn.baidu.com", + "detail": { + "whois": null, + "category": null + } + } + } + }, + { + "id": "baidu", + "type": "circle", + "size": 28, + "icon": { + "show": true, + "img": "http://localhost/images/entity-symbol2/app-colored.svg", + "width": 17, + "height": 20 + }, + "style": { + "fill": "transparent", + "stroke": "transparent", + "lineWidth": 0 + }, + "labelCfg": { + "position": "bottom", + "offset": 10, + "style": { + "fill": "#353636", + "fontSize": 12 + } + }, + "data": { + "level": "2.5", + "type": "app", + "name": "baidu", + "data": { + "vertex": "baidu", + "detail": { + "category": { + "appName": "baidu", + "isValid": 1, + "appDescription": "Baidu is a Chinese search engine for websites, audio files and images. Baidu means \"\"One hundred degrees\"\" in English.", + "appTechnology": "network-protocol", + "appCategory": "general-internet", + "updateTime": "2023-06-21 06:39:57", + "knowledgeId": 12, + "appLongname": "Baidu.com", + "appCompanyCategory": "", + "createTime": "2023-06-21 06:39:57", + "appId": 548, + "appCompany": "Baidu", + "appRisk": 1, + "appSubcategory": "internet-utility" + } + } + } + } + } + ], + "edges": [ + { + "id": "baidu.com-ip-1", + "source": "baidu.com", + "target": "ip-1", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "baidu.com-domain-1", + "source": "baidu.com", + "target": "domain-1", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "baidu.com-app-1", + "source": "baidu.com", + "target": "app-1", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-116.178.71.35", + "source": "ip-1", + "target": "116.178.71.35", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-119.249.102.33", + "source": "ip-1", + "target": "119.249.102.33", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "ip-1-27.221.27.35", + "source": "ip-1", + "target": "27.221.27.35", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-imeres.baidu.com", + "source": "domain-1", + "target": "imeres.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-img0.baidu.com", + "source": "domain-1", + "target": "img0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-img1.baidu.com", + "source": "domain-1", + "target": "img1.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-luimg.baidu.com", + "source": "domain-1", + "target": "luimg.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pics0.baidu.com", + "source": "domain-1", + "target": "pics0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pics1.baidu.com", + "source": "domain-1", + "target": "pics1.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-pn.baidu.com", + "source": "domain-1", + "target": "pn.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-ss0.baidu.com", + "source": "domain-1", + "target": "ss0.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "domain-1-wjz-cdn.baidu.com", + "source": "domain-1", + "target": "wjz-cdn.baidu.com", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + }, + { + "id": "app-1-baidu", + "source": "app-1", + "target": "baidu", + "style": { + "stroke": "#BEBEBE", + "endArrow": { + "path": "M 0,0 L 5,-2.5 L 5,2.5 Z" + } + } + } + ] +} diff --git a/src/views/report/Report.vue b/src/views/report/Report.vue index ae13a5fe..ad4c8d2e 100644 --- a/src/views/report/Report.vue +++ b/src/views/report/Report.vue @@ -66,6 +66,8 @@