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自己定義流程之整合(四):整合自己定義表單部署流程定義
borde row ont 創建 source als dst art select 綜合前幾篇博文內容。我想在整合這一部分中應該會有非常多模塊會跳過不講,就如自己定義表單的表單列表那一塊,由於這些模塊在整合的過程中都差點兒沒有什麽修改,再多講也是反復無用功。
activiti自定義流程之整合(三):整合自定義表單建立模型
本來在建立了表單之後應該是表單列表和預覽功能,但是我看了看整合的程式碼,和之前沒有用angularjs的基本沒有什麼變化,一些極小的變動也只是基於angularjs的語法,因此完全可以參考之前說些的表單列表展示相關的內容,這裡也就直接進入到下一個步驟,建立流程模型了。
我的C#跨平臺之旅(四):使用AOP進行系統增強
odata ima ges rest eba 技術分享 啟動 get header 使用OData提速REST API開發 引入NuGet包:Microsoft.AspNet.WebApi.OData 在啟動類中添加如下配置(示例為全局配置,也可基於Contro
我的機器學習之旅(四):回歸與工程應用
多個 算法 ati function RR numpy pen 圖片 bsp 內容:線性回歸;邏輯回歸,應用場景。 一、線性回歸 有監督學習,根據學習樣本{x->y},學習一個映射f:X->Y(線性相關),輸出預測結果y_i。最簡單的例子:y=ax+b 重要組成
深度學習之 TensorFlow(四):卷積神經網絡
padding valid 叠代 val 分析 此外 nbsp drop BE 基礎概念: 卷積神經網絡(CNN):屬於人工神經網絡的一種,它的權值共享的網絡結構顯著降低了模型的復雜度,減少了權值的數量。卷積神經網絡不像傳統的識別算法一樣,需要對數據進行特征提取和數據重
Linux 學習之路(四):管道、重定向、正則
管道及IO重定向 運算器、控制器:CPU 儲存器:RAM 輸入裝置/輸出裝置 程式:指令和資料 控制器:指令 運算器: 儲存器: 地址匯流排:記憶體定址 資料匯流排:傳輸資料 控制匯流排:控制指令 暫存器:CPU暫時儲存器 I/O:硬碟 系
微信小程式填坑之路(四):微信登入獲取openid、unionid
在微信小程式中,因為各種各樣的原因我們會需要獲取到使用者的openid或者unionid下面就簡單來講一下在小程式中如何獲取openid和unionid。 步驟一:微信登入獲取登入憑證
Cocos2D遊戲之旅(四):卡牌翻轉效果的實現(下)
曉石頭的部落格 郵箱:[email protected] 上篇講解了用ScaleTo縮放卡牌,達到翻轉的效果。 條條大道通羅馬,RotateBy 旋轉卡牌同樣能夠實現,而且效果更棒,就看你喜歡哪種了! 效果對比圖 一、先談思路: 用ScaleTo縮放卡
linux系統程式設計之程序(四):程序退出exit,_exit區別即atexit函式
一,程序終止有5種方式: 正常退出: 從main函式返回 呼叫exit 呼叫_exit 異常退出: 呼叫abort 由訊號終止 二,exit和_exit區別: 關於_exit(): #include <unistd.h>
MyEclipse整合SSM框架(四):整合前端頁面,通過ajax請求獲得資料
Spring+SpringMVC+Mybatis 框架已經搭建完成,其中包括:(1)maven工程的搭建 (2)框架所需要的配置檔案的配置 (3)Mybatis 建立逆向工程連結資料庫。相應的配置檔案參見前幾篇部落格。此篇整理前端頁面傳送ajax 請求到後端,後端通過 Myb
我的python之路(四):列表
mage cycle 之間 信息 索引 網站 告訴 tor 提取 1、列表是什麽 列表是由一系列按照特定順序排列的元素組成,它可以創建包含字母表中的所有字母、數字0-9或所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒有任何關系。鑒於列
Spring Boot 2.x(四):整合Mybatis的四種方式
前言 目前的大環境下,使用Mybatis作為持久層框架還是佔了絕大多數的,下面我們來說一下使用Mybatis的幾種姿勢。 姿勢一:
詳解C#中Socket通訊(四):使用雜湊表管理客戶端
public void StartListening() { //獲取本機IP地址 IPHostEntry ipHost = Dns.GetHostEntry(Dns.GetHostName()); HostIP = ipHo
ASP.NET 安全認證(一):如何運用 Form 表單認證
程式碼寫 N 久了,總想寫得別的。這不,上頭說在整合兩個專案,做成單一登入(Single Sign On),也有人稱之為“單點登入”。查閱相關文件後,終於實現了,現在把它拿出來與大家一起分享。或許大家會問:“這與標題不符呀?”別急,在下筆之前,我腦子裡想到了我剛使用 Form
activiti自定義流程之整合(六):獲取我的申請任務
流程啟動後,流程節點便進入到了任務相關的部分。可以看到我之前的做法是在啟動節點就綁定了form表單,啟動時就填寫相關的資料。實際上在之前我的做法是不對開始節點做任何操作,知道任務節點的時候再填寫相關的資料進行設定。 至於這兩種方式的優劣,我暫時還不太確定,單獨從功能上來說
從零開始學 Web 之 HTML5(四)拖拽介面,Web儲存,自定義播放器
>大家好,這裡是「 從零開始學 Web 系列教程 」,並在下列地址同步更新...... > > - github:https://github.com/Daotin/Web > - 微信公眾號:[Web前端之巔](https://github.com/Daotin/pi
從零開始學 Web 之 jQuery(四)元素的建立新增與刪除,自定義屬性
一、元素的建立新增和刪除 1、方式一:以物件的方式建立元素 append,appendTo :在被選元素所有子元素的結尾插入內容(增加子元素)。 prepend,prependTo:在被選元素所有子元素的開頭插入元素(增加子元素)。 before:在當前被選元素之後插入內容(相當於增加兄弟元素)。 af
自定義控制元件之繪圖篇(四):canvas變換與操作
前言:前幾篇講解了有關canvas繪圖的一些操作,今天更深入一些,講講對畫布的操作,這篇文章不像前幾篇那麼容易理解,如果以前沒有接觸過畫布的童鞋可能比較難以理解,為什麼會這樣。我儘量多畫圖,讓大家更清晰明白。前幾天偶然看到一篇文章,寫的樸實無華,充滿正能量,我非常喜歡裡面的一
Django 筆記(四)模板標籤 ~ 自定義過濾器
模板標籤: 標籤在渲染的過程中提供任意的邏輯 語法: 由{% ... %} 和 {% end... %} 常用標籤: with:類似取別名 模版繼承: Django模版引擎中最強大也是最