Vue3使用AntvG6写拓扑图,可添加修改删除节点和边

npm安装antv/g6

npm install @antv/g6 --save

上代码

<template><div id="tpt1" ref="container" style="width: 100%;height: 100%;"></div>
</template><script setup>import { Renderer as SVGRenderer } from '@antv/g-svg';//通过svg方式呈现import { Graph,iconfont } from '@antv/g6';import { onMounted, onUnmounted, ref,nextTick,computed } from 'vue';const container = ref();const nodes = ref([{ id: '1', style: { x: 550, y: 100 },data:{id:'1',name:"wifi路由器",type:"路由器"} }//数据格式])const edges = ref([{ id:'1-3-g1',source: '1', target: '3',data:{id:1,name:"线路1",status:0,outRate:"80MB/s",inRate:"50MB/s",scoureName:"url",scoureType:"",scoureUrl:"",targetName:"http",targetType:"",targetUrl:"",watchDevice:"",watchUrl:""} }//数据格式])let graph:any = nullonMounted(() => {updateChart();})onUnmounted(() => {graph && graph.clear();});//获取所有节点const getNodeData = () => {return graph.getNodeData()}//获取所有边const getEdgeData = () => {return graph.getEdgeData()}//获取缩放比例const getZoom = () => {return graph.getZoom();}const updateChart = () => {const style = document.createElement('style');style.innerHTML = `@import url(${iconfont.css});`;document.head.appendChild(style);graph = new Graph({container: container.value,data: {nodes: nodes.value,edges: edges.value,},edge: {// type:"extra-label-edge",style: {//线条的样式cursor: 'pointer',lineWidth: 1,labelText: (d:any) => {// 改变边上的第一行第二行颜色nextTick(()=>{let parentElement = document.getElementById(d.id)let tspanList = parentElement.getElementsByTagName("tspan")setTimeout(()=>{if(tspanList.length>=2){tspanList[0].setAttribute("fill","#81f4f9")tspanList[1].setAttribute("fill","#eca13c")}})})return props.isEdit||(d.data.outRate==''&&d.data.inRate=='')?'':`⬆${d.data.outRate}\n⬇${d.data.inRate}`;},data:(d)=>{return d.data},endArrow: props.isEdit?true:false,endArrowType: (d) => d.id.split('-')[0],increasedLineWidthForHitTesting:10,stroke: '#83d6dc',labelAutoRotate:true,//是否旋转与边一致labelFill: '#fff',labelFontSize: 11,labelPadding:[3,7],zIndex:2},},transforms: [{type:"process-parallel-edges",mode:"bundle",distance: 50}],node: {type: 'image',style:{padding:[10,10],size: [60,60],labelText: (d:any) => {return d.data.name;},src: (d)=>{//通过类型自定义节点图片let imgArr:any = {"交换机":"tpt_jhj.png","路由器":"tpt_lyq.png","安全设备":"tpt_fhq.png","其他设备":"tpt_qt.png",}return (d.data.type?getImageUrl(imgArr[d.data.type]):getImageUrl('tpt_qt.png')) || getImageUrl('tpt_qt.png')},data:(d)=>{return d.data},labelPosition: 'bottom',labelFill: '#fff',labelFontSize: 13,labelBackground: false,//背景颜色labelBackgroundFill: 'linear-gradient(#e66465, #9198e5)',labelBackgroundStroke: '#9ec9ff',labelBackgroundRadius: 2,labelFontWeight: 600,labelPadding:[3,10],zIndex:3,labelOffsetY:8,badge: false, // 是否显示徽标badges: [{ text: 'x', placement: 'right-top',padding:[2,5] },],badgePalette: ['red'], // 徽标的背景色板badgeFontSize: 10, // 徽标字体大小}},behaviors: [{type:'zoom-canvas'//缩放},{type: 'drag-canvas',key: 'drag-canvas-1',},{type:"drag-element",key: 'drag-element-1',enableAnimation:false,shadow:false//拖动样式},{type: 'create-edge',key:"create-edge-1",trigger: 'click',//dragonCreate: (edge) => {//创建线的样式const { style, ...rest } = edge;return {...rest,data:{name:"",status:0,scoureName:"",scoureType:"",scoureUrl:"",targetName:"",targetType:"",targetUrl:"",watchDevice:"",watchUrl:"",inRate:"",outRate:"",},style: {...style,stroke: 'red',lineWidth: 2,endArrow: true,},};},},],renderer: () => new SVGRenderer(),});graph.render();//鼠标右键点击节点编辑graph.on('node:contextmenu', (e) => {//添加编辑设备不为0是修改form.value = e.target.config.style.datasubmitNode();});}//添加设备按钮const addNode = () => {form.value.id = 0submitNode();}//添加修改节点const submitNode = () => {if(form.value.id == 0){//添加nodes.value = graph.getNodeData();graph.addData({nodes:[{id: nodes.value.length>0?`${graph.getNodeData().length+1}`:"1",style:{ x: container.value.clientWidth/2, y: 30 },data:{id:nodes.value.length>0?`${graph.getNodeData().length+1}`:"1",name:form.value.name,type:form.value.type}}]})}else{graph.updateNodeData([{id:form.value.id,data:form.value}])}graph.render();}
</script>

运行结果

不断更新

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

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

相关文章

Arduino编译和烧录STM32——基于J-link SWD模式

一、安装Stm32 Arduino支持 在arduino中添加stm32的开发板地址&#xff1a;https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json 安装stm32开发板支持 二、安装STM32CubeProgrammer 从stm32网站中安装&#xff1a;https://ww…

智慧城市气象中台架构:多源天气API网关聚合方案

在开发与天气相关的应用时&#xff0c;获取准确的天气信息是一个关键需求。万维易源提供的“天气预报查询”API为开发者提供了一个高效、便捷的工具&#xff0c;可以通过简单的接口调用查询全国范围内的天气信息。本文将详细介绍如何使用该API&#xff0c;以及其核心功能和调用…

Vue 组件化开发

引言 在当今的 Web 开发领域&#xff0c;构建一个功能丰富且用户体验良好的博客是许多开发者的目标。Vue.js 作为一款轻量级且高效的 JavaScript 框架&#xff0c;其组件化开发的特性为我们提供了一种优雅的解决方案。通过将博客拆分成多个独立的组件&#xff0c;我们可以提高代…

Deno 统一 Node 和 npm,既是 JS 运行时,又是包管理器

Deno 是一个现代的、一体化的、零配置的 JavaScript 运行时、工具链&#xff0c;专为 JavaScript 和 TypeScript 开发设计。目前已有数十万开发者在使用 Deno&#xff0c;其代码仓库是 GitHub 上 star 数第二高的 Rust 项目。 Stars 数102620Forks 数5553 主要特点 内置安全性…

应用篇02-镜头标定(上)

本节主要介绍相机的标定方法&#xff0c;包括其内、外参数的求解&#xff0c;以及如何使用HALCON标定助手实现标定。 计算机视觉——相机标定(Camera Calibration)_摄像机标定-CSDN博客 1. 原理 本节介绍与相机标定相关的理论知识&#xff0c;不一定全&#xff0c;可以参考相…

PG CTE 递归 SQL 翻译为 达梦版本

文章目录 PG SQLDM SQL总结 PG SQL with recursive result as (select res_id,phy_res_code,res_name from tbl_res where parent_res_id (select res_id from tbl_res where phy_res_code org96000#20211203155858) and res_type_id 1 union all select t1.res_id, t1.p…

C# Where 泛型约束

在C#中&#xff0c;Where关键字主要有两种用途 1、在泛型约束中限制类型参数 2、在LINQ查询中筛选数据 本文主要介绍where关键字在在泛型约束中的使用 泛型定义中的 where 子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束。通过使用 where 关键字和…

《MySQL:MySQL表的约束-主键/复合主键/唯一键/外键》

表的约束&#xff1a;表中一定要有各种约束&#xff0c;通过约束&#xff0c;让未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段&#xff0c;倒逼程序员插入正确的数据。即&#xff0c;站在mysql的视角&#xff0c;凡是插入进来的数据&#xff0c;都是符合数据约…

Qt 创建QWidget的界面库(DLL)

【1】新建一个qt库项目 【2】在项目目录图标上右击&#xff0c;选择Add New... 【3】选择模版&#xff1a;Qt->Qt设计师界面类&#xff0c;选择Widget&#xff0c;填写界面类的名称、.h .cpp .ui名称 【4】创建C调用接口&#xff08;默认是创建C调用接口&#xff09; #ifnd…

汽车免拆诊断案例 | 2011款雪铁龙世嘉车刮水器偶尔自动工作

故障现象 一辆2011款雪铁龙世嘉车&#xff0c;搭载1.6 L 发动机&#xff0c;累计行驶里程约为19.8万km。车主反映&#xff0c;该车刮水器偶尔会自动工作&#xff0c;且前照灯偶尔会自动点亮。 故障诊断 接车后试车发现&#xff0c;除了上述故障现象以外&#xff0c;当用遥控器…

【Linux】NAT、代理服务、内网穿透

NAT、代理服务、内网穿透 一. NAT1. NAT 技术2. NAT IP 转换过程3. NAPT 技术4. NAT 技术的缺陷 二. 代理服务器1. 正向代理2. 反向代理3. NAT 和代理服务器 内网穿透内网打洞 一. NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&a…

MobaXterm连接Ubuntu(SSH)

1.查看Ubuntu ip 打开终端,使用指令 ifconfig 由图可知ip地址 2.MobaXterm进行SSH连接 点击session,然后点击ssh,最后输入ubuntu IP地址以及用户名

Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践

Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践 前言 在开发和运维 Java 应用的过程中&#xff0c;远程诊断和调试是一个不可或缺的需求。尤其是当生产环境出现问题时&#xff0c;能够快速定位并解决这些问题至关重要。Arthas 是阿里巴巴开源的一款强大的 Java…

图像预处理-添加水印

一.ROI切割 类似裁剪图片&#xff0c;但是原理是基于Numpy数组的切片操作(ROI数组切片是会修改原图数据的)&#xff0c;也就是说这个“裁剪”不是为了保存“裁剪”部分&#xff0c;而是为了方便修改等处理。 import cv2 as cv import numpy as npimg cv.imread(../images/dem…

数据结构——八大排序算法

排序在生活中应用很多&#xff0c;对数据排序有按成绩&#xff0c;商品价格&#xff0c;评论数量等标准来排序。 数据结构中有八大排序&#xff0c;插入、选择、快速、归并四类排序。 目录 插入排序 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 hoare…

吃透LangChain(五):多模态输入与自定义输出

多模态数据输入 这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAl 期望的格式相同的格式传递。对于支持多模态输入的其他模型提供者&#xff0c;我们在类中添加了逻辑以转换为预期格式。 在这个例子中&#xff0c;我们将要求模型描述一幅图像。 …

【Rust 精进之路之第10篇-借用·规则】引用 (``, `mut`):安全、高效地访问数据

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:所有权的“限制”与“变通”之道 在上一篇【所有权核心】中,我们揭示了 Rust 如何通过所有权规则和移动 (Move) 语义来保证内存安全,避免了垃圾回收器的同时,也防止了诸…

剑指Offer(数据结构与算法面试题精讲)C++版——day16

剑指Offer&#xff08;数据结构与算法面试题精讲&#xff09;C版——day16 题目一&#xff1a;序列化和反序列化二叉树题目二&#xff1a;从根节点到叶节点的路径数字之和题目三&#xff1a;向下的路径节点值之和附录&#xff1a;源码gitee仓库 题目一&#xff1a;序列化和反序…

OpenCV 模板与多个对象匹配方法详解(继OpenCV 模板匹配方法详解)

文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9&#xff1a;5.2 loc np.where(res > threshold)&#xff1a; 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转…

产品经理学习过程

一&#xff1a;扫盲篇&#xff08;初始产品经理&#xff09; 阶段1&#xff1a;了解产品经理 了解产品经理是做什么的、产品经理的分类、产品经理在实际工作中都会接触什么样的岗位、以及产品经理在实际工作中具体要做什么事情。 二&#xff1a;准备篇 阶段2&#xff1a;工…