activiti自己定义流程之整合(三):整合自己定义表单创建模型
本来在创建了表单之后应该是表单列表和预览功能。可是我看了看整合的代码,和之前没实用angularjs的基本没有什么变化,一些极小的变动也仅仅是基于angularjs的语法,因此全然能够參考之前说些的表单列表展示相关的内容,这里也就直接进入到下一个步骤,创建流程模型了。
在之前的创建流程模型一节里,我讲代码比較多,实际上在这里还有非常重要的一个环节没有细说,那就是自己定义流程图,画流程图的过程也是有不少须要注意的事项的,在这一节我会适当的以截图加解释进行说明。
而在创建流程模型的过程中,由于之前也是用java、spring、angularjs等,所以在代码上实际上并没有什么变化。不同之处就在流程图制作上,还有就是activiti内部自己实现,我们不用管他。那么这里着重要讲的就是调用activiti-modeler来画流程图。
我们的创建模型首先是在自己制作的页面填好模型的name、key、description等。然后提交到后台,进而跳转到activiti-modeler流程图制作界面。
自己定义的页面例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
填写数据的这个页面代码例如以下:
<div id="create"style="margin-top:100px;margin-left:290px;background-color:#9cc;height:350px;width:40%;font-size:26px;position:relative;float:left;">
<p style="font-size:30px">创建模型</p>
Name :<input type="text" name="name"ng-model="activiti.name"/>
</br>
</br>
Key :<input type="text" name="key"ng-model="activiti.key"/>
</br>
</br>
Description:<input type="text" name="description"ng-model="activiti.description"/>
</br>
</br>
<input style="font-size:28px;cursor:pointerborder:1px solid;border-radius:0.5em;" type="button"value="创建模型" ng-click="createTo(activiti);"/>
<input style="font-size:28px;cursor:pointer;cursor:pointerborder:1px solid;border-radius:0.5em;" type="button"value="返回"/>
</div>
在我们填好相关数据以后。点击提交,便会触动createTo方法进入到js代码中,相应的整个js代码例如以下:
angular.module('activitiApp')
.controller('createCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){
//创建模型
$http.post("createFlush.do").success(function(result){
if(result.isLogin==="yes"){
$rootScope.userName=result.userName;
}else{
$location.path("/login");
}
});
$scope.createTo=function(activiti){
//向后台提交数据
$http.post("./create.do",activiti,{headers:'Content-Type:application/json'}).success(function(createResult){
console.log(createResult);
$location.path("/modelList");
window.open("http://localhost:8080/activitiTest1"+createResult.path+createResult.modelId);
});
}
}])
在上述的代码中能够看到createTo方法是直接调用$http向后台发送post请求。然后把页面中的数据对象直接传到后台,并没有多做处理。这里涉及到angularjs的双向数据绑定,假设有不明确的。能够自己去了解下面。
须要注意的是,发送请求并接收后台返回数据后,从返回数据中拿到path和modelid然后跳转到activiti-model流程图设计页面,这里能够先看一下下边的后台代码再返回来看。
经过http请求。操作便执行到后台,对应的后台代码例如以下:
/**
* 创建模型
*
* @author:tuzongxun
* @Title: create
* @param@param activiti
* @param@param request
* @param@param response
* @param@return
* @return Object
* @date Mar 17, 201612:30:29 PM
* @throws
*/
@RequestMapping(value = "/create.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
@ResponseBody
public Object create(@RequestBody ActivitiModel activiti,
HttpServletRequest request, HttpServletResponse response) {
Map<String, String> map = new HashMap<String, String>();
Boolean isLogin = this.isLogin(request);
if (isLogin) {
Model newModel = repositoryService.newModel();
try { ObjectMapper objectMapper = new ObjectMapper();
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME,
activiti.getName());
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION,
StringUtils.defaultString(activiti.getDescription()));
newModel.setMetaInfo(modelObjectNode.toString());
newModel.setName(activiti.getName());
newModel.setKey(StringUtils.defaultString(activiti.getKey()));
repositoryService.saveModel(newModel);
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id", "canvas");
editorNode.put("resourceId", "canvas");
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace",
"http://b3mn.org/stencilset/bpmn2.0#");
editorNode.put("stencilset", stencilSetNode);
repositoryService.addModelEditorSource(newModel.getId(),
editorNode.toString().getBytes("utf-8"));
} catch (Exception e) {
e.getStackTrace();
}
//response.sendRedirect(request.getContextPath() +
//"/service/editor?id="
// +newModel.getId());
map.put("isLogin", "yes");
map.put("userName",
(String) request.getSession().getAttribute("userName"));
map.put("path", "/service/editor? id=");
map.put("modelId", newModel.getId());
} else {
map.put("isLogin", "no");
}
return map;
}
这一段代码里涉及到的东西还比較多,有一些我也不是非常理解,仅仅是这段代码基本上就是这样不怎么会变了,我也临时没有深入理解,能够看到这段代码跟之前说列的也是一样,那么这里我要说的是最后走完这段代码返回数据给前台。
能够看到当中有一个path属性和modelId,正是这两个属性返回给前台后,前台angularjs再控制路由跳转到activiti-model流程图设计页面(这个页面全然整合而来。非自己创造)。依据path和modelId跳转后的界面例如以下:
这个界面是整合而来,在跳转的过程中会自己主动把之前我们填写的数据带入过来,当然了。还有modelId,这个时候数据库实际上已经有了数据。
进入到这个界面。那么下边就要正式開始设计流程图了,首先例如以下图所看到的的创建開始节点,创建方法是找到StartEventbutton,按住鼠标左键拖拽到右方空白处就可以。
然后在这个開始节点后边有很多button能够点击。我们选择下图中箭头所指的个人任务,然后便新建了一个任务节点,当然了。假设能学到自己定义流程图这一步,我想大家应该已经对流程图的基础有一定了解了,起码在eclipse中画流程图应该已经没有问题,所以这里大家应该不难理解,否则的话。不如先用eclipse中的插件了解一下。
这种话,按照上边的步骤我们就能够创建出例如以下图的流程图雏形,包括開始节点、两个任务节点,然后是结束节点:
那么接下来就是比較重要的了。開始进入自己定义表单整合的环节。
在上图中能够看到右方我用箭头指了一个地方。attributes。顾名思义。就是属性,这里是能够点开的,假如大家能走到这一步来,就能够看到在不同情况下这里显示的不一样。
首先我们不选中不论什么节点,能够看到属性例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
而我们选中開始节点和任务节点是属性又分别例如以下图1和图2:
图2:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
可是无论是開始节点还是任务节点。都有Formkey这个属性,在这里我们就能够指定每一个节点须要使用的自己定义表单文件的名称,一般是xxx.form的形式。指定好formkey以后就能够点击保存。也能够设置其它的属性,如任务中的assignment和name、key等等。
而这里的整个页面都不是自己写的,保存相关的方法也不是自己写的,仅仅要数据库配置正确。activiti-modeler就会自己主动把这些数据保存到数据库中,模型创建完成。
activiti自己定义流程之整合(三):整合自己定义表单创建模型的更多相关文章
- activiti自定义流程之整合(三):整合自定义表单创建模型
本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单 ...
- 比较Activiti中三种不同的表单及其应用
http://www.kafeitu.me/activiti/2012/08/05/diff-activiti-workflow-forms.html 开篇语 这个恐怕是初次接触工作流最多的话题之一了 ...
- 第三章:Web表单
感谢作者 –> 原文链接 本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你 ...
- Flask 教程 第三章:Web表单
本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你如何使用Web表单. 在第二章中 ...
- Struts2_day04--自定义拦截器_Struts2的标签库_表单标签
自定义拦截器 1 在struts2里面有很多的拦截器,这些拦截器是struts2封装的功能,但是在实际开发中,struts2里面的拦截器中可能没有要使用的功能,这个时候需要自己写拦截器实现功能 2 拦 ...
- Android自己定义控件系列三:自己定义开关button(二)
接上一篇自己定义开关button(一)的内容继续.上一次实现了一个开关button的基本功能.即自己定义了一个控件.开关button,实现了点击切换开关状态的功能.今天我们想在此基础之上.进一步实现触 ...
- Hibernate学习笔记(三)Hibernate生成表单ID主键生成策略
一. Xml方式 <id>标签必须配置在<class>标签内第一个位置.由一个字段构成主键,如果是复杂主键<composite-id>标签 被映射的类必须定义对应数 ...
- Java Web开发总结(三) —— request接收表单提交中文参数乱码问题
1.以POST方式提交表单中文参数的乱码问题 <%@ page language="java" import="java.util.*" pageEnco ...
- Day5 JavaScript(三)事件、表单验证以及初识jQuery
事件 1)鼠标事件 mousedown mouseup 2)键盘事件 a) keydown:键被按下 b) keyup:键抬起 c) keypress:按下可打印字符的键时. document.onk ...
随机推荐
- java中集合里的泛型
import java.util.ArrayList;/* * 泛型 : java jdk1.5新特性. * 泛型的好处 : * 1.将运行时的错诶提前到编译时. * 2.避免无谓的强制类型转换. * ...
- 微信小程序开发教程(五)开发框架:MINA
微信团队为小程序提供的框架命名为MINA应用框架.MINA框架通过封装微信客户端提供的文件系统.网络通信.任务管理.数据安全等基础功能,对上层提供一整套JavaScript API,让开发者能够非常方 ...
- 【二分答案】【最大流】bzoj3130 [Sdoi2013]费用流
二分最大的边的cap,记作Lim. 把所有的边的cap设为min(Lim,cap[i]). Bob一定会把单位费用加到最大边上. #include<cstdio> #include< ...
- 【带修莫队】bzoj2120 数颜色
块大小为n2/3. 把询问和修改分开. 每次两个询问之间的修改进行暴力转移,如果修改在上一次询问的区间里,就会对当前状态形成影响. 好慢. #include<cstdio> #includ ...
- 【MySQL笔记】SQL语言四大类语言
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句, ...
- 自定义PHP页面跳转函数redirect($url, $time = 0, $msg = '')
利用PHP的header()函数,可以实现页面跳转,如 header("Location: " . $url); 但它有个缺点,一旦HTTP报头块已经发送,就不能使用 header ...
- 论文中的state-of-the-art
最近看了几篇计算机顶会和SCI,摘要里经常出现这个词,我以为是什么算法,查阅的知是“当前最高水平”,我记得老师说不能有这种模糊词语,需要表明提高了多少,看来论文都很水,即便是IEEE,SCI.
- javascript快速入门6--Script标签与访问HTML页面
Script标签 script标签用于在HTML页面中嵌入一些可执的脚本 <script> //some script goes here </script> script标签 ...
- scrapy-splash抓取动态数据例子十四
一.介绍 本例子用scrapy-splash爬取超级TV网站的资讯信息,输入给定关键字抓取微信资讯信息. 给定关键字:数字:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4. ...
- onbeforepaste事件用法
onkeyup="value=value.replace(/[^\d]/g,'')" onbeforepaste="clipboardData.setData('text ...