空山雪林通用模塊工作室

           

          也談基于Web的含工作流項目的一般開發流程

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

           

          基于Web的含工作流的項目看起來并不如想象的那么簡單,主要需求:

          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收到消息后解碼,廣播到所有瀏覽器;

          我們實現的事件通知非常簡單,設定全局變量并讓瀏覽器偵聽:

          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推送消息的地方加上一個函數即可:

          	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啟動實例流程,申領完成任務等,如下圖:



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

          最后說說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等,這里就不再記錄了。

           

           

          posted on 2014-03-20 12:48 徐靈 閱讀(1677) 評論(6)  編輯  收藏

          評論

          # re: 也談基于Web的含工作流項目的一般開發流程 2014-03-21 10:33 魏五鎖業

          支持支持博主  回復  更多評論   

          # re: 也談基于Web的含工作流項目的一般開發流程 2014-03-22 07:28 鵬達鎖業

          支持博主分享  回復  更多評論   

          # re: 也談基于Web的含工作流項目的一般開發流程 2014-03-22 09:25 金利鎖業

          期待更新啊博主  回復  更多評論   

          # re: 也談基于Web的含工作流項目的一般開發流程 2014-03-22 15:25 天津涂裝設備

          風格是很好的啊  回復  更多評論   

          # re: 也談基于Web的含工作流項目的一般開發流程 2014-03-26 10:55 鵬達鎖業

          堅持每天都來。。。。。。。。。  回復  更多評論   

          # re: 也談基于Web的含工作流項目的一般開發流程 2014-04-02 15:54 web開發組

          有源代碼嗎?樓主,上傳一份學習學習  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          友情鏈接

          最新評論

          主站蜘蛛池模板: 湘潭市| 兴业县| 许昌县| 正宁县| 瓦房店市| 昆明市| 花垣县| 彰化市| 南陵县| 碌曲县| 姜堰市| 长垣县| 浪卡子县| 宁化县| 远安县| 澄迈县| 资阳市| 清镇市| 上饶县| 项城市| 柳河县| 游戏| 轮台县| 怀来县| 湟源县| 平乐县| 武安市| 成都市| 土默特左旗| 绍兴县| 花莲县| 绍兴市| 剑川县| 车险| 沈丘县| 双峰县| 昭觉县| 南投市| 东乌| 文水县| 天津市|