activiti自定义流程之整合(四):整合自定义表单部署流程定义
综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功。
正因为如此,在创建了流程模型之后,模型列表的展示也是和之前的没有什么区别,而且都是很简单的后台查询以及前台展示,这一部分也就不过多的讲了。
模型列表页面如下:
至于其中的修改和删除也没什么多讲的,删除很简单,而修改也是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表中会再多出一条表单相关的数据,如图:
那么至此,整合自定义表单部署流程结束。
activiti自定义流程之整合(四):整合自定义表单部署流程定义的更多相关文章
- activiti自己定义流程之整合(四):整合自己定义表单部署流程定义
综合前几篇博文内容.我想在整合这一部分中应该会有非常多模块会跳过不讲,就如自己定义表单的表单列表那一块,由于这些模块在整合的过程中都差点儿没有什么修改,再多讲也是反复无用功. 正由于如此,在创建了流程 ...
- Flowable实战(五)表单和流程变量
一.流程变量 流程实例按步骤执行时,需要保存并使用一些数据,在Flowable中,这些数据称为变量(variable). 流程实例可以持有变量,称作流程变量(process variables ...
- asp.net 微信企业号办公系统-表单及流程设计配置实例
在环境搭建好之后,我们就来学习一下怎样快速创建一个流程,并执行和流转该流程(我们这里讲的只是入门,不涉及到具体流程参数设置). 创建一个流程步骤为:在数据库在创建表-->设计表单-->设置 ...
- Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定
1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...
- (四)Knockout 表单
click <div> You've clicked <span data-bind="text: numberOfClicks"></span> ...
- FlowPortal-BPM——创建新组织架构、表单、流程
一.创建新组织架构 (1)管理流程→组织管理→组织架构添加需要的组织架构→新建新成员或角色 (2)设置成员信息 二.创建新数据源(如果在已有的数据库中操作,只需要添加需要的表) (1)添加新数据库并添 ...
- 驰骋BPM系统-表单引擎-流程引擎 2020年大换装
关键字:驰骋表单引擎,流程引擎,界面升级. 前言概述: 感谢美工与同事们的辛苦工作,ccbpm新年大换装,迎接爱好着,为这阴霾多日的疫情气愤增添一笔光彩. 本次的色系以浅灰色为主,因为ccbpm大 ...
- 五十四:WTForms表单验证之自定义表单验证器
如果想要对表单中的某个字段进行自定义验证,则需要对这个字段进行单独的验证1.定义一个方法,命名规则为:validate_字段名(self, filed)2.在方法中,使用filed.data获取字段的 ...
- 第四章 Web表单
4.1 跨站请求伪造保护 安装flask-wtf app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' 密钥不 ...
随机推荐
- linux 安装redis
1:首先命令行下载安装包 wget http://download.redis.io/releases/redis-2.8.13.tar.gz 2:进行解压 tar xzf redis-2.8.13. ...
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- live555源代码编译
参考http://www.cnblogs.com/MikeZhang/archive/2013/04/24/live555Windows_20130424.html 环境:windowsxp + VS ...
- 3-4 rpm包查询
概述:yum不能查询已经安装好的rpm包, 就算采用了yum来进行安装,查询方法还是依赖rpm包的查询, 因此rpm包的查询十分常用和重要 1.查询是否安装 <1>rpm -q 包名(不是 ...
- URAL 1072 Routing(最短路)
Routing Time limit: 1.0 secondMemory limit: 64 MB There is a TCP/IP net of several computers. It mea ...
- HDU-4003 Find Metal Mineral (树形DP+分组背包)
题目大意:用m个机器人去遍历有n个节点的有根树,边权代表一个机器人通过这条边的代价,求最小代价. 题目分析:定义状态dp(root,k)表示最终遍历完成后以root为根节点的子树中有k个机器人时产生的 ...
- HTML 5 canvas —— 基本语法
目录 简述 canvas 基础 2D context API 基本线条 路径 插入图像 像素级操作 文字 阴影 颜色渐变 小节 简述 HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 ca ...
- 【转】SocketRocket:iOS WebSocket客户端开源框架
原文网址:http://blog.csdn.net/zmp1123/article/details/44015507 WebSocket: WebSocket通信协议实现的是基于浏览器的原生socke ...
- Optimize Managed Code For Multi-Core Machines
Parallel Performance Optimize Managed Code For Multi-Core Machines Daan Leijen and Judd Hall This ar ...
- svn常见错误总结
1. svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS reque ...