RelationMap图谱--VUE,真实项目提供mock数据

RelationMap官网: 在线配置官网(可以把数据放进去,直接看效果)

VUE2 效果:左侧列表栏,点击右侧显示对应的图谱

代码:按照代码直接贴过去,直接出效果

relationMap/index.vue

<template><div class="graphBody"><List :list="list" @select-Graph="getGraph" /><Graph v-if="showGraph" :key="graphItem.rootId" :item="graphItem" /></div>
</template><script lang="ts">
import { getUuid } from "@/utils/generateUuid";import List from "./list/index.vue";
import Graph from "./graph/index.vue";
import mockInfo from "./mock.json";export default {components: {List,Graph,},data() {return {list: [],showGraph: false,graphItem: {},};},methods: {initListData() {this.list = mockInfo.data;},getGraph(item) {const data = {id: getUuid(),name: item.globalVariable.name,DefineType: item.globalVariable.defineType,ActualType: item.globalVariable.actualType,children: [],};const graphMap = new Map();item.callFunction.forEach((item) => {item.call.forEach((call) => {const fileName = call.location.split("/").pop();const secondNode = {id: getUuid(),fileName: fileName,location: call.location,children: [],};const threeNode = {id: getUuid(),functionName: item.functionName,children: [{id: getUuid(),startRow: call.startRow,endRow: call.endRow,startColumn: call.startColumn,endColumn: call.endColumn,mode: call.mode,},],};// 如果没有相同文件if (!graphMap.has(call.location)) {secondNode.children.push(threeNode);graphMap.set(call.location, secondNode);} else {const copy = graphMap.get(call.location);copy.children[0].children.push({id: getUuid(),startRow: call.startRow,endRow: call.endRow,startColumn: call.startColumn,endColumn: call.endColumn,});graphMap.set(call.location, copy);}});const valuesIterator = graphMap.values();const valuesArray = Array.from(valuesIterator);data.children.push(...valuesArray);graphMap.clear();});// 合并具有相同 location 属性的对象的 children 属性const mergedData = data.children.reduce((acc, obj) => {const existingObj = acc.find((item) => item.location === obj.location);if (existingObj) {existingObj.children = existingObj.children.concat(obj.children);} else {acc.push(obj);}return acc;}, []);const newValue = { ...data, children: mergedData };const { nodes, edges } = this.convertToNodesAndLines(newValue);const graphData = {rootId: newValue.id,nodes,lines: edges,};this.graphItem = graphData;if (this.graphItem) {this.showGraph = true;}},convertToNodesAndLines(data) {const treeToNode = (node, parentId) => {const result = [];const { children, ...nodeData } = node;result.push({id: node.id,text: node.id,data: nodeData,});if (node.children && node.children.length > 0) {node.children.forEach((item) => {result.push(...treeToNode(item, node.id));});}return result;};const nodeArray = treeToNode(data, data.id);const treeToEdge = (node) => {const links = [];if (node.children && node.children.length > 0) {node.children.forEach((item) => {const to = item.id;const from = node.id;links.push({id: `${to}->${from}`,to,from,});links.push(...treeToEdge(item));});}return links;};const edgeArray = treeToEdge(data);return { nodes: nodeArray, edges: edgeArray };},},mounted() {this.initListData();},
};
</script><style scoped>
.graphBody {height: 100%;border-radius: 4px;border: 1px solid #222529;background: #191c1f;display: flex;
}::-webkit-scrollbar {display: block;
}::-webkit-scrollbar-thumb {background: #393d45;
}
</style>

使用的方法util/generateUuid.js

import { v1 as uuidv1 } from 'uuid'// 去除-携带时间戳-uuid
export function getUuid() {// const timestamp = new Date().getTime()// 生成UUID时去掉连字符const uuid = uuidv1().replace(/-/g, '')// 截取前8位作为8位UUIDconst eightDigitUuid = uuid.substring(0, 12)return `${eightDigitUuid}`
}

relationMap/graph/index.vue

<template><div><div id="relation-graph-container" class="graph-wrapper"><RelationGraph ref="graphRef" :options="graphOptions"><template slot="node" slot-scope="{ node }"><div:class="`node-container node-type`"@click="nodeClick(node.data)"><spanv-if="node.data?.DefineType || node.data?.ActualType"class="type-style"><div class="type-title">{{ node.data.name }}</div><div class="content word-hidden type-content"><p>DefineType: {{ node.data.DefineType }}</p><p>ActualType: {{ node.data.ActualType }}</p></div></span><span v-if="node.data?.location" class="file-style"><div class="file-title"><div>{{ node.data.fileName || node.data.name }}</div></div><div><span class="content word-hidden file-path">路径: {{ node.data?.location }}</span></div></span><div v-if="node.data?.functionName" class="function-style"><div><span clsss="content word-hidden1">函数名:{{ node.data?.functionName }}</span></div></div><div v-if="node.data?.startRow" class="rowRolumn-style"><span clsss="content word-hidden">行号:{{ node.data?.startRow }} 列号:{{node.data?.startColumn}}-{{ node.data?.endColumn }}</span><span><span>【{{ node.data.mode === "read" ? "读取" : "写入" }}】</span></span></div></div></template></RelationGraph></div></div>
</template><script>
import RelationGraph from "relation-graph";
import { set } from "vue";
export default {name: "Graph",components: {RelationGraph,},props: {item: Object,},data() {return {graphOptions: {backgroundImageNoRepeat: true,moveToCenterWhenRefresh: false,zoomToFitWhenRefresh: false,defaultNodeBorderWidth: 0,defaultNodeShape: 1,layouts: [{label: "中心",layoutName: "tree",from: "left",},],},};},mounted() {this.$refs.graphRef.setJsonData(this.item, (graphInstance) => {});},
};
</script>
<style scoped>
.node-container {width: 240px;min-height: 40px;border-radius: 4px;background-color: #484750;
}.type-style {height: 120px;
}.type-title {color: #4880ff;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;padding: 8px 12px;text-align: left;border-radius: 4px;border-bottom: 1px solid #383b3e;
}.type-content {text-align: left;line-height: 22px;padding: 3px 6px;
}.file-style {height: 120px;border-radius: 4px;
}.file-title {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;background-color: #387dff;padding: 8px 12px;text-align: left;border-radius: 4px;
}.file-path {text-align: left;line-height: 22px;padding: 3px 6px;
}.function-style {height: 40px;line-height: 40px;text-align: left;background: #aabee3;border-radius: 4px;padding: 0 4px;color: #000;
}.rowRolumn-style {height: 40px;line-height: 40px;text-align: left;padding: 0 4px;border-radius: 2px;
}.content {padding: 4px 2px 2px;width: 240px;align-items: left;
}.word-hidden {word-break: break-all;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;
}.word-hidden1 {word-break: break-all;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;overflow: hidden;
}
</style>
<style>
.graph-wrapper {height: calc(100vh - 160px);width: 1200px;
}.c-current-zoom {color: #999999 !important;
}.relation-graph .rel-map {background-color: #191c1f !important;
}.relation-graph .rel-toolbar .c-mb-button:hover {background-color: rgba(153, 153, 153, 0.5) !important;
}.relation-graph .rel-node-checked {width: 100% !important;box-shadow: 0 0px 5px 2px #191c1f !important;
}
</style>

relationMap/list/index.vue

该页面使用了虚拟滚动RecycleScroller,需要安装一下,参考文档: 虚拟滚动

安装: npm i vue-virtual-scroller

main.ts: 

  1. // vue virtual scroller

  2. import "vue-virtual-scroller/dist/vue-virtual-scroller.css" // 引入它的 css

  3. import VueVirtualScroller from "vue-virtual-scroller" // 引入它

  4. Vue.use(VueVirtualScroller) //

<template><RecycleScrollerclass="scroller":items="list":item-size="36"key-field="id"v-slot="{ item }"><div class="user" @click="selectGraph(item)"><span style="margin-left: 16px"> {{ item.globalVariable.name }}</span></div></RecycleScroller>
</template><script>
export default {props: {list: Array,},methods: {selectGraph(item) {this.$emit("select-Graph", item);},},
};
</script><style scoped>
.scroller {height: 800px;width: 240px;
}.user {height: 36px;position: relative;display: flex;align-items: center;color: #fff;overflow: hidden;text-overflow: ellipsis;font-family: "Source Han Sans CN";font-size: 14px;font-style: normal;font-weight: 700;line-height: 20px; /* 142.857% */
}
.user:hover {background: #222529;
}
/* 在:hover状态下添加before伪类的样式 */
.user:hover::before {content: ""; /* 必须有content属性才能显示 */display: block;width: 3px;height: 36px;position: absolute;left: 0;top: 0;background-color: #4880ff;
}
</style>

mock.json 数据量太大了,这个页面放不下了,看这里:mock.json

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

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

相关文章

泽攸科技无掩模光刻机:引领微纳制造新纪元

在当今科技迅猛发展的时代&#xff0c;微纳制造技术正变得越来越重要。泽攸科技作为这一领域的先行者&#xff0c;推出了其创新的无掩模光刻机&#xff0c;这一设备在微电子制造、微纳加工、MEMS、LED、生物芯片等多个高科技领域展现出了其独特的价值和广泛的应用前景。 技术革…

Python-VBA函数之旅-tuple函数

目录 一、tuple函数的常见应用场景 二、tuple函数使用注意事项 三、如何用好tuple函数&#xff1f; 1、tuple函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、tu…

爱普生推出适用于物联网小尺寸温补晶振TG1612SLN

爱普生推出一款小尺寸温补晶振TG1612SLN&#xff0c;之前推出的小尺寸温补晶振TG2016SLN&#xff0c;封装2016已经是很小了&#xff0c;而TG1612SLN的尺寸仅为1.6x1.2x0.45毫米&#xff0c;不得不佩服爱普生的研发能力。 温度补偿晶体振荡器TG1612SLN使用爱普生开发和制造…

程序员的神奇应用:从代码创造到问题解决的魔法世界之持续集成/持续部署

文章目录 持续集成/持续部署 在软件开发的海洋中&#xff0c;程序员的实用神器如同航海中的指南针&#xff0c;帮助他们导航、加速开发、优化代码质量&#xff0c;并最终抵达成功的彼岸。这些工具覆盖了从代码编写、版本控制到测试和部署的各个环节。 在当今数字化的世界里&…

Llama 3 是怎么回事?Arena 数据分析

4 月 18 日,Meta 发布了他们最新的开放权重大型语言模型 Llama 3。从那时起,Llama 3-70B 就在 English Chatbot Arena 排行榜上迅速上升,拥有超过 50,000 次对战。Meta 的这一非凡成就对开源社区来说是个好消息。在这篇博文中,我们旨在深入探讨为什么用户将 Llama 3-70b 与 GPT…

Linux信息显示相关指令

1、查看cpu 查看cpu信息:cat /proc/cpuinfo 查看cpu个数:nproc cat /proc/cpuinfo | grep "physical id" | uniq | wc -l uniq命令:删除重复行;wc –l命令:统计行数 查看CPU核数 cat /proc/cpuinfo | grep "cpu cores" | uniq 2、查看内存 cat /pr…

快解析Tplink端口映射如何设置

Tplink作为国内知名路由器品牌&#xff0c;有着广泛的用户群体。使用快解析端口映射是实现内网服务器被外网访问必须要做的设置&#xff0c;很多对网络不懂得小白不知道该到哪里去做&#xff0c;下面我就讲解一下tplink路由器如何做端口映射。 1&#xff1a;访问路由器 &#…

uboot 顶层 Makefile 逐行分析

文章目录 0001-00080009-00180019-00510052-00920093-01070108-01230124-01770178-21350178-01810182-01860187-02020203-02450246-02620263-02720273-03370338-03830384-03870388-04250426-04490450-04740475-04860487-04980499-05340535-05500551-05650566-221822192220-2332…

想半天憋不出几个字?试试AI扩写

大家在写文章时是否也经常这样&#xff1f;想了半天&#xff0c;结果只能写出几个字&#xff0c;但是要求往往又是几百多个字&#xff0c;那么有没有啥工具可以帮我们在原文的基础上扩写一下文章字数&#xff0c;让我们达到字数要求呢&#xff1f; 下面给大家介绍一下如何扩写文…

Django开发实战之定制管理后台界面及知识梳理(下)

接上一篇&#xff1a;Django开发实战之定制管理后台界面及知识梳理&#xff08;中&#xff09; 1、前台设置 1、隐藏路由 当你输入一个错误地址时&#xff0c;可以看到这样的报错&#xff1a; 从这样的报错中&#xff0c;我们可以看到&#xff0c;这个报错页面暴漏了路由&a…

FullCalendar日历组件集成实战(1)

背景 有一些应用系统或应用功能&#xff0c;如日程管理、任务管理需要使用到日历组件。虽然Element Plus也提供了日历组件&#xff0c;但功能比较简单&#xff0c;用来做数据展现勉强可用。但如果需要进行复杂的数据展示&#xff0c;以及互动操作如通过点击添加事件&#xff0…

python数据可视化:从n个点中挑选m组3个点绘制m个三角形matplotlib.pyplot.triplot()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python数据可视化&#xff1a; 从n个点中挑选m组3个点 绘制m个三角形 matplotlib.pyplot.triplot() [太阳]选择题 以下关于matplotlib.pyplot.triplot()函数说法正确的是&#xff1f; impor…

Linux---windows 机器和远端的 Linux 机器如何通过 XShell 传输文件

一、关于rzsz 这个工具用于 windows 机器和远端的 Linux 机器通过 Xshell 传输文件. 二、下载rzsz软件 用root输入命令&#xff1a; sudo yum install -y lrzsz下载完成&#xff1a; 三、如何传输 有图形化界面 1、从Windows机器传输给远端Linux机器 ① 直接拖拽 直接将…

微软如何打造数字零售力航母系列科普10 - 什么是Azure Databricks?

什么是Azure Databricks&#xff1f; 目录 一、数据智能平台是如何工作的&#xff1f; 二、Azure Databricks的用途是什么&#xff1f; 三、与开源的托管集成 四、工具和程序访问 五、Azure Databricks如何与Azure协同工作&#xff1f; 六、Azure Databricks的常见用例是…

JavaSE——集合框架一(2/7)-Collection集合的遍历方式-迭代器、增强for循环、Lambda、案例

目录 Collection的遍历方式 迭代器 增强for循环&#xff08;foreach&#xff09; Lambda表达式遍历集合 案例 需求与分析 代码部分 运行结果 Collection的遍历方式 迭代器 选代器是用来遍历集合的专用方式&#xff08;数组没有选代器&#xff09;&#xff0c;在Java中…

【Spring Boot】 深入理解Spring Boot拦截器:自定义设计与实现全攻略

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】 深入理解Spring Boot拦截器&#xff1a;自定义设计与实现全攻略 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 SpringBoot统⼀功能处理一…

第十五节:贪心算法(下)

一 、 贪心算法的解题套路实战一&#xff08;最多的会议宣讲场次&#xff09; 1.1 描述 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来安排宣讲的日程&#xff0c;要求会议室进行的宣讲的场次最多。…

HTML静态网页成品作业(HTML+CSS)——动漫哆啦A梦网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

Mongo关联查询两张表中分别满足某些条件的记录

如果是在mysql里面&#xff0c;这个查起来就很方便&#xff0c;但是&#xff0c;在mongo里面的话&#xff0c;查询起来就没这么方便了。 如果使用付费版的Studio 3T工具的话&#xff0c;也可以像使用mysql一样查询mongo数据&#xff0c;但是免费版不支持sql的用法&#xff0c;只…

Python---Pandas万字总结(1)

Pandas基础-1 Pandas 是 一个强大的分析结构化数据的工具集。Pandas 以 NumPy 为基础&#xff08;实现数据存储和运算&#xff09;&#xff0c;提供了专门用于数据分析的类型、方法和函数&#xff0c;对数据分析和数据挖掘提供了很好的支持&#xff1b;同时 pandas 还可以跟数…