基于jsplumb构建的流程设计器

简介: 最近在准备开发工作流引擎相关模块,完成表结构设计后开始着手流程设计器的技术选型,调研了众多开源项目后决定基于jsplumb.js开源库进行自研开发,保证定制化的便捷性,相关效果图及项目地址如下

项目背景

最近在准备开发工作流引擎相关模块,完成表结构设计后开始着手流程设计器的技术选型,调研了众多开源项目后决定基于jsplumb.js开源库进行自研开发,保证定制化的便捷性,相关效果图及项目地址如下

项目地址:https://gitee.com/code2roc/fast-flow-desgion

需求概述

流程设计器中最基础的两个元素为活动(节点)和变迁(连接),我们需要以下基础功能来配合相关接口进行工作流相关设计数据的保存/修改

  • 活动的添加/删除/移动
  • 变迁的添加/删除
  • 活动/变迁数据的全部读取
  • 根据json渲染活动与变迁

相关引入依赖如下表所示

名称 功能
jsplumb.js 设计器主要依赖,用于绘制相关图形与动态操作实现
jquery.js jsplumb依赖的库
jquery-ui.js jsplumb依赖的库,进行拖拽绑定
contextMenu.js 实现右击菜单
mustache.js 模板引擎渲染活动,避免字符串拼接

实现思路

活动添加

通过mustache的render方法渲染添加到html后,需要调用draggable方法让活动能够进行自由拖动,其中grid参数作用是固定每次拖拽移动最小距离,便于不同节点经过移动后对齐

<script type="text/x-mustache" id="jnode-template">
   <div class="jnode-panel" id="{
    
    {id}}" jnode="{
    
    {jnode}}" style="top:{
    
    {top}}px;left:{
    
    {left}}px">
       <div class="jnode-box {
    
    {jnodeClass}}">{
    
    {
    
    {
    
    jnodeHtml}}}</div>
   </div>
</script>

jsPlumb.draggable(id, {
   containment: 'parent',
   grid: [8, 8]
})

活动删除

通过jsPlumb.remove方法删除,会删除相关活动与连接的变迁,参数是活动id,通过右键菜单的点击事件获取属性

 callback: function(itemKey, opt, rootMenu, originalEvent) {
   
   
      var id = {
   
   mathJaxContainer[0]}(opt.$trigger[0]).parent()).attr("id");
      jsPlumb.remove(id)
}

活动移动

在活动拖动的过程中位置进行变化,我们需要进行事件监听获取实时位置保存到数据库,通过jsPlumb.draggable方法的stop方法注册实现

    jsPlumb.draggable(id, {
   
   
        containment: 'parent',
        grid: [8, 8],
        stop: function(event, ui) {
   
   
           var nodeID = $(ui.helper.context).attr("id");
           moveActivity(nodeID, ui.position.left, ui.position.top);
        }
    });

变迁添加

jsplumb节点可以添加相关锚点,连接不同锚点会自动绘制连线,在实际操作时连线要求锚点对准操作精度较高不便捷,所以我们通过设置节点整体对象为连接对象,可实现鼠标放置在活动div范围内进行拖拽连线,需要注意makeSource和makeTarget需要同时执行,节点才能作为起点与终点

function registAutoConnect(id) {
   
   
    jsPlumb.makeSource(id, {
   
   
        endpoint: "Dot",
        anchor: "Continuous"
    })

    jsPlumb.makeTarget(id, {
   
   
        endpoint: "Dot",
        anchor: "Continuous"
    })
}

以上方法是手动在流程设计器中进行操作连接,如果我们通过接口获取已有数据,需要通过connect方法进行代码渲染变迁

需要注意jsplumb中connection的id为自动生成,我们需要通过setAttribute方法对canvas进行id赋值操作,才能绑定我要自己的id数据

function addConnect(id, sourceID, targetID) {
   
   
    var connection = jsPlumb.connect(
    {
   
   
        source: sourceID,
        target: targetID
    });
    connection.id = id
    jsPlumb.setAttribute(connection.canvas, "id", connection.id)
}

通过监听connection事件我们可以知道连接添加完成,进行相关接口调用,但我们需要区分是我们通过设计器操作还是代码渲染,只要判断originalEvent是否存在,存在则是通过鼠标操作的

    jsPlumb.bind("connection", function(connInfo, originalEvent) {
   
   
        if (originalEvent) {
   
   

        }
    });

变迁删除

通过jsPlumb.detach方法进行变迁的删除,默认只删除变迁不删除连接的活动

function deleteConnect(id) {
   
   
    var connects = jsPlumb.getAllConnections();
    for (var i = 0; i < connects.length; i++) {
   
   
        var connect = connects[i];
        if (connect.id == id) {
   
   
            jsPlumb.detach(connect)
        }
    }
}

其它

代码还包含很多其他细节,如下所示,就不详细赘述了,大家可以仔细阅读,项目中包含了详细的注释

  • 连接添加控制,例如开始节点不能为连接终点,结束节点不能为起点
  • 导入默认配置控制连线样式
  • 各种操作模式指针变换及交互模式
  • 流程图整体移动
  • 活动/变迁的选中效果及点击空白处取消
目录
相关文章
|
17天前
|
监控 Kubernetes 测试技术
概括模型开发部署流程
**模型部署流程概览:**训练完成的大型语言模型经验证评估,进行剪枝量化后导出为标准格式。封装成API,部署到云服务器,考虑GPU资源与安全。通过Docker或Kubernetes管理,集成后端服务,确保负载均衡和安全。监控性能,执行A/B测试和灰度发布,持续优化与维护。每个步骤涉及团队协作与线上稳定性。
13 1
|
2月前
|
存储 算法 安全
软件系统设计步骤与原理
软件系统设计步骤与原理
|
2月前
|
监控 机器人 数据安全/隐私保护
|
2月前
|
监控 安全 数据处理
了解阿里云 RPA:如何实现流程自动化
机器人流程自动化(RPA)是一种快速发展的技术,它可以帮助企业实现重复性任务的自动化,提高工作效率和准确性。阿里云 RPA 作为一款强大的 RPA 解决方案,为用户提供了一种简单而高效的方式来实现流程自动化。本文将介绍阿里云 RPA 的功能和特点,以及如何使用它来实现流程自动化。
|
11月前
|
监控 关系型数据库 MySQL
架构基本流程
架构基本流程
|
数据采集 机器学习/深度学习 算法
整体流程介绍 | 学习笔记
快速学习整体流程介绍
119 0
整体流程介绍 | 学习笔记
|
数据采集 消息中间件 监控
项目总体数据处理流程详解|学习笔记
快速学习项目总体数据处理流程详解
185 0
项目总体数据处理流程详解|学习笔记
|
存储 Kubernetes 监控
K8S架构设计及工作流程分析
K8S架构设计及工作流程分析
595 0
K8S架构设计及工作流程分析
|
存储 运维 架构师
开发人员为什么要学会画技术架构图?
系统架构是概念的体现,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。