楊英櫻,喬運華,班玉榮
(北京機械工業(yè)自動化研究所有限公司,北京 100120)
RS10系統(tǒng)管理子系統(tǒng)是整個RS10系統(tǒng)正常運行的基礎(chǔ),可以選擇不同的操作系統(tǒng)和數(shù)據(jù)庫,可以設(shè)置個性化菜單,可以為其他子系統(tǒng)提供權(quán)限理,是系統(tǒng)管理員的好助手,是RS10系統(tǒng)的入口,更是RS10系統(tǒng)不可或缺的一部分。
之前的RS10版本存在以下問題:
采用客戶端發(fā)送請求的方式存在很多弊端,比如JSP只能在支持java的管web服務(wù)器中運行,無法使用nginx提升并發(fā)性能、服務(wù)器收到的請求太多,壓力太大,頁面響應(yīng)慢、前后端不分離,修改時需要雙方協(xié)同開發(fā),效率低下。
系統(tǒng)管理子系統(tǒng)在配置頁面以及修改頁面時,每個需要做授權(quán)的頁面、驗證的頁面、權(quán)限校驗的頁面等邏輯相同的頁面都需要寫同樣的過濾程序,同樣的驗證程序,代碼重復(fù)率高,代碼復(fù)用度低,不符合面向切面編程(AOP)的思想。
基于上述問題我們采用了spring boot微服務(wù)架構(gòu)和面向切面編程的思想,即把相同的業(yè)務(wù)邏輯抽象成模塊。通過采取這樣的方式,我們達成了以下效果:
1)瀏覽器發(fā)送請求后直達HTML頁面,通過ajax調(diào)用服務(wù)端口產(chǎn)生數(shù)據(jù),實現(xiàn)前后端真正的解耦,前后端分離;
2)在大并發(fā)情況下,我可以同時水平擴展前后端服務(wù)器,可以將除了接口以外的其他所有http請求全部轉(zhuǎn)移到前端nginx上。
3)把授權(quán)、驗證等相關(guān)業(yè)務(wù)抽象出來作為模型化可以實現(xiàn)代碼復(fù)用,提升效率,在需要用到權(quán)限校驗的地方、數(shù)據(jù)驗證的地方調(diào)用模型的公用方法處理即可。
4)模型是可配置的,可以動態(tài)調(diào)整權(quán)限校驗邏輯一處修改處處生效,極大的提高了效率。
本系統(tǒng)管理以SpringBoot作為主要核心框架,以ExtJs作為UI框架,基于B/S結(jié)構(gòu)上支持多種數(shù)據(jù)庫,以MyBatis作為數(shù)據(jù)持久層框架,用Log4j來記錄日志,以Maven進行項目管理框架的開發(fā)。
Spring框架是 一種開源應(yīng)用框架。它的核心主要為:控制反轉(zhuǎn)(IOC)和面向切面(AOP)這兩個概念。
IoC是提供具有控制反轉(zhuǎn)特性的容器,它可以解決創(chuàng)建了許多重復(fù)對象,造成大量資源浪費;更換實現(xiàn)類需要改動多個地方;創(chuàng)建和配置組件工作繁雜,給組件調(diào)用方帶來極大不便等問題
AOP就是面向橫向切面的編程。它可以解決切面邏輯編寫繁瑣,有多少個業(yè)務(wù)方法就需要編寫多少次的問題。
Spring Boot是發(fā)展在Spring的基礎(chǔ)上,操作上更加簡便,因為它可以根據(jù)jar包和類自動配置Bean,極大的簡化了應(yīng)用程序初始搭建和開發(fā)過程。配置文件少了、節(jié)約了大量的開發(fā)時間并提高了生產(chǎn)力。對整個團隊的開發(fā)及維護來說,避免了編寫XML配置和注釋等。
不僅如此,Spring Boot內(nèi)嵌了servlet容器,從而降低了對環(huán)境的要求,只需執(zhí)行java-jar xx.jar命令就可以獨立運行Spring Boot項目,并且還可以對其進行監(jiān)控。
ExtJS是一款功能非常強大的用來開發(fā)前端界面的的JS框架。它具備一套完整的組件庫、支持多種強大功能,主要用于創(chuàng)建前端用戶界面,是瀏覽器里的桌面級UI庫。開發(fā)者可以通過ExtJS提供的強大組件迅速的開發(fā)出強大美觀的軟件界面。
系統(tǒng)管理模塊提供業(yè)務(wù)系統(tǒng)功能管理,使系統(tǒng)管理員可以為系統(tǒng)賬號配置功能權(quán)限及菜單權(quán)限,是平臺運行的基礎(chǔ)。系統(tǒng)功能模塊圖如圖1所示:
圖1
但是其中的模塊管理存在很多的重復(fù)性邏輯代碼,在多個邏輯過程中有重復(fù)的操作行為,比如授權(quán)賬號時每個需要做權(quán)限校驗的頁面都需要寫同樣的權(quán)限過濾程序和同樣的權(quán)限驗證程序代碼,很繁瑣。所以我們基于面向切面編程的編程思想,針對業(yè)務(wù)處理過程中的切面進行模型化,之后調(diào)用模型的公用方法進行處理,以獲得邏輯過程中各部分之間低耦合性的隔離效果。
通用服務(wù)平臺支持業(yè)務(wù)留痕模型、流程驅(qū)動模型、業(yè)務(wù)授權(quán)模型、數(shù)據(jù)和理性校驗?zāi)P汀I(yè)務(wù)數(shù)據(jù)結(jié)轉(zhuǎn)模型支持、消息推送模型支持、第三方數(shù)據(jù)交互模型、算法庫模型。
每一種模型都需要先定義通用對象類型,比如業(yè)務(wù)授權(quán)模型中,首先需要定義通用授權(quán)對象類型,供功能授權(quán)和業(yè)務(wù)授權(quán)模型選擇使用。內(nèi)置數(shù)據(jù)包括賬號授權(quán)、角色授權(quán)、組織授權(quán)、崗位授權(quán)。通過業(yè)務(wù)授權(quán)模型定義來進行開發(fā)業(yè)務(wù)授權(quán),調(diào)用通用授權(quán)方法,完成授權(quán);業(yè)務(wù)權(quán)限校驗時,可以調(diào)用通用權(quán)限查詢方法,獲取查詢結(jié)果。查詢時,通用查詢模型需要封裝成動態(tài)查詢條件,匹配該條件加上頁面?zhèn)鬟f的篩選條件得到查詢條件,封裝通用查詢頁面,關(guān)聯(lián)查詢的方法。
通用服務(wù)平臺詳細功能如圖2所示。
圖2
2.1.1 授權(quán)模型
授權(quán)模型是用來進行頁面中用戶、角色、菜單直接的權(quán)限配置的。
首先給做授權(quán)業(yè)務(wù)的頁面定義一個授權(quán)頁面號,用于唯一標識一個模型。然后根據(jù)數(shù)據(jù)字典建立授權(quán)結(jié)果表,根據(jù)實際業(yè)務(wù)場景定義授權(quán)模型。授權(quán)結(jié)果表中的的業(yè)務(wù)字段與模型明細中的業(yè)務(wù)字段要一一對應(yīng)。授權(quán)模型定義完成后生成針對授權(quán)表的新增、修改、刪除方法,各個業(yè)務(wù)字段的望遠鏡,針對于業(yè)務(wù)原表的檢索方法。根據(jù)授權(quán)頁面號從授權(quán)模型頭表中查詢到唯一記錄,獲取該授權(quán)頁面對應(yīng)的授權(quán)結(jié)果表名和需要修改的權(quán)限記錄的所有字段名及對應(yīng)值,從授權(quán)模型配置表中查找當(dāng)前系統(tǒng)中該授權(quán)頁面對應(yīng)模型所使用的授權(quán)對象類型。通用方法自動獲取當(dāng)前頁面的表單信息對應(yīng)到授權(quán)結(jié)果表的各個字段,執(zhí)行數(shù)據(jù)保存操作寫入授權(quán)結(jié)果表。要求結(jié)果表的字段與頁面的各個字段保持一致。
如果是賬號授權(quán),則根據(jù)授權(quán)頁面號查詢到唯一記錄,再從授權(quán)結(jié)果表中,查詢授權(quán)對象類型為賬號授權(quán)的,權(quán)限信息如果是其他授權(quán),則需要先從授權(quán)對象類型表中查找該授權(quán)對象類型對應(yīng)的關(guān)聯(lián)表名,再從關(guān)聯(lián)表查詢當(dāng)前賬號對應(yīng)的授權(quán)對象類型,最后從授權(quán)結(jié)果表中查詢授權(quán)對象類型對應(yīng)的所有權(quán)限信息
2.1.2 授權(quán)模型流程圖
如圖3所示。
圖3 授權(quán)模型流程圖
2.1.3 驗證模型
驗證模型是可以進行數(shù)據(jù)驗證并對異常進行合理反饋的。
首先需要對驗證模型進行定義,針對一個功能的保存或確認等操作,可以創(chuàng)建一個用于驗證數(shù)據(jù)合理性的后臺驗證模型,每一個驗證項可作為驗證模型的明細;可實現(xiàn)選擇存放模型庫、模型另存為。
根據(jù)前臺傳入的驗證參數(shù),在和事物開啟后提交前,分別進行預(yù)先驗證和結(jié)果驗證,按順序號規(guī)則循環(huán)處理各驗證項的驗證。首先封裝驗證項驗證數(shù)據(jù),然后根據(jù)匹配條件取數(shù)據(jù)庫中的驗證項驗證數(shù)據(jù),最后根據(jù)控制規(guī)則進行數(shù)據(jù)驗證判定。當(dāng)中的異常數(shù)據(jù)進行后臺異常處理。
2.1.3 模型驗證流程圖
如圖4所示。
圖4 模型驗證流程圖
2.2.1 系統(tǒng)參數(shù)設(shè)置
系統(tǒng)參數(shù)設(shè)置主要是設(shè)置系統(tǒng)的基本運行參數(shù),包括登錄方式的管理、文件類型的限制、是否開啟密碼驗證、是否開啟三員管理、是否開啟日志記錄等。日志記錄包含了用戶日志管理、程序訪問日日志管理、權(quán)限日志管理和清理日志的功能。除此之外,還需要定義通用望遠鏡模板和管理維護平臺中的所有子系統(tǒng)。
2.2.2 菜單管理設(shè)計
菜單管理使得用戶可以DIY屬于自己的菜單,可以選擇自己想要的功能,整個系統(tǒng)更加的靈活,用戶可以根據(jù)個人偏好實現(xiàn)定制的菜單。菜單管理詳細功能如圖5所示:
圖5
2.2.3 角色管理設(shè)計
角色信息查詢可以查詢平臺中的所有角色信息。角色用戶授權(quán)用來完成角色和用戶的綁定關(guān)系,角色管理詳細功能如圖6所示。
圖6
2.2.4 用戶管理設(shè)計
用戶信息維護可完善賬號的基本信息和賬號關(guān)聯(lián)信息,通過用戶類型管理可以管理并維護所有賬號類型。用戶通過用戶角色授權(quán)完成用戶和角色的綁定。用戶管理詳細功能如圖7所示。
圖7
2.2.5 權(quán)限管理設(shè)計
權(quán)限管理具有角色菜單權(quán)限管理、崗位菜單權(quán)限管理和反向授權(quán)、用戶菜單權(quán)限管理的功能。權(quán)限管理主要用來實現(xiàn)角色與菜單權(quán)限綁定和用戶與菜單權(quán)限的綁定。其中,角色和賬號的分配可以維護平臺賬號和角色的關(guān)聯(lián)信息,菜單授權(quán)可以實現(xiàn)平臺賬號與菜單權(quán)限的關(guān)聯(lián)信息,實現(xiàn)授權(quán)功能。按賬號類型分組,對賬號分配角色,一個賬號可以分配多個角色。權(quán)限管理詳細功能如圖8所示。
圖8
采用微服務(wù)架構(gòu)的RS10系統(tǒng)管理將各個模塊分割成小型的獨立功能,每個微服務(wù)按照自己的流程運行,開發(fā)團隊只要部署自己的應(yīng)用即可,減緩了部署的時間;易于開發(fā)和維護,對于開發(fā)人員來說,他們可以用更高的質(zhì)量水平更快地開發(fā)獨立的功能,這樣提高了團隊開發(fā)的效率;并且可擴展性更強,增加了一些具有獨立功能的底層應(yīng)用的可重用性。微服務(wù)是未來的趨勢。