本来在创建了表单之后应该是表单列表和预览功能,但是我看了看整合的代码,和之前没有用angularjs的基本没有什么变化,一些极小的变动也只是基于angularjs的语法,因此完全可以参考之前说些的表单列表展示相关的内容,这里也就直接进入到下一个步骤,创建流程模型了。

在之前的创建流程模型一节里,我讲代码比较多,实际上在这里还有很重要的一个环节没有细说,那就是自定义流程图,画流程图的过程也是有不少需要注意的事项的,在这一节我会适当的以截图加解释进行说明。

而在创建流程模型的过程中,因为之前也是用java、spring、angularjs等,所以在代码上实际上并没有什么变化,不同之处就在流程图制作上,还有就是activiti内部自己实现,我们不用管他,那么这里着重要讲的就是调用activiti-modeler来画流程图。

我们的创建模型首先是在自己制作的页面填好模型的name、key、description等,然后提交到后台,进而跳转到activiti-modeler流程图制作界面。自定义的页面如下图:

填写数据的这个页面代码如下:

  1. <div id="create"style="margin-top:100px;margin-left:290px;background-color:#9cc;height:350px;width:40%;font-size:26px;position:relative;float:left;">
  2. <p style="font-size:30px">创建模型</p>
  3. Name   :<input type="text" name="name"ng-model="activiti.name"/>
  4. </br>
  5. </br>
  6. Key    :<input type="text" name="key"ng-model="activiti.key"/>
  7. </br>
  8. </br>
  9. Description:<input type="text" name="description"ng-model="activiti.description"/>
  10. </br>
  11. </br>
  12. <input style="font-size:28px;cursor:pointerborder:1px solid;border-radius:0.5em;" type="button"value="创建模型" ng-click="createTo(activiti);"/>
  13. <input style="font-size:28px;cursor:pointer;cursor:pointerborder:1px solid;border-radius:0.5em;" type="button"value="返回"/>
  14. </div>

在我们填好相关数据以后,点击提交,便会触动createTo方法进入到js代码中,对应的整个js代码如下:

  1. angular.module('activitiApp')
  2. .controller('createCtr', ['$rootScope','$scope','$http','$location','$state', function($rootScope,$scope,$http,$location,$state){
  3. //创建模型
  4. $http.post("createFlush.do").success(function(result){
  5. if(result.isLogin==="yes"){
  6. $rootScope.userName=result.userName;
  7. }else{
  8. $location.path("/login");
  9. }
  10. });
  11. $scope.createTo=function(activiti){
  12. //向后台提交数据
  13. $http.post("./create.do",activiti,{headers:'Content-Type:application/json'}).success(function(createResult){
  14. console.log(createResult);
  15. $location.path("/modelList");
  16. window.open("http://localhost:8080/activitiTest1"+createResult.path+createResult.modelId);
  17. });
  18. }
  19. }])

在上述的代码中可以看到createTo方法是直接调用$http向后台发送post请求,然后把页面中的数据对象直接传到后台,并没有多做处理,这里涉及到angularjs的双向数据绑定,如果有不明白的,可以自己去了解以下。

需要注意的是,发送请求并接收后台返回数据后,从返回数据中拿到path和modelid然后跳转到activiti-model流程图设计页面,这里可以先看一下下边的后台代码再返回来看。

经过http请求,操作便运行到后台,相应的后台代码如下:

  1. /**
  2. * 创建模型
  3. *
  4. * @author:tuzongxun
  5. * @Title: create
  6. * @param@param activiti
  7. * @param@param request
  8. * @param@param response
  9. * @param@return
  10. * @return Object
  11. * @date Mar 17, 201612:30:29 PM
  12. * @throws
  13. */
  14. @RequestMapping(value = "/create.do", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
  15. @ResponseBody
  16. public Object create(@RequestBody ActivitiModel activiti,
  17. HttpServletRequest request, HttpServletResponse response) {
  18. Map<String, String> map = new HashMap<String, String>();
  19. Boolean isLogin = this.isLogin(request);
  20. if (isLogin) {
  21. Model newModel = repositoryService.newModel();
  22. try {
  23. ObjectMapper objectMapper = new ObjectMapper();
  24. ObjectNode modelObjectNode = objectMapper.createObjectNode();
  25. modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME,
  26. activiti.getName());
  27. modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
  28. modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION,
  29. StringUtils.defaultString(activiti.getDescription()));
  30. newModel.setMetaInfo(modelObjectNode.toString());
  31. newModel.setName(activiti.getName());
  32. newModel.setKey(StringUtils.defaultString(activiti.getKey()));
  33. repositoryService.saveModel(newModel);
  34. ObjectNode editorNode = objectMapper.createObjectNode();
  35. editorNode.put("id", "canvas");
  36. editorNode.put("resourceId", "canvas");
  37. ObjectNode stencilSetNode = objectMapper.createObjectNode();
  38. stencilSetNode.put("namespace",
  39. "http://b3mn.org/stencilset/bpmn2.0#");
  40. editorNode.put("stencilset", stencilSetNode);
  41. repositoryService.addModelEditorSource(newModel.getId(),
  42. editorNode.toString().getBytes("utf-8"));
  43. } catch (Exception e) {
  44. e.getStackTrace();
  45. }
  46. //response.sendRedirect(request.getContextPath() +
  47. //"/service/editor?id="
  48. // +newModel.getId());
  49. map.put("isLogin", "yes");
  50. map.put("userName",
  51. (String) request.getSession().getAttribute("userName"));
  52. map.put("path", "/service/editor?id=");
  53. map.put("modelId", newModel.getId());
  54. } else {
  55. map.put("isLogin", "no");
  56. }
  57. return map;
  58. }

这一段代码里涉及到的东西还比较多,有一些我也不是很理解,只是这段代码基本上就是这样不怎么会变了,我也暂时没有深入理解,可以看到这段代码跟之前说列的也是一样,那么这里我要说的是最后走完这段代码返回数据给前台。

可以看到其中有一个path属性和modelId,正是这两个属性返回给前台后,前台angularjs再控制路由跳转到activiti-model流程图设计页面(这个页面完全整合而来,非自己创造)。根据path和modelId跳转后的界面如下:

这个界面是整合而来,在跳转的过程中会自动把之前我们填写的数据带入过来,当然了,还有modelId,这个时候数据库实际上已经有了数据。

进入到这个界面,那么下边就要正式开始设计流程图了,首先如下图所示的创建开始节点,创建方法是找到StartEvent按钮,按住鼠标左键拖拽到右方空白处即可。

然后在这个开始节点后边有许多按钮可以点击,我们选择下图中箭头所指的个人任务,然后便新建了一个任务节点,当然了,如果能学到自定义流程图这一步,我想大家应该已经对流程图的基础有一定了解了,起码在eclipse中画流程图应该已经没有问题,所以这里大家应该不难理解,否则的话,不如先用eclipse中的插件了解一下。

这样的话,依照上边的步骤我们就可以创建出如下图的流程图雏形,包含开始节点、两个任务节点,然后是结束节点:

那么接下来就是比较重要的了,开始进入自定义表单整合的环节。

在上图中可以看到右方我用箭头指了一个地方,attributes,顾名思义,就是属性,这里是可以点开的,假如大家能走到这一步来,就可以看到在不同情况下这里显示的不一样。

首先我们不选中任何节点,可以看到属性如下:

而我们选中开始节点和任务节点是属性又分别如下图1和图2:

图2:

但是不管是开始节点还是任务节点,都有Formkey这个属性,在这里我们就可以指定每个节点需要使用的自定义表单文件的名称,通常是xxx.form的形式。指定好formkey以后就可以点击保存,也可以设置其他的属性,如任务中的assignment和name、key等等。

而这里的整个页面都不是自己写的,保存相关的方法也不是自己写的,只要数据库配置正确,activiti-modeler就会自动把这些数据保存到数据库中,模型创建完毕。

activiti自定义流程之整合(三):整合自定义表单创建模型的更多相关文章

  1. activiti自己定义流程之整合(三):整合自己定义表单创建模型

    本来在创建了表单之后应该是表单列表和预览功能.可是我看了看整合的代码,和之前没实用angularjs的基本没有什么变化,一些极小的变动也仅仅是基于angularjs的语法,因此全然能够參考之前说些的表 ...

  2. activiti自定义流程之自定义表单(三):表单列表及预览和删除

    注:(1)环境配置:activiti自定义流程之自定义表单(一):环境配置 (2)创建表单:activiti自定义流程之自定义表单(二):创建表单 自定义表单创建成功,要拿到activiti中使用,自 ...

  3. 用dedecms自定义表单创建简易自助预约系统

    建站往往需要根据客户的需求来增加相应的功能,比如预约.平时用比较多的是织梦系统,那么如何用dedecms自定义表单创建简易自助预约系统呢? 进入dedecms后台,左侧菜单中依次点击“核心” - 频道 ...

  4. [MVC]自定义模型绑定器,从表单对模型进行赋值

    一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...

  5. HTML第三章:表单

    第三章:表单 表单标签form:<form></form>//相当于一张记录用户信息的单子    常用属性:method:表单的提交方式,常用的值有两个             ...

  6. Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定

    1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...

  7. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  8. CoreData 从入门到精通(三)关联表的创建

    上篇博客中讲了 CoreData 里增删改查的使用,学到这里已经可以应对简单的数据存储需求了.但是当数据模型复杂起来时,例如你的模型类中除了要存储 CoreData 里支持的数据类型外,还有一些自定义 ...

  9. 第三章 XHTML 表单

    1.表单的主要作用在于在网页上提供一个图形用户界面,以采集和提交用户输入的数据. 2.HTML表单元素和属性可以分为两种类型:定义表单整体结构,使浏览器知道如何处理表单数据的元素:创建输入控件的元素. ...

随机推荐

  1. JavaMail入门第五篇 解析邮件

    上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式.规范复杂得很.不过,我们所用的浏览器内置了解析各种数据类 ...

  2. 内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统

    linux内核最小系统,使用内核版本:https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.8.1.tar.bz2 1,FL2440板子的基本硬件: ...

  3. PHP(1)——学习之前做点啥准备

    工欲善其事必先利其器,当然是先准备工具咯.首先硬件条件就是双核CPU以及8G内存的电脑一台,操作系统环境:windows(64bit)7+.Mac OSX 10.10+.Linux 64bit.软件环 ...

  4. (旧)子数涵数·VB——变量

    最近,VB吧频繁出现如下图所示的帖子(现在C吧.VB吧等都已经被二级考生玩坏了) 这主要用到的是变量的概念 首先,我们来看一下变量的数据类型 当然,就这题而言,数据类型不是重点,主要考察的是变量的作用 ...

  5. $(document).ready()即$()方法和window.onload方法的比较

    以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...

  6. .NET Core的“dotnet restore”、“dotnet build”和“dotnet run”命令都是用来干什么的?

    dotnet restore 源代码:https://github.com/dotnet/cli/tree/rel/1.0.0/src/dotnet/commands/dotnet-restore 入 ...

  7. winform(ListView及数据库连接)

    一.ListView:列表展示数据1.视图 - 在其右上方小箭头点击将视图改为Largelcon:或右键属性在外观View将其改为Details2.设置列头 - 在其右上方小箭头点击选择编辑列,然后添 ...

  8. 原生js验证简洁美观注册登录页面

    序 一个以js验证表单的简洁的注册登录页面,不多说直接上图 效果 主要文件 完整代码 sign_up.html 注册表单 <!DOCTYPE html> <html lang=&qu ...

  9. 【使用 DOM】使用 Window 对象

    1. 获取 Window 对象 可以用两种方式获得Window对象.正规的HTML5方式是在Document对象上使用defaultView属性.另一种是使用所有浏览器都支持的全局变量window . ...

  10. 总结隐藏Ribbon菜单的方法

    1. 重载 using (SPSite site = new SPSite("http://SP2010-01")) { using (SPWeb web = site.OpenW ...