Vue3-Vite-ts 前端生成拓扑图,复制即用

完整代码,复制即可用,样式自调
试过 jointjs dagre-d3 vis,好用一点

方法1:Vis.js

npm install vis-network

<template>
  <div id="mynetwork" class="myChart" :style="{width: '100%', height: '90vh'}"></div>
</template>
<script setup lang="ts">
import 'vis-network/dist/dist/vis-network.min.css'
import vis from 'vis-network/dist/vis-network.min'
import { onMounted, ref } from 'vue';
onMounted(() => {
  makeVis()
})
const mynetwork = ref()
const makeVis = () => {
  var nodes = [ // 每行加上shape: 'circle' ,则节点显示圆形
      {id: 1, label: 'Node 1'},
      {id: 2, label: 'Node 2'},
      {id: 3, label: 'Node 3'},
      {id: 4, label: 'Node 4'},
      {id: 6, label: 'Node 6'},
      {id: 7, label: 'Node 7'},
      {id: 8, label: 'Node 8'},
      {id: 9, label: 'Node 9'},
      {id: 5, label: 'Node 5'}
  ]
  var edges = [ // 每行加上label: '关系名称',则会在线中间显示节点关系名
    {from: 1, to: 3},
    {from: 1, to: 2},
    {from: 2, to: 4},
    {from: 2, to: 5},
    {from: 6, to: 5},
    {from: 6, to: 7},
    {from: 8, to: 6},
    {from: 7, to: 9},
  ]
  var data = {
    nodes: nodes,
    edges: edges
  }
    var container = document.getElementById('mynetwork')
    var options = {
      nodes: {
        shape: 'box', //设置节点node样式为矩形
        fixed: false, //节点node固定可移动
        font: {
          color: 'red', //字体的颜色
          size: 20, //显示字体大小
        },
        scaling: {
          min: 16,
          max: 32, //缩放效果比例
        },
        borderWidth: 1,
        color: {
          border: 'red',
          background: 'white' // 若是引用图标,背景颜色
        }
      },
      // groups: {
      //   ws: { // 系统定义的形状 dot等 这些官网都可以找到
      //     shape: 'dot',
      //     color: 'white'
      //   }
      // },
      layout: {
        // randomSeed: 1, // 配置每次生成的节点位置都一样,参数为数字1、2等
        //以分层方式定位节点
        hierarchical: {
          direction: 'UD', //分层排序方向
          sortMethod: 'directed', //分层排序方法
          levelSeparation: 100, //不同级别之间的距离
        },
      },
      // physics: {
      //   // barnesHut: { gravitationalConstant: -30000 },
      //   barnesHut: {
      //     gravitationalConstant: -80000,
      //     springConstant: 0.001,
      //     springLength: 200
      //   },
      //   stabilization: false
      //   // { iterations: 2500 }
      // },
      interaction: {
        // navigationButtons: true,
        hover: true, // 鼠标移过后加粗该节点和连接线
        selectConnectedEdges: false, // 选择节点后是否显示连接线
        hoverConnectedEdges: false, // 鼠标滑动节点后是否显示连接线
        tooltipDelay: 200,
        zoomView: true // 是否能缩放画布
      },
      edges: {
        color: { // 连接线的样式
          color: 'white',
          highlight: 'white',
          hover: '#848484',
          inherit: 'from',
          opacity: 1.0
        },
        // font: {
        //   align: 'top', //连接线文字位置
        // },
        shadow: true, // 连接线阴影配置
        smooth: true // 是否连线平滑
        // arrows: {to : true }//是否显示方向箭头 箭头指向to节点
      }
    }
    const network = new vis.Network(container, data, options)
    network.on('click',(params) => {
      console.log(params);
    })
  }
</script>

效果
在这里插入图片描述

方法2 -dagre-d3

$ npm i d3@5.16.0

$ npm i dagre-d3@0.6.4

<template>
  <div >
    <svg class="dagre" width="1500" height="800">
      <g class="container"></g>
    </svg>
  </div>
</template>
 
<script setup lang="ts">
import { ref, onMounted, watch } from "vue";
import dagreD3 from "dagre-d3";
import * as d3 from "d3";
const draw = () => {
  var nodes = [ // 每行加上shape: 'circle' ,则节点显示圆形
      {id: 1, label: 'Node 1'},
      {id: 2, label: 'Node 2'},
      {id: 3, label: 'Node 3'},
      {id: 4, label: 'Node 4'},
      {id: 6, label: 'Node 6'},
      {id: 7, label: 'Node 7'},
      {id: 8, label: 'Node 8'},
      {id: 9, label: 'Node 9'},
      {id: 5, label: 'Node 5'}
  ]
  var edges = [ // 每行加上label: '关系名称',则会在线中间显示节点关系名
    {from: 1, to: 3},
    {from: 1, to: 2},
    {from: 2, to: 4},
    {from: 2, to: 5},
    {from: 6, to: 5},
    {from: 6, to: 7},
    {from: 8, to: 6},
    {from: 7, to: 9},
  ]
  // 创建 Graph 对象
  const g = new dagreD3.graphlib.Graph()
    .setGraph({
      zoom: 1,
      rankdir: "TB", // 流程图从下向上显示,默认'TB',可取值'TB'、'BT'、'LR'、'RL'
      // align: 'UL', //节点的对齐方式。有4个值: UL,UR,DL,DR。
      // acyclicer: 'greedy',//如果设置为贪婪模式(greedy), 则使用贪婪启发式来查找. 返回的弧设置是一组可以删除的线, 从而使图无环.
      //ranker: "network-simplex",//连线算法
      // nodesep: 120, //水平方向上, 分隔节点的距离(节点之间的间距)
      // edgesep: 100,//在水平方向上, 线段间的距离
      // ranksep: 50,//每个层级间的距离
      // marginx: 200,//图形左右边缘的距离
      // marginy: 20,//图形上下边缘的距离
    })
    .setDefaultEdgeLabel(function () {
      return {};
    });
  nodes.forEach((node) => {
    g.setNode(node.id, {
      id: node.id,
      label: `<foreignObject id='${node.id}'>
        <div id='${node.id}'>
         <span>${node.label}</span>
        </div>
        </foreignObject>`, //node.nodeName,
      labelType: "html",
      shape: "rect", //节点形状,可以设置rect(长方形),circle,ellipse(椭圆),diamond(菱形) 四种形状,还可以使用render.shapes()自定义形状
      style: "fill:#333;stroke:#a0cfff;stroke-width: 2px;",  //节点样式,可设置节点的颜色填充、节点边框
      labelStyle: "fill: #ddd;font-weight:bold;",  //节点标签样式, 可设置节点标签的文本样式(颜色、粗细、大小)
      rx: 5, // 设置圆角
      ry: 5, // 设置圆角
      // paddingBottom: 0,
      // paddingLeft: 0,
      // paddingRight: 0,
      // paddingTop: 0,`
    });
  });
 
  // Graph添加节点之间的连线
  if (nodes.length > 1) {
    edges.forEach((edge) => {
      g.setEdge(edge.from, edge.to, {
        // curve: d3.curveBasis , //d3.curveBasis 贝塞尔曲线  curveStepBefore直线
        style: "stroke: #0fb2cc; fill: none; stroke-width: 1px", // 连线样式
        arrowheadStyle: "fill: #0fb2cc;stroke: #0fb2cc;", //箭头样式,可以设置箭头颜色
        arrowhead: "vee", //箭头形状,可以设置 normal,vee,undirected 三种样式,默认为 normal
      });
    });
  }
 
  // 获取要绘制流程图的绘图容器
  const container = d3.select("svg.dagre").select("g.container");
 
  // 创建渲染器
  const render = new dagreD3.render();
  // 在绘图容器上运行渲染器绘制流程图
  render(container, g);
  let svg = d3.select('svg')
  // 建立拖拽缩放
  let zoom = d3.zoom()
    .on("zoom", function () {
      container.attr("transform", d3.event.transform);
     });
  svg.call(zoom);
};
onMounted(() => {
  draw();
});
</script>

效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QGraphicsView实现简易地图19『迁徙图』

模仿echarts的迁徙图效果 用到了前2篇制作的散点(涟漪效果)和两年前的路径动画类&#xff1b;然尾迹效果未依附路径&#xff0c;有待优化。 动态演示效果 静态展示图片 核心代码 #pragma once #include "Item/AbstractGeoItem.h" #include "DataStruct/GeoD…

苹果电脑如何清理最近打开的文稿记录 Mac如何移除浏览痕迹保护隐私

日常使用苹果电脑的过程中&#xff0c;我们经常会打开各种文稿&#xff0c;浏览网页等操作。然而&#xff0c;这些操作可能会留下一些记录&#xff0c;涉及到个人隐私和数据安全问题。下面我们来看看苹果电脑如何清理最近打开的文稿记录&#xff0c;Mac如何移除浏览痕迹保护隐私…

JavaSE:异常

1、什么是异常 在生活当中&#xff0c;不管是人还是动物又或是植物&#xff0c;都会生病&#xff1b;在程序中也是&#xff0c;作为程序猿&#xff0c;虽然我们会尽力将程序写的完美&#xff0c;可难免会出现一些问题~ 在程序执行过程中&#xff0c;发生的一些不正常行为&…

2024年5月31日 (周五) 叶子游戏新闻

《Granblue Fantasy: Relink》版本更新 新增可操控角色及功能世嘉股份有限公司现已公开《Granblue Fantasy: Relink》&#xff08;以下简称 Relink&#xff09;免费版本更新ver.1.3.1于5月31日&#xff08;周五&#xff09;上线的消息。该作是由Cygames Inc.&#xff08;下称Cy…

进程——linux

目录 冯诺依曼体系结构&#xff08;计算机组成原理与体系结构&#xff09; 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…

一维时间序列信号的小波模极大值分解与重建(matlab R2018A)

数学上称无限次可导函数是光滑的或没有奇异性&#xff0c;若函数在某处有间断或某阶导数不连续&#xff0c;则称函数在此处有奇异性&#xff0c;该点就是奇异点。奇异性反映了信号的不规则程度&#xff0c;因为信号的奇异点和突变部分往往携带者重要信息&#xff0c;因此信号的…

资深人士称:AI开发游戏会降低游戏成本和体验,不会降低就业率

易采游戏网6月1日最新消息&#xff1a;本周在TD Cowen会议上&#xff0c;R星的母公司Take-Two的CEO Strauss Zelnick对于人工智能(AI)是否会影响游戏开发行业表达了自己的看法。他坚定地认为&#xff0c;AI绝对会改变游戏的制作方式&#xff0c;但不会降低游戏行业的就业水平。…

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

YOLOv8 segment介绍

1.YOLOv8图像分割支持的数据格式&#xff1a; (1).用于训练YOLOv8分割模型的数据集标签格式如下: 1).每幅图像对应一个文本文件&#xff1a;数据集中的每幅图像都有一个与图像文件同名的对应文本文件&#xff0c;扩展名为".txt"; 2).文本文件中每个目标(object)占一行…

OCR图片转Excel表格:没结构化的弊端

随着OCR技术的不断发展&#xff0c;将表格图片转为excel已不再是难题&#xff0c;但是&#xff0c;目前市面上的程序还大多处于仅能将图片表格转为普通的excel格式阶段&#xff0c;而不能将其结构化&#xff0c;这样就会产生许多的弊端&#xff0c;具体弊端如下&#xff1a; &l…

6个适合在家做的副业兼职,做得好的月入过万,适合上班族和宝妈

嘿&#xff0c;亲爱的朋友们&#xff01;是不是常常觉得钱包瘪瘪&#xff0c;却又因为种种原因无法外出兼职&#xff1f; 别急&#xff0c;我来为大家揭秘几个在家也能轻松赚钱的靠谱副业&#xff0c;让你足不出户也能月入过万&#xff0c;从此告别财务烦恼&#xff01; 副业一…

xcode删除依赖包package,删除不必要的依赖项

点击项目&#xff0c;然后点击PROJECT项里面的Package DepenDependencies&#xff1a; 选中一个依赖项&#xff0c;然后点击减号&#xff0c;就可以把依赖项删除掉了&#xff0c;左侧项目下面的Package已经没有了这个依赖项 TARGET下面的package也要删除&#xff1a;在这里删除…

OceanBase开发者大会实录-李楠:4条路径+6大方案,关键业务系统数据库的升级之路

本文来自2024 OceanBase开发者大会&#xff0c;OceanBase 金融与政企事业部解决方案总监李楠的演讲实录 ——《关键业务系统分布式数据库升级路线选择和技术演进之路》。完整视频回看&#xff0c;请点击这里&#xff1e;> 大家好&#xff0c;我是 OceanBase 金融与政企事业部…

第一周 数据结构与算法以及复杂度分析

数据结构与算法 算法定义 算法&#xff08;algorithm&#xff09;是在有限时间内解决特定问题的一组指令或操作步骤&#xff0c;它具有以下特性。 1.问题是明确的&#xff0c;包含清晰的输入和输出定义。 2.具有可行性&#xff0c;能够在有限步骤、时间和内存空间下完成。 3.…

利用WMI横向移动

一. WMI介绍和使用 1. WMI介绍 WMI是Windows在Powershell还未发布前&#xff0c;微软用来管理Windows系统的重要数据库工具&#xff0c;WMI本身的组织架构是一个数据库架构&#xff0c;WMI 服务使用 DCOM或 WinRM 协议, 在使用 wmiexec 进行横向移动时&#xff0c;windows 操…

小白跟做江科大32单片机之对射式红外传感器计次

原理部分 1中断示意图&#xff0c;中断会打断主函数的执行&#xff0c;终端执行完成之后再返回主函数继续执行 2.STM32中断 这些灰色的是内核中断 这些白色的是普通中断 3.NVIC统一管理中断&#xff0c;每个中断通道都拥有16个可编程的优先等级&#xff0c;可对优先级进行分组…

超大功率光伏并网逆变器学习(三相)

1.超大功率用的IGBT开关频率通常很低,比如6KHz 2.线电压和相电压的关系 相电压 A AB线电压-CA线电压 相电压 B BC线电压-AB线电压 相电压 C CA线电压-BC线电压 3.坐标变换 ABC三相信号通过Clark坐标变换得到αβ两相静止信号,其中α与A相重合,β与α…

ElasticSearch教程(详解版)

本篇博客将向各位详细介绍elasticsearch&#xff0c;也算是对我最近学完elasticsearch的一个总结&#xff0c;对于如何在Kibana中使用DSL指令&#xff0c;本篇文章不会进行介绍&#xff0c;这里只会介绍在java中如何进行使用&#xff0c;保证你看完之后就会在项目中进行上手&am…

为何选择 MindMapper

MindMapper是一款专业的可视化思维导图软件&#xff0c;通过智能绘图方法&#xff0c;在管理信息和 处理工作流程中&#xff0c;帮助提高组织、审查、合作、分享和交流能力。 企业创造力 在企业界&#xff0c;MindMapper思维导图软件可以提高生产力和沟通效果&#xff0c;以及…

复试不考机试,初试300分以上,上岸稳了?东北林业大学计算机考研考情分析!

东北林业大学&#xff08;Northeast Forestry University&#xff09;&#xff0c;简称东北林大&#xff08;NEFU&#xff09;&#xff0c;位于黑龙江省哈尔滨市&#xff0c;是一所以林科为优势、林业工程为特色的中华人民共和国教育部直属高校&#xff0c;由教育部、国家林业局…