該項目包含的通用子產品代碼等我有時間一并剝離貢獻出來(基于WebSocket的通知引擎,工作流整合子產品,自定義表單,基于RBAC權限設計),最近太忙了,Web項目有一段時間沒碰,有點生疏的感覺,主要在忙GQT項目,一套基于桌面開發的架構,寫代碼寫的有點手酸的感覺。
基于Web的含工作流的項目看起來并不如想象的那麼簡單,主要需求:
靈活定制工作流,并跟蹤流程進度;
每個Order含有曆史軌迹記錄,可在曆史中檢視;
工作流的Action靈活,認領任務不一定非要先提取表單,因為很多節點都隻有幾個動作,直接按鈕操作即可;
待辦事宜清單在不重新整理頁面情況下也能變動;
項目要求:
操作簡單高效;
權限細節到按鈕級别;
并發數少,不超過3000個線上使用者;
主要可能使用到技術:
工作流引擎,我這裡選用Activiti5,很靈活好用;
權限使用Spring Security,基于标簽式管理權限很友善;
通知引擎使用WebSocket,基于Flash實時通信,基于socket.io;
權限粒度基于經典的RBAC;
總體架構Spring MVC+Mybatis;
實作的WebSocket的總體思路:
WebSocket Server獨立于Web項目,Web Server與WebSocket Server之間的區域網路通信基于簡單的Socket通信,這樣這個元件可以完全解耦和通用;
當Web項目要Push消息到Client時,通過Web Server的Socket Client向WebSocket Server的Socker Server發送消息,然後WebSocket Server收到消息後解碼,廣播到所有浏覽器;
我們實作的事件通知非常簡單,設定全局變量并讓浏覽器偵聽:
在需要偵聽WebSocket接受Web Server推送消息的地方加上一個函數即可:
這樣的結構要擴充推送服務很簡單,比如按頻道推送等,都可以很容易的擴充。
再看看看工作流,我們實作了activiti通用的申請送出任務流程和自定義表單功能,提取跟蹤流程圖功能等,這樣你要設計一個新流程也變得非常簡單,隻需要在eclipse裡劃上工作流圖,在背景釋出,然後通過SpringMVC的RestAPI啟動執行個體流程,申領完成任務等,如下圖:
流程走到了分支的兩個節點上,這樣對後續新增的工作流提供了極大的周遊。
最後說說Spring Security,基于RBAC的權限體系搭建好後(可以用在任何管理系統中),要在頁面中通路一個資源,首先判斷一下是否有權限,如下HTML:
前台由于項目比較小,沒有用到js的MVC架構,如backbone等,這裡就不再記錄了。