Type Script 在流程設計器的落地實踐

来源:https://www.cnblogs.com/limitcode/archive/2022/12/03/16947187.html
-Advertisement-
Play Games

JQuery03 4.jQuery選擇器03 4.4表單選擇器 應用實例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>表單選擇器應用實例</title> <script type="text/javasc ...


流程設計器項目介紹

從事過BPM行業的大佬必然對流程建模工具非常熟悉,做為WFMC三大體繫結構模型中的核心模塊,它是工作流的能力模型,其他模塊都圍繞工作流定義來構建。

成熟的建模工具通過可視化的操作界面和行業BPMN規範描述用戶容易理解的工作流的各種構成圖元,例如圓圈表示事件,方框表示活動。

流程設計器技術選型

前端框架

VUE3 + TS + Ant Design Vue

選擇TS做為首選語言我們是經過充分考慮和驗證的,並不是單純的因為TS比較流行、時髦而去無腦應用。流程設計器是對流程的建模,必然涉及到大量的業務屬性數據建模,這些屬性可以通過類的方式抽象、繼承、維護,也就是面向對象開發,而這恰好是TS的優勢。我們的項目中大概有80多個業務模型,如果用JS去表示,那將是何種場景!在驗證的過程中我們發現,使用TS開發可以簡化開發複雜度和提高產品的成功率。

VUE3 + TS 使用的過程中並不是很順暢,主要是類型檢查方面做的並不是很好。如 vuex、混入 等。

圖編輯組件

AntV X6

對於流程圖基本的圖形繪製能力,我們調研過多個開源的框架,最終選擇了 X6。下麵附上調研結果,僅當參考(作者對這些框架都帶著敬畏之心,並沒有惡意,如有不適,勿噴)。

底層技術 瀏覽器支持情況 事件處理 渲染效果
SVG IE9++、Edge、Chrome、Safari、Opera、360、Firefox 友好 適合複雜度低的流程圖
Canvas IE9++、Edge、Chrome、Safari、Opera、360、Firefox 基於位置的定位事件不友好 更適合圖像密集型的游戲應用
框架 底層技術 文檔地址 協議 點評
SVG.JS SVG https://svgjs.dev/docs/3.0/shape-elements/#svg-line MIT license 僅支持基礎的圖形繪製能力
G6 圖可視化引擎 canvas https://g6.antv.vision/zh MIT license 上手容易,功能面廣
X6 圖可視化引擎 SVG https://x6.antv.vision/zh/examples/showcase/practices#bpmn MIT license 上手容易,比較專註流程圖領域
D3.js SVG https://d3js.org/ https://github.com/d3/d3/wiki/API--中文手冊 BSD license 複雜度高,難上手。
logic-flow SVG http://logic-flow.org/ Apache-2.0 License 上手容易,更專註流程圖領域,功能不全,較為粗超
bpmn.js SVG https://bpmn.io/toolkit/bpmn-js/ Apache-2.0 License 專業的流程繪製框架,沒文檔,完全遵循BPMN2.0

輔助框架

class-transformer

普通JS對象與TS對象互轉利器

class-validator

流程模型驗證利器,類似 C# 中 Attribute,java 中的註解,通過在屬性上加註解實現驗證。

擴展圖元

BPMN2.0規範中對圖元做了定義,如圓圈表示事件、方框表示人工任務、菱形表示網關。但是我們的BPM產品主要面對的是國內的客戶,規範中的圖元太抽象,不適合國內,基於X6基礎圖形我們定義了一套新圖元。

混入實現組件遞歸重置

右側的屬性面板是配置業務的區域,右下角有保存和重置兩個按鈕。點擊重置後需要對屬性面板內所有組件的內容進行重新初始化,因為組件不止一個,多是多級嵌套的,所以需要遞歸重置。
項目中我們採用vue局部混入的方式,在每個組件上傳遞 currentUUID props 的方式,層層下鑽通知子組件重新初始化內容。

vue3 + ts 使用混入比較繁瑣噁心,下麵是核心代碼:

點擊查看代碼

declare module 'vue' {
  interface ComponentCustomProperties {
	/* 定義更新當前組件ID的混入方法 */
    updateCurrentUUID: (from: string) => void
     
  }
}

export default defineComponent({
  props: {
    /** 父組件的UUID */
    parentUUID: {
      type: Object
    }
  },
  data () {
    return {
      /** 當前組件的UUID */
      currentUUID: {
        uuid: v4(),
        from: '' // 驅動來源
      },
      /** 支持的級聯更新來源 */
      supportFroms: [
        'propertyReset', // 屬性面板重置
        'ruleChange'
      ]
    }
  }, 
  methods: {
    /** 初始化數據,要求所有子組件的初始化都放到該方法內 */
    initComponentData () {
	/* 子組件數據初始化的方法 */
	},
    /** 更新當前組件UUID */
    updateCurrentUUID (from: string) {
      this.currentUUID.from = from
      this.currentUUID.uuid = v4()
    }
  },
  watch: {
    /**  */
    parentUUID: {
      handler: function (val) {
        // 如果來源在 supportFroms 集合中,才支持重新初始化
        if (this.supportFroms.indexOf(val.from) > -1) {
          this.initComponentData()
          this.$forceUpdate()
          this.$nextTick(() => {
            this.updateCurrentUUID(val.from)
          })
        }
      },
      deep: true
    }
  }
})

發佈訂閱模式實現組件遞歸驗證

右側的屬性面板在點擊保存時需要驗證數據的完整性,而這些數據又分佈在不同的子組件內,所以需要每個子組件自己完成數據驗證。項目中我們採用混入 + 發佈訂閱設計模式完成該功能。

子組件在 mounted 時訂閱驗證事件,unmounted 時刪除訂閱,點擊保存時發佈驗證事件,每個子組件完成自身的驗證後返回一個 Promise,當所有子組件都驗證完成後,再將數據保存到資料庫。

點擊查看代碼

declare module 'vue' {
  interface ComponentCustomProperties {
    componentValidate: (data?: any) => Promise<ValidateResult>
  }
}

/**
 * 組件驗證結果
 */
export interface ValidateResult {
  /** 是否驗證通過 */
  isOk: boolean,
  /** 驗證失敗的消息 */
  msgs?: string[]
}

export default defineComponent({
  props: {
     
  },
  data () {
    return {
      
    }
  },
  mounted () {
    const pubSub = inject<PubSub>('pubSub')
    if (pubSub) {
      unref(pubSub).on(this.currentUUID.uuid, this.componentValidate)
    }
  },
  beforeUnmount () {
    const pubSub = inject<PubSub>('pubSub')
    if (pubSub) {
      unref(pubSub).off(this.currentUUID.uuid)
    }
  },
  unmounted () {
    const pubSub = inject<PubSub>('pubSub')
    if (pubSub) {
      unref(pubSub).off(this.currentUUID.uuid)
    }
  },
  methods: {
     
    /** 組件驗證 */
    componentValidate (data?: any): Promise<ValidateResult> {
      return Promise.resolve({
        isOk: true
      })
    }
  }
})


<template>
  <div>
     
  </div>
</template>

<script lang="ts">
 
export default defineComponent({
  name: 'BaseTabView',
  mixins: [resetMixin], // 混入組件驗證模塊
  props: {
     
  },
  data () {
    return {
       
    }
  },
  setup () {
     
  },
  mounted () {
     
  },
  methods: {
    componentValidate (data?: any): Promise<ValidateResult> {
      const result: ValidateResult = {
        isOk: true,
        msgs: []
      }
      return Promise.resolve(result)
    }
  }
})
</script>


export class PubSub {
  // eslint-disable-next-line @typescript-eslint/ban-types
  handles: Map<string, Function> = new Map<string, Function>()
  /** 訂閱事件 */
  on (eventType: string, handle: any) {
    if (this.handles.has(eventType)) {
      throw new Error('重覆註冊的事件')
    }
    if (!handle) {
      throw new Error('缺少回調函數')
    }
    this.handles.set(eventType, handle)
    return this
  }

  /** 發佈事件 所有事件 */
  emitAll (data?: any): Promise<any[]> {
    const result: Promise<any>[] = []
    this.handles.forEach(item => {
      // eslint-disable-next-line prefer-spread
      result.push(item.apply(null, data))
    })
    return Promise.all(result)
  }

  /** 發佈事件 */
  emit (eventType: string, data?: any) {
    if (!this.handles.has(eventType)) {
      throw new Error(`"${eventType}"事件未註冊`)
    }
    const handle = this.handles.get(eventType)!
    // eslint-disable-next-line prefer-spread
    handle.apply(null, data)
  }

  /** 刪除事件 */
  off (eventType: string) {
    this.handles.delete(eventType)
  }
}

設計器產品展示

關於作者:本人從事BPM開發多年,歡迎有志同道合之友來擾!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 來源:https://www.cnblogs.com/prayjourney/p/9667835.html 在一個應用系統中, 無論使用何種語言開發, 必然存在模塊之間的調用, 調用的方式分為幾種。 1.同步調用 同步調用是最基本並且最簡單的一種調用方式, 類A的方法a()調用類B的方法b(), 一 ...
  • 在Seata的AT模式中,在服務執行完成後,直接進行RM提交和資源釋放,提供了對CAP理論相對平衡的解決方案,並且沒有侵入業務工程; ...
  • 一:背景 1.講故事 這周有個朋友找到我,說他的程式出現了記憶體緩慢增長,沒有回頭的趨勢,讓我幫忙看下到底怎麼回事,據朋友說這個問題已經困擾他快一周了,還是沒能找到最終的問題,看樣子這個問題比較刁鑽,不管怎麼說,先祭出 WinDbg。 二:WinDbg 分析 1. 托管還是非托管泄露 一直關註這個系列 ...
  • Linux 命令及其參數繁多,大多數人都是無法記住全部功能和具體參數意思的。在 linux 終端,面對命令不知道怎麼用,或不記得命令的拼寫及參數時,我們需要求助於系統的幫助文檔; linux 系統內置的幫助文檔很詳細,通常能解決我們的問題,我們需要掌握如何正確的去使用它們。 ...
  • Linux系統環境監測 Linux系統環境主要監測CPU、記憶體、磁碟I/O和網路流量。 1. CPU (1) 查看CPU的負載情況:uptime 可以通過uptime查看系統整體的負載情況。 如果伺服器的CPU為1核心,則1分鐘的系統平均負載 >=3 說明負載過高,如果伺服器的CPU為4核心,則lo ...
  • 1.2 Hadoop簡介 1.2.1 什麼是Hadoop ​ Hadoop 是一個適合大數據的分散式存儲和計算平臺 ​ 如前所述,狹義上說Hadoop就是一個框架平臺,廣義上講Hadoop代表大數據的一個技術生態 圈,包括很多其他軟體框架 ​ Hadoop生態圈技術棧 ​ Hadoop(HDFS + ...
  • 導讀: 今天為大家介紹京東零售大數據的雲原生平臺化實踐,主要包括以下幾大方面內容: 雲原生的定義和理解 雲原生相關技術的演化 京東大數據在雲原生平臺化上的實踐 雲原生應用平臺的發展 分享嘉賓:劉仲偉 京東 架構師 編輯整理:張明宇 廣州某銀行 出品社區:DataFun 01/雲原生的定義和理解 1. ...
  • 一、學習路線 1.HTML5+CSS3 黑馬程式員pink老師前端入門教程,零基礎必看的h5(html5)+css3+移動端前端視頻教程_嗶哩嗶哩_bilibili 2.JavaScript JavaScript基礎語法-dom-bom-js-es6新語法-jQuery-數據可視化echarts黑馬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...