简单流程引擎实现

news2025/1/26 15:34:23

技术栈

vue3+gojs+primevue+lodash+c#+sql server

效果展示

参考文档

初学者笔记

官网demo

实现思路

  1. 运用官方demo,将gojs的数据结构转换为需要的数据库记录
  2. 实际数据分为两部分:存储gojs节点、节点关系数据;实际业务数据。gojs数据负责存储流程顺序、流程节点。至于业务数据,则需要与节点关联。

踩坑简述

  1. 官方demo是将gojs对于dom节点的操作放onMounted生命周期中,实际在vue3中放在一个init函数,然后在nextTick中调用会比较好,否则会导致找不到绑定gojs的dom
  2. 不要用vue3的ref绑定dom语法,虽然一样可以实现gojs的demo,但是与官方demo相差较大,对于gojs小白不友好
  3. gojs创建好流程、节点后,注意通过Diagram.model.linkDataArray处理出节点顺序,否则对数据库中存储的两部分数据,会对应不上
  4. gojs模型的存储,通过Diagram.model.toJson();和go.Model.fromJson(此处为前json序列化后结果)进行模型→string→模型的过程,数据库中存储string
  5. 本身gojs处理逻辑一般般,重点在于对数据的处理,以下为我接口数据结构,可以适当参考,红色部分存储流程本身数据,flowDiagramModel存储gojs模型转换的string;蓝色部分为节点信息,seq记录节点顺序,用于与gojs节点对应;绿色部分为节点绑定提交人/提交部门信息,sendType控制审批者的权限(审批/抄送)
  6. 对于gojs节点与右下角信息对应,我是通过一张map维护,初始时,将接口数据转换为map;保存时,将map转为接口所需数据
  7. 后端处理数据结构稍微麻烦一点
  8. 对于gojs的点击图形以及删除图形,代码如下
    myDiagram.addDiagramListener("ObjectSingleClicked", (e) => {
            currentNode.value = myDiagram.selection.first().data.key;
            setCurrentNodeData(currentNode.value);
            console.log("currentDialogId-->", myDiagram.selection.first().data.key);
        });
    myDiagram.addDiagramListener("SelectionDeleting", (e) => {
            currentNode.value = myDiagram.selection.first().data.key;
            removeCurrentNodeData(currentNode.value);
            console.log("currentDialogId-->", myDiagram.selection.first().data.key);
        });

核心代码

// 将linkDataArray梳理出先后顺序数组
const sortLDA = (data) => {
    return _.chain(data)
        .filter({ from: -1 })
        .map("from")
        .concat(_.chain(data).map("to").sortedUniq().value())
        .value();
};

//通过这个,获取gojs中每个图形的key
myDiagram.selection.first().data.key

总结

因为所有的代码与业务强关联,且实际实现功能也很一般,故只做参考,如需完成代码留言即可,看到回复。

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

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

相关文章

VSCode远程开发 Windows11 Linux

问题背景 之前一直用JetBrains的Gateway和本地Linux虚拟机开发,不过笔记本配置不够,太卡了。最近租了个国外的便宜服务器,JetBrains的Gateway总断连,也不知道为什么,所以试试VSCode。 本地 Windows 11 ,远…

FL Studio Fruity Edition2024中文入门版Win/Mac

FL Studio Fruity Edition2024是一款功能强大的音乐制作软件,适合初学者和音乐爱好者使用。它提供了丰富的音乐制作工具,包括音频录制、编辑、混音以及MIDI制作等功能,帮助用户轻松创作出动人的音乐作品。 FL Studio 21.2.3 Win-安装包下载如…

ARCMAP进行天空开阔度(SVF)分析

这里的SVF并不是生物学或医学的(Stromal Vascular Fraction),而是指GIS中的(Sky View Factor,SVF),即为(城市)天空开阔度。 城市天空开阔度(Sky View Factor,SVF)是重要的城市形态学参数,那今天博主就跟大家讲一下如何用ArcMap来计算天空开阔度。 1、加载数据 需要加载…

跟着cherno手搓游戏引擎【26】Profile和Profile网页可视化

封装Profile: Sandbox2D.h:ProfileResult结构体和ProfileResult容器,存储相应的信息 #pragma once #include "YOTO.h" class Sandbox2D :public YOTO::Layer {public:Sandbox2D();virtual ~Sandbox2D() default;virtual void OnAttach()ove…

FL Studio Producer Edition2024中文进阶版Win/Mac

FL Studio Producer Edition,特别是其【中文进阶版 Win/Mac】,是数字音乐制作领域中的一款知名软件。它为广大音乐制作人、声音工程师以及音乐爱好者提供了一个从音乐构思到最终作品发布的完整解决方案。这个版本特别为中文用户优化,并兼容W…

消息中间件篇之Kafka-消费顺序性

一、应用场景 1. 即时消息中的单对单聊天和群聊,保证发送方消息发送顺序与接收方的顺序一致。 2. 充值转账两个渠道在同一个时间进行余额变更,短信通知必须要有顺序。 二、解决方案 topic分区中消息只能由消费者组中的唯一一个消费者处理,所…

2024-02-23(Spark)

1.RDD的数据是过程数据 RDD之间进行相互迭代计算(Transaction的转换),当执行开启后,代表老RDD的消失 RDD的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见了。 这个特性可以最大化…

低代码的核心问题:其实是方法论的问题!

在一条错误的方向上努力越多,浪费越大!有时候是没有办法,基于当时的认知和技术,以及硬件环境,只能做当时的事情,这个可以理解,但是如果技术等各方面条件具备,还一大帮子人往错误的方…

Android studio 六大基本布局详解

Android studio 六大基本布局详解 一、Android studio1.Android studio简介2.架构组成3.地址3.1 [官网地址](https://developer.android.google.cn/)3.2 [官方下载地址](https://developer.android.google.cn/studio?hlzh-cn) 二、Android studio六大基本布局详解1.Android六大…

OpenGL-ES 学习(5)---- GPU 基础知识

目录 Arm GPU 架构说明移动系统的特点渲染管线渲染管线简介几何处理像素处理 渲染管线的硬件IMR(立即渲染)TBR(Tile Based Rendering) 渲染硬件的实现CPUGPU 设计 Mali Shadercore重要补充 Arm GPU 架构说明 UtGard: 比较早的架构,支持到 OpenGL-ES 2.0,VertexShad…

黑色创意蝙蝠侠韦恩和小丑404html5网页源码

这是一款非常有创意的黑色蝙蝠侠韦恩和小丑404html5网页源码,这个404页面模板很有想法,通过不同的图片组合在一起,配合鼠标指针的移动实现动画的效果,移动指针蝙蝠侠的手电筒的灯光会照向不同的地方。 https://wfr.lanzout.com/iK6S31phtrje

MySQL多实例与Mycat分布式读写分离的架构实践

文章目录 1.Mycat读写分离分布式架构规划2.在两台服务器中搭建八个MySQL实例2.1.安装MySQL软件2.2.创建每个MySQL实例的数据目录并初始化2.3.准备每个实例的配置文件2.4.准备每个实例的启动脚本2.6启动每台机器的MySQL多实例2.7.为每个MySQL实例设置密码2.8.查看每个MySQL实例的…

如何在Cobalt Strike中使用Payload-Generator实现Payload自动化构建

关于Payload-Generator Payload-Generator是一款功能强大的安全测试脚本,该工具专为红队研究人员设计,可以帮助广大研究人员在Cobalt Strike中使用Payload-Generator实现Payload自动化构建。 工具要求 Visual Studio 2022 .NET Framework v4.8 工具下载…

【Excel PDF 系列】EasyExcel + iText 库

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 文章目录 前言转换前后效果引入 pom 配置代码实现定义 ExcelDataVo 对象主方法EasyExcel 监听器 前言 最近遇到生成 …

光谱数据处理:1.特征波长优选的不同方法与Python实现

首先,我们要理解为什么要对“光谱数据进行特征波长优选”以及这是在干嘛,光谱数据可以想象成一长串的彩色条纹,每种颜色对应一个波长,就像彩虹一样。这些颜色的条纹代表了从某种物质(比如植物、矿石或是食品&#xff0…

将python两个版本添加环境变量(Mac版)

在运行程序的时候,可能不知道选择哪个版本的程序来执行,先添加环境变量,然后进行选择。 1、查看python安装路径 which python which python3 来查看各个版本的安装位置 2、编辑环境变量配置文件 Macos使用默认终端的shell是bash&#xff0c…

面试redis篇-13Redis为什么那么快

Redis是纯内存操作,执行速度非常快采用单线程,避免不必要的上下文切换可竞争条件,多线程还要考虑线程安全问题使用I/O多路复用模型,非阻塞IOI/O多路复用模型 Redis是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度, I/O多路复用模型主要就是实现了高效…

Netty 网络 阻塞模式

1.概要 1.1 需求 服务端等待连接,等待读取数据,客户端写入数据。 1.2 要点 SocketChannel sc ssc.accept(); channel.read(byteBuffer); 1.3 要点说明 因为两处都是阻塞模式,所以用一个线程很难处理多个客户端同时访问的情况。 2.代…

AI不离谱,大语言模型ChatMusician可以理解曲谱生成AI音乐

虽然大型语言模型在文本生成AI音乐方面已经表现得相当出色,但它们在音乐这一人类创造性领域的表现却还有待提高。然而,近日推出的ChatMusician打破了这一局面,成为了一个集成了内在音乐能力的开源大型语言模型。 ChatMusician论文地址&#x…

网络安全之安全事件监测

随着人们对技术和智能互联网设备依赖程度的提高,网络安全的重要性也在不断提升。因此,我们需要不断加强网络安全意识和措施,确保网络环境的安全和稳定。 网络安全的重要性包含以下几点: 1、保护数据安全:数据是组织和…