当前位置:首页 » 数据仓库 » bpmn怎么配置属性模板
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

bpmn怎么配置属性模板

发布时间: 2022-07-11 23:15:12

① 如何实现bpmn文件更改后自动重新部署

首页 > Activiti > activiti--部署bpmn/bar文件详解

activiti--部署bpmn/bar文件详解

Everything that is related to 'static' data (such as process definitions) are accessed through the RepositoryService. Conceptually, every such static piece of data is content of the 'repository' of the Activiti engine.
当配置好工作流,启动工作流。我们的第一步就是配置bpmn、bar、bpmn20.xml等文件。
部署bpmn的简单代码:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("org/activiti/test/AssigneeUserAndGroup.bpmn")
.deploy();
简单解释:创建一个部署引擎DeploymentBuilder,然后通过addClasspathResource把文件路径设置进去(最起码activiti需要知道部署哪一个文件啊),然后启动部署方法deploy()。
addClasspathResource()方法其实就是把文件读入到一个输入流中,然后调用addInputStream()方法。addInputStream()主要是创建一个资源类,然后设置名称,字节,并且把这个资源给deployment实体
public DeploymentBuilder addInputStream(String resourceName, InputStream inputStream) {
if (inputStream==null) {
throw new ("inputStream for resource '"+resourceName+"' is null");
}
byte[] bytes = IoUtil.readInputStream(inputStream, resourceName);
ResourceEntity resource = new ResourceEntity();
resource.setName(resourceName);
resource.setBytes(bytes);
deployment.addResource(resource);
return this;
}

public DeploymentBuilder addClasspathResource(String resource) {
InputStream inputStream = ReflectUtil.getResourceAsStream(resource);
if (inputStream==null) {
throw new ("resource '"+resource+"' not found");
}
return addInputStream(resource, inputStream);
}
所以也可以直接调用addInputStream(String resourceName, InputStream inputStream)进行文件的部署。

注意:单独部署一个bpmn文件,png会在底层BpmnDeployer中分解出来,并且保存到数据库中。
如果一个部署中涉及到多个文件,我们可以打包一起部署,例如方法addZipInputStream(ZipInputStream zipInputStream),其实addZipInputStream会把这个包下面的所有文件逐一找出来,然后创建资源类,设置到deployment实体中。
public DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream) {
try {
ZipEntry entry = zipInputStream.getNextEntry();
while (entry != null) {
if (!entry.isDirectory()) {
String entryName = entry.getName();
byte[] bytes = IoUtil.readInputStream(zipInputStream, entryName);
ResourceEntity resource = new ResourceEntity();
resource.setName(entryName);
resource.setBytes(bytes);
deployment.addResource(resource);
}
entry = zipInputStream.getNextEntry();
}
} catch (Exception e) {
throw new ActivitiException("problem reading zip input stream", e);
}
return this;
}
下面说说.bar文件怎么打包:

(1)把文件都拷到同一目录下面

(2)对diagrams文件夹进行打包
diagrams.zip
(3)修改文件的扩展名diagrams.bar
其实一切很简单...

② JAVA工作流框架哪个比较好

为了更好地帮助大家找到适合自己的流程引擎, 快速地完成流程引擎技术架构选型, 快速地完成项目交付。下面一起来看看java快速开发框架工作流引擎快速开发平台。 希望您能从中找到适合您自己的流程引擎。

Activiti是由jBPM 的创建Tom Baeyen离JBoss之后建立的项目,构建在开发 jBPM 版本1到4时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。文档丰富,csdn有相应专栏,并且国人贡献了一本《activiti实战》详细地讲解了基于activiti的开发内容,网上教程资源丰富。Activiti上手比较快,界面也比较简洁、直观,学习周期相对较短。

官方提供webapp war包,部署在Tomcat下可快速操作和了解activiti,esclipse提供支持activiti项目的ide插件,总的来说环境支持良好。

代码量大,核心代码改动难度较大,但提供了完整的技术文档,架构良好,网上开发文档较多,一定上降低了二次开发的难度。

支持,用户体验好,但是流程设计器是英文版,还需要汉化。

支持多种表单:动态表单,外置表单,普通表单,但表单设计未集成,需要自己集成表单设计。

支持绝大部分工作流功能,符合中国国情的审批流程需要在此基础上进行开发。

JBPM(Java Business Process Management):JAVA业务流程管理,是一个可扩展、灵活、开源的流程引擎, 它可以运行在独立的服务器上或者嵌入任何Java应用中。

1、jBPM3是一个完整的工作流系统实现,面向开发人员,目的在于简化对组织核心流程进行支撑的软件创建,不支持标准。

2、jBPM4引入PVM,使其拥有更强大的扩展性,同时增加BPMS特性,这些特性包括了对BPMN的支持、面向业务人员的Web建模器和简单统计分析功能的加入。

3、jBPM5基于原先的Drools Flow,支持BPMN,通过与Drools的合并支持BAM,通过内容仓库增加对流程可视化的支持。由于放弃了jBPM4的PVM,引擎的可扩展性受到损害,并且不再支持jPDL。

XJR快速开发平台可视化开发,高效快速,开发成本低。兼容强,支持多种数据库,基于B/S架构,纯浏览器应用,只需要拖拽组件,拼接流程,就能实现各层的审批。面向服务接口设计,容易整合企业现有的资源。前后端分离设计,采用shiro权限验证,通过简单配置就可以实现功能权限和数据权限。开源级代码,二次扩展强。

XJR快速开发平台技术选型

使用目前流行的多种web技术,包括springboot, JPA,Druid, Activiti,Lombok,swagger,poi,WebSocket,Jquery,BootStrap, maven,Jenkins 等等,支持多种数据库Mysql, Oracle, sqlserver等。 分层设计:使用分层设计,分为,service,Controller,view层,层次清楚,低耦合,高内聚。 安全考虑:严格遵循了web安全的规范,前后台双重验证,参数编码传输,密码md5加密存储,shiro权限验证,从根本上避免了SQL注入,XSS攻击,CSRF攻击等常见的web攻击手段。

模块功能

功能模块:开发向导、代码 生成器,商业智能、工作流、报表管理、移动端开发、作业计划、多语言、数据源管理、企业微信、钉钉、消息管理,菜单 管理,用户管理,机构管理,角色管理,区域管理,字典管理,日志查询等基础模块。

③ 如何在eclipse中配置bpmn2插件

bpmn modeler 早就不更新不能下载了。。。
你可以去看看下面的帖子。
http://www.myexception.cn/eclipse/1863140.html

④ 业务流程建模标记法的BPMN基本话题

BPMN仅限于支持对业务流程有用的建模概念。这意味着组织所做的非业务目的其他类型建模将排除在BPMN之外。例如,以下方面的建模不属于BPMN的一部分:
组织结构 职能分解数据模型 此外,虽然BPMN会显示数据的流(消息)以及活动与数据器物的关联,但它并非数据流图(data flow diagram)。 BPMN用很小一套图形要素做简单的图来建模,这将令业务用户与开发者一样容易理解其中的过程和流。它的四种基本要素如下:
流对象(Flow Object) 事件(Events),活动(Activities),关口(Getways) 连接对象(Connecting Objects) 顺序流(Sequence Flow),消息流(Message Flow),关联(Association) 泳道(Swimlanes) 池(Pool),道(Lane) 器物(Artifacts/Artefacts) 数据对象(Data Object),组(Group),注释(Annotation) 这四大类对象令我们有机会做出简单的业务流程图(BPD, business process diagram)。同时,BPMN也允许在BPD中创建你自己的流对象、器物类型,使图更好理解。
事件 Event
活动 Activity
关口 Gateway
连接 Connections 流对象(Flow Objects)是BPMN的主要描述对象,由三种核心要素(事件、活动、关口)组成。
事件(Event) “事件”(Event)以圆环表示,指发生的事情(区分于“活动”代表所做的事情)。圆环中的图标代表事件的类型(例如:信封为消息,时钟为时间)。事件也被分为“捕获”(Catching,例如捕获输入的消息而开始一个流程)或“抛出”(Throwing,例如在流程结束抛出消息)。 开始事件(Start event) 作为流程的触发器;以细单线标明,并且只能“捕获”(Catch),所以它显示为空心(轮廓)的图标。 结束事件(End event) 表现流程的结果;以粗单线标明,且只能“抛出”(Throw),所以显示为实心图标。 中间事件(Intermediate event) 表现发生在开始和结束事件之间的事;以双线标明,可以是“抛出”或“捕获”(相应采用实心或空心图标)。例如,一任务流到一事件,抛出一个消息到另一个池,然后由下一个事件守候,捕获其回应。 活动(Activity) “活动”(Activity)用圆角矩形表示,并描述必需做的工作的种类。 任务(Task) 任务代表单一工作单元,它不会或不能被分解为更深层次上的业务流程细节,而不包含操作程序步骤的图示(此非BPMN的目的)。 子流程(Sub-process) 用于隐藏或显露深层业务流程细节——收起时,在矩形底部用加号标明子流程;展开时,在矩形内显示全部的流对象、连接对象及器物。 子流程自含开始及结束事件,来自“父”流程的顺序流不可跨过其边框。 事务(Transaction) 子流程的一种形式,其所包含的全部活动必须作为一个整体对待,即它们必须完全结束以满足目标,其中任何一个失败就必须全部偿还(撤回)。事务作为扩展的子流程,用双线环绕。 关口(Gateway) “关口”(Gateway)用菱形表示,基于所示条件决定路径的分流与合并。 “流对象”通过“连接对象”(Connecting objects)互相连接。连接对象包括三个类型(顺序、消息、关联):
顺序流(Sequence Flow) “顺序流”用实心线和箭头表示,显示活动进行的顺序。“顺序流”还可以在开始端带有符号,以小菱形标明其中一些发自活动的“条件流”(conditional flow),同时以对角斜线标明发自活动或决定,带条件流的“默认流”(default flow)。 消息流(Message Flow) “消息流”用虚线表示,起始端有一个空心圆圈,终端是一个空心箭头。它告诉我们哪些消息流跨过组织的边界(即介于池之间)。消息流不可用于在同一个池中连接活动或事件。 关联(Association) “关联”(Association)用点线表示。它用于建立器物或文本到流对象的联系,并且可以用空心箭头标明某种方向性(指向器物表示结果,源自器物表示输入,同时出现则表示读和更新)。当器物或文本联系到顺序或消息流时,关联无需标明方向(那些流已经显示了方向)。
泳道 Swimlanes
数据对象 Data objects
组 Groups
注释 Annotation 泳道(Swimlanes)是从视觉上对活动加以组织或分类的机制。它基于交叉功能流程图基础,在BPMN中有两种类型:
池(Pool) 表示流程中的主要参与者,典型地,用来分开不同的组织。一个池可容纳一个或多个道(像真实的泳池一样)。当池为展开的(显示出内部细节),绘做大的矩形;若为收起的(隐藏起内部细节),绘做沿着图的长或宽伸展的空的矩形。 道(Lane) 在池中,用于活动按职能或角色归类。绘做按池的长或宽展开的矩形。道包含流对象、连接对象和人造物。
器物(Artifacts)使开发者可以带给模型/图更多的信息,通过这一方式,使模型/图更可读。预定的三种器物如下:
数据对象(Data Objects) “数据对象”向读者显示在活动中需要或产生哪些数据。 组(Group) 组表现为虚线的圆角矩形。组用来将不同的活动分组,但不影响图中的流。 注释(Annotation) 注释为模型/图的读者增加可理解性。 点击小图查看全尺寸图
带正常流的流程
讨论循环
电子邮件投票流程
采集投票 在BPMN的三种子模型之内和之间,可以创建各种类型的图。以下列出的是能够用BPMN建模的业务流程类型(其中带星号的可能无法映射到执行语言):
高层次私有流程的活动(非职能分解)* 细节私有流程(Detailed private business process) 当前或过往的业务流程* 未来或新业务流程 与一个或多个外部实体互动的细节私有业务流程(或“黑盒子”流程) 两个或更多细节私有业务流程的交互作用 细节私有业务流程到抽象流程的联系 细节私有业务流程到协作流程的联系 两个或更多抽象流程* 抽象流程与协作流程的关系* 单独的协作流程(例如:ebXML BPSS或RosettaNet)* 两个或更多细节私有业务流程通过抽象流程的交互作用 两个或更多细节私有业务流程通过一个协作流程的交互作用 两个或更多细节私有业务流程通过抽象与写作流程的交互作用 BPMN的设计目标是允许上述全部类型的图。然而,需要小心的是,包含了太多的子模型类型,例如三种或更多的私有流程之间都有消息流连接,这样的图可能会变得难以理解。因而,我们建议建模者为诸如私有流程、协作流程的BPD建立明确的目标。 BPMN 2.0的工作提案名为“业务流程模型及标记法”。BPMN 2.0为新的业务流程模型和标记法建立单一规范,对标记法、元模型和交换格式做出界定。2.0版的名称有所修改,但仍会维持“BPMN”这个标志。已提议的特征有:
结合BPMN和“业务流程定义元模型”(Business Process Definition Meta model, BPDM),形成单纯一致的语言 使能在建模工具间交换业务流程模型及其布局,以保持语义完整性 扩充BPMN以允许将模型配置与编排成独立或集成的模型 支持模型上不同透视法的显示和交替,令用户可以聚焦于特定的关注点 串行化BPMN,为模型转换提供XML方案(schemes),向执行决策支持方向扩展业务模型。 新BPMN的建议方案计划在2008年内完成。 有两个不同的小组分别在竞争的规范草案上工作。第一个小组包括例如EDS和MEGA,目标是直接吸收BPDM到BPMN规范。第二个小组包括例如SAP AG,IBM,Oracle,不准备直接包括BPDM,而试图提供两个标准间的映射。从2008年7月开始,二者开始讨论合并其草案提出单一的规范。

⑤ 如何实现Activiti的分支条件的自定义配置

一、Activiti的流程分支条件的局限

Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:

<sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">
<conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">
<conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">
<conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>
</sequenceFlow>

从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:

1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写

2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。

以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机
基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷
新流程定义的引擎缓存,如下的代码就是基于这种方式:
JsonNode jsonObject=objectMapper.readTree(configJson);
JsonNode configsNode=jsonObject.get("configs");
BpmSolution bpmSolution=bpmSolutionManager.get(solId);
BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId());
ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId());
String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId());
System.out.println("xml:"+processDefXml);
ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId);
ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes());
Map<String,String> map = new HashMap<String,String>();
map.put("bpm","http://www.omg.org/spec/BPMN/20100524/MODEL");
map.put("xsi","http://www.omg.org/spec/BPMN/20100524/MODEL");
SAXReader saxReader = new SAXReader();
saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
Document doc = saxReader.read(is);
//Document doc=Dom4jUtil.load(is, "UTF-8");
Element rootEl=doc.getRootElement();
if(configsNode!=null){
//取得分支条件列表
JsonNode configs=configsNode.get("conditions");
if(configs!=null){
Iterator<JsonNode> it=configs.elements();
while(it.hasNext()){
ObjectNode config=(ObjectNode)it.next();
String tmpNodeId=config.get("nodeId").textValue();
String tmpCondition=config.get("condition").textValue();
Element seqFlow=(Element)rootEl.selectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='"
+sourceNode.getNodeId()+"' and @targetRef='"+tmpNodeId+"']");
if(seqFlow==null) continue;
Element conditionExpress=(Element)seqFlow.selectSingleNode("bpm:conditionExpression");
if(conditionExpress==null){
conditionExpress=seqFlow.addElement("conditionExpression");
conditionExpress.addAttribute("xsi:type", "tFormalExpression");
}else{
conditionExpress.clearContent();
}
conditionExpress.addCDATA(tmpCondition);
}
}
}
//修改流程定义的XML,并且清空该流程定义的缓存
actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());

【说明】

1.基于这种方式容易出错,因为流程的分支条件写回流程定义的XML是比较容易出问题的,同时不清楚人员填写什么条件回XML文件中。

2.对于Jsaas中的一个流程定义可用于多个流程解决方案中使用配置不同的条件不太适合,因为一个流程定义是一样,但可能会分支的条件设置不一样。

基于以上的要求,为此我们对Activiti进行扩展,以使得我们可以允许流程引擎在分支判断处理中,执行我们的条件设置,其原理如下:

当流程引擎跳至分支条件判断处理时,可以让它执行我们的脚本设置条件,条件满足时,则跳至我们的设置的目标节点,从而实现干预流程引擎本身的执行方式,为了不影响Activiti的原的运行机制,我们还是保留其旧的执行判断方式。

二、Activiti的扩展点

Activiti的流程扩展是比较灵活的,我们通过改写这个ExclusiveGateway的节点的行为方法即可,其实现方法如下:
package com.redxun.bpm.activiti.ext;
import java.util.Iterator;
import javax.annotation.Resource;
import org.activiti.engine.impl.bpmn.behavior.;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.redxun.bpm.core.entity.config.ExclusiveGatewayConfig;
import com.redxun.bpm.core.entity.config.NodeExecuteScript;
import com.redxun.bpm.core.manager.BpmNodeSetManager;
import com.redxun.core.script.GroovyEngine;
import com.sun.star.uno.RuntimeException;
/**
* 对网关的条件判断,优先使用扩展的配置
* @author keitch
*
*/
@SuppressWarnings("serial")
public class Ext extends {

protected static Logger log = LoggerFactory.getLogger(Ext.class);

//节点的设置管理器
@Resource
BpmNodeSetManager bpmNodeSetManager;
//脚本引擎
@Resource GroovyEngine groovyEngine;

@Override
protected void leave(ActivityExecution execution) {
log.debug("enter Ext=======================");
if (log.isDebugEnabled()) {
log.debug("Leaving activity '{}'", execution.getActivity().getId());
}
String solId=(String)execution.getVariable("solId");
String nodeId=execution.getActivity().getId();
log.debug("solid is {} and nodeId is {}",solId,nodeId);

if(StringUtils.isNotEmpty(solId)&& StringUtils.isNotBlank(nodeId)){
ExclusiveGatewayConfig configs=bpmNodeSetManager.getExclusiveGatewayConfig(solId, nodeId);
for(NodeExecuteScript script:configs.getConditions()){
String destNodeId=script.getNodeId();
String condition=script.getCondition();
log.debug("dest node:{}, condition is {}",destNodeId,condition);
//执行脚本引擎
Object boolVal=groovyEngine.executeScripts(condition, execution.getVariables());
if(boolVal instanceof Boolean){
Boolean returnVal=(Boolean)boolVal;//符合条件
if(returnVal==true){
//找到符合条件的目标节点并且进行跳转
Iterator<PvmTransition> transitionIterator = execution.getActivity().getOutgoingTransitions().iterator();
while (transitionIterator.hasNext()) {
PvmTransition seqFlow = transitionIterator.next();
if(destNodeId.equals(seqFlow.getDestination().getId())){
execution.take(seqFlow);
return;
}
}
}
}else{
throw new RuntimeException("表达式:\n "+condition+"\n返回值不为布尔值(true or false)");
}
}
}
//执行父类的写法,以使其还是可以支持旧式的在跳出线上写条件的做法
super.leave(execution);

}
}

我们通过继续改写了这个分支节点的跳出机制,并且通过脚本引擎来执行其条件分支的判断处理,但流程引擎并不了解我们扩展的类,这时我们需要配置Activiti流程引擎的行为动作工厂类,如下所示:
package com.redxun.bpm.activiti.ext;

import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.engine.impl.bpmn.behavior.;
import org.activiti.engine.impl.bpmn.parser.factory.;

/**
* 扩展缺省的流程节点默认工厂类,实现对Activiti节点的执行的默认行为的更改
* @author keitch
*
*/
public class ActivityBehaviorFactoryExt extends {

private Ext ;

/**
* 通过Spring容器注入新的分支条件行为执行类
* @param
*/
public void setExt(Ext ) {
this. = ;
}

//重写父类中的分支条件行为执行类
@Override
public create(ExclusiveGateway exclusiveGateway) {
return ;
}
}

三、Activiti的Spring配置的更改

在Activiti的流程引擎配置中加入新的流程行为动作执行工厂类。配置如下所示,注意activityBehaviorFactory的属性配置:
<bean id="processEngineConfiguration" class="org.activiti.spring.">
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="false" />
<property name="enableDatabaseEventLogging" value="false" />
<property name="databaseType" value="${db.type}" />
<property name="idGenerator" ref="actIdGenerator"/>
<property name="eventListeners">
<list>
<ref bean="globalEventListener"/>
</list>
</property>
<property name="activityFontName" value="宋体"/>
<property name="labelFontName" value="宋体"/>
<!-- 用于更改流程节点的执行行为 -->
<property name="activityBehaviorFactory" ref="activityBehaviorFactoryExt"/>
</bean>

<bean id="activityBehaviorFactoryExt" class="com.redxun.bpm.activiti.ext.ActivityBehaviorFactoryExt">
<property name="" ref=""/>
</bean>

<bean id="" class="com.redxun.bpm.activiti.ext.Ext"/>

⑥ activiti串行会签的时候怎么设置相应的属性

BPMN2的标准中并没有对以上这种情景提供完善的支持,因此要在Activiti中实现会签审批,我们需要结合Activiti提供的流程任务的多实例特性,进行一些必要的扩展,以支持我们的中国特色的会签需求。 会签任务也是一种人工任务,其在activiti的定义中,也是使用UserTask来定义,但在属性上我们需要对这个定义的类型进行特殊的配置,即为多任务实例类型(并行或串行)任何一种。另外需要定义会签的参与人员,再定义会签的完成条件(若不定义,表示其是所有参与人均完成后,流程才往下跳转)。

⑦ 请问低 代 码是什么 请指教

低代码开发平台最近好像挺热啊,听说微软、Google都入局了,国内资本如今也在热捧。网络指数了解了一下,关联度最高的那几个国内产品,不少是存在了好多年,更有甚者xx表差不多是上一个世纪的老产品了,也来蹭一下热度。

那么,低代码到底是什么玩意?是新鲜事物么?为啥上个世纪的老产品也凑一份热闹?我们一起去看看。

低代码平台,洋文称Low Code Development Platform,注意了,这个Low可不是你想的那个Low,不是低级的意思,而是少量、简易的DSL代码甚至是无代码的意思。

为什么能够是更少量甚至是无代码呢?开发者们想想自己是怎么减少重复代码的就会明白了。 我拿自定义表单的场景作为例子,从演化的路径上来看,是这样的:

  • 一开始,在一个应用里实现了一个自定义表单的功能,做新应用的时候,也需要这个功能,我们会把原来的代码复制一份,然后简单改一些样式或变量,搞定。

  • 然后,越来越多的应用需要自定义表单的功能了,我们把那砣代码抽象成一个函数库,每次需要的时候只需要引用函数库,给不同的参数就好了,省了代码复制不说,一下子就提升了代码的可维护性,这时,代码就开始变少了。

  • 再后来,我们嫌引用函数库还麻烦了,我们把这个功能做成了一个独立应用或微服务,提供一系列常见的表单模板,使用的时候,在这个应用里面选一个模板,稍配置一下,然后复制一个链接到目标应用上粘贴一下就能用了。这个时候,自定义表单变成了一个Saas服务,目标应用中要实现自定义表单的功能已经不需要编写代码了。至此,这个自定义表单服务就是一个低代码应用了。

  • 所以,低代码的本质就是应用场景的极致抽象并且模板化的过程。实际上,我们以前看到的低代码产品多了去了,只是那个时候还没有低代码这个概念罢了。下面我给你说说:

  • 上面举的自定义表单例子,你可能有意无意间接触过了,例如金数据,就是对表单收集这个场景进行了极致的抽象,形成一套固定的表单设计套路,并且让表单的开发可以通过可视化配置来完成。顺带说一句,金数据的创始人现在就在二次创业,做的正是低代码开发平台。所以,你懂的了。

  • 早年的DreamWave、FrontPage,现在的RapidWeaver等可视化网页制作软件、大量的在线可视化网站拖拉拽建站应用,就是网页制作场景的低代码平发平台。

  • BAAS,Backend As A Service,后端服务平台,直接让开发者省掉了后端的开发工作,也是一种典型的低代码开发平台,例如微信小程序的云开发平台、知晓云、Lean Cloud等。

  • 众多的移动应用、小程序可视化制作平台,提供大量的场景模板,简单调整一下参数就可以得到一个自己的应用。

  • 以上这些应用场景的本质都是低代码或零代码,但为什么低代码平台的概念在这几年才兴起?我猜想,是应用的场景覆盖得更广、涉及开发的环节更完整导致了平台化的出现。

  • 应用的场景覆盖得更广了,之前的低代码应用,只能够满足相对窄的应用场景,如建站、表单、BAAS,但到了后面,抽象层次往下降一层,允许定义数据结构、定义界面和流程,能够解决更多通用的场景了,就自然而然有了平台的感觉。

  • 涉及开发的环节更完整了,以前的建站,纯粹是前端页面的拼凑,而BAAS,也只是解决后端的问题,而到了后来的小程序可视化制作时,就把前后端的开发都囊括进去了,几乎就不需要代码开发了,又自然而然有开发平台的即视感了。

  • 再看看微软和Google的低代码平台,都是解决相对通用场景、涵盖前后端开发环节的形态,就更加印证了我的猜想。

    不对呀,上面说到了通用场景,但同时也说了低代码的本质是场景的抽象并且模板化,通用和模板化不矛盾吗?这里就要说低代码平台的限制了,所谓的通用场景也只能是相对通用,可模板化的,于是就有了模板化的通用场景,即这个通用场景是受限的,不是完全的通用。所以,现在大多数的低代码平台都是面向企业,做企业应用的。因为企业应用,是一个可以模板化的垂直通用场景,例如钉钉宜搭、简道云、织信Informat等等,都是服务企业用户。

    最后,低代码并非零代码,尽管市面上有不少零代码的应用平台打着低代码的旗号吸引关注。代低码平台的底层逻辑还是一个开发平台,需要对个性化的需求开放实现途径,如何开放?开放接口?二次开发?还是开放DSL?不一而足。如果一个平台没有支持个性化需求的开发能力,那它不算是一个及格的低代码开发平台,充其量只是低代码应用罢了。

    好了,现在你已经知道什么是低代码了,往后,我会带大家一起实现一些低代码开发的场景,并对低代码的商业化进行深度的思考,例如谁会为低代码平台买单、低代码平台到底是专业平台还是小白应用等等。 合理并且有效地运用低代码,不仅可以让我们工作高效地运行,还能最大程度保证团队目标的达成。我推荐织信,它内置了100+的应用模板,覆盖OA、ERP、CRM、绩效、人事、企业服务、个人及组织等多个应用场景。

⑧ eclipse设计activiti流程图conditionexpression怎么设置的

Activiti 有个Eclipse 插件,Activiti Eclipse Designer ,可用于图形化建模、测试、部署 BPMN 2.0的流程。安装步骤如下:

1、eclipse打开help-> install new software,单击add:

2、Name: Activiti BPMN 2.0 designer

3、Location:

进行安装。

注意:要求eclipse必须是3.6以上版本,建议使用最新的eclipse进行安装。