oryx 分离&集成
公司需要用到在线的流程编辑器,我研究了下activiti,activiti-explorer 是一个 web流程编辑工具,根据我了解到的情况。 activiti-explorer web流程编辑工具 是和activiti 紧密结合到一起了的。 activiti-explorer 前端使用了 angular , 流程编辑部分底层使用了 oryx。 原本 oryx 后面发展成Signavio。 或者说 Oryx就是Signavio Core Components project开源版和Signavio Process Editor商业版的蓝图。 oryx 本身是一套js 的svg绘图工具。发现oryx 是还不错。 不过里面的代码和后端耦合到了一起,实在有些郁闷了。 后面我研究了几个版本的activiti-explorer,渐渐搞明白了 oryx 是怎么和后台交互的了。其实早期版本activiti-explorer并没有用到angular。没有使用 angular的话,复杂度减少很多。 我很快完成了oryx 和后端代码的分离———— 当然,我是修改了源码。虽然已经完成 oryx 的前后端分离, 但是因为oryx 中存在一些静态资源的请求,故oryx.rar 还是需要解压然后部署到 web 容器中才能 运行。 但是, 它不会涉及任何后端代码。
1. 集成配置
1.1. 简单集成:
将oryx.zip 放置到项目中webapp目录下。解压,在项目相关的html 文件中的head部分引入oryx 相关的js、css等。 如其中 view/new.html所示, 同时需要确保这些资源都能够访问。 然后在需要oryx的地方嵌入:
<div id="oryx_canvas" ></div>
oryx_canvas 是canvas的ID,不可更改。这样, 我们就已经将oryx嵌入到了我们页面的 div中了。
../explorer/src/img/signavio/smoky/logo2.png 是顶部图标
// Ext.onReady(Signavio.Helper.ShowMask); 可以控制是否进行加载阶段:
其中图标为 ../explorer/src/img/signavio/smoky/logo.png
1.2. 配置:
目前,oryx相关的配置全部写死在oryx.debug.js中:
如图所示, 主要的配置有:
ORYX.CONFIG.PANEL_LEFT_WIDTH = 250; // 左部Panel的宽度
ORYX.CONFIG.PANEL_RIGHT_WIDTH = 300; // 右部Panel的宽度
ORYX.CONFIG.WINDOW_HEIGHT = 700; // 中部画布窗口的高度,也是左部右部Panel的高度
ORYX.CONFIG.CANVAS_WIDTH = 1485; // 中部画布的宽度,注意它不同于窗口的宽度
ORYX.CONFIG.CANVAS_HEIGHT = 1050;// 中部画布的高度,注意它不同于窗口的高度
... 还有很多的配置待研究!!
左部Panel 的所有菜单都是根据stencilset.js 动态加载的,因此我们需要熟悉stencilset.js的结构。stencilset 的大致结构是:
var stencilset_jsonObject = {
"title" : "Hi ORXY",
"namespace" : "http://b3mn.org/stencilset/bpmn2.0#",
"description" : "This is the BPMN 2.0 stencil set specification.",
"propertyPackages" :[ {“name”:“xx”, “properties”: [{id:xx, type:xx, title:xx, value:xx, description:xx , popular: xx, refToView:xx, items:xx }, ...]} ],
"stencils" : [ {“type”:“xx”, “id”: xx, “title”: xx, “description”: xx, “view”: xx, “icon”: xx, “groups”: xx, “mayBeRoot”: xx, “propertyPackages”: xx, “roles”: xx} ]
"rules" : {“ruleName”: [{“role”: roleName, “incomingEdges”: [{“role”: roleName, maximun: num}] }, {“role”: roleName, “outgoingEdges”: [{“role”: roleName, maximun: num}] }]
“ruleName2”: [xxx]
}
}
其中:
title, 显示在左部Panel 的菜单顶部
propertyPackages 定义了所有的属性及其数据结构。
stencils定义了所有的图形(也就是画布上的可视元素)及其数据结构。
rules定义了图形之间的所有可能拥有的关系
举例来说:
l propertyPackage 之 mailtaskbase :
{
"name" : "mailtaskbase",
"properties" : [ {
"id" : "mailtaskto",
"type" : "Text",
"title" : "To",
"value" : "",
"description" : "The recipients if the e-mail. Multiple recipients are defined in a comma-separated list.",
"popular" : true
}, {
"id" : "mailtaskfrom",
"type" : "Text",
"title" : "From",
"value" : "",
"description" : "The sender e-mail address. If not provided, the default configured from address is used.",
"popular" : true
}, {
"id" : "mailtasksubject",
"type" : "Text",
"title" : "Subject",
"value" : "",
"description" : "The subject of the e-mail.",
"popular" : true
}, {
....
} ]
}
如上:
mailtaskbase 定义了所有邮件任务的基本的共有属性集合,它包含了很多具体的邮件属性:
mailtaskto 收件人,数据类型为 text,页面的展现标题为To,默认值为空,描述为“..”
Mailtaskfrom发件人,数据类型为 text,页面的展现标题为From,默认值为空,描述为“..”
Mailtasksubject邮件的主题,数据类型为 text,页面的展现标题为Subject,默认值为空,描述为“..”
l stencils之 开始节点
{
"type" : "node",
"id" : "StartNoneEvent",
"title" : "开始",
"description" : "A start event without a specific trigger",
"view" : "startevent/none.svg",
"icon" : "startevent/none.png",
"propertyPackages" : [ "elementbase", "baseattributes", "formdefinition", "nonestarteventbase", "executionlistenersbase" ],
"roles" : [ "Startevents_all", "sequence_start", "StartEventsMorph", "all" ]
}
StartNoneEvent 是开始流程的图形节点,类型是节点,id 是StartNoneEvent, title 是开始,view 是startevent/none.svg, icon 是 startevent/none.png, propertyPackages 是其拥有的属性,(在画布中,点击StartNoneEvent 节点, 右边的属性Panel可以查看到其所有的属性)分别是[ "elementbase", "baseattributes", "formdefinition", "nonestarteventbase", "executionlistenersbase" ]
,roles 是它拥有的角色:["Startevents_all", "sequence_start", "StartEventsMorph", "all"]
l stencils之 ManualTask 节点
{
"type" : "node",
"id" : "ManualTask",
"title" : "手工任务",
"description" : "An automatic task with no logic",
"view" : "activity/manualtask.svg",
"icon" : "activity/list/type.manual.png",
"groups" : [ "业务规范" ],
"propertyPackages" : [ "elementbase", "baseattributes", "asynchronousbase", "executionlistenersbase", "loopcharacteristics", "activity" ],
"roles" : [ "sequence_start", "Activity", "sequence_end", "ActivitiesMorph", "all" ]
}
这是一个手工任务节点,需要注意的是groups字段,它实际表示一个二级菜单:“业务规范”
通过groups字段, 我们将我们的业务规则进行分组。 如果没有groups字段,那么,它会显示作为一级菜单。
l 4 rules 配置,
rules 表明了图形节点之间的可能的关系, 比如,哪些节点可以发出一根连线, 哪些节点不可以。哪些节点可以通过悬浮菜单创建怎么样的新节点等等。
2. 使用
Toolbar 提供了很多便利的操作:
这些操作都提供了键盘、方向键的操作。
2.1. 保存
可以将当然画布内容进行保存,保存可以选择xml 或者 json 格式转换。 然后, 发送Ajax 请求到后台, 当前默认的后台请求URL 是:
../service/model/" + params.id + "/save"
2.2. 加载(待完成)
如果要加载之前的json或xml, 可以在请求当前html时加入名为oryx_modelId 的query参数,
window.location.search.indexOf("oryx_modelId=")
那么其值就会被解析成流程图的 model ID,然后发送请求到后台,请求对应的json/xml, 然后解析它, 然后再把它在画布中展现为 流程图 。
"../service/model/" + modelMeta.modelId + "/json"
注意:
json或xml 格式必须符合 BPMN2 的流程规范。 也就是说, 我们需要在业务中解析的时候按需提取我们需要的内容, 但是和oryx 交互的时候必须提供BPMN2格式数据。
2.3. 待完成..
当前左部菜单需要按情况定制,其中分组、图标,默认值都需要不断完善:
右边的Panel 需要删除无用的属性,展现需要的属性,这个其实可以使用一些汉化包来完成。
双击画布节点,其text 文本框显示位置不对,这个是oryx早期版本的bug,后面其实已经修复了。
下载链接:
https://files.cnblogs.com/files/FlyAway2013/oryx.zip
解压后,放到tomcat下, 访问 view/new.html 即可看到效果。 然后,当然,需要按照实际需求进行定制。
oryx 分离&集成的更多相关文章
- 鲜衣怒马散尽千金,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask钱包区块链虚拟货币三方支付功能
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_219 不得不承认,大多数人并不拥有或者曾经拥有加密货币.是的,Web3.0.加密货币.区块链,对于大多数的互联网用户来说,其实是一 ...
- 区块相隔虽一线,俱在支付同冶熔,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask区块链虚拟三方支付功能
最近几年区块链技术的使用外延持续扩展,去中心化的节点认证机制可以大幅度改进传统的支付结算模式的经营效率,降低交易者的成本并提高收益.但不能否认的是,区块链技术也存在着极大的风险,所谓身怀利器,杀心自起 ...
- springcloud vue.js 微服务分布式 前后分离 集成代码生成器 shiro权限 activiti工作流
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- springcloud vue 微服务分布式 activiti工作流 前后分离 集成代码生成器 shiro权限
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器
1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...
- 阿里云上,Ubuntu下配置Nginx,在tomcat中加了https协议就不可以了
问题 阿里云上,Ubuntu服务器,本来部署的是tomcat,并且使用了https 协议.后来为了静态资源分离集成了 nginx,nginx代理跳转到 tomcat.刚开始直接访问http 网址发现, ...
- 很详细的SpringBoot整合UEditor教程
很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https: ...
- ACE反应器(Reactor)模式(1)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/13/591332.html 1.ACE反应器框架简介 反应器(Reactor):用于事件多路分 ...
- ACE_Reactor类
.ACE反应器框架简介 反应器(Reactor):用于事件多路分离和分派的体系结构模式 对一个文件描述符指定的文件或设备的操作, 有两种工作方式: 阻塞与非阻塞. 在设计服务端程序时,如果采用阻塞模式 ...
随机推荐
- 放一个Dynamicinputs corresponding to Dynamicknobs的Node源码
static const char* const CLASS = "AddInputsSol"; static const char* const HELP = "Add ...
- 大规模问题的分解法-D-W分解法
大规模线性规划问题的求解极具挑战性,在效率.存储和数值稳定性等方面对算法都有很高的要求.但是这类问题常常非常稀疏且有特殊结构,能够分解为若干个较小规模问题求解. 线性规划问题的目标函数和非负约束都可分 ...
- XBOX360更新游戏封皮(FSD自制系统)
第一步,请记下上图左下角的IP地址第二步,打开电脑IE浏览器,输入“第二步”你记下的IP地址“回车”然后,就如下图所示了. 输入账号:f3http 密码:f3http 进入,然后你就进到你的360 F ...
- Docker容器技术的PaaS云平台架构设计***
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...
- S型顺序遍历二叉树(c++实现)
//1.s型顺序访问二叉树,默认先左后右:利用两个栈来实现:如果先右后左的话,改变一下入栈的顺序就行 //2.注意s1 s2插入栈的顺序是不同的 void S_LevelOrderPrint(Tree ...
- 【C#】语音识别 - System.Speech
一个有趣的东西,今后可能用得上. C#语音识别:在命名空间 System.Speech下SpeechSynthesizer可以将文字转换成语音 贴出代码: public partial class F ...
- [转]FTP命令字和响应码解释
FTP命令 命令 描述 ABOR 中断数据连接程序 ACCT <account> 系统特权帐号 ALLO <bytes> 为服务器上的文件存储器分配字节 APPE < ...
- 学习笔记之HTML 教程 | 菜鸟教程
HTML 教程 | 菜鸟教程 http://www.runoob.com/html/html-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/try ...
- HTML背景图片自适应
由于<body>标签的图片不能够拉伸, 解决办法: 1.图片不够大,又background属性不能拉伸图片: 2.只能用个div,把其z-index值设为负,并使这个div大小为整个bod ...
- 廖雪峰Java2面向对象编程-3继承和多态-2多态
1.重载 子类覆写父类的方法称为重载Override. 父类和子类拥有一摸一样的方法(方法的名字.返回值.参数是相同的,但是方法的语句是不一样的) 方法签名如果不同就不是重载,而是创建了一个新的方法. ...