【已开源】基于Vue2和jsPlumb.js的模仿sqlFlow数据血缘图的前端页面【源代码已更新】

0.概述

【已开源】基于jsPlumb.js的模仿sqlFlow数据血缘图的前端页面 开源后,
一些小伙伴咨询是否有Vue版本的计划。拖拖拉拉写完了,参考了这个项目jsplumb-vue-wordflow写的,毕竟自己前端功底着实不行。效果如下图

在这里插入图片描述
2022-03-15 17:07:05 更新了vue3版本,仅供参考.githu切换vue3分支即是vue3编写的

1. 功能特点

  1. 根据json渲染血缘图,任意节点可自由拖动;移动到连线上高亮相关列和线
  2. 画布支持整体缩放 (滚轮缩放)和整体拖动
  3. 下载JSON
  4. 下载血缘保存为png图片

因为是基于原生js版修改而来,部分代码是从我之前的js代码搬过来的。「之前代码」指的是js版本,文章可以看这里:【已开源】基于jsPlumb.js的模仿sqlFlow数据血缘图的前端页面 !


2. 项目结构 && 功能实现

目前介绍的是最新的代码(github sha:b043bc2),最初的完整代码是 Feb 14, 2022的135b383

2.1 项目结构

├─assets # 图片资源
├─common # 通用js
├─router# vue路由
├─views
│ ├─components # 单个节点的组件
│ │ ├─TableNode.vue
│ ├─config # 配置相关
│ │ ├─buttonGroup.js #按钮组的配置文件
│ │ ├─jsplumbConfig.js # jsplumb的配置文件
│ │ ├─sampleData.json #示例的json文件
│ │ └─tableTypeMappingColor.js #表类型对应的颜色配置文件
│ └─methods # jsplumb调用的方法函数和按钮组的方法
│ │ ├─buttonMethods.js # 按钮组的调用的方法
│ │ └─comm.js #jsplumb调用的方法等
└─Index.vue# 首页,也是核心内容

2.2 先看样例samp.json

edges 数组和nodes数组构成,具体的设计来源于我的从SQLFlow的json格式中学习数据血缘json格式设计这篇文章
和js版的不同是对象的字段略有调整。

 "edges": [
        {
            "from": {
                "field": "name",
                "name": "data2"

            },
            "to": {
                "field": "name",
                "name": "middle1"
            }

        },
        ..]
 "nodes": [{
            "name": "data1",
            "type": "Origin",
            "fields": [{
                "name": "age"
            }, {
                "name": "name"
            }, {
                "name": "class"
            }],
            "top": 135,
            "left": 10
        },
        ..]
2.3 功能实现
2.3.1. 渲染、高亮功能

和之前一样,走 渲染node-》添加端点-》连线这一套,期间完成事件绑定,只不过部分jsplumb的api自己封装了下根据自己的需求

 //1 绘制节点信息
  this.json.nodes.forEach(node => {
          //使节点可拖动
          this.draggableNode(node.name)
          node.fields.forEach(field => {
            this.addEndpoint(node.name + this.minus+ field.name, anchorArr)
          })
        })
     //2 绘制节点间连线
        this.json.edges.forEach(edge => {
          let from = edge.from.name + this.minus + edge.from.field + this.minus + "Right",
              to = edge.to.name + this.minus + edge.to.field + this.minus + "Left"
          this.connectEndpoint(from, to);
         ...
2.3.2. 画布整体缩放和 整体平移

这里用是原项目的功能,底层使用 panzoom 这个lib实现的,具体参考comm.js的 initPanZoom方法,也可以直接去jsplumb-vue-wordflow看源项目

2.3.3. 下载json和图片功能
  • json:直接打开下载框,下载json
  • 图片:使用html2canvas + canvg 实现功能,利用中间元素生成,解决了之前生成图片后dom结构被破坏连线无法移动的问题,注意canvg 版本,我开始使用2.X的版本总由各种报错,换回1.5就可以了

3. QA

Q1:后端呢?为什么只有前端代码?
A1:后端代码因为个人问题丢失了,也不打算再写了。这里有条思路:后端可以利用sqlflow开源的jar包完成sql解析,再构建本项目所需要的json配合使用。sqlflow的项目地址:https://github.com/sqlparser/gsp_demo_java

Q2:json中的节点坐标是如何确定的呢?
A2:坐标在最开始设计的时候是由后端负责计算处理的。前端只负责渲染表达。
后端这里提供思路:前端传递渲染区域长宽,后端利用拓扑排序生成每个节点的坐标,注意如果你的json有成环的情况,还需要在拓扑排序之前自行处理环的情况!参考文档:https://www.dazhuanlan.com/tong08/topics/982245 ,该参考文档转载存档:https://blog.csdn.net/qq_44831907/article/details/128370539

Q3:有问题如何联系你?
A3: github 提issue(优先,注意优先查看readme和close issue)、发送邮件至1538413737@qq.com

4. 其他

一些参考文章:

欢迎留言提问!

  • 18
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
好的,我可以为您提供一些指导。首先,您需要安装Node.jsVue.js。然后,您可以按照以下步骤实现登录的前端页面和接口: 1. 创建一个Vue.js项目,在命令行中使用以下命令: ``` vue create login-app ``` 2. 在项目中创建一个登录页面组件,可以使用Vue.js提供的模板语法和组件生命周期钩子。例如,您的组件可以包括一个表单,用户可以在表单中输入用户名和密码。 3. 在Node.js中创建一个登录接口,该接口将接收来自前端的用户名和密码,并与后端数据库进行验证。如果验证成功,后端将返回一个JSON Web Token(JWT)给前端。 4. 在Vue.js中使用ajax发送请求来调用登录接口。您可以使用Vue.js提供的axios库来发送请求。例如,您可以在登录页面组件中使用以下代码: ``` import axios from 'axios'; export default { data() { return { username: '', password: '' } }, methods: { login() { axios.post('/api/login', { username: this.username, password: this.password }) .then(response => { // 将JWT保存到本地存储中 localStorage.setItem('token', response.data.token); }) .catch(error => { console.error(error); }); } } } ``` 在上面的代码中,`axios.post()`方法将发送POST请求到`/api/login`接口,并将用户名和密码作为请求体发送。如果请求成功,`response.data.token`将包含从后端接收到的JWT,您可以将其保存到本地存储中以备将来使用。 请注意,这只是一个简单的示例,用于说明如何使用Vue.js和Node.js创建登录页面和接口。在实际项目中,您需要进行更多的验证和安全性措施,以确保您的应用程序是安全的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值