前面介紹了很多ABP系列的文章,一步一步的把我們?nèi)粘i_發(fā)中涉及到的Web API服務(wù)構(gòu)建、登錄日志和操作審計(jì)日志、字典管理模塊、省份城市的信息維護(hù)、權(quán)限管理模塊中的組織機(jī)構(gòu)、用戶、角色、權(quán)限、菜單等內(nèi)容,以及配置管理模塊,界面的高級(jí)查詢處理等內(nèi)容,同時(shí)我們把整個(gè)開發(fā)理念結(jié)合我們的代碼生成工具Database2Sharp進(jìn)行快速的開發(fā),快速開發(fā)分為兩個(gè)部分:一個(gè)是Web API部分的ABP框架代碼生成,包括領(lǐng)域?qū)嶓w層、應(yīng)用服務(wù)層、公用DTO和接口層、API調(diào)用Caller層等內(nèi)容的生成,并且整合了我們封裝的基類,以便生成的代碼更加簡(jiǎn)潔,但卻具有更加強(qiáng)大、易用的功能函數(shù);另一個(gè)快速生成的部分是界面生成,我們根據(jù)我們?cè)赪inform領(lǐng)域多年的開發(fā),整合了分頁(yè)、公用類庫(kù)和Winform基礎(chǔ)界面類的基礎(chǔ)上實(shí)現(xiàn)了快速的Winform界面生成,并且Winform界面生成可以根據(jù)需要配置列表查詢條件、列表顯示內(nèi)容,編輯界面的字段顯示等等內(nèi)容,并且生成的Winform界面自動(dòng)具有和ABP快速框架整體調(diào)用通用規(guī)則。
1、ABP框架背景知識(shí)介紹
ABP是ASP.NET Boilerplate的簡(jiǎn)稱,ABP是一個(gè)開源且文檔友好的應(yīng)用程序框架。ABP不僅僅是一個(gè)框架,它還提供了一個(gè)最徍實(shí)踐的基于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)的體系結(jié)構(gòu)模型。學(xué)習(xí)使用ABP框架也有一段時(shí)間了,一直想全面了解下這個(gè)框架的整個(gè)來(lái)龍去脈,并把想把它使用歷程整理成一個(gè)系列出來(lái),不過一直沒有下筆來(lái)寫這篇文章的開篇,就是希望能夠深入了解,再深入了解一些,希望自己能夠理解透徹一些,不能誤人子弟,也不想和網(wǎng)上千篇一律的翻譯官網(wǎng)的內(nèi)容,官網(wǎng)的英文介紹也已經(jīng)很詳細(xì)了,于是我覺得還是以實(shí)際使用的過程進(jìn)行一定的整理會(huì)更好。
初次了解ABP框架,對(duì)它還是非常驚艷的,它基本上是.NET 領(lǐng)域架構(gòu)的集大成者,幾乎囊括了我們.NET領(lǐng)域排的上名的各種技術(shù)應(yīng)用,而且它本身可以支持.net framework和.net core兩種技術(shù)流派,對(duì)它的介紹也是非常感興趣。
1)ABP框架的特點(diǎn)
我們來(lái)大概了解下ABP框架涉及到的內(nèi)容。
- 依賴注入,這個(gè)部分使用 Castle windsor (依賴注入容器)來(lái)實(shí)現(xiàn)依賴注入,這個(gè)也是我們經(jīng)常使用IOC來(lái)處理的方式;
- Repository倉(cāng)儲(chǔ)模式,已實(shí)現(xiàn)了Entity Framework、NHibernate、MangoDB、內(nèi)存數(shù)據(jù)庫(kù)等,倉(cāng)儲(chǔ)模式可以快速實(shí)現(xiàn)對(duì)數(shù)據(jù)接口的調(diào)用;
- 身份驗(yàn)證與授權(quán)管理,可以使用聲明特性的方式對(duì)用戶是否登錄,或者接口的權(quán)限進(jìn)行驗(yàn)證,可以通過一個(gè)很細(xì)粒度的方式,對(duì)各個(gè)接口的調(diào)用權(quán)限進(jìn)行設(shè)置;
- 數(shù)據(jù)有效性驗(yàn)證,ABP自動(dòng)對(duì)接口的輸入?yún)?shù)對(duì)象進(jìn)行非空判斷,并且可以根據(jù)屬性的申請(qǐng)信息對(duì)屬性的有效性進(jìn)行校驗(yàn);
- 審計(jì)日志記錄,也就是記錄我們對(duì)每個(gè)接口的調(diào)用記錄,以及對(duì)記錄的創(chuàng)建、修改、刪除人員進(jìn)行記錄等處理;
- Unit Of Work工作單元模式,為應(yīng)用層和倉(cāng)儲(chǔ)層的方法自動(dòng)實(shí)現(xiàn)數(shù)據(jù)庫(kù)事務(wù),默認(rèn)所有應(yīng)用服務(wù)層的接口,都是以工作單元方式運(yùn)行,即使它們調(diào)用了不同的存儲(chǔ)對(duì)象處理,都是處于一個(gè)事務(wù)的邏輯里面;
- 異常處理,ABP框架提供了一整套比較完善的流程處理操作,可以很方便的對(duì)異常進(jìn)行進(jìn)行記錄和傳遞;
- 日志記錄,我么可以利用Log4Net進(jìn)行常規(guī)的日志記錄,方便我們跟蹤程序處理信息和錯(cuò)誤信息;
- 多語(yǔ)言/本地化支持,ABP框架對(duì)多語(yǔ)言的處理也是比較友好的,提供了對(duì)XML、JSON語(yǔ)言信息的配置處理;
- Auto Mapping自動(dòng)映射,這個(gè)是ABP的很重要的對(duì)象隔離概念,通過使用AutoMaper來(lái)實(shí)現(xiàn)域?qū)ο蠛虳TO對(duì)象的屬性映射,可以隔離兩者的邏輯關(guān)系,但是又能輕松實(shí)現(xiàn)屬性信息的賦值;
- 動(dòng)態(tài)Web API層,利用這個(gè)動(dòng)態(tài)處理,可以把Application Service 直接發(fā)布為Web API層,而不需要在累贅的為每個(gè)業(yè)務(wù)對(duì)象手工創(chuàng)建一個(gè)Web API的控制器,非常方便;
- 動(dòng)態(tài)JavaScript的AJax代理處理,可以自動(dòng)創(chuàng)建Javascript 的代理層來(lái)更方便使用Web Api,這個(gè)在Web層使用。
除了這些重要特性外,ABP框架還有很多一些特別的功能或者概念。
- 多租戶支持(每個(gè)租戶的數(shù)據(jù)自動(dòng)隔離,業(yè)務(wù)模塊開發(fā)者不需要在保存和查詢數(shù)據(jù)時(shí)寫相應(yīng)代碼;
- 軟刪除支持(繼承相應(yīng)的基類或?qū)崿F(xiàn)相應(yīng)接口,會(huì)自動(dòng)實(shí)現(xiàn)軟刪除)
- 系統(tǒng)設(shè)置存取管理(系統(tǒng)級(jí)、租戶級(jí)、用戶級(jí),作用范圍自動(dòng)管理)
- EventBus實(shí)現(xiàn)領(lǐng)域事件(Domain Events)
- 模塊以及模塊的依賴關(guān)系實(shí)現(xiàn)插件化的模塊處理等等
ABP框架主要還是基于領(lǐng)域驅(qū)動(dòng)的理念來(lái)構(gòu)建整個(gè)架構(gòu)的,其中領(lǐng)域驅(qū)動(dòng)包含的概念有 域?qū)ο驟ntities、倉(cāng)儲(chǔ)對(duì)象Repositories、域服務(wù)接口層Domain Services、域事件Domain Events、應(yīng)用服務(wù)接口Application Services、數(shù)據(jù)傳輸對(duì)象DTOs等。
ABP官方網(wǎng)站:http://www.aspnetboilerplate.com,從里面可以查看很詳細(xì)的案例和文檔說(shuō)明,可以根據(jù)需要下載不同類型的基礎(chǔ)框架。
ABP GitHub源碼地址:https://github.com/aspnetboilerplate,可以下載整個(gè)基礎(chǔ)的框架內(nèi)容,以及相關(guān)的樣板案例代碼。
基于ABP框架基礎(chǔ)上,我們整理完善了整個(gè)權(quán)限體系,以及基于這個(gè)基礎(chǔ)上進(jìn)行的業(yè)務(wù)系統(tǒng)快速開發(fā),我們整理后的ABP快速開發(fā)框架的架構(gòu)圖示,如下圖所示(以字典模塊為例說(shuō)明)
針對(duì)Web API接口調(diào)用的封裝,為了適應(yīng)客戶端快速調(diào)用的目的,這個(gè)封裝作為一個(gè)獨(dú)立的封裝層,以方便各個(gè)模塊之間進(jìn)行共同調(diào)用。
2、基于Winform的ABP快速開發(fā)框架功能介紹
1)登陸界面
2)主體框架界面
主體框架界面采用的是基于菜單的動(dòng)態(tài)生成,以及多文檔的界面布局,具有非常好的美觀性和易用性。
左側(cè)的功能樹列表和頂部的菜單模塊,可以根據(jù)角色擁有的權(quán)限進(jìn)行動(dòng)態(tài)構(gòu)建,不同的角色具有不同的菜單功能點(diǎn),如下是測(cè)試用戶登錄后具有的界面。
3)用戶管理界面
用戶列表包括分頁(yè)查詢、導(dǎo)入、導(dǎo)出用戶數(shù)據(jù),以及可以利用右鍵菜單進(jìn)行新增、編輯用戶記錄,或者對(duì)指定用戶進(jìn)行重置密碼操作。
用戶編輯界面如下所示。
當(dāng)然可以查看這個(gè)用戶本身?yè)碛械臋?quán)限功能點(diǎn),如下界面所示。
用戶數(shù)據(jù)導(dǎo)入 ,可以根據(jù)指定模板的格式進(jìn)行填寫后,然后導(dǎo)入指定的文件內(nèi)容,如下所示。
導(dǎo)出文件則是把列表中現(xiàn)有的數(shù)據(jù)進(jìn)行導(dǎo)入,導(dǎo)出后提示是否打開Excel文件進(jìn)行查看。
4)組織機(jī)構(gòu)管理
組織機(jī)構(gòu)主要就是一個(gè)層級(jí)的對(duì)象關(guān)系,一般包含但不限于公司、部門、工作組等的定義,其中組織機(jī)構(gòu)包含用戶成員和角色成員的關(guān)系,如下界面所示。
組織機(jī)構(gòu)的樹形列表可以進(jìn)行拖動(dòng)實(shí)現(xiàn)不同層級(jí)的變化
或者通過右鍵菜單進(jìn)行編輯修改操作
組織機(jī)構(gòu)可以修改機(jī)構(gòu)名稱和對(duì)應(yīng)的父類節(jié)點(diǎn),如下界面所示。
組織機(jī)構(gòu)包含的成員可以添加多個(gè)人員記錄,添加界面如下所示。
添加角色界面如下所示。
5)角色管理
角色信息沒有層級(jí)關(guān)系,可以通過列表展示。
其中角色包含權(quán)限分配、角色成員和擁有菜單的維護(hù),如下是角色編輯界面,包含角色基本信息、擁有權(quán)限、包含成員、擁有菜單的管理等。菜單對(duì)于角色來(lái)說(shuō),應(yīng)該是一種界面資源,可以通過配置進(jìn)行管理對(duì)應(yīng)角色用戶的菜單。
菜單編輯界面如下所示。
角色的權(quán)限包含系統(tǒng)可以用的權(quán)限,并可以勾選為角色設(shè)置所需的功能點(diǎn),如下界面所示。
用戶成員則和機(jī)構(gòu)的用戶管理一樣,可以指定多個(gè)用戶,這里不再贅述。
而菜單對(duì)于角色來(lái)說(shuō),應(yīng)該是一種界面資源,可以通過配置進(jìn)行管理對(duì)應(yīng)角色用戶的菜單,如下界面所示。
通過配置好的菜單,用戶登錄系統(tǒng)后,系統(tǒng)根據(jù)當(dāng)前用戶具有的菜單項(xiàng)目,動(dòng)態(tài)構(gòu)建顯示對(duì)應(yīng)的列表菜單和工具欄菜單。
6)功能管理
嚴(yán)格來(lái)說(shuō),ABP框架并沒有統(tǒng)一管理好權(quán)限功能點(diǎn)的,它沒有任何表來(lái)存儲(chǔ)這個(gè)功能集合,而是通過派生AuthorizationProvider的子類來(lái)定義權(quán)限功能點(diǎn)
我在這個(gè)基礎(chǔ)上引入了一個(gè)權(quán)限功能的表用來(lái)存儲(chǔ)功能點(diǎn)的,然后提供管理界面來(lái)動(dòng)態(tài)維護(hù)這些功能點(diǎn)。如下界面所示。
我們剛才在角色里面看到可以分配的權(quán)限內(nèi)容,就是基于這個(gè)權(quán)限表的信息展示。
這樣我們可以動(dòng)態(tài)添加或者批量添加所需要的功能點(diǎn),并且和整個(gè)權(quán)限管理模塊串聯(lián)起來(lái),形成一個(gè)完整的控制體系。
另外我們還可以通過左側(cè)樹列表的右鍵菜單管理列表,如下所示可以級(jí)聯(lián)刪除對(duì)應(yīng)的節(jié)點(diǎn)及其下面所有子節(jié)點(diǎn)。
系統(tǒng)登錄后,客戶端自動(dòng)獲取對(duì)應(yīng)用戶的角色功能點(diǎn),然后我們每次打開一個(gè)新的業(yè)務(wù)窗體,客戶端會(huì)進(jìn)行界面的權(quán)限邏輯控制,如果沒有權(quán)限的,那么不可以訪問操作,如下是禁止了產(chǎn)品信息的導(dǎo)入、導(dǎo)出、新增、編輯等操作功能,如下界面所示產(chǎn)品界面被動(dòng)態(tài)取消相關(guān)權(quán)限后,界面禁止了某些操作功能。
7)菜單管理
Winform主界面的開發(fā),基本上都是標(biāo)準(zhǔn)的界面,在頂部放置工具欄,中間區(qū)域則放置多文檔的內(nèi)容,但是在頂部菜單比較多的時(shí)候,就需要把菜單分為幾級(jí)處理,如可以在頂部菜單放置一二級(jí)菜單,這種方式在一般功能點(diǎn)不算太多的情況下,呈現(xiàn)的界面效果較為直觀、也較為美觀。不過隨著一些系統(tǒng)功能的增多,這種方式可能就會(huì)顯得工具欄比較擁擠,那么我們是否可以在左側(cè)放置一個(gè)樹形列表,這樣通過樹形列表的收縮折疊,就可以放置非常多的菜單功能了。
在ABP快速開發(fā)框架里面,我們依舊采用Winform開發(fā)框架里面用到的菜單維護(hù)方式,在權(quán)限模塊系統(tǒng)中維護(hù)菜單內(nèi)容,并在用戶登錄系統(tǒng)后,動(dòng)態(tài)加載菜單展示,并通過菜單的配置信息,可以動(dòng)態(tài)展示不同的窗體信息。
菜單資源管理的列表界面界面如下所示
左側(cè)列表依舊可以通過右鍵菜單進(jìn)行維護(hù)管理。
雙擊樹列表或者右側(cè)的列表,都可以對(duì)已有的菜單進(jìn)行編輯,菜單編輯界面如下所示。
我們可以通過選擇圖標(biāo)按鈕進(jìn)行菜單圖標(biāo)的選擇,如下是選擇菜單圖片的界面。
這樣我們可以采用DevExpress內(nèi)置漂亮的系統(tǒng)圖標(biāo),也可選擇系統(tǒng)文件里面的圖標(biāo)文件。
如果用戶登錄系統(tǒng)后,覺得自己管理的菜單有些多,那么可以通過菜單配置的方式,選擇性的呈現(xiàn)某些菜單,把其他部分的菜單隱藏起來(lái),這個(gè)就是自定義應(yīng)用菜單界面,界面如下所示。
8)系統(tǒng)登錄日志
登錄日志,這個(gè)就是用戶嘗試登錄的時(shí)候,留下的記錄信息,其中包括用戶的登錄用戶名,ID,IP地址、登錄時(shí)間,以及登錄是否成功的狀態(tài)等信息。
這個(gè)登錄日志,就是在系統(tǒng)登錄嘗試的時(shí)候,留下的記錄,可供管理員進(jìn)行跟蹤了解某個(gè)賬戶的使用情況,也可以根據(jù)這些登錄信息進(jìn)行一個(gè)統(tǒng)計(jì)報(bào)表的分析。
**9)系統(tǒng)審計(jì)日志 **
審計(jì)日志,設(shè)置我們?cè)谠L問或者調(diào)用某個(gè)應(yīng)用服務(wù)層接口的時(shí)候,橫切面流下的一系列操作記錄,其中記錄我們?cè)L問的服務(wù)接口,參數(shù),客戶端IP地址,訪問時(shí)間,以及異常等信息,這些操作都是在ABP系統(tǒng)自動(dòng)記錄的,如果我們需要屏蔽某些服務(wù)類或者接口,則這些就不會(huì)記錄在里面,否則默認(rèn)是記錄的。
審計(jì)日志的明細(xì)展示界面如下所示。
10)字典管理
字典管理界面,左側(cè)列出字典類型,并對(duì)字典類型下的字典數(shù)據(jù)進(jìn)行分頁(yè)展示,右側(cè)則利用分頁(yè)展示對(duì)應(yīng)字典類型的字典數(shù)據(jù),字典管理界面如下所示。
新增或者編輯窗體界面如下
批量添加字典內(nèi)容的界面如下所示。
省份城市行政區(qū)的模塊管理,也主要是為了提供一個(gè)三級(jí)聯(lián)動(dòng)的字典列表給界面使用,因此這里對(duì)這些統(tǒng)計(jì)局的數(shù)據(jù)進(jìn)行一個(gè)維護(hù)和展示出來(lái),如下界面所示。
11)參數(shù)配置模塊
一般來(lái)說(shuō),一個(gè)系統(tǒng)或多或少都會(huì)涉及到一些系統(tǒng)參數(shù)或者用戶信息的配置,而ABP框架也提供了一套配置信息的管理模塊,ABP框架的配置信息,必須提前定義好配置的各項(xiàng)內(nèi)容,然后才能在系統(tǒng)中初始化或者通過接口查詢來(lái)使用,本ABP快速開發(fā)框架引入了另外一種配置信息的定義,實(shí)現(xiàn)更加簡(jiǎn)化的處理。
參數(shù)配置管理模塊界面如下所示。
配置模塊使用主要特點(diǎn)是以鍵為操作對(duì)象,然后內(nèi)容是JSON序列化后的內(nèi)容,可以存儲(chǔ)用戶自定義的類的序列號(hào)字符串,通過整合了SettingsProvider.net組件,使得我們操作配置內(nèi)容更加方便和動(dòng)態(tài)化。
12) 附件管理模塊
該模塊其實(shí)是很通用的一個(gè)模塊,例如我們的一些日常記錄,可能會(huì)伴隨著有圖片、文檔等的附件管理,如果為每個(gè)業(yè)務(wù)對(duì)象都做一個(gè)附件管理,或者每次開發(fā)系統(tǒng)都重新做,那么效率肯定沒有直接采用通用的附件管理那么方便快捷了。
其實(shí)這個(gè)模塊是基于我的Winform開發(fā)框架開發(fā)的,同樣現(xiàn)在的ABP快速開發(fā)框架的Winform端依舊可以使用這些模塊的界面和大概的處理規(guī)則,我們把它利用ABP框架的獲取數(shù)據(jù)方式調(diào)整一下即可。
首先我們創(chuàng)建一個(gè)獨(dú)立的控件,用于放到編輯數(shù)據(jù)記錄窗口里面,如下所示。
這樣在項(xiàng)目中集成(如數(shù)據(jù)編輯窗口),直接拖動(dòng)這個(gè)控件到界面中,運(yùn)行就可以看到下面的效果了。
由于一般創(chuàng)建記錄的時(shí)候,給他指定一個(gè)GUID的附件組ID,這樣我們?cè)跀?shù)據(jù)記錄保存前,我們就可以上傳附件了,如下所示。
而且在這個(gè)過程中,可以隨時(shí)查看自己在該記錄中已經(jīng)上傳的附件。如果附件不夠,可以隨時(shí)啟動(dòng)上傳操作,附件支持多選文件,然后一次性,啟動(dòng)后臺(tái)線程操作方式,把文件上傳及附件記錄保存到數(shù)據(jù)庫(kù)。
由于是附件管理,因此有可能上傳各種文件,包括Word文檔、Excel文檔、壓縮文件,以及各種類型的圖片,因此為了方便對(duì)圖片的查看,這個(gè)控件集成了圖片查看控件,可以非常方便直接讀取圖片附件的數(shù)據(jù)流作為對(duì)象展示,該圖片控件支持對(duì)圖片的滾動(dòng)放大縮小、左右翻轉(zhuǎn)、選擇放大、圖片移動(dòng)、保存圖片等功能,不需要查看,直接使用ESC退出即可。
附件管理在很多信息化管理系統(tǒng)中很普遍使用,例如我在病人管理系統(tǒng)界面里面,可以在一個(gè)界面里面分門別類管理很多影像學(xué)的圖片資料,通過查看附件,可以看到其中一些圖片附件的縮略圖,需要進(jìn)一步查看,可以雙擊圖片即可實(shí)現(xiàn)預(yù)覽效果。
通用附件管理模塊,就是基于這些特點(diǎn),實(shí)現(xiàn)圖片、Excel文檔、Word文檔和PDF等文檔的在線預(yù)覽和管理操作,界面截圖如下所示。
以上就是框架里面主要的模塊內(nèi)容展示,當(dāng)然我們可以結(jié)合代碼生成工具來(lái)快速開發(fā)自己的業(yè)務(wù)管理模塊,而這些主要就是設(shè)計(jì)好數(shù)據(jù)庫(kù)后,對(duì)框架代碼和界面代碼的統(tǒng)一生成后進(jìn)行整合到主體框架里面即可,可以獲得高效、統(tǒng)一、快速的開發(fā)體驗(yàn)。
詳細(xì)的代碼生成工具開發(fā)過程,可以了解隨筆《利用代碼生成工具生成基于ABP框架的代碼 》、《ABP開發(fā)框架前后端開發(fā)系列---(8)ABP框架之Winform界面的開發(fā)過程》
ABP框架代碼生成
最終根據(jù)根據(jù)選擇數(shù)據(jù)庫(kù)表信息,一鍵生成相關(guān)ABP架構(gòu)分層代碼,文件結(jié)構(gòu)如下所示。
ABP框架的Winform界面開發(fā)
設(shè)置好后直接生成,代碼工具就可以依照模板來(lái)生成所需要的WInform列表界面和編輯界面的內(nèi)容了,如下是生成的界面代碼。
放到VS項(xiàng)目里面,就看到對(duì)應(yīng)的窗體界面效果了。
生成界面后,進(jìn)行一定的布局調(diào)整就可以實(shí)際用于生產(chǎn)環(huán)境了,省卻了很多時(shí)間。
系列文章列表如下所示:
ABP開發(fā)框架前后端開發(fā)系列---(13)高級(jí)查詢功能及界面的處理
ABP開發(fā)框架前后端開發(fā)系列---(12)配置模塊的管理
ABP開發(fā)框架前后端開發(fā)系列---(11)菜單的動(dòng)態(tài)管理
ABP開發(fā)框架前后端開發(fā)系列---(10)Web API調(diào)用類的簡(jiǎn)化處理
ABP開發(fā)框架前后端開發(fā)系列---(9)ABP框架的權(quán)限控制管理
ABP開發(fā)框架前后端開發(fā)系列---(8)ABP框架之Winform界面的開發(fā)過程
ABP開發(fā)框架前后端開發(fā)系列---(7)系統(tǒng)審計(jì)日志和登錄日志的管理
ABP開發(fā)框架前后端開發(fā)系列---(6)ABP基礎(chǔ)接口處理和省份城市行政區(qū)管理模塊的開發(fā)
利用代碼生成工具生成基于ABP框架的代碼
ABP開發(fā)框架前后端開發(fā)系列---(5)Web API調(diào)用類在Winform項(xiàng)目中的使用
ABP開發(fā)框架前后端開發(fā)系列---(4)Web API調(diào)用類的封裝和使用
ABP開發(fā)框架前后端開發(fā)系列---(3)框架的分層和文件組織
ABP開發(fā)框架前后端開發(fā)系列---(2)框架的初步介紹
ABP開發(fā)框架前后端開發(fā)系列---(1)框架的總體介紹