也談基於Web的含工做流項目的通常開發流程

項目包含的通用模塊代碼等我有時間一併剝離貢獻出來(基於WebSocket的通知引擎,工做流整合模塊,自定義表單,基於RBAC權限設計),最近太忙了,Web項目有一段時間沒碰,有點生疏的感受,主要在忙GQT項目,一套基於桌面開發的框架,寫代碼寫的有點手痠的感受。html

 

基於Web的含工做流的項目看起來並不如想象的那麼簡單,主要需求:json

  1. 靈活定製工做流,並跟蹤流程進度;
  2. 每一個Order含有歷史軌跡記錄,可在歷史中查看;
  3. 工做流的Action靈活,認領任務不必定非要先提取表單,由於不少節點都只有幾個動做,直接按鈕操做便可;
  4. 待辦事宜列表在不刷新頁面狀況下也能變更;

項目要求:瀏覽器

  1. 操做簡單高效;
  2. 權限細節到按鈕級別;
  3. 併發數少,不超過3000個在線用戶;

主要可能使用到技術:併發

  1. 工做流引擎,我這裏選用Activiti5,很靈活好用;
  2. 權限使用Spring Security,基於標籤式管理權限很方便;
  3. 通知引擎使用WebSocket,基於Flash實時通訊,基於socket.io;
  4. 權限粒度基於經典的RBAC;
  5. 整體框架Spring MVC+Mybatis;

實現的WebSocket的整體思路:框架

  1. WebSocket Server獨立於Web項目,Web Server與WebSocket Server之間的局域網通訊基於簡單的Socket通訊,這樣這個組件能夠徹底解耦和通用;
  2. 當Web項目要Push消息到Client時,經過Web Server的Socket Client向WebSocket Server的Socker Server發送消息,而後WebSocket Server收到消息後解碼,廣播到全部瀏覽器;

咱們實現的事件通知很是簡單,設定全局變量並讓瀏覽器偵聽:eclipse

var G_WebSocket=false; 
var EVENT_ORDER_CHANGE_STATUS = "orderChange";
var EVENT_ORDER_CHANGE_AMOUNT = "amountChange";
var EVENT_ORDER_CHANGE_REFUND = "refundChange";
WebSocket.init = function(callbackFunc){
socket = io.connect(connUrl, connOptions);
socket.on('connect', function() {
G_WebSocket=true;
callbackFunc("connect",null);
});
socket.on('disconnect', function() {
G_WebSocket=false;
callbackFunc("disconnect",null);
});
socket.on('clientQuit', function(obj){
G_WebSocket=false;
callbackFunc("clientQuit",obj);
});
socket.on('broadcast', function(obj) {
callbackFunc("broadcast",obj);
});
};

 

在須要偵聽WebSocket接受Web Server推送消息的地方加上一個函數便可:socket

	WebSocket.init(function(command,jsonObj){ 		
if(command=="broadcast"){
if(jsonObj.e == EVENT_ORDER_CHANGE_STATUS){
//TODO:write your code here
}else if(jsonObj.e == EVENT_ORDER_CHANGE_AMOUNT){
//TODO:write your code here
}else if(jsonObj.e == EVENT_ORDER_CHANGE_REFUND){
//TODO:write your code here
}
}
});

這樣的結構要擴展推送服務很簡單,好比按頻道推送等,均可以很容易的擴展。函數

再看看看工做流,咱們實現了activiti通用的申請提交任務流程和自定義表單功能,提取跟蹤流程圖功能等,這樣你要設計一個新流程也變得很是簡單,只須要在eclipse裏劃上工做流圖,在後臺發佈,而後經過SpringMVC的RestAPI啓動實例流程,申領完成任務等,以下圖:ui



流程走到了分支的兩個節點上,這樣對後續新增的工做流提供了極大的遍歷。
url

最後說說Spring Security,基於RBAC的權限體系搭建好後(能夠用在任何管理系統中),要在頁面中訪問一個資源,首先判斷一下是否有權限,以下HTML:

<sec:authorize ifAllGranted="r_pd"> 
<a href="#">resource access here</a>
</sec:authorize>

 

<sec:authorize url="/XXX/XXX/XXX.html"> 	
<a href="XXX/XXX/XXX.html'">
<span>XXX功能</span>
</a>
</sec:authorize>

 

前臺因爲項目比較小,沒有用到js的MVC框架,如backbone等,這裏就再也不記錄了。

相關文章
相關標籤/搜索