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