如何在Vue中使用拓撲圖功能

前言

該組件基于 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;其配置…