├── resource
├── readme1.png
├── readme2.png
├── weixin.png
├── LinDaiDai赞赏码.png
├── problem
│ ├── 111.png
│ ├── 131.png
│ ├── 222.png
│ ├── 333.png
│ ├── 4444.png
│ ├── bpmn1.gif
│ ├── bpmn2.gif
│ ├── bpmn3.gif
│ ├── WechatIMG206.png
│ ├── WechatIMG210.png
│ ├── WechatIMG214.png
│ ├── WechatIMG312.png
│ ├── WechatIMG313.png
│ ├── WechatIMG316.png
│ ├── WechatIMG319.png
│ ├── WechatIMG62.png
│ ├── WechatIMG64.png
│ ├── WechatIMG70.png
│ ├── WechatIMG855.jpeg
│ ├── 0B01F220-CA9B-41EA-8AC9-84E113E3E390.png
│ ├── 46BDE64B-158E-4B32-ABC7-CACF51385D5F.png
│ ├── 57819D29-947C-4013-A1A9-FA66044ED11D.png
│ ├── 5A8C0AD2-4BD7-459F-8A05-F919B9ADB605.png
│ ├── 6BE53065-AA11-4446-B6B3-81B5CF6BB709.png
│ ├── A256DA1C-E9B1-4EC8-90F7-6472B3D86509.png
│ ├── A8E7ECA0-EC4C-4DEB-BEAB-BB16C8FEA44F.png
│ ├── AE96B155-9290-432A-84A1-957DC9D0DF8B.png
│ ├── E5C86775-0DE7-4DFD-9BDD-98695C79C389.png
│ └── WeChate7d32848fc70b5c6a169bb0d6ed05ecf.png
├── LinDaiDai公众号二维码.png
├── bpmn-colors
│ ├── 1.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ ├── 5.png
│ └── bpmn-colors.gif
├── LinDaiDai公众号gif图.gif
└── activiti.json
├── directory.md
├── README.md
└── LinDaiDai
├── 全网最详bpmn.js教材-群友问题汇总(二).md
├── 全网最详bpmn.js教材-Color篇.md
├── 全网最详bpmn.js教材-事件篇.md
├── 全网最详bpmn.js教材-http请求篇.md
├── 全网最详bpmn.js教材-编辑、删除节点篇.md
├── 全网最详bpmn.js教材-properties篇.md
├── 全网最详bpmn.js教材-自定义contextPad篇.md
├── 全网最详bpmn.js教材-基础篇.md
├── 全网最详bpmn.js教材-自定义renderer篇.md
├── 全网最详bpmn.js教材-自定义palette篇.md
├── 全网最详bpmn.js教材-群友问题汇总(一).md
├── 全网最详bpmn.js教材-封装组件篇.md
├── 全网最详bpmn.js教材-properties-panel篇(上).md
└── 全网最详bpmn.js教材-poperties-panel篇(下).md
/resource/readme1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/readme1.png
--------------------------------------------------------------------------------
/resource/readme2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/readme2.png
--------------------------------------------------------------------------------
/resource/weixin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/weixin.png
--------------------------------------------------------------------------------
/resource/LinDaiDai赞赏码.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/LinDaiDai赞赏码.png
--------------------------------------------------------------------------------
/resource/problem/111.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/111.png
--------------------------------------------------------------------------------
/resource/problem/131.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/131.png
--------------------------------------------------------------------------------
/resource/problem/222.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/222.png
--------------------------------------------------------------------------------
/resource/problem/333.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/333.png
--------------------------------------------------------------------------------
/resource/problem/4444.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/4444.png
--------------------------------------------------------------------------------
/resource/LinDaiDai公众号二维码.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/LinDaiDai公众号二维码.png
--------------------------------------------------------------------------------
/resource/bpmn-colors/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/bpmn-colors/1.png
--------------------------------------------------------------------------------
/resource/bpmn-colors/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/bpmn-colors/2.png
--------------------------------------------------------------------------------
/resource/bpmn-colors/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/bpmn-colors/3.png
--------------------------------------------------------------------------------
/resource/bpmn-colors/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/bpmn-colors/4.png
--------------------------------------------------------------------------------
/resource/bpmn-colors/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/bpmn-colors/5.png
--------------------------------------------------------------------------------
/resource/problem/bpmn1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/bpmn1.gif
--------------------------------------------------------------------------------
/resource/problem/bpmn2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/bpmn2.gif
--------------------------------------------------------------------------------
/resource/problem/bpmn3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/bpmn3.gif
--------------------------------------------------------------------------------
/resource/LinDaiDai公众号gif图.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/LinDaiDai公众号gif图.gif
--------------------------------------------------------------------------------
/resource/problem/WechatIMG206.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG206.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG210.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG210.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG214.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG214.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG312.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG312.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG313.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG313.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG316.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG316.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG319.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG319.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG62.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG62.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG64.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG70.png
--------------------------------------------------------------------------------
/resource/problem/WechatIMG855.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WechatIMG855.jpeg
--------------------------------------------------------------------------------
/resource/bpmn-colors/bpmn-colors.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/bpmn-colors/bpmn-colors.gif
--------------------------------------------------------------------------------
/resource/problem/0B01F220-CA9B-41EA-8AC9-84E113E3E390.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/0B01F220-CA9B-41EA-8AC9-84E113E3E390.png
--------------------------------------------------------------------------------
/resource/problem/46BDE64B-158E-4B32-ABC7-CACF51385D5F.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/46BDE64B-158E-4B32-ABC7-CACF51385D5F.png
--------------------------------------------------------------------------------
/resource/problem/57819D29-947C-4013-A1A9-FA66044ED11D.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/57819D29-947C-4013-A1A9-FA66044ED11D.png
--------------------------------------------------------------------------------
/resource/problem/5A8C0AD2-4BD7-459F-8A05-F919B9ADB605.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/5A8C0AD2-4BD7-459F-8A05-F919B9ADB605.png
--------------------------------------------------------------------------------
/resource/problem/6BE53065-AA11-4446-B6B3-81B5CF6BB709.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/6BE53065-AA11-4446-B6B3-81B5CF6BB709.png
--------------------------------------------------------------------------------
/resource/problem/A256DA1C-E9B1-4EC8-90F7-6472B3D86509.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/A256DA1C-E9B1-4EC8-90F7-6472B3D86509.png
--------------------------------------------------------------------------------
/resource/problem/A8E7ECA0-EC4C-4DEB-BEAB-BB16C8FEA44F.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/A8E7ECA0-EC4C-4DEB-BEAB-BB16C8FEA44F.png
--------------------------------------------------------------------------------
/resource/problem/AE96B155-9290-432A-84A1-957DC9D0DF8B.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/AE96B155-9290-432A-84A1-957DC9D0DF8B.png
--------------------------------------------------------------------------------
/resource/problem/E5C86775-0DE7-4DFD-9BDD-98695C79C389.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/E5C86775-0DE7-4DFD-9BDD-98695C79C389.png
--------------------------------------------------------------------------------
/resource/problem/WeChate7d32848fc70b5c6a169bb0d6ed05ecf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/LinDaiDai/bpmn-chinese-document/HEAD/resource/problem/WeChate7d32848fc70b5c6a169bb0d6ed05ecf.png
--------------------------------------------------------------------------------
/directory.md:
--------------------------------------------------------------------------------
1 | ## bpmn.js教材目录
2 |
3 |
4 |
5 | - [《全网最详bpmn.js简介》](https://github.com/LinDaiDai/bpmn-chinese-document)🔥🔥🔥
6 | - [《基础篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-基础篇.md)🔥🔥
7 | - [《http请求篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-http请求篇.md)🔥🔥
8 | - [《事件篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-事件篇.md)🔥🔥🔥
9 | - [《自定义Palette篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-自定义palette篇.md)🔥🔥
10 | - [《自定义Renderer篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-自定义renderer篇.md)🔥🔥🔥🔥
11 | - [《自定义contextPad篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-自定义contextPad篇.md)🔥🔥🔥
12 | - [《编辑、删除节点篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-编辑、删除节点篇.md)🔥🔥🔥
13 | - [《封装组件篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-封装组件篇.md)🔥🔥🔥
14 | - [《properties篇》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-properties篇.md)🔥🔥🔥
15 | - [《properties-panel篇(上)》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-properties-panel篇(上).md)🔥🔥🔥
16 | - [《properties-panel篇(下)》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-poperties-panel篇(下).md)🔥🔥🔥
17 | - [《Color篇》](./LinDaiDai/全网最详bpmn.js教材-Color篇.md)🔥🔥🔥
18 | - [《全网最详bpmn.js教材-群友问题汇总(一)》](https://github.com/LinDaiDai/bpmn-chinese-document/tree/master/LinDaiDai/全网最详bpmn.js教材-群友问题汇总(一).md)🔥🔥🔥🔥
19 | - [《全网最详bpmn.js教材-群友问题汇总(二)》](https://github.com/LinDaiDai/bpmn-chinese-document/blob/master/LinDaiDai/全网最详bpmn.js教材-群友问题汇总(二).md)🔥🔥🔥
20 | - [《掘友易样-使用vue+bpmn-js实现activiti的流程设计器》](https://juejin.im/post/5e7330c36fb9a07cd248ef00)
21 | - [《掘友winily-Vue 整合Bpmn-js 工作流模型编辑器》](https://juejin.im/post/5e509fab6fb9a07c820fa78a)
22 | - [《掘友winily-Bpmn.js 在线流程编辑器的汉化》](https://juejin.im/post/5e802afcf265da794978f8b0)
23 | - [《ops-coffee.cn/bpmn 教程》](https://blog.ops-coffee.cn/bpmn)
24 | - [《Bpmn Process Designer》](https://github.com/miyuesc/bpmn-process-designer)
25 | - [《PL-FE/bpmn 教程》](https://github.com/PL-FE/bpmn-doc)
26 |
27 |
28 | ## bpmn.js教材案例地址
29 |
30 |
31 |
32 | - **基础篇** 案例地址: [bpmn-basic-demo](https://github.com/LinDaiDai/bpmn-basic-demo)
33 | - **基础篇/http请求篇/事件篇** 案例地址: [bpmn-vue-basic](https://github.com/LinDaiDai/bpmn-vue-basic)
34 | - **自定义Palette/Renderer/ContextPad/编辑、删除节点篇** 案例地址: [bpmn-vue-custom](https://github.com/LinDaiDai/bpmn-vue-custom)
35 | - **封装组件篇** 案例地址: [bpmn-custom-modeler](https://github.com/LinDaiDai/bpmn-custom-modeler)
36 | - **Properties/properties-panel篇** 案例地址: [bpmn-vue-properties-panel](https://github.com/LinDaiDai/bpmn-vue-properties-panel)
37 | - **Color篇** 案例地址:[bpmn-vue-properties-panel](https://github.com/LinDaiDai/bpmn-vue-properties-panel)
38 |
39 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | ### bpmn.js简介
4 |
5 | [bpmn.js](https://bpmn.io/)是一个BPMN2.0渲染工具包和web建模器.
6 |
7 | 它使用JavaScript编写,在不需要后端服务器支持的前提下向现代浏览器内嵌入BPMN2.0流程图.
8 |
9 | 简单来说, 就是能使得前端来画流程图, 它可能长成这样:
10 |
11 | 
12 |
13 |
14 |
15 | 也可能长成这样:
16 |
17 |
18 |
19 | 
20 |
21 |
22 |
23 | 或许你可以亲自试试: [在线绘制bpmn流程图](https://demo.bpmn.io/)
24 |
25 |
26 |
27 | ### 全部目录
28 |
29 | [bpmn.js教材目录](https://github.com/LinDaiDai/bpmn-chinese-document/blob/master/directory.md)
30 |
31 | **注:如果霖呆呆的文档较旧的话, 建议查看:[bpmn-js 交流群附属资料(文档及开源库)](https://juejin.cn/post/7304831120710434868) 中的文档, 会新很多,强推!!!**
32 |
33 | (如果github中一些文章的图片显示不出来,可以在掘金上查看,也有相应的文章:https://juejin.cn/user/360295513463912/posts)
34 |
35 | ### 几个问题
36 |
37 |
38 |
39 | > Q: bpmn.js是什么? 🤔️
40 |
41 | [bpmn.js](https://bpmn.io/)是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成.
42 |
43 |
44 |
45 | > Q: 我为什么要写该系列的教材? 🤔️
46 |
47 | 因为公司业务的需要因而要在项目中使用到`bpmn.js`,但是由于`bpmn.js`的开发者是国外友人, 因此国内对这方面的教材很少, 也没有详细的文档. 所以很多使用方式很多坑都得自己去找 😅.
48 |
49 | 在将其琢磨完之后, 决定写一系列关于它的教材来帮助更多`bpmn.js`的使用者或者是期于找到一种好的绘制流程图的开发者. 同时也是自己对其的一种巩固.
50 |
51 |
52 |
53 | > Q: 教材中的知识我都是从哪里看的? 🤔️
54 |
55 | 最开始是根据公司业务的需要, 跟着官方给的一些例子 来推敲了解`bpmn.js`的一些基础知识, 包括一些自定义`contextPad、renderer、palette`的使用, 然后就写了几篇关于`bpmn.js`的文章 ✏️.
56 |
57 | 之后越来越多读者通过微信与我联系, 他们也会问一些我没有遇到过的问题, 从中互相探索怎样使用, 怎样解决实际问题... 过程里大多都是通过查看`bpmn.js`的源码, 然后本地测试源码中一些方法和属性的作用.
58 |
59 |
60 |
61 | > Q: 本教材还会更新多久? 🤔️
62 |
63 | 不知道🤷♂️... 因为其实现在工作已经没在用`bpmn.js`了, 我现在更多的把它当成一种兴趣来学习吧...
64 |
65 | 而且现在我们也有了自己的一个`bpmn.js`交流群, 时不时会有一些新的问题抛出来, 所以暂时是与其分不开的 😊.
66 |
67 | 我也会在工作之余, 尽量多出一些教材, 包括群里大家抛出的问题, 我也会抽时间将它们整理出来, 方便后面遇到同样问题的小伙伴查看, 所以现在是持续更新的.
68 |
69 |
70 |
71 | > Q: 还有什么想说的? 🤔️
72 |
73 | 求Star 🌟 , 求 Fork 📒
74 |
75 | 就像之前我提到过的, 光靠我一个人的力量想要将 **bpmn-chinese-document**打造成一个真正的**bpmn中文文档**
76 |
77 | 是不可能的...
78 |
79 | 精力不够...能力也不够...
80 |
81 | 所以我希望有更多的`bpmn.js`使用者能参与到此项目中来 🎉...
82 |
83 | 你可以是写一篇关于某个知识点的文章, 就算是我已经写过的知识点也可以, 因为我知道我写的不一定全面, 如果你有更多可以写的我当然欢迎👏.
84 |
85 | 也可以是写一些教材案例, 因为之前就有大佬吐槽说官方给的案例都太过简单了 😂, 可以让我们自己写一些案例出来. (案例中的`README`要尽量详细哟 😁, 当然有一篇配合着的文档更好啦 😄)
86 |
87 | 再或者是一些你平常碰到的坑, 总结之类的文章也很好 😼.
88 |
89 |
90 |
91 | > Q: 如何 Fork ? 🤔️
92 |
93 | 点击项目右上角的`Fork`, 然后像`Fork`其它项目一样, 不太会的小伙伴可以查看这篇文章:
94 |
95 | [Github上怎么修改别人的项目并且提交给原作者!图文并茂!](https://blog.csdn.net/qq_26787115/article/details/52133008)
96 |
97 | 不过在提交的时候, 为避免项目太乱, 可以在根目录下创建一个以你`github`为名的文件夹(比如我的就是`LinDaiDai`)然后将你的文章或者案例都放在这个文件夹里面进行提交就可以了🎉 .
98 |
99 |
100 | > Q: 还有什么要提醒的?
101 |
102 | 文章中的案例 icon 或者一些 .bpmn 的云文件链接,例如以 https:hexo-blog-1256114407 开头的链接,用的都是我私人的腾讯云存储桶。
103 |
104 | 仅用于文章案例,所以如果大家自己写写 demo 看还好,请勿用在实际项目上哈。
105 |
106 | 这样带来的风险:
107 |
108 | 1、如果我的私人账号欠费了的话,所有这些链接都不能访问了,可能会对您的生产环境造成不可预估的影响;
109 |
110 | 2、访问量多了的话,我这费用也抗不住啊...
111 |
112 | 案例里的这些图标都是:
113 |
114 | 
115 |
116 |
117 | ### 后语
118 |
119 | 如果你也对`bpmn.js` 感兴趣的话, 欢迎加入我们的`bpmn.js`交流群, 一起学习, 一起进步💪.
120 |
121 | 
122 |
123 | 进群方式: 关注 **霖呆呆(LinDaiDai)** 的公众号👇👇👇, 选择 **其它** 菜单中的 **bpmn.js群** 即可😊.
124 |
125 | | 公众号二维码 | 赞赏码 |
126 | | ----------------------------------------- | ----------------------------------- |
127 | |  |  |
128 |
129 | 整理文章, 编写案例不易 😂...
130 |
131 | 走过路过的各位大佬能否打赏点饭钱呢...
132 |
133 | 你的支持是霖呆呆持续更新的动力, 哈哈哈 😄
134 |
135 | #### 更多bpmn相关文档和案例
136 |
137 | - https://github.com/miyuesc/bpmn-process-designer
138 | - https://github.com/PL-FE/bpmn-doc
139 |
140 |
--------------------------------------------------------------------------------
/LinDaiDai/全网最详bpmn.js教材-群友问题汇总(二).md:
--------------------------------------------------------------------------------
1 | # 全网最详bpmn.js教材-群友问题汇总(二)
2 |
3 | 1. 如何获取所有的事件(超哥)
4 | 2. 把左侧工具栏上的四个功能分离出来(Ruby)
5 | 3. 画出来的图在activiti跑不起来,看了下xml才发现都是camunda(多人)
6 | 4. 设置初始化元素到正中心(WD)
7 | 5. 默认的bpmn.js,后端的`activity`解析不了(Ivan)
8 | 6. 自定义属性不能是default ? 用default就报错(小笨蛋)
9 | 7. 如何给一些特殊的节点设置颜色(锦绣Erin)
10 | 8. bpmn底层是如何操作xml的, 源码在哪里(流星)
11 | 9. 条件顺序流的条件是怎么加进去的(Ivan)
12 | 10. 如何使得流程图不能被编辑,仅仅做展示用(Ivan和Mercury、锦绣)
13 | 11. 禁止滚动(kokoro、What If.)
14 | 12. 如何将自定义类型的元素通过基本类型渲染出来(好好干)
15 | 13. 开发环境正常,生产环境却会报错(锦绣Erin)
16 | 14. 自定义属性面板的监听添加(麦兜)
17 | 15. 如何获取流程图最外层的属性(根节点)
18 |
19 |
20 |
21 |
22 |
23 | ### 1. 如何获取所有的事件
24 |
25 | (感谢该问题解决者超哥)
26 |
27 | 如果不了解事件的小伙伴请移步[《全网最详bpmn.js教材-事件篇》](https://juejin.im/post/5def47e16fb9a0160376e416)。
28 |
29 | 在官方文档中并没有很明确的地方介绍具体有哪些监听事件。
30 |
31 | 事实上,我们用的比较多的可能就是`shape.added(新增shape)`、`element.click(点击元素)`、`element.changed(元素发生改变)` 等等。
32 |
33 | 但如果想要知道在做某个操作时触发了什么事件该怎么办呢 🤔️?
34 |
35 | 如果你不想去啃源码的话,我们这里提供了一个办法,能勉强用用:
36 |
37 | 在`importXML`函数的回调中,获取到所有的可用事件,全部绑定到元素上,然后看你的操作触发了哪个。
38 |
39 | 来看看代码:
40 |
41 | ```javascript
42 | createNewDiagram() {
43 | this.bpmnModeler.importXML(xmlStr, err => {
44 | if (!err) { // 渲染成功
45 | this.addEventBusListener()
46 | }
47 | })
48 | }
49 | addEventBusListener () { // 绑定监听事件
50 | const eventBus = this.bpmnModeler.get('eventBus');
51 | const eventTypes = Object.keys(eventBus._listeners); // 获取所有的可用事件
52 | console.log(eventTypes); // 打印出来有242种事件
53 | eventTypes.forEach((event) => {
54 | this.bpmnModeler.on(event, e => {
55 | console.log(event);
56 | })
57 | })
58 | }
59 | ```
60 |
61 | 如图👇,打印出来的可用事件为`242`种,现在你可以在页面上去操作元素,然后查看你期望的事件了。
62 |
63 | 图片1
64 |
65 |
66 |
67 | ### 2. 把左侧工具栏上的四个功能分离出来
68 |
69 | 在[《全网最详bpmn.js教材-自定义palette篇》](https://juejin.im/post/5df197c4f265da33bd4976af)中我介绍的都是一些**如何使用palette创建元素**,但是如何使用`palette`中上面的那四个工具(官方上说它们属于`Activate`这个组)却没介绍。
70 |
71 | 先来简单介绍下这四个工具的作用:
72 |
73 | ##### (一) Activate the hand tool
74 |
75 | 工具栏第一个像手一样的那个工具,它的作用实际上就是能拖动整个画布,来进行位置调整(和单击长按画布效果一样)
76 |
77 | ##### (二) Active the lasso tool
78 |
79 | 点击之后,能选择多个元素进行集体拖拽:
80 |
81 | 
82 |
83 | ##### (三) Active the create/remove space tool
84 |
85 | 点击之后,能调整一侧元素之间的间隔:
86 |
87 | 
88 |
89 | ##### (四) Active the global connect tool
90 |
91 | 创建一根连接线:
92 |
93 |
94 |
95 | 
96 |
97 | 把左侧工具栏上的四个功能分离出来
98 |
99 | 样式:用原先的class名称
100 |
101 | 功能:
102 |
103 | 
104 |
105 | 
106 |
107 |
108 |
109 | ### 3.
110 |
111 |
112 |
113 |
114 |
115 | 
116 |
117 |
118 |
119 | 
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 | ### 4.
132 |
133 | 设置初始化元素到正中心
134 |
135 | ```
136 | bpmnViewer.get('canvas').zoom('fit-viewport', 'auto')
137 | ```
138 |
139 |
140 |
141 | ### 5.
142 |
143 | 默认的bpmn.js,后端的`activity`解析不了,主要是很多属性前面需要添加activity的namespace
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 | 
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 | ### 6.
166 |
167 | 自定义属性不能是default ? 用default就报错
168 |
169 | 
170 |
171 | ### 7.
172 |
173 | 如何给一些特殊的节点设置颜色
174 |
175 | 
176 |
177 |
178 |
179 | ### 8.
180 |
181 | bpmn底层是如何操作xml的, 源码在哪里
182 |
183 | 
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 | ### 9.
192 |
193 | 条件顺序流的条件是怎么加进去的
194 |
195 |
196 |
197 |
198 |
199 | 
200 |
201 |
202 |
203 | 
204 |
205 |
206 |
207 |
208 |
209 | ### 10.
210 |
211 | 如何使得流程图不能被编辑,仅仅做展示用
212 |
213 | 1. 用 import BpmnViewer from 'bpmn-js' (Ivan)
214 | 2. 直接在上面蒙个遮罩层 (Mercury)
215 | 3. 锦绣提供的方法。(聊天记录2月21日)
216 |
217 |
218 |
219 | ### 11.
220 |
221 | 
222 |
223 |
224 |
225 | 
226 |
227 | ### 12.
228 |
229 | ```javascript
230 | drawShape(parentNode, element) {
231 | const types = {
232 | 'wfe:CounterSignatureUserTask': 'bpmn:ScriptTask',
233 | 'wfe:ConvergingParallelGateway': 'bpmn:ParallelGateway'
234 | }
235 | const type = types[element.type] || element.type
236 | const h = this.bpmnRenderer.handlers[type];
237 |
238 | return h(parentNode, element);
239 | }
240 | ```
241 |
242 | 使用了它底层的handlers,它预定义了基本的类型,我这里做了一个转换
243 |
244 |
245 |
246 | ### 13
247 |
248 | 
249 |
250 | $inject的问题
251 |
252 | https://segmentfault.com/a/1190000020723731?utm_source=tag-newest
253 |
254 |
255 |
256 | ### 14
257 |
258 | 
259 |
260 |
261 |
262 | 
263 |
264 | 
265 |
266 | 
267 |
268 |
269 |
270 |
271 |
272 | ### 15
273 |
274 | ```javascript
275 | this.bpmnModeler.getDefinitions().rootElements[0]
276 | ```
277 |
278 |
--------------------------------------------------------------------------------
/LinDaiDai/全网最详bpmn.js教材-Color篇.md:
--------------------------------------------------------------------------------
1 | ## 前言
2 |
3 | > Q: bpmn.js是什么? 🤔️
4 |
5 | [bpmn.js](https://bpmn.io/)是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成.
6 |
7 | > Q: 我为什么要写该系列的教材? 🤔️
8 |
9 | 因为公司业务的需要因而要在项目中使用到`bpmn.js`,但是由于`bpmn.js`的开发者是国外友人, 因此国内对这方面的教材很少, 也没有详细的文档. 所以很多使用方式很多坑都得自己去找.在将其琢磨完之后, 决定写一系列关于它的教材来帮助更多`bpmn.js`的使用者或者是期于找到一种好的绘制流程图的开发者. 同时也是自己对其的一种巩固.
10 |
11 | 首先先说明一点吧,`bpmn.js`主要是为画工作流做规则引擎用的,所以如果您的工作中并不涉及到这一块的话可以不用浪费时间阅读本篇文章。当然如果您为此感兴趣的话可以移步[bpmn-chinese-document](https://github.com/LinDaiDai/bpmn-chinese-document)看看它的介绍,如果你对它不感兴趣对我感兴趣的话可以移步我的个人博客[niubility-coding-js](https://github.com/LinDaiDai/niubility-coding-js) (好惨没一个Star)😄。
12 |
13 | 由于是系列的文章, 所以更新的可能会比较频繁, **您要是无意间刷到了且不是您所需要的还请谅解**😊.
14 |
15 | 求赞👍求心❤️. 更希望能对你有一点小小的帮助.
16 |
17 | 完整目录及`GitHub`地址:[bpmn-chinese-document](https://github.com/LinDaiDai/bpmn-chinese-document)
18 |
19 | ## Color篇
20 |
21 | 很久没写`bpmn.js`系列的教材了...😄,写起来还是感觉挺亲切的。
22 |
23 | 这篇文章主要是介绍一下在`bpmn.js`中修改节点颜色的各种场景和方式,算是[bpmn.js交流群](https://juejin.im/post/5e15b149e51d45238744d3d0)群里的一个热门问点吧。另外文章中我会以几个常用类型的节点作为案例来进行讲解,比如`StartEvent、Task、EndEvent`这几种类型,其它类型的修改和案例中的大同小异,还请自行扩展。
24 |
25 | 因为我一直相信`授人予鱼不如授人予渔`,这才是一篇教程真正能带给你的东西。我们在实际开发中肯定会遇到各种各样不同的需求,不可能每篇教程都能刚好符合你的业务要求,所以我能做的只是保证你能有一定的`bpmn.js`使用基础并在此基础上有自己的思考。
26 |
27 | 好了话不多说咯,来看看,通过阅读你可以学习到:
28 |
29 | - 修改`palette`左侧工具栏中的节点颜色
30 | - 修改`renderer`渲染在页面上的节点颜色
31 | - 修改`contextPad`上的节点颜色
32 | - 在渲染完成之后用户手动触发修改节点颜色
33 |
34 | 来几张张效果图看看:
35 |
36 | 
37 |
38 | (这狗血的画质...)
39 |
40 | 
41 |
42 | 
43 |
44 | 因为内容不多,所以就没有另起一个案例项目。
45 |
46 | 以下所有案例都整理在[bpmn-properties-panel](https://github.com/LinDaiDai/bpmn-vue-properties-panel)里面。`Color`篇的展示主要是在`custom-color`这个页面下,代码是放在`components/custom-color.vue`中。
47 |
48 |
49 |
50 | ## 修改`palette`左侧工具栏中的节点颜色
51 |
52 | 左侧工具栏修改节点颜色很简单,只需要找到对应节点的类名在`css`中修改就可以了。
53 |
54 | 例如我修改了案例中的开始节点。
55 |
56 | 1. 找到开始节点的类名
57 |
58 | 
59 |
60 | 2. 在一个全局样式中修改它
61 |
62 | 如果你和我一样不想要所有的`palette`都被修改颜色,可以指定某一个页面下进行修改,方式是给你生成`bpmn`图的容器添加一个类名:
63 |
64 | `custom-color.vue`
65 |
66 | ```vue
67 |
70 | ```
71 |
72 | 例如我这里只修改`custom-color`页面中的`palette`
73 |
74 | 
75 |
76 | 给它加上`bpmn-color`这个类名。
77 |
78 | 然后在全局的`/styles/bpmn-custom-color.css`中修改类的样式:
79 |
80 | ```css
81 | .bpmn-color .bpmn-icon-start-event-none:before {
82 | color: #12c2e9;
83 | }
84 | .bpmn-color .bpmn-icon-task:before {
85 | color: #c471ed;
86 | }
87 | .bpmn-color .bpmn-icon-end-event-none:before {
88 | color: #f64f59;
89 | }
90 | ```
91 |
92 |
93 |
94 | 3. 将自定义的样式引入到`main.js`中
95 |
96 | 最后一步就是要把我们自定义的样式引入到`main.js`里,这里有一个要注意的就是自定义的样式要放在`bpmn.js`自带的样式下面:
97 |
98 | `main.js`
99 |
100 | ```javascript
101 | import Vue from 'vue'
102 |
103 | import 'bpmn-js/dist/assets/diagram-js.css' // 左边工具栏以及编辑节点的样式
104 | import './styles/bpmn-custom-color.css' // 自定义样式
105 | ```
106 |
107 | 现在保存打开页面就可以看到效果了。
108 |
109 | 
110 |
111 | 不过这个只能修改图像边框的颜色,因为这个图像本质就是一个`icon`字体,所以可以用`color`这个属性来控制字体的颜色。而字体颜色的范围是由这个`icon`图像本身决定的,也就是说如果这个字体它本身就是个圆环,那`color`也就只能修改它的圆边框;如果这个字体本身就是个完整的圆,那`color`肯定也就能修改整个圆了。
112 |
113 |
114 |
115 | ## 修改`renderer`渲染在页面上的节点颜色
116 |
117 | 光有左侧工具栏的修改还不够,最主要的是要渲染的时候能修改为自己想要的颜色。
118 |
119 | 例如你的需求可能是在进行初始化的时候,就需要根据节点的类型来将节点修改为不同的颜色。
120 |
121 | 比如`StartEvent`修改为红色,`Task`修改为蓝色等等。
122 |
123 | 这时候我们需要用到之前在[自定义renderer篇]()中提到过的「在默认的Renderer基础上修改」。对`renderer`不懂的小伙伴一定要先阅读自定义renderer篇才行。
124 |
125 | 在此我假设你已经完全了解了`renderer`。
126 |
127 | 那么我们知道一个元素能否成功在页面上渲染,关键的代码就是在`CustomRenderer`中重写`drawShape`这个方法。
128 |
129 | 而这个方法其实依赖的是这段代码:
130 |
131 | ```javascript
132 | //CustomRenderer.js
133 |
134 | drawShape(parentNode, element) {
135 | let shape = this.bpmnRenderer.drawShape(parentNode, element)
136 | return shape
137 | }
138 | ```
139 |
140 | 也就是说是靠`this.bpmnRenderer.drawShape`这个方法将`element`对象转换为一个`svg`形式的节点。
141 |
142 | 最开始我的想法是在转换之前使用`modeling.setColor`方法来修改`element`的相应样式:
143 |
144 | ```javascript
145 | //CustomRenderer.js
146 |
147 | drawShape(parentNode, element) {
148 | modeling.setColor(element, {
149 | fill: null,
150 | stroke: color
151 | })
152 | let shape = this.bpmnRenderer.drawShape(parentNode, element)
153 | return shape
154 | }
155 | ```
156 |
157 | 但这种方式失败了,打开控制台报了一堆的红色错误,大致就是进入了死循环,浏览器爆栈了。
158 |
159 | 想了一下其实也好理解,`renderer`的作用本就是将`element`进行渲染,但是在这个阶段你又用`setColor`去修改`element`的这个属性,那这样肯定就会造成递归循环渲染,所以这种做法被我否定了。
160 |
161 | 之后我想了一下,使用`drawShape`方法产生的东西会是什么呢?带着好奇我把生成的`shape`打印出来看了一下,发现他就是一个`DOM`元素:
162 |
163 | ```javascript
164 | // StartEvent
165 |
166 |
167 | // TaskEvent
168 |
169 | ```
170 |
171 | 既然是`DOM`元素那可就简单了,只需要用修改`DOM`元素样式的方法来处理就可以了。
172 |
173 | 所以其实你可以这样做:
174 |
175 | ```javascript
176 | //CustomRenderer.js
177 |
178 | drawShape(parentNode, element) {
179 | let shape = this.bpmnRenderer.drawShape(parentNode, element)
180 | shape.style.setProperty('fill', 'red')
181 | return shape
182 | }
183 | ```
184 |
185 | 在生成`shape`之后使用`style.setProperty`方法修改想要修改的属性就可以了。
186 |
187 | 在一个`shape`中,主要是有这么几种属性可以供我们修改:
188 |
189 | - `fill`:元素的填充色
190 | - `stroke`:元素的边框颜色
191 | - `strokenWidth`:元素边框的宽度
192 |
193 | 为了方便管理和配置我在`CustomRenderer.js`中定义了一个配置项,另外封装了一个`setShapeProperties`方法专门用来处理节点颜色的问题,核心代码就这么些:
194 |
195 | ```javascript
196 | const propertiesConfig = {
197 | 'bpmn:StartEvent': {
198 | fill: '#12c2e9'
199 | },
200 | 'bpmn:Task': {
201 | stroke: '#c471ed',
202 | strokeWidth: 2,
203 | },
204 | 'bpmn:EndEvent': {
205 | stroke: '#f64f59',
206 | fill: '#f64f59'
207 | }
208 | }
209 |
210 | export default class CustomRenderer extends BaseRenderer {
211 | drawShape(parentNode, element) {
212 | let shape = this.bpmnRenderer.drawShape(parentNode, element)
213 | setShapeProperties(shape, element)
214 | return shape
215 | }
216 | }
217 |
218 | function setShapeProperties (shape, element) {
219 | const type = element.type // 获取到的类型
220 | if (propertiesConfig[type]) {
221 | const properties = propertiesConfig[type]
222 | Object.keys(properties).forEach(prop => {
223 | shape.style.setProperty(prop, properties[prop])
224 | })
225 | }
226 | }
227 | ```
228 |
229 | 通过`PropertiesConfig[type]`判断有没有要自定义的元素,有的话就走`if`判断里。
230 |
231 | `Object.keys()` 方法其实就是获取某个对象下的所有属性名称,比如:
232 |
233 | ```javascript
234 | var obj = { a: 1, b: 2 }
235 | console.log(Object.keys(obj)) // ['a', 'b']
236 | ```
237 |
238 | 这个写前端的可能都知道,主要是怕后台人员不了解所以提一嘴。
239 |
240 |
241 |
242 | 现在保存刷新页面后就可以看到效果了 😊:
243 |
244 | 
245 |
246 |
247 |
248 | ## 修改`contextPad`上的节点颜色
249 |
250 | `contextPad`上的节点颜色,事实上和修改`palette`是一样的。因为它们共用了一个`className`。因此如果你改了`palette`上的样式,`contextPad`上的也会被修改。
251 |
252 |
253 |
254 |
255 |
256 | ## 在渲染完成之后用户手动触发修改节点颜色
257 |
258 | 这个功能的主要作用是说,在渲染成功之后,可能需要用户手动去修改某个节点的颜色。
259 |
260 | 额...这其实在[全网最详bpmn.js教材-poperties-panel篇(下)](./全网最详bpmn.js教材-poperties-panel篇(下).md)中也说到过了吧,核心方法就是用使用`modeling.setColor()`方法去修改。
261 |
262 | ```javascript
263 | const modeling = this.modeler.get('modeling')
264 | modeling.setColor(element, {
265 | fill: 'blue',
266 | stroke: 'red'
267 | })
268 | ```
269 |
270 | 在此不再重复说了 😁。
271 |
272 |
273 |
274 | 另外我在官网也发现了有关于`colors`的案例,它主要是能配合`xml`标签上的属性来进行相应颜色的修改,有兴趣的小伙伴可以看一下:
275 |
276 | [bpmn-js colors](https://github.com/bpmn-io/bpmn-js-examples/tree/master/colors)
277 |
278 | [bpmn-js-task-priorities](https://github.com/bpmn-io/bpmn-js-task-priorities)
279 |
280 |
281 |
282 | ## 后语
283 |
284 | 从`2019年12月10日`最开始写此教材到现在已经四个月了,`bpmn.js交流群`也从最开始的`3,4`个人扩展到了现在的`200`人,还是挺欣慰的。
285 |
286 | 也很感谢群里的一些小伙伴能热心的为新来的小伙伴解答问题提供帮助,我在此代接受过帮助的小伙伴谢谢大家!
287 |
288 | 不过也希望能有更多的小伙伴能积极的参与到[bpmn-chinese-document](https://github.com/LinDaiDai/bpmn-chinese-document)的项目中来,也算是为国内`bpmn.js`的社区贡献一份力吧💪。
289 |
290 | 最后还请能给[bpmn-chinese-document](https://github.com/LinDaiDai/bpmn-chinese-document)一个`Star`🌟,编写整理都不易,感谢🙏。
291 |
292 |
--------------------------------------------------------------------------------
/LinDaiDai/全网最详bpmn.js教材-事件篇.md:
--------------------------------------------------------------------------------
1 | ## 前言
2 | > Q: bpmn.js是什么? 🤔️
3 |
4 | [bpmn.js](https://bpmn.io/)是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成.
5 |
6 | > Q: 我为什么要写该系列的教材? 🤔️
7 |
8 | 因为公司业务的需要因而要在项目中使用到`bpmn.js`,但是由于`bpmn.js`的开发者是国外友人, 因此国内对这方面的教材很少, 也没有详细的文档. 所以很多使用方式很多坑都得自己去找.在将其琢磨完之后, 决定写一系列关于它的教材来帮助更多`bpmn.js`的使用者或者是期于找到一种好的绘制流程图的开发者. 同时也是自己对其的一种巩固.
9 |
10 | 由于是系列的文章, 所以更新的可能会比较频繁, **您要是无意间刷到了且不是您所需要的还请谅解**😊.
11 |
12 | 不求赞👍不求心❤️. 只希望能对你有一点小小的帮助.
13 |
14 | ## 事件篇
15 |
16 | 上一章节我们介绍了利用`bpmn.js`与后台进行交互, 要是对`bpmn.js`不了解的小伙请移步:
17 |
18 | [《全网最详bpmn.js教材-http请求篇》](https://juejin.im/post/5def468c6fb9a01622778a03)
19 |
20 | 这一章节要讲解是关于`bpmn.js`的一些事件, 通过学习此章节你可以学习到:
21 |
22 | - [监听modeler并绑定事件](#监听modeler并绑定事件)
23 | - [监听element并绑定事件](#监听element并绑定事件)
24 | - [通过监听事件判断操作方式](#通过监听事件判断操作方式)
25 |
26 |
27 |
28 | ### 监听modeler并绑定事件
29 |
30 | 很多时候你期望的是在用户在进行不同操作的时候能够监听到他操作的是什么, 从而做想要做的事情.
31 |
32 | 是进行了`shape`的新增还是进行了线的新增.
33 |
34 | 比如如下的一些监听事件:
35 |
36 | - shape.added 新增一个`shape`之后触发;
37 | - shape.move.end 移动完一个`shape`之后触发;
38 | - shape.removed 删除一个`shape`之后触发;
39 |
40 |
41 |
42 | 继续在项目案例[bpmn-vue-basic](https://github.com/LinDaiDai/bpmn-vue-basic)的基础上创建一个`event.vue`文件:
43 |
44 | 并在`success()`函数中添加上监听事件的函数:
45 |
46 | ```vue
47 | // event.vue
48 |
110 | ```
111 |
112 | 配置好`addEventBusListener()`函数后, 在进行元素的点击、新增、移动、删除的时候都能监听到了.
113 |
114 | 但是有一点很不好, 你在点击“画布”的时候, 也就是**根元素**也可能会触发此事件, 我们一般都不希望此时会触发, 因此我们可以在`on`回调中添加一些判断, 来避免掉不需要的情况:
115 |
116 | ```javascript
117 | eventBus.on(eventType, function(e) {
118 | if (!e || e.element.type == 'bpmn:Process') return // 这里我的根元素是bpmn:Process
119 | console.log(e)
120 | })
121 | ```
122 |
123 | 此时我们可以把监听到返回的节点信息打印出来看看:
124 |
125 | 
126 |
127 |
128 |
129 | 如上图, 它会打印出该节点的`Shape`信息和`DOM`信息等, 但我们可能只关注于`Shape`信息(也就是该节点的`id、type`等等信息), 此时我们可以使用`elementRegistry`来获取`Shape`信息:
130 |
131 | ```javascript
132 | eventBus.on(eventType, function(e) {
133 | if (!e || e.element.type == 'bpmn:Process') return // 这里我的根元素是bpmn:Process
134 | console.log(e)
135 | var elementRegistry = this.bpmnModeler.get('elementRegistry')
136 | var shape = elementRegistry.get(e.element.id) // 传递id进去
137 | console.log(shape) // {Shape}
138 | console.log(e.element) // {Shape}
139 | console.log(JSON.stringify(shape)===JSON.stringify(e.element)) // true
140 | })
141 |
142 | ```
143 |
144 | 或者你也可以直接就用`e.element`获取到`Shape`的信息, 我比较了一下它们两是一样的. 但是官方是推荐使用`elementRegistry`的方式.
145 |
146 |
147 |
148 | ### 通过监听事件判断操作方式
149 |
150 | 上面我们已经介绍了`modeler`和`element`的监听绑定方式, 在事件应用中, 你更多的需要知道用户要进行什么操作, 好写对应的业务逻辑.
151 |
152 | 这里我就以我工作中要用到的场景为案例进行讲解.
153 |
154 | - 新增了shape
155 | - 新增了线(connection)
156 | - 删除了shape和connection
157 | - 移动了shape和线
158 |
159 | ```javascript
160 | // event.vue
161 | ...
162 | success () {
163 | this.addModelerListener()
164 | this.addEventBusListener()
165 | },
166 | // 添加绑定事件
167 | addBpmnListener () {
168 | const that = this
169 | // 获取a标签dom节点
170 | const downloadLink = this.$refs.saveDiagram
171 | const downloadSvgLink = this.$refs.saveSvg
172 | // 给图绑定事件,当图有发生改变就会触发这个事件
173 | this.bpmnModeler.on('commandStack.changed', function () {
174 | that.saveSVG(function(err, svg) {
175 | that.setEncoded(downloadSvgLink, 'diagram.svg', err ? null : svg)
176 | })
177 | that.saveDiagram(function(err, xml) {
178 | that.setEncoded(downloadLink, 'diagram.bpmn', err ? null : xml)
179 | })
180 | })
181 | },
182 | addModelerListener() {
183 | // 监听 modeler
184 | const bpmnjs = this.bpmnModeler
185 | const that = this
186 | // 'shape.removed', 'connect.end', 'connect.move'
187 | const events = ['shape.added', 'shape.move.end', 'shape.removed']
188 | events.forEach(function(event) {
189 | that.bpmnModeler.on(event, e => {
190 | var elementRegistry = bpmnjs.get('elementRegistry')
191 | var shape = e.element ? elementRegistry.get(e.element.id) : e.shape
192 | // console.log(shape)
193 | if (event === 'shape.added') {
194 | console.log('新增了shape')
195 | } else if (event === 'shape.move.end') {
196 | console.log('移动了shape')
197 | } else if (event === 'shape.removed') {
198 | console.log('删除了shape')
199 | }
200 | })
201 | })
202 | },
203 | addEventBusListener() {
204 | // 监听 element
205 | let that = this
206 | const eventBus = this.bpmnModeler.get('eventBus')
207 | const eventTypes = ['element.click', 'element.changed']
208 | eventTypes.forEach(function(eventType) {
209 | eventBus.on(eventType, function(e) {
210 | if (!e || e.element.type == 'bpmn:Process') return
211 | if (eventType === 'element.changed') {
212 | that.elementChanged(eventType, e)
213 | } else if (eventType === 'element.click') {
214 | console.log('点击了element')
215 | }
216 | })
217 | })
218 | },
219 | elementChanged(eventType, e) {
220 | var shape = this.getShape(e.element.id)
221 | if (!shape) {
222 | // 若是shape为null则表示删除, 无论是shape还是connect删除都调用此处
223 | console.log('无效的shape')
224 | // 由于上面已经用 shape.removed 检测了shape的删除, 因此这里只判断是否是线
225 | if (this.isSequenceFlow(shape.type)) {
226 | console.log('删除了线')
227 | }
228 | }
229 | if (!this.isInvalid(shape.type)) {
230 | if (this.isSequenceFlow(shape.type)) {
231 | console.log('改变了线')
232 | }
233 | }
234 | },
235 | getShape(id) {
236 | var elementRegistry = this.bpmnModeler.get('elementRegistry')
237 | return elementRegistry.get(id)
238 | },
239 | isInvalid (param) { // 判断是否是无效的值
240 | return param === null || param === undefined || param === ''
241 | },
242 | isSequenceFlow (type) { // 判断是否是线
243 | return type === 'bpmn:SequenceFlow'
244 | }
245 | ```
246 |
247 | 案例Git地址: [LinDaiDai-bpmn.js案例event.vue](https://github.com/LinDaiDai/bpmn-vue-basic/blob/master/src/components/event.vue) 喜欢的小伙伴请给个`Star`🌟呀, 谢谢😊
248 |
249 |
250 | ### 后语
251 |
252 | 系列全部目录请查看此处: [《全网最详bpmn.js教材目录》](https://github.com/LinDaiDai/bpmn-chinese-document/blob/master/directory.md)
253 |
254 | 最后, 如果你也对`bpmn.js` 感兴趣可以进我们的bpmn.js交流群👇👇👇, 共同学习, 共同进步.
255 |
256 | 关注**霖呆呆(LinDaiDai)的公众号**, 选择 **其它** 菜单中的 **bpmn.js群** 即可😊.
257 |
258 | 
259 |
260 |
--------------------------------------------------------------------------------
/LinDaiDai/全网最详bpmn.js教材-http请求篇.md:
--------------------------------------------------------------------------------
1 | ## http请求篇
2 |
3 | 上一章节我们介绍了`bpmn.js`的一些基础知识点以及介绍了在`vue`是如何使用的, 要是对`bpmn.js`不了解的小伙请移步:
4 |
5 | 这一章节主要讲解的是关于`bpmn.js`如何与后台进行交互的问题, 通过学习此章节你可以学习到:
6 |
7 | [通过http请求获取数据并渲染](#通过http请求获取数据并渲染)
8 |
9 | [将编辑之后的最新bpmn发送给后台](将编辑之后的最新bpmn发送给后台)
10 |
11 | [编辑完保存为bpmn文件或svg文件](编辑完保存为bpmn文件或svg文件)
12 |
13 | ### 通过http请求获取数据并渲染
14 |
15 | 在之前的案例中使用的一直都是本地写死的一个`xml`字符串, 那么实际使用上肯定不会以这种方式.
16 |
17 | 我们团队现在采用的做法是:
18 |
19 | - 前端发起请求, 获取到一个`bpmn`文件的地址
20 | - 拿到地址之后, 使用`axios`请求这个地址得到`xml`的字符串(这里命名为`bpmnXmlStr`)
21 | - 使用`importXML`方法将字符串转化为图形并渲染.
22 |
23 | 为了模拟上面的执行环境我接着上一章节的项目案例[bpmn-vue-basic](https://github.com/LinDaiDai/bpmn-vue-basic)在components文件夹下创建一个`axios.vue`的 文件并配置好路由:
24 |
25 | ```javascript
26 | const routes = [
27 | ...
28 | {
29 | path: '/axios',
30 | component: () => import('./../components/axios')
31 | }
32 | ]
33 | ```
34 |
35 | 同时在项目中安装`axios`以用于前端发送`http`请求:
36 |
37 | ```javascript
38 | npm i axios --save-D
39 | ```
40 |
41 | 首先在`HTML`代码中作出一个`loading`的效果, 用户前端在获取到`xml`之前的一个展示:
42 |
43 | ```vue
44 | // axios.vue
45 |
46 |
47 |
48 | Loading...
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | ```
57 |
58 | 然后在`js`中引入`axios`并定义一个`getXmlUrl`方法模拟获取`bpmn`文件地址:
59 |
60 | ```vue
61 | // axios.vue
62 |
136 | ```
137 |
138 | 你可以直接用我在案例中模拟获取地址的那个路径:
139 |
140 | [https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/bpmnMock.bpmn](https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/bpmnMock.bpmn)
141 |
142 | 案例Git地址: [LinDaiDai-bpmn.js测试案例axios.vue](https://github.com/LinDaiDai/bpmn-vue-basic/blob/master/src/components/axios.vue)
143 |
144 |
145 |
146 | ### 将编辑之后的最新bpmn发送给后台
147 |
148 | 上面我们介绍了如何从后台那里拿到数据并渲染到页面上, 但这样是不够的.
149 |
150 | 可能你需要将编辑之后的最新`bpmn`存储到后台.
151 |
152 | 该功能就涉及到了`bpmn.js`中的事件绑定, 也就是前端需要给图形绑定一个事件来检测到图形的改变, 并获取到最新的`xml` 信息.
153 |
154 | 新建一个`save.vue`文件并将`axios.vue`里的内容复制进来.
155 |
156 | 在`success()`方法中添加一个`addBpmnListener()`绑定事件的方法:
157 |
158 | ```vue
159 | // save.vue
160 |
183 |
184 | ```
185 |
186 | 如图所示:
187 |
188 | 
189 |
190 | 案例Git地址: [LinDaiDai-bpmn.js测试案例save.vue](https://github.com/LinDaiDai/bpmn-vue-basic/blob/master/src/components/save.vue)
191 |
192 |
193 |
194 | ### 编辑完保存为bpmn文件或svg文件
195 |
196 | 在上面我们监听`commandStack.changed`事件就能实时获取到最新的`xml`信息.
197 |
198 | 拿到这些信息之后你可以选择在每次图形改变的时候就请求给后台传递给他们最新的`xml`;
199 |
200 | 也可以选择将其保存到一个变量中, 然后在页面中给一个保存按钮, 当点击按钮的时候再传递给后台.
201 |
202 | 或许你可能完全不需要再请求给后台, 而是希望本地就能够下载为`bpmn`文件或者`svg`文件.
203 |
204 | 在上面`save.vue`案例的基础上增加两个保存按钮:
205 |
206 | 
207 |
208 |
209 |
210 | 然后修改`HTML`代码:
211 |
212 | ```vue
213 | // save.vue
214 |
215 | ...
216 |
224 |
225 | ```
226 |
227 | 在`js`代码中加上:
228 |
229 | ```vue
230 | // save.vue
231 |
275 | ```
276 |
277 | 案例Git地址: [LinDaiDai-bpmn.js测试案例save.vue](https://github.com/LinDaiDai/bpmn-vue-basic/blob/master/src/components/save.vue) 喜欢的小伙伴请给个`Star`🌟呀, 谢谢😊
278 |
279 |
280 |
281 | ## 后语
282 |
283 | 系列全部目录请查看此处: [《全网最详bpmn.js教材目录》](https://github.com/LinDaiDai/bpmn-chinese-document/blob/master/directory.md)
284 |
285 | 最后, 如果你也对`bpmn.js` 感兴趣可以进我们的bpmn.js交流群👇👇👇, 共同学习, 共同进步.
286 |
287 | 关注霖呆呆的公众号, 选择“其它”菜单中的“bpmn.js群”即可😊.
288 |
289 | 
290 |
291 |
--------------------------------------------------------------------------------
/LinDaiDai/全网最详bpmn.js教材-编辑、删除节点篇.md:
--------------------------------------------------------------------------------
1 | ## 前言
2 | > Q: bpmn.js是什么? 🤔️
3 |
4 | [bpmn.js](https://bpmn.io/)是一个BPMN2.0渲染工具包和web建模器, 使得画流程图的功能在前端来完成.
5 |
6 | > Q: 我为什么要写该系列的教材? 🤔️
7 |
8 | 因为公司业务的需要因而要在项目中使用到`bpmn.js`,但是由于`bpmn.js`的开发者是国外友人, 因此国内对这方面的教材很少, 也没有详细的文档. 所以很多使用方式很多坑都得自己去找.在将其琢磨完之后, 决定写一系列关于它的教材来帮助更多`bpmn.js`的使用者或者是期于找到一种好的绘制流程图的开发者. 同时也是自己对其的一种巩固.
9 |
10 | 由于是系列的文章, 所以更新的可能会比较频繁, **您要是无意间刷到了且不是您所需要的还请谅解**😊.
11 |
12 | 不求赞👍不求心❤️. 只希望能对你有一点小小的帮助.
13 |
14 | ## 编辑、删除节点篇
15 |
16 | 虽然前面已经说了很多关于如何创建, 渲染元素的知识, 但是在实际使用上肯定不仅仅只局限于创建`Task`、 `Event`这些节点上.
17 |
18 | 你可能还需要创建: **线(`bpmn:SequenceFlow`)、网关(`ExclusiveGateway`)、活动(`Activities`)** 等等其他类型的节点.
19 |
20 | 甚至你想要在`contextPad`中定义一个删除、编辑节点的功能.
21 |
22 | 那么这一章节我们主要就是来讲解这些.
23 |
24 | 通过阅读你可以学习到:
25 |
26 | - [`contextPad`上的删除功能](`contextPad`上的删除功能)
27 | - [`contextPad`上的编辑功能](`contextPad`上的编辑功能)
28 |
29 | ## `contextPad`上的删除功能
30 |
31 | 让我们接着上个章节的案例进行讲解哈, 项目还是之前的项目[LinDaiDai/bpmn-vue-custom](https://github.com/LinDaiDai/bpmn-vue-custom)
32 |
33 | 想要实现的功能是: 在`contextPad`中加上一个删除功能(这里加上一个小垃圾桶):
34 |
35 | 
36 |
37 | 并且点击它的时候可以删除当前的节点...
38 |
39 | 让我们打开`CustomContextPad.js`文件或者`CustomContextPadProvider.js`文件, 然后在`getContextPadEntries`方法中加上以下代码:
40 |
41 | ```javascript
42 | // CustomContextPad.js
43 | getContextPadEntries(element) {
44 | const { modeling } = this // modeling需要利用CustomContextPad.$inject注册进来
45 | function removeElement(e) { // 点击的时候实现删除功能
46 | modeling.removeElements([element])
47 | }
48 | function deleteElement() { // 创建垃圾桶
49 | return {
50 | group: 'edit',
51 | className: 'icon-custom icon-custom-delete',
52 | title: translate('删除'),
53 | action: {
54 | click: removeElement
55 | }
56 | }
57 | }
58 | return {
59 | 'append.lindaidai-task': {...},
60 | 'delete': deleteElement() // 返回值加上删除的功能
61 | }
62 | }
63 | ```
64 | 可以看到要点就是:
65 |
66 | - 将`modeling`引进来, 因为要使用到它的`removeElements`方法;
67 | - 定义绘制垃圾桶的功能
68 | - 编写`className`来实现修改默认样式的功能
69 |
70 | OK👌, 接下来别忘了在我们的`app.css`中加上垃圾桶的样式:
71 | ```css
72 | /* app.css*/
73 | .icon-custom-delete {
74 | background-image: url('https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/delete.png');
75 | }
76 |
77 | .djs-context-pad .icon-custom-delete.entry:hover {
78 | background: url('https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/delete.png') center no-repeat!important;
79 | background-size: cover!important;
80 | }
81 | ```
82 |
83 | (自定义`modeler`中的`CustomContextPadProvider.js`也是这么写的)
84 |
85 | 这样删除功能就实现了.
86 |
87 | ## `contextPad`上的编辑功能
88 |
89 | 其实这里说的编辑功能, 是指在`contextPad`上定一个编辑的图标, 然后点击的时候, 可以出现一个弹窗, 或者右边出现一个自定义的`properties-panel`, 然后这里面可以显示出节点的一些信息.
90 |
91 | 这么做的原因是:
92 |
93 | - 你期望的可能不是点击节点的时候右边出现`properties-panel`, 而是将`properties-panel`作为一个抽屉隐藏在右侧, 点击`contextPad`中的某个图标才从右侧出来.
94 | - 点击`contextPad`中的某个图标获取到当前节点的节点信息然后做其他自定义的操作.
95 |
96 | ### 通过点击小图标获取节点信息
97 |
98 | 
99 |
100 | 如上图, 先实现这个功能: 点击编辑图标, 将节点信息打印出来.
101 |
102 | 其实也很简单, 经过了`lindaidi-task`和`delete`之后, 我相信你也掌握了一些规律了.
103 |
104 | 反正要创建什么图标就往`getContextPadEntries`的返回值加就可以了:
105 |
106 | ```javascript
107 | // CustomContextPad.js
108 | getContextPadEntries(element) {
109 | function clickElement(e) {
110 | console.log(element)
111 | }
112 | function editElement() { // 创建编辑图标
113 | return {
114 | group: 'edit',
115 | className: 'icon-custom icon-custom-edit',
116 | title: translate('编辑'),
117 | action: {
118 | click: clickElement
119 | }
120 | }
121 | }
122 | return {
123 | 'append.lindaidai-task': {...},
124 | 'edit': editElement(), // 返回值加上编辑功能
125 | 'delete': deleteElement() // 返回值加上删除的功能
126 | }
127 | }
128 | ```
129 | 然后记得在`app.css`中加上`.icon-custom-edit`的样式, 这里就不贴代码了.
130 |
131 | ### 将节点的信息传递出去
132 |
133 | 其实我们会发现, 通过点击小图标获取到节点信息很容易就实现了, 但是如何将在`CustomContextPad.js`中的信息传递出去呢, 也就是我们在页面上该怎么拿到这个信息呢?
134 |
135 | 比如我想实现: **点击上面👆所说的编辑小图标, 然后出现这么一个弹窗, 显示出节点的相关信息**:
136 |
137 | 
138 |
139 | (由于没有引入任何的`UI`组件, 所以随手写了一些样式)
140 |
141 | 哈哈😄, 方法其实也有很多种:
142 |
143 | - 前端本地存储`localStorage`
144 | - `vue`的`vuex`
145 | - `react`的`redux`
146 |
147 | 以上技术都可以实现...
148 |
149 | 由于项目是用`vue`开发的, 所以这里我就演示一下利用`vuex`来进行交互😄.
150 |
151 | 首先在我们的项目里安装上`vuex`:
152 | ```
153 | $ npm i vuex --save-D
154 | ```
155 | 然后在`src`目录下创建好一个`store`文件夹用来存放它, 并记得在`main.js`用进行引用:
156 | ```javascript
157 | // main.js
158 | import store from './store'
159 | ...
160 | new Vue({
161 | ...
162 | store,
163 | render: h => h(App),
164 | }).$mount('#app')
165 | ```
166 | 让我们在`store`中创建一个叫做`bpmn`模块, 专门用来定义`bpmn`相关的存储. 然后在其中定义:
167 | 1. `nodeInfo