iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vue+jsplumb实现工作流程图的方法
  • 755
分享到

vue+jsplumb实现工作流程图的方法

2023-06-30 03:06:25 755人浏览 安东尼
摘要

这篇文章主要介绍“Vue+jsplumb实现工作流程图的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue+jsplumb实现工作流程图的方法”文章能帮助大家解决问题。先写了一个demo,大概

这篇文章主要介绍“Vue+jsplumb实现工作流程图的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue+jsplumb实现工作流程图的方法”文章能帮助大家解决问题。

先写了一个demo,大概样子如下:

vue+jsplumb实现工作流程图的方法

官网文档Home | jsPlumb Toolkit Documentation

先安装插件

npm install jsplumb --save

安装panzoom,主要用于鼠标滚轮缩放流程图

npm install panzoom --save

在需要的页面引入插件

import panzoom from 'panzoom'import { jsPlumb } from 'jsplumb'

接下来先写布局

父组件

<template>  <div class="workflow">    <div class="flow_region">      <div id="flowWrap" ref="flowWrap" class="flow-wrap" @drop="drop($event)" @draGover="allowDrop($event)">        <div id="flow">           <flownode v-for="item in data.nodeList" :id="item.id" :key="item.id" :node="item" @setNodeName="setNodeName" @changeLineState="changeLineState" />        </div>      </div>    </div>  </div></template>

flowNode是子组件

<template>  <div    ref="node"    class="node-item"    :class="{      isStart: node.type === 'start',      isEnd: node.type === 'end',      'common-circle-node':node.type === 'start' || node.type === 'end' || node.type === 'event',      'common-rectangle-node':node.type === 'common' || node.type === 'freedom' || node.type === 'child-flow',      'common-diamond-node':node.type === 'gateway',      'common-x-lane-node':node.type === 'x-lane',      'common-y-lane-node':node.type === 'y-lane'    }"    :style="{      top: node.y + 'px',      left: node.x + 'px'    }"    @click="setNotActive"    @mouseenter="showAnchor"    @mouseleave="hideanchor"  >    <div class="nodeName">{{ node.nodeName }}</div>     </div></template>

样式主要是子组件的,父组件样式随意就行

<style lang="less" scoped>@labelColor: #409eff;@nodeSize: 20px;@viewSize: 10px;.node-item {  position: absolute;  display: flex;  height: 40px;  width: 120px;  justify-content: center;  align-items: center;  border: 1px solid #b7b6b6;  border-radius: 4px;  cursor: move;  box-sizing: content-box;  font-size: 12px;  z-index: 9995;  &:hover {    z-index: 9998;    .delete-btn{      display: block;    }  }  .log-wrap{    width: 40px;    height: 40px;    border-right: 1px solid  #b7b6b6;  }  .nodeName {    flex-grow: 1;    width: 0;    overflow: hidden;    text-overflow: ellipsis;    white-space: nowrap;    text-align: center;  }  .node-anchor {    display: flex;    position: absolute;    width: @nodeSize;    height: @nodeSize;    align-items: center;    justify-content: center;    border-radius: 10px;    cursor: crosshair;    z-index: 9999;    background: -WEBkit-radial-gradient(sandybrown 10%, white 30%, #9a54ff 60%);  }  .anchor-top{    top: calc((@nodeSize / 2)*-1);    left: 50%;    margin-left: calc((@nodeSize/2)*-1);  }  .anchor-right{    top: 50%;    right: calc((@nodeSize / 2)*-1);    margin-top: calc((@nodeSize / 2)*-1);  }  .anchor-bottom{    bottom: calc((@nodeSize / 2)*-1);    left: 50%;    margin-left: calc((@nodeSize / 2)*-1);  }  .anchor-left{    top: 50%;    left: calc((@nodeSize / 2)*-1);    margin-top: calc((@nodeSize / 2)*-1);  }}.active{  border: 1px dashed @labelColor;  box-shadow: 0px 5px 9px 0px rgba(0,0,0,0.5);}.common-circle-node{  border-radius: 50%;  height: 60px;  width: 60px;}</style>

页面样式写完,接下来写插件配置

jsPlumb.ready() 是一个钩子函数,它会在 jsPlumb 准备完毕时执行。

连接线的建立是通过 jsPlumb.connect() 方法实现的。该方法接受一个对象作为配置项。其中包含了与上述概念一一对应的配置项,以及一些额外的样式。

source: 源对象,可以是对象的 id 属性、Element 对象或者 Endpoint 对象。

target: 目标对象,可以是对象的 id 属性、Element 对象或者 Endpoint 对象。

anchor: 是一个数组,数组中每一项定义一个锚点。

初始化方法

init() {    this.jsPlumb.ready(() => {      // 导入默认配置      this.jsPlumb.importDefaults(this.jsplumbSetting)      // 完成连线前的校验      this.jsPlumb.bind('beforeDrop', evt => {        const res = () => { } // 此处可以添加是否创建连接的校验, 返回 false 则不添加;        return res      })       this.loadEasyFlow()      // 会使整个jsPlumb立即重绘。      this.jsPlumb.setSuspendDrawing(false, true)    })    this.initPanZoom()  }, // 加载流程图  loadEasyFlow() {    // 初始化节点    for (let i = 0; i < this.data.nodeList.length; i++) {      const node = this.data.nodeList[i]      // 设置源点,可以拖出线连接其他节点      this.jsPlumb.makeSource(node.id, this.jsplumbSourceOptions)      // // 设置目标点,其他源点拖出的线可以连接该节点      this.jsPlumb.makeTarget(node.id, this.jsplumbTargetOptions)      // this.jsPlumb.draggable(node.id);      this.draggableNode(node.id)    }     // 初始化连线    this.jsPlumb.unbind('connection') // 取消连接事件    console.log(this.data.lineList)    for (let i = 0; i < this.data.lineList.length; i++) {      const line = this.data.lineList[i]      const conn = this.jsPlumb.connect(        {          source: line.sourceId,          target: line.targetId,          paintStyle: {            stroke: line.cls.linkColor,            strokeWidth: 2            // strokeWidth: line.cls.linkThickness          }        },        this.jsplumbConnectOptions      )      conn.setLabel({        label: line.label,        CSSClass: `linkLabel ${line.id}`      })    }      },

this.data 是需要渲染的数据,放在文章末尾,具体数据按照接口实际返回的来写

this.jsplumbSourceOptions 是jsplumb配置信息,新建一个文件编写,具体如下:

export const jsplumbSetting = {  grid: [10, 10],  // 动态锚点、位置自适应  anchor: ['TopCenter', 'RightMiddle', 'BottomCenter', 'LeftMiddle'],  Container: 'flow',  // 连线的样式 StateMachine、Flowchart,有四种默认类型:Bezier(贝塞尔曲线),Straight(直线),Flowchart(流程图),State machine(状态机)  Connector: ['Flowchart', { cornerRadius: 5, alwaysRespectStubs: true, stub: 5 }],  // 鼠标不能拖动删除线  ConnectionsDetachable: false,  // 删除线的时候节点不删除  DeleteEndpointsOnDetach: false,  // 连线的端点  // Endpoint: ["Dot", {radius: 5}],  Endpoint: [    'Rectangle',    {      height: 10,      width: 10    }  ],  // 线端点的样式  EndpointStyle: {    fill: 'rgba(255,255,255,0)',    outlineWidth: 1  },  LogEnabled: false, // 是否打开jsPlumb的内部日志记录  // 绘制线  PaintStyle: {    stroke: '#409eff',    strokeWidth: 2  },  HoverPaintStyle: { stroke: '#409eff' },  // 绘制箭头  Overlays: [    [      'Arrow',      {        width: 8,        length: 8,        location: 1      }    ]  ],  RenderMode: 'svg'} // jsplumb连接参数export const jsplumbConnectOptions = {  isSource: true,  isTarget: true,  // 动态锚点、提供了4个方向 Continuous、AutoDefault  anchor: ['TopCenter', 'RightMiddle', 'BottomCenter', 'LeftMiddle']} export const jsplumbSourceOptions = {  filter: '.node-anchor', // 触发连线的区域    filterExclude: false,  anchor: ['TopCenter', 'RightMiddle', 'BottomCenter', 'LeftMiddle'],  allowLoopback: false} export const jsplumbTargetOptions = {  filter: '.node-anchor',    filterExclude: false,  anchor: ['TopCenter', 'RightMiddle', 'BottomCenter', 'LeftMiddle'],  allowLoopback: false}

 在父组件引入配置文件和方法

import { jsplumbSetting, jsplumbConnectOptions, jsplumbSourceOptions, jsplumbTargetOptions } from './config/commonConfig'

接下来在上面说的初始化方法文件里面配置鼠标滚轮缩放插件的方法 this.initPanZoom():

// 鼠标滚动放大缩小  initPanZoom() {    const mainContainer = this.jsPlumb.getContainer()    const mainContainerWrap = mainContainer.parentNode    const pan = panzoom(mainContainer, {      smoothScroll: false,      bounds: true,      // autocenter: true,      zoomDoubleClickSpeed: 1,      minZoom: 0.5,      maxZoom: 2,      // 设置滚动缩放的组合键,默认不需要组合键      beforeWheel: (e) => {        // console.log(e)        // let shouldIgnore = !e.ctrlKey        // return shouldIgnore      },      beforeMouseDown: function(e) {        // allow mouse-down panning only if alTKEy is down. Otherwise - ignore        var shouldIgnore = e.ctrlKey        return shouldIgnore      }    })    this.jsPlumb.mainContainerWrap = mainContainerWrap    this.jsPlumb.pan = pan    // 缩放时设置jsPlumb的缩放比率    pan.on('zoom', e => {      const { scale } = e.getTransfORM()      this.jsPlumb.setZoom(scale)    })    pan.on('panend', (e) => {     })     // 平移时设置鼠标样式    mainContainerWrap.style.cursor = 'grab'    mainContainerWrap.addEventListener('mousedown', function wrapMousedown() {      this.style.cursor = 'grabbing'      mainContainerWrap.addEventListener('mouseout', function wrapMouseout() {        this.style.cursor = 'grab'      })    })    mainContainerWrap.addEventListener('mouseup', function wrapMouseup() {      this.style.cursor = 'grab'    })  },

大功告成,data的数据放在这里,测试使用:

 {  "FlowJSON": {      "nodeList": [          {              "type": "start",              "nodeName": "已新建",              "id": "start-HiXWf8wsAcrWXjAAXVWc6AQk00000001",              "node_code": "已新建",              "trigger_event": "",              "branch_flow": "",              "icon": "play-circle",              "x": 175,              "y": 60,              "width": 50,              "height": 50          },          {              "type": "freedom",              "nodeName": "待审批",              "id": "freedom-YakFJzZ5VSp3Gec6ZULD2jdk00000004",              "node_code": "待审批",              "trigger_event": "",              "branch_flow": "",              "icon": "sync",              "x": 330,              "y": 160,              "width": 50,              "height": 120          },          {              "type": "end",              "nodeName": "已通过",              "id": "end-JjRvtD5J2GIJKCn8MF7IYwxh00000999",              "node_code": "已通过",              "trigger_event": "",              "branch_flow": "",              "icon": "stop",              "x": 330,              "y": 360,              "width": 50,              "height": 50          },          {              "type": "end",              "nodeName": "审批拒绝",              "id": "end-J1DMScH5YjSKyk0HeNkbt62F00010001",              "node_code": "审批拒绝",              "trigger_event": "",              "branch_flow": "",              "icon": "stop",              "x": 500,              "y": 350,              "width": 50,              "height": 50          }      ],      "linkList": [          {              "type": "link",              "id": "link-BpI6ZuX1bJywz5SEi3R5QaWoi7g3QiSr",              "sourceId": "start-HiXWf8wsAcrWXjAAXVWc6AQk00000001",              "targetId": "freedom-YakFJzZ5VSp3Gec6ZULD2JDK00000004",              "label": "LINE000000",              "role": [],              "organize": [],              "audit_role": [],              "audit_organize": [],              "audit_organize_same": "0",              "audit_dealer_same": "0",              "audit_dealers": [],              "notice": "0",              "plug": "",              "pass_option": "pass",              "row_par_json": "",              "judge_fields": "",              "auth_at": "",              "auth_user": "",              "auth_stat": "",              "auth_mark": "",              "cls": {                  "linkType": "Flowchart",                  "linkColor": "#008000",                  "linkThickness": 4              }          },          {              "type": "link",              "id": "link-5xJWzGlkIpUCsjmpfgesJxAOMHwkPlno",              "sourceId": "freedom-YakFJzZ5VSp3Gec6ZULD2JDK00000004",              "targetId": "end-J1DMScH5YjSKyk0HeNkbt62F00010001",              "label": "LINE000001",              "role": [],              "organize": [],              "audit_role": [                  "PROJECT_SUPPORT_PLAN_CODE"              ],              "audit_organize": [],              "audit_organize_same": "0",              "audit_dealer_same": "0",              "audit_dealers": [],              "notice": "0",              "plug": "",              "pass_option": "reject",              "row_par_json": "",              "judge_fields": "",              "auth_at": "",              "auth_user": "",              "auth_stat": "",              "auth_mark": "",              "cls": {                  "linkType": "Flowchart",                  "linkColor": "#808080",                  "linkThickness": 1              }          },          {              "type": "link",              "id": "link-g05V3usXa86wAtpcMkvGzybdBlpasMjU",              "sourceId": "freedom-YakFJzZ5VSp3Gec6ZULD2JDK00000004",              "targetId": "end-JjRvtD5J2GIJKCn8MF7IYwxh00000999",              "label": "LINE000002",              "role": [],              "organize": [],              "audit_role": [                  "PROJECT_SUPPORT_PLAN_CODE"              ],              "audit_organize": [],              "audit_organize_same": "0",              "audit_dealer_same": "0",              "audit_dealers": [],              "notice": "0",              "plug": "",              "pass_option": "approve",              "row_par_json": "",              "judge_fields": "",              "auth_at": "",              "auth_user": "",              "auth_stat": "",              "auth_mark": "",              "cls": {                  "linkType": "Flowchart",                  "linkColor": "#808080",                  "linkThickness": 1              }          }      ]  }  }

关于“vue+jsplumb实现工作流程图的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: vue+jsplumb实现工作流程图的方法

本文链接: https://www.lsjlt.com/news/327254.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue+jsplumb实现工作流程图的方法
    这篇文章主要介绍“vue+jsplumb实现工作流程图的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue+jsplumb实现工作流程图的方法”文章能帮助大家解决问题。先写了一个demo,大概...
    99+
    2023-06-30
  • vue+jsplumb实现工作流程图的项目实践
    最近接到一个需求——给后台开发一个工作流程图,方便给领导看工作流程具体到哪一步。 先写了一个demo,大概样子如下: 官网文档Home | jsPlumb ...
    99+
    2024-04-02
  • PHP实现工作流的方法是什么
    PHP实现工作流的方法有多种,以下是其中的一些常见方法: 使用现有的工作流引擎库:PHP有一些成熟的工作流引擎库,如Activi...
    99+
    2023-10-26
    PHP
  • Vue指令工作原理实现方法
    Vue简介 现在的大前端时代,是一个动荡纷争的时代,江湖中已经分成了很多门派,主要以Vue,React还有Angular为首,形成前端框架三足鼎立的局势。Vue在前端框架中的地位就...
    99+
    2024-04-02
  • springboot+camunda实现工作流的流程分析
    1.在camunda modeler工具里面写流程,任务执行指明Java类 2.保存文件放在resources目录下,并建立一个processes.xml的空文件 3.依赖配置 ...
    99+
    2024-04-02
  • java切面实现工作流的方法是什么
    在Java中实现工作流的方法有很多种,其中一种常用的方法是使用切面编程(Aspect-Oriented Programming, A...
    99+
    2023-08-24
    java
  • Springboot+Flowable 快速实现工作流的开发流程
    目录总览一、flowable-ui部署运行二、绘制流程图三、后台项目搭建四、数据库五、流程引擎API与服务五、参考资料总览 使用flowable自带的flowable-ui制作流程图...
    99+
    2024-04-02
  • React工作流程及ErrorBoundaries实现过程讲解
    目录什么是Error Boundaries步骤1:捕获错误步骤2:构造callback执行callback总结这里简单讲解下React工作流程,后文有用。分为三步: 触发更新 ren...
    99+
    2024-04-02
  • C#多线程系列之工作流实现
    目录前言节点ThenParallelScheduleDelay试用一下顺序节点并行任务编写工作流接口构建器工作流构建器依赖注入实现工作流解析前言 前面学习了很多多线程和任务的基础知识...
    99+
    2024-04-02
  • Git的工作流程实例分析
    今天小编给大家分享一下Git的工作流程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2024-04-02
  • Java工作流框架:探索流程引擎的实现和应用
    目前,市面上有很多基于SpringBoot+Vue前后端分离的Java快速开发框架和工作流开发框架可供选择。以下是一些比较流行的框架: Spring Cloud:Spring Cloud是一套基于Spring Boot的开发工具,用于快速...
    99+
    2023-09-08
    java 开发语言
  • GitLab的自定义工作流和持续交付流程定制方法
    GitLab是一款功能强大的开源代码托管平台,它不仅支持版本控制功能,还提供了丰富的自定义工作流和持续交付流程定制方法。本文将介绍如何利用GitLab的自定义功能实现自己的工作流和持续交付流程,并提供了一些具体的代码示例。一、自定义工作流定...
    99+
    2023-10-22
    gitlab 自定义工作流 持续交付流程定制方法
  • 基于springboot的flowable工作流实战流程分析
    目录背景一、flowable-ui部署运行二、绘制流程图三、后台项目搭建四、数据库五、流程引擎API与服务五、参考资料背景 使用flowable自带的flowable-ui制作流程...
    99+
    2024-04-02
  • vue中使用词云图的实现方法
    这篇文章将为大家详细讲解有关vue中使用词云图的实现方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在vue中, 查找到有两种方法来实现词云图, 分别是echarts 和 highchar...
    99+
    2023-06-29
  • 使用SpringBoot整合Activiti6工作流的操作方法
    目录1.idea安装actibpm流程设计器2.创建maven项目,导入相关依赖,添加配置文件3.新增启动类,剔除掉activiti默认集成springsecurity4.新建文件夹...
    99+
    2022-11-13
    SpringBoot整合Activiti6 SpringBoot整合Activiti工作流
  • QtDesignStudio创建工程的实现方法
    目录Creating Projects使用项目向导向项目中添加文件Creating Projects Qt Design Studio的主要优势之一是,它允许设计人员和开发人员使用通...
    99+
    2024-04-02
  • js实现轮播图制作方法
    本文实例为大家分享了js实现轮播图展示的具体代码,供大家参考,具体内容如下 效果如图所示 代码如下: <!DOCTYPE html> <html> &...
    99+
    2024-04-02
  • vue使用echarts实现地图的方法详解
    目录全局安装echarts将echarts绑定在原型上(main.js文件中)准备画布地图配置option中国地图包(china.json)总结 全局安装echarts npm i ...
    99+
    2024-04-02
  • java 工作流引擎设计实现解析流程定义文件
    目录引言类图流程图代码实现LogicFlow模型对象解析类服务上下文相关类解析入口类配置类单元测试类运行结果引言 在上一篇我们手动构建了一个流程对象并简单打印执行,其构建流程对象的方...
    99+
    2023-05-19
    java 工作流引擎设计 java 流程定义文件
  • Git中三种工作方式的流程分析
    这篇文章主要介绍了Git中三种工作方式的流程分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在项目开发过程中使用Git的方式有三种工作方式,分别是集中式工作流,Git Fl...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作