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,后面其实已经修复了。

时间: 2024-11-07 01:37:34

oryx 分离&集成的相关文章

springcloud vue.js 微服务分布式 前后分离 集成代码生成器 shiro权限 activiti工作流

1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2.多数据源:(支持同时连接无数个数据库,可以不同的模块连接不同数的据库)支持N个数据源3.阿里数据库连接池druid,安全权限框架 shiro(菜单权限和按钮权限), 缓存框架 ehcache4.代码编辑器,在线模版编辑,仿开发工具编辑器5.调用摄像头拍照 自定义裁剪编辑头像,头像图片色度调节6.we

spring cloud springboot 框架源码 activiti工作流 前后分离 集成代码生成器

1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2.多数据源:(支持同时连接无数个数据库,可以不同的模块连接不同数的据库)支持N个数据源3.阿里数据库连接池druid,安全权限框架 shiro(菜单权限和按钮权限), 缓存框架 ehcache4.代码编辑器,在线模版编辑,仿开发工具编辑器5.调用摄像头拍照 自定义裁剪编辑头像,头像图片色度调节6.we

springcloud vue.js 微服务分布式 activiti工作流 前后分离 集成代码生成器 shiro权限

1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2.多数据源:(支持同时连接无数个数据库,可以不同的模块连接不同数的据库)支持N个数据源3.阿里数据库连接池druid,安全权限框架 shiro(菜单权限和按钮权限), 缓存框架 ehcache4.代码编辑器,在线模版编辑,仿开发工具编辑器5.调用摄像头拍照 自定义裁剪编辑头像,头像图片色度调节6.we

ACE反应器(Reactor)模式(1)

转载于:http://www.cnblogs.com/TianFang/archive/2006/12/13/591332.html 1.ACE反应器框架简介 反应器(Reactor):用于事件多路分离和分派的体系结构模式 通常的,对一个文件描述符指定的文件或设备, 有两种工作方式: 阻塞与非阻塞.所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待状态, 直到有东西可读或者可写为止.而对于非阻塞状态, 如果没有东西可读, 或者不可写

Cognos软件介绍文档

1. Cognos简介 Cognos是世界上最大的业务智能软件制造商,它能够帮助用户提取公司数据,然后分析并汇总得出报告.Cognos有许多产品,但最为著名的还是它的PowerPlay联机分析处理(online analytical processing,OLAP)工具,以及Impromptu报告和查询语言工具.Axiant客户/服务器开发系统.在20世纪70年代晚期的midrange系统中,Cognos公司的PowerHouse 4GL(第四代语言)初次亮相. Cognos提供与IBM DB2

忆往昔--集成门控时钟技术的前世--分离门控时钟技术

本文转自:自己的微信公众号<集成电路设计及EDA教程> <忆往昔--集成门控时钟技术的前世--分离门控时钟技术> 多种门控时钟实现方案: Design Compiler中已经集成了可以进行低功耗设计的Power Compiler,它有多种门控时钟实现方案(分离门控时钟.集成门控时钟.多级门控时钟.层次化门控时钟). 如何选择? 首先需要看自己所用的标准单元库中是否有集成门控时钟(Integrated Clock Gating, ICG)单元,如果有的话最好选择使用ICG而不用分离门

在前后端分离的SpringBoot项目中集成Shiro权限框架

项目背景 公司在几年前就采用了前后端分离的开发模式,前端所有请求都使用ajax.这样的项目结构在与CAS单点登录等权限管理框架集成时遇到了很多问题,使得权限部分的代码冗长丑陋,CAS的各种重定向也使得用户体验很差,在前端使用vue-router管理页面跳转时,问题更加尖锐.于是我就在寻找一个解决方案,这个方案应该对代码的侵入较少,开发速度快,实现优雅.最近无意中看到springboot与shiro框架集成的文章,在了解了springboot以及shiro的发展状况,并学习了使用方法后,开始在网上

SpringBoot20 集成SpringSecurity02 -&gt; 利用SpringSecurity进行前后端分离的登录验证

1 SpirngBoot环境搭建 创建一个SpringBoot项目即可,详情参见三少的相关博文 参考博文 -> 点击前往 SpirngBoot项目脚手架 -> 点击前往 2 引入SpirngSecurity依赖 技巧01:引入了springSecurity相关依赖后,项目就会被SpringSecurity进行管理了:默认的登录名为user,登录密码会被打印到控制台上 技巧02:SpringSecurity默认的配置使用的是 <!--spring-security相关--> <

Springboot vue.js html 跨域 前后分离 shiro权限 集成代码生成器

本代码为 Springboot vue.js  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ mybaits+maven+接口 前端页面:html +vue.js 形式 jquery ajax 异步跨域 json 格式数据交互 前后分离,前后台分开部署 (特别注意,前端用的vue.js,  就是html页面引入vue.js形式, 用tomcat部署运行,更适合后台开发者) 1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)