前言

该组件基于 Vue.js 和 AntV G6 构建
在这里插入图片描述

项目特色功能

1. 丰富的节点图标支持

本拓扑图系统的最大特色是支持使用自定义图片作为节点图标

2. 智能的力导向布局

系统采用力导向布局算法,能够自动优化节点位置,避免重叠,形成美观的网络拓扑结构。用户无需手动调整节点位置,系统会自动计算出最佳的显示效果。

3. 丰富的交互功能

  • 拖拽操作:支持节点拖拽,用户可以手动调整布局
  • 缩放平移:支持画布缩放和平移,方便查看大型网络
  • 悬停效果:鼠标悬停显示详细信息
  • 点击复制:点击节点可将信息复制到剪贴板

4. 漏洞信息展示

边缘连接不仅表示网络连接关系,还能显示具体的漏洞信息,如:

  • SQL注入漏洞
  • XSS跨站脚本攻击
  • 网络协议漏洞
  • 配置错误等

第一步:安装依赖

首先确保项目中已安装必要的依赖包:

npm install @antv/g6 vue axios

第二步:准备图标资源

在项目的 `public/目录下放置设备图标文件:

public/defalut.png          # 默认设备图标kylin_high.png       # 麒麟系统高危linux_mid.png        # Linux中危win_high.png         # Windows高危win_low.png          # Windows低危win_safety.png       # Windows安全linux_high.png       # Linux高危linux_low.png        # Linux低危

第三步:创建拓扑图组件

创建主要的拓扑图组件文件:

<template><div class="topology-container"><div id="container" class="topology-canvas"></div><screen-component :objF="objF":currentEve="currentEve":questionList="questionList":list="list"@realType="handleRealType"/></div>
</template><script>
import { Graph, NodeEvent } from '@antv/g6'
import axios from 'axios'
import ScreenComponent from './screen.vue'export default {name: 'TopologyViewer',components: {ScreenComponent},data() {return {graphHH: null,objF: {},currentEve: [],questionList: [],list: []}}
}
</script>

第四步:实现数据获取逻辑

methods: {async fetchTopologyData(type) {try {const urlParams = new URLSearchParams(window.location.search);const taskId = urlParams.get('taskId');const response = await axios.get(`/api/topology?taskId=${taskId}&type=${type}`,{headers: {'platform-token': 'your-token-here'}});if (response.data.code === 200) {const topologyData = response.data.data;this.processTopologyData(topologyData);}} catch (error) {console.error('获取拓扑数据失败:', error);this.useDefaultData();}}
}

第五步:初始化拓扑图

initTopology(allData) {// 销毁现有实例if (this.graphHH) {this.graphHH.destroy();this.graphHH = null;}const graph = new Graph({container: document.getElementById("container"),width: 1520,height: 900,data: {nodes: allData.nodes.map((node) => ({id: node.id,type: node.type || "circle",style: {size: node.size || 60,labelText: `${node.name}\n${node.title}`,labelFill: '#fff',src: node.style?.src,fill: "rgba(255,255,255,.9)"}})),edges: allData.edges.map((edge) => ({id: edge.id,source: edge.source,target: edge.target,style: {labelText: edge.vulName,stroke: "#aaa",lineWidth: 1,labelFill: "rgba(255,255,255,.8)"}}))},layout: {type: "force"},behaviors: ['hover-activate','drag-canvas','zoom-canvas', 'drag-node','drag-element']});// 绑定事件this.bindEvents(graph);this.graphHH = graph;graph.render();
}

数据结构说明

节点数据结构

{id: 'firewall-001',           // 唯一标识name: '外网防火墙',            // 显示名称type: 'image',                // 节点类型size: 80,                     // 节点大小title: '192.168.1.1',         // 副标题(如IP地址)style: {src: '/img2/firewall.png'   // 图标路径}
}

边缘数据结构

{id: 'edge-001',               // 唯一标识source: 'firewall-001',       // 源节点IDtarget: 'router-001',         // 目标节点IDvulName: '防火墙策略配置漏洞'   // 漏洞描述
}

高级功能实现

1. 节点状态管理

实现不同状态下节点的视觉效果:

// 设置节点状态
setNodeState(nodeId, state) {const graph = this.graphHH;switch(state) {case 'active':graph.updateNodeData([{id: nodeId,style: {stroke: '#ff4d4f',shadowBlur: 10,shadowColor: 'rgba(255, 77, 79, 0.5)'}}]);break;case 'normal':graph.updateNodeData([{id: nodeId,style: {stroke: '#d9d9d9',shadowBlur: 0}}]);break;}graph.draw();
}

2. 动态数据更新

支持实时更新拓扑数据:

updateTopologyData(newData) {const graph = this.graphHH;// 更新节点if (newData.nodes) {graph.updateData({nodes: newData.nodes.map(node => ({id: node.id,style: node.style}))});}// 更新边缘if (newData.edges) {graph.updateData({edges: newData.edges.map(edge => ({id: edge.id,style: edge.style}))});}
}

3. 搜索和筛选功能

实现节点搜索和类型筛选:

searchNodes(keyword) {const graph = this.graphHH;const allNodes = graph.getNodes();allNodes.forEach(node => {const nodeData = graph.getNodeData(node.id);const isMatch = nodeData.name.includes(keyword) || nodeData.title.includes(keyword);graph.updateNodeData([{id: node.id,style: {opacity: isMatch ? 1 : 0.3}}]);});graph.draw();
}filterByType(deviceType) {const graph = this.graphHH;const allNodes = graph.getNodes();allNodes.forEach(node => {const nodeData = graph.getNodeData(node.id);const isVisible = deviceType === 'all' || nodeData.deviceType === deviceType;graph.updateNodeData([{id: node.id,style: {display: isVisible ? 'block' : 'none'}}]);});graph.draw();
}

性能优化建议

1. 大数据量处理

当节点数量超过1000个时,建议采用以下优化策略:

// 启用性能模式
const graph = new Graph({// ... 其他配置modes: {default: ['drag-canvas', 'zoom-canvas']},// 禁用一些耗性能的功能animate: false,groupByTypes: false
});

2. 内存管理

正确的实例销毁:

beforeDestroy() {if (this.graphHH) {this.graphHH.destroy();this.graphHH = null;}// 清理定时器if (this.intervalId) {clearInterval(this.intervalId);}
}

3. 事件优化

避免频繁的事件触发:

// 使用防抖处理鼠标事件
const debouncedHover = debounce((e) => {// 悬停处理逻辑
}, 100);graph.on(NodeEvent.POINTER_ENTER, debouncedHover);

样式定制

CSS样式配置

.topology-container {width: 100%;height: 100vh;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);position: relative;
}.topology-canvas {width: 100%;height: 100%;border-radius: 10px;box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
}/* 节点标签样式 */
.g6-tooltip {background: rgba(0, 0, 0, 0.8);color: white;border-radius: 4px;padding: 8px 12px;font-size: 12px;
}

常见问题及解决方案

  1. 图标不显示:检查图片路径是否正确,确保图片文件存在
  2. 节点重叠:调整力导向布局参数或增加画布大小
  3. 性能问题:减少节点数量或禁用动画效果
  4. 事件不响应:检查事件绑定是否正确,确保DOM元素已渲染

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918093.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918093.shtml
英文地址,请注明出处:http://en.pswp.cn/news/918093.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于dynamic的Druid 与 HikariCP 连接池集成配置区别

你提供的内容是关于 ​​dynamic-datasource-spring-boot-starter​​ 的详细介绍&#xff0c;这是一个非常实用的 ​​Spring Boot 多数据源动态切换组件​​&#xff0c;适用于需要在单个应用中连接多个数据库并灵活切换数据源的场景。下面我为你梳理一下该组件的核心信息与使…

算法训练之栈

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

OpenAI 最新开源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss&#xff0c;这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说&#xff0c;这意味着我们终于可以在自己的机器上&#xff0c;完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows系统上&…

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖)

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖) 在Linux系统中&#xff0c;有时候我们需要在特定的环境或架构下安装软件包&#xff0c;而不影响主系统。一种常见的方法是创建一个虚拟的根目录&#xff0c;并在此环境中操作。本文将介绍如何通过创建…

scratch笔记和练习-第9课:一起来绘画

位图也称为点阵图&#xff0c;它是由许许多多的点组成的&#xff0c;这些点被称为像素。位图图像可以表现丰富的多彩变化 并产生逼真的效果&#xff0c;很容易在不同软件之间交换使用&#xff0c; 但它在保存图像时需要记录每一个像素的色彩信息&#xff0c;所以占用的存储空间…

[linux] Linux:一条指令更新DDNS

Linux&#xff1a;一条指令更新DDNS 在动态IP环境下&#xff0c;如何确保我们的域名始终指向正确的公网IP地址&#xff1f;动态DNS&#xff08;DDNS&#xff09;服务为我们提供了完美的解决方案。今天&#xff0c;我将分享一个简洁高效的Linux命令行指令&#xff0c;用于自动更…

[激光原理与应用-182]:测量仪器 - 光束型 - 光束质量分析仪

光束质量分析仪是用于精确评估激光光束特性的核心设备&#xff0c;通过测量光束的强度分布、相位分布、发散角等参数&#xff0c;为激光系统的优化、加工工艺控制及科研实验提供关键数据支持。以下是光束质量分析仪的详细解析&#xff1a;一、核心功能 - 光束强度分布分析测量内…

Linux 限制 root 登录 IP 地址的方法

Linux 限制 root 登录 IP 地址的方法Linux 限制 root 登录 IP 地址的方法方法一&#xff1a;修改 SSH 配置文件方法二&#xff1a;使用 hosts.allow 和 hosts.deny 文件方法三&#xff1a;使用防火墙规则方法四&#xff1a;使用 access.conf 文件注意事项Linux 限制 root 登录 …

Word中怎样插入特殊符号

使用 “插入” 菜单&#xff1a;插入常用符号&#xff1a;将光标置于要插入符号的位置&#xff0c;点击 “插入” 选项卡&#xff0c;在 “符号” 组中点击 “符号” 按钮&#xff0c;会弹出一个符号库&#xff0c;里面包含了常见的标点符号、特殊字符等&#xff0c;找到所需符…

Linux 内核发包流程与路由控制实战

Linux 内核发包流程与路由控制实战 在网络调优、性能优化、SDN、NFV、容器网络等场景下&#xff0c;理解 Linux 内核发包路径和路由控制机制是必修课。 本文将从内核网络栈的原理入手&#xff0c;再结合 iproute2 命令和 策略路由给出实战案例。一、Linux 内核发包流程&#xf…

点播服务器

早期的时候&#xff0c;用 live555 作为 rtsp 点播服务器&#xff1b;现在比较常用的 流媒体服务器比较多&#xff1b;这里比较简单的&#xff0c;可以用 ZLMediakit&#xff1b;可以支持 ffmeg 退流 到ZLMediakit&#xff0c;然后别的客户端从 ZLMediakit 服务器拉流&#xff…

分享超图提供的、很不错的WebGIS学习资源

最近在学习了解Supermap iclient&#xff0c;发现官方提供的帮助文档、GIS学堂真的不错&#xff0c;解释了很多的内容。 官方modern-web-gis-in-action文档的网址如下&#xff1a;https://iclient.supermap.io/web/books/modern-web-gis-in-action/&#xff0c;在其中介绍了现代…

通信算法之298: verilog语法generate和for介绍

在 Verilog 中&#xff0c;generate和for是实现参数化设计和模块实例化复用的重要工具&#xff0c;尤其在需要根据参数动态生成逻辑时非常有用。以下是它们的使用方法和区别&#xff1a;1. for循环&#xff08;过程块内&#xff09;for循环主要用于过程块&#xff08;always/in…

laravel在cli模式下输出格式漂亮一些

在 Laravel 的 CLI 模式下&#xff0c;可以通过以下方式让命令行输出更加美观和专业&#xff1a; 1. 使用 Artisan 输出助手方法 Laravel 提供了多种输出样式方法&#xff1a; public function handle() {// 基础样式$this->info(成功信息 - 绿色); // 绿色$this->err…

大数据管理与应用学什么?就业前景怎么样?

前言在数字经济蓬勃发展的今天&#xff0c;大数据已经成为推动社会进步的核心生产要素。大数据管理与应用作为新兴交叉学科&#xff0c;正受到越来越多学生和企业的关注。本文将全面剖析该专业的课程体系、核心技能要求&#xff0c;详细介绍CDA数据分析师认证的备考策略&#x…

mac笔记本如何重新设置ssh key

要在Mac上重新生成SSH密钥并将其添加到平台&#xff0c;可以按照以下步骤操作&#xff1a; 打开终端 在Mac上&#xff0c;你可以通过Spotlight搜索&#xff08;按Command Space&#xff09;输入Terminal来打开终端或者直接搜索终端检查现有SSH密钥 首先&#xff0c;检查是否已…

Godot ------ 通过鼠标对节点进行操作

Godot ------ 通过鼠标对节点进行操作 引言 正文 引言 对于一个游戏,通过鼠标对游戏对象进行操作是非常普遍的行为,本文我们将以 Control 节点进行举例,说明如何通过鼠标对 Control 节点进行移动操作。 正文 首先,我们创建一个 Contorl 节点,并将它的 Layout->Trans…

k8s 网络插件 flannel calico

一、k8s 网络概述 Kubernetes网络是指在Kubernetes集群中不同组件之间进行通信和交互的网络架构&#xff0c;每个容器都有自己的IP地址&#xff0c;这些容器组成了Pod&#xff0c;Pod是Kubernetes调度的最小单元。 Pod是Kubernetes中最小的部署单元&#xff0c;每个Pod都有一个…

易美教育荣膺“腾讯年度影响力国际教育品牌”双奖加冕,见证中国国际教育力量的崛起

【腾讯新闻&#xff0c;北京讯】在刚刚圆满落幕的“回响中国”腾讯新闻教育频道年度论坛上&#xff0c;国际教育领域迎来了高光时刻&#xff1a;以美国华尔街为总部、深耕国际教育十余年的易美教育&#xff08;Easymay&#xff09;&#xff0c;凭借其持续创新的教育模式、国际化…

Chrome与Firefox浏览器安全运维配置命令大全:从攻防到优化的专业实践

Chrome与Firefox浏览器安全运维配置命令大全&#xff1a;从攻防到优化的专业实践 作者&#xff1a;高级网络安全工程师 吉林•镇赉融媒 刘晓伟 最后更新&#xff1a;2025年8月 适用对象&#xff1a;网络安全、运维从业者 浏览器作为访问互联网资源的主要入口&#xff0c;其配置…