Bpmn.js?自定義描述文件使用說(shuō)明
前言
在使用 bpmn-js
繪制流程圖時(shí),可能會(huì)存在需要開(kāi)發(fā)者自己定義屬性或者元素的情況,為了保證符合官方定義,對(duì)官方文檔進(jìn)行了漢化說(shuō)明。以下說(shuō)明基于個(gè)人理解,可能與真實(shí)作用有出入,希望大家指出不正確或者意義不明的地方,我好加以改正,謝謝!
說(shuō)明文件配置屬性
原文見(jiàn) bpmn
官方倉(cāng)庫(kù) bpmn-io/moddle 。
自定義說(shuō)明文件demo
說(shuō)明文件 SelfDescriptor.json
{ "name": "self", "uri": "https://self", "prefix": "se", "xml": { "tagAlias": "lowerCase" }, "types": [ { "name": "AttrOne", "superClass": [ "Element" ], "properties": [ { "name": "name", "type": "String", "isAttr": "true" }, { "name": "values", "type": "AttrOneProp", "isMany": true } ] }, { "name": "AttrOneProp", "superClass": [ "Element" ], "meta": { "allowedIn": [ "*" ] }, "properties": [ { "name": "propName", "type": "String", "isAttr": true }, { "name": "value", "type": "String", "isAttr": true } ] }, { "name": "AttrTwo", "superClass": [ "Element" ], "meta": { "allowedIn": [ "*" ] }, "properties": [ { "name": "value", "type": "String", "isBody": true } ] } ] }
使用
import $ from 'jquery'; import BpmnModeler from 'bpmn-js/lib/Modeler'; // 側(cè)邊欄 import propertiesPanelModule from 'bpmn-js-properties-panel'; // camunda 側(cè)邊欄內(nèi)容構(gòu)建器 import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda'; // camunda 屬性解析文件 import camundaModdleDescriptor from 'camunda-bpmn-moddle/resources/camunda.json'; // 自定義的屬性解析文件 import SelfDescriptor from "./SelfDescriptor.json"; // 省略部分內(nèi)容... // 初始化 modeler var bpmnModeler = new BpmnModeler({ container: canvas, propertiesPanel: { parent: '#js-properties-panel' }, additionalModules: [ propertiesPanelModule, propertiesProviderModule ], moddleExtensions: { // 使用引入的屬性解析文件 camunda: camundaModdleDescriptor, self: SelfDescriptor } }); // 使用與創(chuàng)建自定義屬性標(biāo)簽 bpmnModeler.on("element.click", function (event, eventObj) { const moddle = bpmnModeler.get("moddle"); // 自定義屬性1 const attrOne = moddle.create("se:AttrOne", { name: "testAttrOne", values: [] }); // 自定義屬性子屬性 const attrOneProp = moddle.create("se:AttrOneProp", {propName: "propName1", value: "propValue1"}) // 自定義屬性2 const attrTwo = moddle.create("se:AttrTwo", { value: "testAttrTwo" }) // 原生屬性Properties const props = moddle.create("camunda:Properties", { values: [] }); // 原生屬性Properties的子屬性 const propItem = moddle.create("camunda:Property", { name: "原生子屬性name", values: "原生子屬性value" }); // 原生擴(kuò)展屬性數(shù)組 const extensions = moddle.create("bpmn:ExtensionElements", { values: [] }) // 開(kāi)始節(jié)點(diǎn)插入原生屬性 if (eventObj.element.type === "bpmn:StartEvent") { props.values.push(propItem); extensions.values.push(props); } // 任務(wù)節(jié)點(diǎn)插入多種屬性 if (eventObj.element.type === "bpmn:Task") { props.values.push(propItem, propItem); attrOne.values.push(attrOneProp); extensions.values.push(props, attrOne, attrTwo); } // root插入自定義屬性 if (eventObj.element.type === "bpmn:Process") { attrOne.values.push(attrOneProp, attrOneProp); extensions.values.push(attrOne); } bpmnModeler.get("modeling").updateProperties(eventObj.element, { extensionElements: extensions }); })
結(jié)果
只截取了流程相關(guān)的部分
<bpmn2:process id="Process_1" isExecutable="false"> <bpmn2:extensionElements> <se:attrOne name="testAttrOne"> <se:attrOneProp propName="propName1" value="propValue1" /> <se:attrOneProp propName="propName1" value="propValue1" /> </se:attrOne> </bpmn2:extensionElements> <bpmn2:startEvent id="StartEvent_1"> <bpmn2:extensionElements> <camunda:properties> <camunda:property name="原生子屬性name" values="原生子屬性value" /> </camunda:properties> </bpmn2:extensionElements> <bpmn2:outgoing>Flow_066c7c5</bpmn2:outgoing> </bpmn2:startEvent> <bpmn2:task id="Activity_0ghpzc3" name="1"> <bpmn2:extensionElements> <camunda:properties> <camunda:property name="原生子屬性name" values="原生子屬性value" /> <camunda:property name="原生子屬性name" values="原生子屬性value" /> </camunda:properties> <se:attrOne name="testAttrOne"> <se:attrOneProp propName="propName1" value="propValue1" /> </se:attrOne> <se:attrTwo>testAttrTwo</se:attrTwo> </bpmn2:extensionElements> <bpmn2:incoming>Flow_066c7c5</bpmn2:incoming> <bpmn2:outgoing>Flow_0qmpzc7</bpmn2:outgoing> </bpmn2:task> <bpmn2:sequenceFlow id="Flow_066c7c5" sourceRef="StartEvent_1" targetRef="Activity_0ghpzc3" /> <bpmn2:task id="Activity_1gm4zj6" name="2"> <bpmn2:extensionElements> <camunda:properties> <camunda:property name="原生子屬性name" values="原生子屬性value" /> <camunda:property name="原生子屬性name" values="原生子屬性value" /> </camunda:properties> <se:attrOne name="testAttrOne"> <se:attrOneProp propName="propName1" value="propValue1" /> </se:attrOne> <se:attrTwo>testAttrTwo</se:attrTwo> </bpmn2:extensionElements> <bpmn2:incoming>Flow_0qmpzc7</bpmn2:incoming> <bpmn2:outgoing>Flow_03hry06</bpmn2:outgoing> </bpmn2:task> <bpmn2:sequenceFlow id="Flow_0qmpzc7" sourceRef="Activity_0ghpzc3" targetRef="Activity_1gm4zj6" /> <bpmn2:task id="Activity_0ahhdt5" name="3"> <bpmn2:extensionElements> <camunda:properties> <camunda:property name="原生子屬性name" values="原生子屬性value" /> <camunda:property name="原生子屬性name" values="原生子屬性value" /> </camunda:properties> <se:attrOne name="testAttrOne"> <se:attrOneProp propName="propName1" value="propValue1" /> </se:attrOne> <se:attrTwo>testAttrTwo</se:attrTwo> </bpmn2:extensionElements> <bpmn2:incoming>Flow_03hry06</bpmn2:incoming> <bpmn2:outgoing>Flow_1h7pp7l</bpmn2:outgoing> </bpmn2:task> <bpmn2:sequenceFlow id="Flow_03hry06" sourceRef="Activity_1gm4zj6" targetRef="Activity_0ahhdt5" /> <bpmn2:endEvent id="Event_1eofx2i"> <bpmn2:incoming>Flow_1h7pp7l</bpmn2:incoming> </bpmn2:endEvent> <bpmn2:sequenceFlow id="Flow_1h7pp7l" sourceRef="Activity_0ahhdt5" targetRef="Event_1eofx2i" /> </bpmn2:process>
后記
由于工作需要(其實(shí)不是很需要),在公司項(xiàng)目的基礎(chǔ)上開(kāi)源了一個(gè)基于 bpmn-js + Vue 2.x + ElementUI 的一個(gè)流程編輯器 Bpmn Process Designer
預(yù)覽地址 MiyueFE blog,
以上就是Bpmn.js 自定義描述文件使用說(shuō)明的詳細(xì)內(nèi)容,更多關(guān)于Bpmn.js 自定義描述文件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue修改數(shù)據(jù)視圖更新原理學(xué)習(xí)
這篇文章主要為大家介紹了vue修改數(shù)據(jù)視圖更新原理學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Vue build過(guò)程取消console debugger控制臺(tái)信息輸出方法詳解
這篇文章主要為大家介紹了Vue build過(guò)程取消console debugger控制臺(tái)信息輸出方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09一文搞懂Vue3中toRef和toRefs函數(shù)的使用
這篇文章主要為大家介紹了Vue3中toRef和toRefs函數(shù)的使用方法,文中通過(guò)示例為大家進(jìn)行了詳細(xì)的講解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-07-07Vue?設(shè)置圖片不轉(zhuǎn)為base64的方式
這篇文章主要介紹了Vue實(shí)現(xiàn)設(shè)置圖片不轉(zhuǎn)為base64的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Vue項(xiàng)目引入translate.js國(guó)際化自動(dòng)翻譯組件的方法
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目引入translate.js國(guó)際化自動(dòng)翻譯組件的相關(guān)資料,除了基本的文本翻譯功能之外,jstranslate還提供了一些高級(jí)功能,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01vue3使用localStorage實(shí)現(xiàn)登錄注冊(cè)功能實(shí)例
這篇文章主要給大家介紹了關(guān)于vue3使用localStorage實(shí)現(xiàn)登錄注冊(cè)功能的相關(guān)資料, localStorage這個(gè)特性主要是用來(lái)作為本地存儲(chǔ)來(lái)使用的,解決了cookie存儲(chǔ)空間不足的問(wèn)題,需要的朋友可以參考下2023-06-06