综合前几篇博文内容。我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功。

正由于如此,在创建了流程模型之后。模型列表的展示也是和之前的没有什么差别。并且都是非常easy的后台查询以及前台展示。这一部分也就只是多的讲了。

模型列表页面例如以下:

至于当中的改动和删除也没什么多讲的,删除非常easy,而改动也是activiti-modeler实现的主要功能。我们仅仅须要跳转过去即可。

重要的部分在于部署,由于点击部署到达后台以后。activiti就要和自己定义的form表单打赏关系。

以上页面的html代码例如以下:

<div id="logdiv1" ng-init="init();">
<p style="font-size:24px;margin:3px">模型列表</p>
<center>
<table border="1px" style="margin-top:1px;width:87%;font-size:18px;text-align:center;margin-left:2px;margin-top:auto;position:relative;float:left;" cellSpacing="0px" cellPadding="0px">
<tr style="background-color:#ccc">
<td>ID</td>
<td>NAME</td>
<td>KEY</td>
<td>描 述</td>
<td>版本号</td>
<td>创建时间</td>
<td>改动时间</td>
<td>操 作</td>
</tr>
<tr ng-repeat="model in modelList | orderBy:'id'" >
<td>{{model.id}}</td>
<td>{{model.name}}</td>
<td>{{model.key}}</td>
<td>{{model.metaInfo}}</td>
<td>{{model.version}}</td>
<td>{{model.createTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
<td>{{model.lastUpdateTime | date:"yyyy-MM-dd HH:mm:ss"}}</td>
<td><a href="script:;" ng-click="deploye(model)">部署</a> 
<a href="script:;" ng-click="delete(model)">删除</a> 
<a href="script:;" ng-click="update(model.id)">改动</a>
</td>
</tr>
</table>
</center>
</div>

点击部署要走到后台,前台就须要js控制,对应的js代码例如以下:

angular.module('activitiApp')
.controller('modelCtr', ['$rootScope','$scope','$http','$location', function($rootScope,$scope,$http,$location){
$scope.init=function(){
$http.post("./modelList.do").success(function(result) {
if(result.isLogin==="yes"){
$rootScope.userName=result.userName;
console.log(result.data);
$scope.modelList=result.data;
}else{
$location.path("/login");
}
});
}
$scope.deploye=function(model){
console.log(model);
$http.post("./deploye.do",model).success(function(deployResult){
$location.path("/processList");
});
} $scope.update=function(modelId){
window.open("http://localhost:8080/activitiTest1/service/editor? id="+modelId);
} }])

而后程序到达后台,后台代码例如以下:

/**
* 依据模型id部署流程定义
*
* @author:tuzongxun
* @Title: deploye
* @param @param activitiModel
* @param @param redirectAttributes
* @param @return
* @return Object
* @date Mar 17, 2016 12:30:05 PM
* @throws
*/
@RequestMapping(value = "/deploye.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
@ResponseBody
public Object deploye(@RequestBody ActivitiModel activitiModel,
HttpServletRequest req) {
Map<String, Object> map = new HashMap<String, Object>();
boolean isLogin = this.isLogin(req);
if (isLogin) {
String modelId = activitiModel.getId();
try {
// 获取forms拿到formname
Model modelData = repositoryService.getModel(modelId);
ObjectNode modelNode = (ObjectNode) new ObjectMapper()
.readTree(repositoryService
.getModelEditorSource(modelData.getId()));
byte[] bpmnBytes = null;
BpmnModel model = new BpmnJsonConverter()
.convertToBpmnModel(modelNode);
bpmnBytes = new BpmnXMLConverter().convertToXML(model);
DeploymentBuilder db = repositoryService.createDeployment()
.name(modelData.getName());
//差别在这里
List<JsonNode> forms = modelNode
.findValues("formkeydefinition");
for (JsonNode node : forms) {
// aaa.form
String formName = node.textValue();
if (!"".equals(formName)) {
// 就是页面的html代码依据formName找到
String formContent = myFormService
.findFormByFormName(formName);
ByteArrayInputStream bi = new ByteArrayInputStream(
formContent.getBytes());
db.addInputStream(formName, bi);
break;
}
}
Deployment deployment = db.addString(
modelData.getName() + ".bpmn20.xml",
new String(bpmnBytes)).deploy();
if (deployment != null && deployment.getId() != null) {
map.put("isLogin", "yes");
map.put("userName",
(String) req.getSession().getAttribute("userName"));
map.put("result", "success");
}
} catch (Exception e) {
e.printStackTrace(); }
} else {
map.put("isLogin", "no");
}
return map;
}

拿这段代码和之前单独的activiti流程部署的代码相比,就能够看到这里多出了查询form的操作以及部署时新的inputStream的设置。

在这段代码中。须要我们自己依据formKey(即自己定义的表单的文件名称)从数据中查询出对应的html表单代码,这段代码也是自己写的。例如以下:

public Connection getDb() {
Connection connection = null;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testtu", "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return connection;
} public String findFormByFormName(String formName) {
String formString = null;
Connection connection = this.getDb();
Statement statement;
try {
statement = connection.createStatement();
PreparedStatement ps = connection
.prepareStatement("select * from formtest where formType=? ");
ps.setString(1, formName);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()) {
formString = resultSet.getString(3);
}
;
} catch (Exception e) {
e.printStackTrace();
}
return formString;
}

实现这个表单设置的目的实际上是为了之后启动流程时的操作,由于部署之后就有了流程定义列表,在流程定义列表中就能够启动流程,仅仅有在这里设置了。那么点击启动流程时才干调用activitiService的相关方法获取相应节点的表单。

有了这个操作,在我们部署成功之后。能够看到与之前的部署相比,在数据库ac_ge_bytearray表中会再多出一条表单相关的数据。如图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

那么至此,整合自己定义表单部署流程结束。

activiti自己定义流程之整合(四):整合自己定义表单部署流程定义的更多相关文章

  1. activiti自定义流程之整合(四):整合自定义表单部署流程定义

    综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...

  2. Flowable实战(五)表单和流程变量

    一.流程变量   流程实例按步骤执行时,需要保存并使用一些数据,在Flowable中,这些数据称为变量(variable).   流程实例可以持有变量,称作流程变量(process variables ...

  3. 第四章:Django表单 - 5:模型表单ModelForm

    如果你正在构建一个数据库驱动的应用,那么你可能会有与Django的模型紧密映射的表单.比如,你有个BlogComment模型,并且你还想创建一个表单让大家提交评论到这个模型中.在这种情况下,写一个fo ...

  4. asp.net 微信企业号办公系统-表单及流程设计配置实例

    在环境搭建好之后,我们就来学习一下怎样快速创建一个流程,并执行和流转该流程(我们这里讲的只是入门,不涉及到具体流程参数设置). 创建一个流程步骤为:在数据库在创建表-->设计表单-->设置 ...

  5. FSBPM流程引擎(002)之表单+自定义流程挂载到引擎

    本章节介绍如何将实际业务的表单和自定义流程挂载到FSBPM流程引擎上. 首先进入引擎交互界面: 点击创建:->出差申请 然后根据实际的业务输入对应的数据项即可,比如[姓名,部门,开始时间,结束时 ...

  6. FlowPortal-BPM——创建新组织架构、表单、流程

    一.创建新组织架构 (1)管理流程→组织管理→组织架构添加需要的组织架构→新建新成员或角色 (2)设置成员信息 二.创建新数据源(如果在已有的数据库中操作,只需要添加需要的表) (1)添加新数据库并添 ...

  7. SpringMVC(十四):SpringMVC 与表单提交(post/put/delete的用法);form属性设置encrypt='mutilpart/form-data'时,如何正确配置web.xml才能以put方式提交表单

    SpringMVC 与表单提交(post/put/delete的用法) 为了迎合Restful风格,提供的接口可能会包含:put.delete提交方式.在springmvc中实现表单以put.dele ...

  8. 第四章:Django表单 - 2:Django表单API详解

    声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑 ...

  9. 第四章:Django表单 - 1:使用表单

    假设你想从表单接收用户名数据,一般情况下,你需要在HTML中手动编写一个如下的表单元素: <form action="/your-name/" method="po ...

随机推荐

  1. Linux 默认目录

    /etc 存放系统管理所需要的配置文件和子目录 /home 一般用户的主目录 /usr 用户使用的系统目录和应用程序等信息 /bin  存放使用者经常使用的命令 如cp  ls cat 等 /proc ...

  2. linux 学习笔记 wc命令

    #wc 文件名.txt 输出 4 13 65 文件名.txt  -->4 行13个单词 #wc -w 文件名.txt  统计单词数量 #wc -l 文件名.txt  统计行数 #wc -c  文 ...

  3. Jenkins部署码云SpringBoot项目到远程服务器

    本文是上一篇文章的后续,上一篇只是利用Jenkins部署项目到本地,并启动,本文是将项目部署到远程服务器并执行. 1.环境准备 1.1 安装插件 上一篇文章已经介绍了需要安装的应用及插件,这一篇还需要 ...

  4. C#调用WebApi

    1.WebRequest方式 Post: private void button1_Click(object sender, EventArgs e) { string ss= HttpPost(&q ...

  5. LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)

    题目链接 就是恶心人的,简单写写了...(似乎就是[HNOI2015]开店?) 拆式子,记\(dis_i\)为\(i\)到根节点的路径权值和,\(Ans=\sum dis_{p_i}+\sum dis ...

  6. JavaScript基础笔记(三) 引用类型

    引用类型 引用类型的值(对象)是引用类型的一个实例. 一.Object类型 创建Object实例: //方法一:通过new操作符创建 var a = new Object(); a.neme = &q ...

  7. 2160 母猪的故事 ACM 数学规律

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2160 中文题目,很简单,找规律就好. 自己画树状图找规律,开始想复杂了,找的规律:Fn=2*F(n-1)- ...

  8. IDEA2018.2.2 版本配置注释模板

    Ctrl+Alt+S进入设置界面(我没改过按键映射,你也可以从File-OtherSetting进入设置),找到Editor->File and Code Templates,先在Include ...

  9. iOS自动布局的学习

    Autolayout: 最重要的两个概念: 约束:对控件位置和大小的限定条件 参照:对控件设置的约束是相对于哪一个视图而言的 自动布局的核心计算公式: obj1.property1 =(obj2.pr ...

  10. 去除input默认带的上下按钮与修改placeholder的默认颜色、背景、placeholder内容的大小

    有时候需要用input元素中type属性值为number时,会出现默认的上下按钮, 去掉input默认的上下按钮:兼容性写法如下 input[type='number']::-webkit-outer ...