徐建國 萬千山



摘要:為節約管理系統開發成本、縮短系統開發時間,基于J2EE進行企業管理模板開發。模板前后端分離開發,后端以Spring Boot為核心架構,開啟二級緩存;前端采用Vue.js、Element-UI模板引擎框架,使用橢圓曲線加密(ECC)保證數據傳輸安全,并采用Rcdis為二級緩存,MySQL為持久化數據庫,使系統對數據的訪問變得高效且靈活,通過Git和Jenkins實現項目的持續集成與部署。實際開發測試結果表明,該模板可直接使用,普遍縮短了開發時間(20-30天),并有效節約了開發成本。模板具備可維護性與可擴展性,使用敏捷開發方式讓開發者與甲方能夠及時溝通,從而對開發作出及時調整,因此可廣泛應用于實際系統開發中。
關鍵詞:敏捷開發;J2EE;信息管理系統;SpringBoot;Jenkins
DOI:10.11907/rjdk.201130 開放科學(資源服務)標識碼(OSID):
中圖分類號:TP319文獻標識碼:A 文章編號:1672-7800(2020)006-0171-05
0 引言
隨著5C時代的到來,信息交互越來越方便,各類管理軟件在中小型企業中的應用也越來越普遍。由于中小型企業提供的開發資金有限,為使系統快速投入使用,節約開發時間與成本,一般采用敏捷開發(ASD)形式進行項目開發。但一方面ASD中的質量需求(QRs)通常容易定義不清,并且由于人們大多關注于快速交付功能,導致該問題難以得到有效解決;另一方面很多中小型企業管理不規范,在需求描述上本身就不甚明確,反復更改需求的情況時有發生,因此有時不得不被迫忽略QRs。有研究表明,忽略QRs會極大地增加軟件開發與維護成本。如文獻報告稱,若在開發早期階段忽略了與質量相關問題,導致系統質量下降,則需要重新開發整個系統。雖然研究者們已提出一些解決方案,但對于小型開發團隊而言,這些解決方案花費的成本都是巨大的。
當前中小型企業管理系統通用性較強,通過工具搭建一個穩定的敏捷開發環境,以及擁有一個適用于中小型企業軟件開發的模板,可極大地節省開發時間,對開發者(小型開發團隊)及使用者(中小型企業)都有很高的價值。模板使用Spring Boot作為開發框架,相比當前主流的SSME框架,無需繁瑣的xml配置。目前通常使用SpringBoot+thymeleaf進行開發,但thymeleaf不利于前后端分離。本文模板前端使用Vue框架與Element-UI桌面端組件庫,使用Axios以RESTful(Representational StateTransfer,將請求參數變成請求路徑)風格發起異步請求完成數據交互,并返還json數據;通過Git、Jenkins以及遠程tomcat服務器實現持續集成、持續部署與持續交互;設置Redis為MySQL的二級緩存,以提高查詢效率。
1 需求分析
基于敏捷開發的信息管理系統有以下共同點:
(1)持續集成與持續部署。實現持續集成與持續部署是敏捷開發的基本要求,可讓項目快速進入測試階段,完成測試后可快速交付給客戶投入使用。
(2)數據安全與權限管理。數據安全可在公共方法類中實現,而權限管理則可通過設計角色與權限為多對多關系的管理模塊完成。
(3)基礎編碼模塊。不同企業具有不同業務流程,但大多數企業都會涉及各類編碼和BOM,因此設計一個完整的方案將基礎編碼模塊化,有利于減少開發時間。
(4)消息推送與實時通信。大多數信息管理系統都需實現消息推送或實時通信功能,Ajax輪詢雖然能解決該問題,但代碼量龐大且不便于復用,因此WebSocket已逐漸成為實現消息推送或實時通信的主流方法。
2 環境搭建與架構設計
2.1 持續集成、持續部署及持續交付
搭建的模板實現了項目的持續集成、持續交付及持續部署。
持續集成通過Git實現,開發者根據功能模塊創建不同分支,并在分支上展開工作,每次更新都提交到相應分支,并將開發的內容合并到master分支(主分支)上。若提交上線的分支中出現bug,需要緊急修復,為了不影響正在進行的后續開發工作,可找到已上線的版本分支,在該分支上再新建一個分支B,在B上修復bug后,將其分別合并到線上分支與正在進行后續開發的分支上,從而實現對尚在持續開發過程中線上版本bug的修復。
利用服務器中的ienkins實現持續部署,當每次代碼倉庫中的master分支發生變化時,都會由webhook通知jenkins將更新的代碼下載到服務器上。對于服務器端而言,webhook相當于一個觸發器。
部署設計上不整合前后端,將前端部署到Nginx代理服務器上,用戶訪問代理服務器,前端向后端發送的請求通過Nginx的反向代理傳輸到后端。采用Nginx反向代理設計方式,為后續可能存在的分布式部署提供了便利。
2.2 分層設計
后端分層設計參照阿里巴巴Java開發分層思想,根據系統自身情況進行一定調整,如圖1所示。
具體分層如下:
(1)開放接口層:即Controller層,負責響應Post/Get/Put/Delete等請求,并返還數據。系統模板采用前后端分離開發方式,在Controller層,除進行網關安全控制與流量控制外,對外只暴露接口,具體的業務邏輯轉發至Service層進行處理。
(2)業務邏輯層:即Service層,接收Controller層轉發的具體業務邏輯并進行處理。
(3)通用處理層:即Manager層,將Service層中可復用的部分下放到該層,如緩存與加密方案、中間件通用處理,以及多個DAO層的組合復用等。
(4)數據持久層:即DAO(Data Access Objects)層,對底層的MySQL、Oracle等進行數據交互。在本系統模板中,主要是對Redis與MySQL進行交互。
2.3 Redis二級緩存
配置文件中開啟二級緩存,自定義類實現Mybatis的Cache接口。將所有實體類進行序列化,然后在Mapper中添加自定義cache功能。此后,Redis將SQL+條件+Hash等作為key值,并將查詢結果作為value。當請求中的所有參數都與key值中對應項符合時,便會使用Redis中的二級緩存。
3 通用方法與系統安全
3.1 統一返還類與公共方法類
統一返還類與公共方法類(通用處理)放置在通用業務處理層中。在進行前后端分離開發時,統一返還類必不可少。在統一返還類ResultBean中,data、code和msg分別返還數據、狀態碼和消息,并根據開發過程中的常見問題定義如無權限、登錄錯誤、操作成功、數據庫異常和一些已知錯誤等的狀態碼等。
在公共方法類中封裝的方法通常有時間戳獲取、算法加密、字符串生成、文件上傳下載方法等。此外,mybatis在執行插入、刪除與修改功能時,默認返還操作記錄的條數。因此,本文在公共方法類中添加如下代碼,以減少大量重復代碼。
3.2 權限管理與數據安全
權限管理與數據安全調用Apache Shiro中的方法完成。大多數管理系統的權限模塊相似,以實現用戶與角色多對多、角色與權限多對多為設計準則。表結構設計如圖2所示。
設計中User僅有id和password兩個非空字段,后期可根據需求,利用外鍵關聯Staff/Customer等表靈活地對不同用戶實施權限管理。
在數據安全設計方面,對普通登錄進行驗證,以保證信息安全,并采用橢圓曲線加密算法對數據進行加密處理。當前端向后端提交數據時,前端發送的數據通過公鑰進行加密,以json字符串形式發送到后端接口,并在后端用私鑰進行解密。
對于一些涉密數據,由于Web端代碼可視,本文設計如圖3所示方案,以保證數據的安全性。
首先,前后端約定好一組密鑰對,其中前端保存該密鑰對的公鑰部分(pb0),后端保存該密鑰對的私鑰部分(pv0)。它們是由橢圓曲線加密算法生成的一組密鑰對,用于加密傳輸密鑰和請求等信息。同時在后端設置一個極短的有效時間t0,用來保證由前端生成的用于加密后端發送的數據隨機密鑰對有有效期約束。
Stepl:在前端生成隨機的密鑰對(密鑰對包含一個公鑰(pbt)和一個私鑰(pvt)),同時截取時間戳t,將時間戳一密鑰對成對地存人到前端緩存中(考慮到密鑰長度,存人localStorage,而非Cookie)。
Step2:對身份信息、時間戳t及前端生成的公鑰(pbt),用約定的公鑰(pb0)進行加密。
Step3:發送請求,請求中包含已加密的上述信息。
Step4:后端通過約定的私鑰(pv0)進行解密,驗證身份信息,校驗時間是否超過有效期。若未過有效期且身份信息合法,則響應前端請求,并使用由前端傳來的公鑰(pbt)對將要發送到前端的數據進行加密,同時將z隨數據一起發送到前端。
Step5:前端獲取數據后,利用時間戳,在localStorage中查詢與該時間戳對應的私鑰(pvt),對數據進行解密,同時刪除localStorage中與之對應的時間戳一密鑰對。
3.3 WebSocket實現推送或實時通信
通過瀏覽器發出WebSocket連線請求,服務器回應,完成握手。只需一次握手,瀏覽器即與服務器形成快速通道,兩者便可進行數據傳送,該通訊為“雙全工”模式。打開連接后端代碼如下:
3.4 基礎編碼模塊
將常見的如崗位、學歷、性別、專業、院校、員3-3-號格式、物料編碼格式等編碼統一錄入到一個表(basic_coding)中,在表中添加type字段以區分是哪種編碼。
4 項目應用
青島某保潔公司需要快速開發一個管理系統,用于企業管理以及為員工派發工作任務。根據需求,將系統劃分為如下幾個模塊:
(1)用戶(員工)管理模塊。除管理員工基本信息外,還包括崗位變動、職務變動、部門變動、請銷假記錄、工作記錄以及員工位置定位幾個子模塊。
(2)任務模塊。主要實現任務信息發布、任務分解、任務分配、任務進展查詢4大功能。
(3)車輛管理模塊。車輛登記與車輛使用狀態記錄。
(4)物料管理模塊。對于保潔工具和物料統一進行管理,實現物料/工具出入庫記錄、物料消耗記錄、物料/工具供應管理、物料/工具庫存管理以及物料/工具損壞/維修記錄幾大功能。
(5)權限管理模塊。要求能自由地為所有用戶角色分配權限。
按照以上要求,使用模板在user表中添加外鍵staff_id與員工信息相關聯后,按需進行相關開發工作,開發過程比預計的3個月縮短了近1個月時間。
員工管理模塊如圖4所示(注:圖中數據為測試數據,不涉及真實信息)。
5 結語
本文結合常用的信息管理系統,設計并搭建了一個適用于敏捷開發的管理系統開發模板,采用Redis作為MySQL的二級緩存,極大地提高了系統查詢效率。模板中的權限管理模塊獨立、功能完善,而且即插即用,能在系統中設定不同權限、角色,從而使不同人員方便、安全地共享信息,達到既能分散操作,又能集中管理的目的。同時,該模板可擴展性強,配合Flutter可完成移動端開發。經過實際系統開發測試,結果表明,該模板能極大地節省開發時間,但仍存在許多不足。如持續集成完成后缺乏對測試人員的通知,需要測試人員隨時跟進版本進行測試;采用前后端分離和Nginx導致前端代碼需要先上傳后編譯(前端源碼上傳到服務器后,再于服務器上進行編譯生成相應的html、JaVaScript和各種靜態文件)等,期望在后續開發中有更好的方案解決以上問題。