前端关系图推荐-relation-graph

前端关系图推荐-relation-graph

目录

一、前言

二、relation-graph官网地址

三、推荐relation-graph的原因

四、relation-graph的使用

1.Vue2使用

1.1、安装relation-graph

1.2、 可直接复制到vue文件中运行使用

2. Vue3使用

2.1、安装relation-graph

2.2、 可直接复制到vue文件中运行使用

3. React使用

1.1、安装relation-graph

1.2、 可直接复制到文件中运行使用

五、运行结果

六、下面是运行成果图


一、前言

Relation-Graph是一个开源的免费关系图谱组件,支持Vue2、Vue3和React框架。它提供开箱即用的体验,配置简单,文档清晰,并支持通过插槽自定义节点样式。文章详细介绍了在Vue2、Vue3和React中的安装和使用方法,包含完整的代码示例和运行效果图。该组件具有高度可定制性,支持节点点击事件等交互功能,适用于构建各种关系图谱应用。作者强烈推荐该工具,并分享了实际项目中的使用效果。

二、relation-graph官网地址

relation-graph - A Relationship Graph Component

三、推荐relation-graph的原因

  1. 超级容易上手,基本开箱即用
  2. 官方文档清晰明了,有在线示例、可自定义配置,配置完可直接复制配置的代码
  3. 完全支持 VUE2、VUE3、React 三种框架
  4. 关系节点可通过插槽完全自定义定制
  5. 免费!!!免费!!!免费!!!

四、relation-graph的使用

1.Vue2使用

1.1、安装relation-graph

npm install --save relation-graph

1.2、 可直接复制到vue文件中运行使用

<template>    <div>      <div>         <RelationGraph ref="graphRef" :options="graphOptions" :on-node-click="onNodeClick" :on-line-click="onLineClick" />      </div>    </div>  </template>  <script> // relation-graph也支持在main.js文件中使用Vue.use(RelationGraph);这样,你就不需要下面这一行代码来引入了。  import RelationGraph from 'relation-graph'  export default {    name: 'Demo',    components: { RelationGraph },    data() {      return {        graphOptions: {          defaultJunctionPoint: 'border'          // 这里可以参考"Graph 图谱"中的参数进行设置 https://www.relation-graph.com/#/docs/graph        }      }    },    mounted() {      this.showGraph()    },    methods: {      showGraph() {        const jsonData = {          rootId: 'a',          nodes: [            { id: 'a', text: 'A', borderColor: 'yellow' },            { id: 'b', text: 'B', color: '#43a2f1', fontColor: 'yellow' },            { id: 'c', text: 'C', nodeShape: 1, width: 80, height: 60 },            { id: 'e', text: 'E', nodeShape: 0, width: 150, height: 150 }          ],          lines: [            { from: 'a', to: 'b', text: '关系1', color: '#43a2f1' },            { from: 'a', to: 'c', text: '关系2' },            { from: 'a', to: 'e', text: '关系3' },            { from: 'b', to: 'e', color: '#67C23A' }          ]        }        // 以上数据中的node和link可以参考"Node节点"和"Link关系"中的参数进行配置        this.$refs.graphRef.setJsonData(jsonData, (graphInstance) => {          // Called when the relation-graph is completed        })      },      onNodeClick(nodeObject, $event) {        console.log('onNodeClick:', nodeObject)      },      onLineClick(lineObject, $event) {        console.log('onLineClick:', lineObject)      }    }  }  </script>

2. Vue3使用

2.1、安装relation-graph

npm install --save relation-graph-vue3

2.2、 可直接复制到vue文件中运行使用

<template>   <div>     <div>       <relation-graph ref="graphRef$" :options="options" />     </div>   </div> </template> <script setup lang="ts"> import { onMounted, ref } from 'vue' import RelationGraph from 'relation-graph-vue3' const graphRef$ = ref<RelationGraph>() const options = {   defaultExpandHolderPosition: 'right' } onMounted(() => {   const jsonData = {     rootId: 'a',     nodes: [       { id: 'a', text: 'a', },       { id: 'b', text: 'b', },       { id: 'c', text: 'c', },       { id: 'd', text: 'd', },       { id: 'e', text: 'e', },       { id: 'f', text: 'f', },     ],     lines: [       { from: 'a', to: 'b', },       { from: 'a', to: 'c', },       { from: 'a', to: 'd', },       { from: 'a', to: 'e', },       { from: 'a', to: 'f', },     ],   }   // The node and line in the above data can refer to the options in "Node" and "Link & Line" for configuration.   // Node: https://www.relation-graph.com/#/docs/node   // Link & Line: https://www.relation-graph.com/#/docs/link   graphRef$.value.setJsonData(jsonData)   // The graphRef$.value.setJsonData(jsonData, callback) method is a convenient method that is equivalent to the following code:   //  const graphInstance = graphRef$.value.getInstance();   //  graphInstance.addNodes(jsonData.nodes);   //  graphInstance.addLines(jsonData.lines);   //  graphInstance.rootNode = graphInstance.getNodeById(jsonData.rootId);   //  await graphInstance.doLayout(); // Layout using the layouter set in graphOptions   //  await graphInstance.moveToCenter(); // Find the center based on node distribution and center the view   //  await graphInstance.zoomToFit(); // Zoom to fit, so that all nodes can be displayed in the visible area }) </script>

3. React使用

1.1、安装relation-graph

npm install --save relation-graph-react

1.2、 可直接复制到文件中运行使用

import React, { useEffect, useRef } from 'react'; import RelationGraph, {RelationGraphInstance} from 'relation-graph-react'; import type { MutableRefObject} from 'react'; import type {   RGLine,   RGLink,   RGNode,   RGNodeSlotProps,   RGOptions,   RelationGraphExpose } from 'relation-graph-react'; const staticJsonData = {   rootId: '2',   nodes: [     { id: '1', text: '节点-1', myicon: 'el-icon-star-on' },     { id: '2', text: '节点-2', myicon: 'el-icon-setting', width: 100, height: 100 },     { id: '3', text: '节点-3', myicon: 'el-icon-setting' },     { id: '4', text: '节点-4', myicon: 'el-icon-star-on' },     { id: '6', text: '节点-6', myicon: 'el-icon-setting' },     { id: '7', text: '节点-7', myicon: 'el-icon-setting' },     { id: '8', text: '节点-8', myicon: 'el-icon-star-on' },     { id: '9', text: '节点-9', myicon: 'el-icon-headset' },     { id: '71', text: '节点-71', myicon: 'el-icon-headset' },     { id: '72', text: '节点-72', myicon: 'el-icon-s-tools' },     { id: '73', text: '节点-73', myicon: 'el-icon-star-on' },     { id: '81', text: '节点-81', myicon: 'el-icon-s-promotion' },     { id: '82', text: '节点-82', myicon: 'el-icon-s-promotion' },     { id: '83', text: '节点-83', myicon: 'el-icon-star-on' },     { id: '84', text: '节点-84', myicon: 'el-icon-s-promotion' },     { id: '85', text: '节点-85', myicon: 'el-icon-sunny' },     { id: '91', text: '节点-91', myicon: 'el-icon-sunny' },     { id: '92', text: '节点-82', myicon: 'el-icon-sunny' },     { id: '5', text: '节点-5', myicon: 'el-icon-sunny' }   ],   lines: [     { from: '7', to: '71', text: '投资' },     { from: '7', to: '72', text: '投资' },     { from: '7', to: '73', text: '投资' },     { from: '8', to: '81', text: '投资' },     { from: '8', to: '82', text: '投资' },     { from: '8', to: '83', text: '投资' },     { from: '8', to: '84', text: '投资' },     { from: '8', to: '85', text: '投资' },     { from: '9', to: '91', text: '投资' },     { from: '9', to: '92', text: '投资' },     { from: '1', to: '2', text: '投资' },     { from: '3', to: '1', text: '高管' },     { from: '4', to: '2', text: '高管' },     { from: '6', to: '2', text: '高管' },     { from: '7', to: '2', text: '高管' },     { from: '8', to: '2', text: '高管' },     { from: '9', to: '2', text: '高管' },     { from: '1', to: '5', text: '投资' }   ] }; const NodeSlot: React.FC<RGNodeSlotProps> = ({node}) => {   console.log('NodeSlot:');   if (node.id === '2') { // if rootNode     return <div style={{zIndex: 555, opacity: 0.5, lineHeight:'100px', width: '100px', height: '100px', color: '#000000', borderRadius:'50%', boxSizing: 'border-box', fontSize: '18px', textAlign: 'center', overflow: 'hidden'}}>       <div style={{width: '100%', height: (node.data!.percent * 100) + '%', marginTop: ((1-node.data!.percent) * 100) + '%', background: 'linear-gradient(to bottom, #00FFFF, #FF00FF)'}}>         {node.text}       </div>     </div>;   }   return <div style={{lineHeight: '80px', textAlign: 'center'}}>     <span>{node.text}</span>   </div> }; const SimpleGraph: React.FC = () => {   const graphRef = useRef() as MutableRefObject<RelationGraphExpose>;   useEffect(() => {     showGraph();   }, []);   const showGraph = async () => {     // The node and line in the above data can refer to the options in "Node" and "Link & Line" for configuration.     // Node: https://www.relation-graph.com/#/docs/node     // Link & Line: https://www.relation-graph.com/#/docs/link     await graphRef.current.setJsonData(staticJsonData, (graphInstance) => {         // Do something when graph ready     });     // The graphRef.current.setJsonData(jsonData, callback) method is a convenient method that is equivalent to the following code:     //  const graphInstance = graphRef.current.getInstance();     //  graphInstance.addNodes(jsonData.nodes);     //  graphInstance.addLines(jsonData.lines);     //  graphInstance.rootNode = graphInstance.getNodeById(jsonData.rootId);     //  await graphInstance.doLayout(); // Layout using the layouter set in graphOptions     //  await graphInstance.moveToCenter(); // Find the center based on node distribution and center the view     //  await graphInstance.zoomToFit(); // Zoom to fit, so that all nodes can be displayed in the visible area   }   const options:RGOptions = {     debug: true,     defaultLineShape: 1,     layout: {       layoutName: 'center',       maxLayoutTimes: 3000     },     defaultExpandHolderPosition: 'right'   };   const onNodeClick = (node: RGNode, _e: MouseEvent | TouchEvent) => {     console.log('onNodeClick:', node.text);     return true;   };   const onLineClick = (line: RGLine, _link: RGLink, _e: MouseEvent | TouchEvent) => {     console.log('onLineClick:', line.text, line.from, line.to);     return true;   };   return <div>     <div>ok</div>     <div style={{ height: 600, width: 900, border: '#efefef solid 1px' }}>       <RelationGraph         ref={graphRef}         options={options}         nodeSlot={NodeSlot}         onNodeClick={onNodeClick}         onLineClick={onLineClick}       />     </div>   </div>; }; export default SimpleGraph;

五、运行结果

因为我是Vue2项目,所以下面展示的是我在Vue2项目中的代码,可直接复制运行,需要注意的是我使用了less

<template>     <div>         <div>             <h3>设备联动图</h3>         </div>         <div>             <RelationGraph ref="graphRef" :options="graphOptions" :on-node-click="onNodeClick" :on-line-click="onLineClick">                 <template #node="{ node }">                     <div>                         <div>                             <div>                                 <span></span>                                 <strong>声光</strong>                                 <div>离线</div>                             </div>                             <div>                                 <span>4</span>                             </div>                         </div>                         <div>                             办公室1                         </div>                     </div>                 </template>             </RelationGraph>         </div>     </div> </template> <script> import RelationGraph from 'relation-graph' export default {     name: "DevLinkageDiagram",     components: { RelationGraph },     props: {},     data() {         return {             graphOptions: {                 defaultJunctionPoint: 'border',                 allowShowDownloadButton: false,                 defaultFocusRootNode: false,                 defaultNodeWidth: 1,                 defaultNodeHeight: 1,                 defaultShowLineLabel: false,                 allowShowRefreshButton: true,                 // 这里可以参考"Graph 图谱"中的参数进行设置 https://www.relation-graph.com/#/docs/graph             }         };     },     computed: {},     created() { },     mounted() {         this.showGraph()     },     methods: {         showGraph() {             const jsonData = {                 rootId: 'a',                 nodes: [                     { id: 'a', text: 'A', },                     { id: 'b', text: 'B', },                     { id: 'c', text: 'C', },                     { id: 'e', text: 'E', }                 ],                 lines: [                     { from: 'a', to: 'b', },                     { from: 'a', to: 'c', },                     { from: 'a', to: 'e', },                 ]             }             // 以上数据中的node和link可以参考"Node节点"和"Link关系"中的参数进行配置             this.$refs.graphRef.setJsonData(jsonData, (graphInstance) => {                 // Called when the relation-graph is completed             })         },         onNodeClick(nodeObject, $event) {             // console.log('onNodeClick:', nodeObject)         },         onLineClick(lineObject, $event) {             // console.log('onLineClick:', lineObject)         }     }, }; </script> <style scoped lang="less"> .dev-linkage-diagram {     padding: 15px;     background-color: #ffffff;     border-radius: 4px;     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);     .header {         display: flex;         justify-content: space-between;         align-items: center;         margin-bottom: 15px;         padding-bottom: 10px;         border-bottom: 1px solid #eee;     }     .graphRefBox {         height: 580px;         background-color: #cfcece;     }     .rel-node-peel {         position: relative;         .c-my-rg-node {             position: absolute;             top: 50%;             left: 50%;             transform: translate(-50%, -50%);         }     }     .nodeBox {         width: 200px;         border-radius: 20px;         overflow: hidden;         >div {             padding: 0 16px;         }         .top {             display: flex;             justify-content: space-between;             align-items: center;             width: 100%;             height: 40px;             background-color: #deb922;             .left {                 display: flex;                 align-items: center;                 color: #fff;                 .state {                     padding: 1px 4px;                     margin-left: 4px;                     background-color: rgba(245, 245, 245, 0.3);                     border-radius: 4px;                 }             }             .num {                 display: flex;                 justify-content: center;                 align-items: center;                 width: 24px;                 height: 24px;                 background-color: rgba(226, 226, 226, 0.5);                 border: 1px solid #fff;                 border-radius: 50%;                 color: #fff;                 font-weight: 700;                 font-size: 14px;             }         }         .bottom {             display: flex;             align-items: center;             width: 100%;             height: 40px;             background-color: #72716d;             font-size: 14px;         }     } } </style>

六、下面是运行成果图

非常完美!!!真的很好用,真心推荐!!!如果觉得有用就请用发财的小手点点赞趴,谢谢啦!

Read more

Java Web请求处理链路剖析(从Filter到HandlerInterceptor的完整流程图解)

第一章:Java Web请求处理链路概述 在Java Web应用中,客户端发起的HTTP请求需经过一系列组件协同处理,最终返回响应。这一完整的链路贯穿了从网络通信到业务逻辑执行的多个层次,理解其结构对开发高性能、可维护的Web系统至关重要。 请求进入容器 当客户端发送HTTP请求时,首先由Web服务器(如Tomcat)接收。服务器基于配置的端口监听请求,并将原始HTTP数据封装为 HttpServletRequest 对象,同时创建 HttpServletResponse 用于输出响应。 Servlet生命周期管理 请求被映射到指定的Servlet进行处理。容器根据web.xml或注解配置确定目标Servlet,并确保其实例已初始化。典型的处理流程如下: * 执行 init() 方法完成初始化(仅一次) * 调用 service() 方法分发请求至 doGet() 或 doPost() * 由具体方法生成响应内容并写入输出流 * 容器自动关闭响应,发送数据回客户端 过滤器与拦截机制 在请求到达Servlet前,可配置多个 Filter 实现横切关注点处理,如日志

WebArena:一个真实的网页环境,用于构建更强大的自主智能体

WebArena:一个真实的网页环境,用于构建更强大的自主智能体

WebArena:一个真实的网页环境,用于构建更强大的自主智能体 最近,在 ICLR 2024 上发表了一篇来自卡内基梅隆大学的论文——WebArena: A Realistic Web Environment for Building Autonomous Agents(arXiv: 2307.13854)。这篇论文提出并实现了一个高度逼真、可复现的网页环境,专门用于开发和评估基于自然语言指令的自主智能体(Autonomous Agents)。今天这篇博客就来详细介绍这篇论文:它到底想解决什么问题、如何解决,以及其中的关键细节。 解决什么问题? 随着大语言模型(如 GPT-4)的快速发展,研究者们开始探索让 AI 智能体通过自然语言指令完成日常任务,比如“帮我在网上买个东西”或“去 GitLab 上更新 README”。然而,现有的智能体评估环境存在几个严重问题: 1. 过于简化、不真实:很多环境(

Tauri 架构从“WebView + Rust”到完整工具链与生态

Tauri 架构从“WebView + Rust”到完整工具链与生态

1. Tauri 不是什么 理解边界会更快建立正确心智模型: * 它不是“轻量内核包装器(kernel wrapper)”,而是直接使用 WRY(WebView 层)与 TAO(窗口与事件循环)去做底层系统交互。 (Tauri) * 它不是 VM 或虚拟化环境,而是一个应用工具箱:你构建的是标准的 OS 应用,只是 UI 用 Web 技术渲染。 (GitHub) 2. 总体分层:从 UI 到系统调用的一条链路 你可以把 Tauri 的架构拆成 4 层:前端、桥接、运行时、上游底座。 TAO 和 WRY 是 Tauri 团队维护的关键“

trae整合figma的mcp实现前端代码自动生成

1.现在trae版本在3.0及以上版本。 2.trae账号是企业版。 3.打开设置,找到mcp 这里需要token,需要从figma账号里生成,网页登录figma账号,找到设置,打开后找到security,然后点击generate new token,token名称随便取,权限都钩上。然后生成一个token,把token放到mcp中即可。 4.使用mcp,切换到mcp模式,你也可以自己创建智能体使用 5.提问使用,可参考下面的提示词使用 注意:这里面的figma链接是mcp的链接,不是figma链接,一般需要你有原型的权限才能看到 我需要根据提供的Figma链接生成一个与设计稿高度一致的网页。请严格遵循以下详细要求: