vue + LogicFlow 实现流程图展示

news/2024/5/19 0:28:19 标签: vue.js, 流程图, 前端

vue + LogicFlow 实现流程图展示

在这里插入图片描述

1.背景

部门主要负责低代码平台,配置端负责配置流程图,引擎端负责流程执行,原引擎端只负责流程执行控制以及流程历史列表展示。现在提出个新的要求,认为仅历史记录不直观,需要在展示完整配置流程图的基础上显示执行历史路线。经过初步分析,决定在当前项目的基础上使用LogicFlow渲染从配置端获取的流程图

2.方案设计

  1. 配置端为流程设计器,引擎端通过配置端接口获取流程图所有的节点信息json
  2. 在引擎端根据json分析出各节点以及连线的信息并整合形成logicFlow适用的节点连线数据
  3. 根据节点连线数据渲染流程图,使显示与配置端配置流程图基本保持一致
  4. 引擎端获取流程执行历史,对执行过的节点以及节点之间的连线高亮从而显示完整的执行历史路线

3.准备工作

  1. 安装:npm install @logicflow/core --save
  2. 引入:import LogicFlow from '@logicflow/core';
  3. 版本:^1.2.22
  4. 框架:vue

4.运行问题排查

  1. 运行报错ERROR in F:/app/node_modules/preact/src/jsx.d.ts(1462,3):1462:3 Cannot find name 'SubmitEvent'.
  • 可能原因:在LogicFlow的package.json文件中"dependencies": {"preact": "^10.4.8"},依赖的preact版本与当前项目的preact版本不一致导致ts校验报错
  • 解决:npm install preact@^10.4.8,安装相应版本的preact
  1. 运行报错ERROR in F:/app/node_modules/@logicflow/core/types/util/mobx.d.ts(1,106):1:106 Cannot find module 'mobx'
  • 可能原因:在LogicFlow的package.json文件中"devDependencies": {"mobx": "^5.15.7"},找不到依赖的第三方库
  • 解决:npm install mobx@^5.15.7,安装相应版本的mobx(按道理来说devDependencies中依赖的库是不需要安装的,不清楚具体什么原因需要安装)

5.关键实现

1.挂载

// index.js
<div class="container" ref="lf_ref"></div>

import LogicFlow from '@logicflow/core'

this.lf = new LogicFlow({
    container: this.$refs.lf_ref,
    isSilentMode: true // 静默模式,仅用于展示
})
this.lf.render(this.lf_data)

2.自定义节点

基于某种类型节点改动可继承该类型节点类,若需要自定义整个节点则需继承htmlNode类去自定义构建html节点

// customRect.js
import { HtmlNodeModel, HtmlNode } from '@logicflow/core'

class CustomRectModel extends HtmlNodeModel {
    setAttributes() {
        const { properties } = this
        this.width = properties.width
        this.height = properties.height
    }
}
class CustomRectNode extends HtmlNode {
    setHtml(rootEl) {
        const { properties } = this.props.model

        const el = document.createElement('div')
        el.className = 'custom-rect-contain'
        const html = `
        <div class="icon-side">
            <div class="icon-type"><i class="new-web-icon icon-flow_sp"></i></div>
            <div class="icon-status"><i class="new-web-icon icon-success"></i></div>
        </div>
        <div class="info-side">
            <div class="name-text">${properties.af_actname || properties.value}</div>
            <div class="member-text">${properties.af_assignee || ''}</div>
            <div class="status-text">${properties.af_choice || ''}</div>
        </div>
        `
        el.innerHTML = html
        // 需要先把之前渲染的子节点清除掉
        rootEl.innerHTML = ''
        rootEl.appendChild(el)
    }
}

export default {
  type: 'custom-rect',
  view: CustomRectNode,
  model: CustomRectModel
}

// index.js
import customRect from './components/customRect'
this.lf.register(customRect)

3.自定义样式

自定义节点后需要搭配自定义样式,vue中会给节点样式增加唯一后缀以实现样式隔离,因此如果需要修改logicFlow生成的节点需要使用深层选择器;
我使用的是less,对应的深层选择器是::v-deep,sass应该是:deep()

<style lang="less" scoped>
.container {
    width: 100%;
    height: 100%;
    overflow: hidden;
    ::v-deep {
        // 此处定义各种自定义样式类的样式
    }
}
</style>

4.流程json分析

原配置端的流程配置是基于Angular实现的流程设计器,流程协议与logicFlow并不通用,需要对配置端获取的流程协议的参数进行调整才可用于logicFlow的渲染;
json数据转换为logicFlow数据的具体逻辑实现在此不多做赘述,毕竟json格式不一定一致

{
    // 节点属性:将当前节点作为起始节点的线的id,用于设置logicFlow中线的sourceNode
    "outgoing": [
        {
            "resourceId": "sid-58F1C9BC-DEEE-4775-90FB-C3E55993E194"
        }
    ],
    // 节点/线属性:标志id
    "resourceId": "sid-F73FFA42-61DD-4834-8A2D-1611588E1F6B",
    // 节点/线属性:左上以及右下位置的坐标,需要根据两个坐标计算logicFlow中节点的x坐标、y坐标以及宽高
    "bounds": {
        "upperLeft": {
            "x": 45,
            "y": 270
        },
        "lowerRight": {
            "x": 75,
            "y": 300
        }
    },
    // 节点/线属性:id对应不同类型,其他则均为普通节点
    // StartNoneEvent:开始节点,EndNoneEvent:结束节点
    // ExclusiveGateway:分支节点
    // SequenceFlow:线
    "stencil": {
        "id": ""
    },
    // 线属性:dockers作为线连接节点的锚点,若仅两元素则为直线,若多于两元素则表示该连线为折线,超出的docker作为折线的中间点
    // 节点的锚点在logicFlow中并不适用,计算折线pointsList时可根据节点方位选择节点边上任一坐标进行连接
    "dockers": [
        {
            "x": 20.5,
            "y": 20.5
        },
        {
            "x": 50,
            "y": 40
        }
    ],
    "properties": {},
    // 线属性:线目标节点的id,用于设置logicFlow中线的targetNode
    "target": {
        "resourceId": "sid-0DA5B3EC-1E1F-4335-AA26-682E9C8D1DAC"
    }
}

http://www.niftyadmin.cn/n/5454409.html

相关文章

python提取视频中的音频

一、搭建环境 1、安装python 2、安装moviepy包 pip3 install moviepy 二、实现思路 1、先通过get请求把视频下载下来 2、再通过moviepy模块去提取视频中的音频 三、完整代码 import requests from moviepy.editor import VideoFileClip""" 支持视频格式 MP…

勾八头歌之分类回归聚类

一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…

力扣Lc23--- 290. 单词规律(java版)-2024年3月27日

1.题目描述 2.知识点 1&#xff09;思路 &#xff08;1&#xff09;s.split(" "); 是将字符串 s 按空格进行分割&#xff0c;得到一个单词列表。 &#xff08;2&#xff09;建立模式字符和单词之间的双向映射关系&#xff0c;我们可以使用两个哈希映射&#xff08;或…

蓝桥杯真题讲解:网络稳定性(Kruskal重构树+LCA)

蓝桥杯真题讲解&#xff1a;网络稳定性&#xff08;Kruskal重构树LCA&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;网络稳定性&#xff08;Kruskal重构树LCA&#xff09; 二、正解代码 //kruskal重构树 lca #include<bits/stdc.h>…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

CUDA安装 Windows版

目录 一、说明 二、安装工具下载 三、CUDA安装 四、cuDNN配置 五、验证安装是否成功 一、说明 windows10 版本安装 CUDA &#xff0c;首先需要下载两个安装包 CUDA toolkitcuDNN 官方教程 CUDA&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-micro…

基于Arduino IDE 野火ESP8266模块 一键配网 的开发

一、配网介绍 ESP8266 一键配网&#xff08;也称为 SmartConfig 或 FastConfig&#xff09;是一种允许用户通过智能手机上的应用程序快速配置 ESP8266 Wi-Fi 模块的方法&#xff0c;而无需手动输入 SSID 和密码。为了实现这一功能&#xff0c;则需要一个支持 SmartConfig 的智能…

Hadoop+Spark大数据技术(微课版)曾国荪、曹洁版思维导图第三章 MapReduce分布式计算框架 (核心思想:“分而治之”)

第三章 MapReduce分布式计算框架 &#xff08;核心思想&#xff1a;“分而治之”&#xff09; 3.1 MapReduce 概述 3.1.1 并发、并行与分布式编程的概念 并发和并行 并发是指两个任务可以在重叠的时间段内启动、运行和完成&#xff1b; 并行是指任务在同一时间运行。 并发是独…