在SqlSugar的開發框架中增加對低代碼EAV模型(實體-屬性-值)的WebAPI實現支持
我在前面隨筆中介紹了在SqlSugar的開發框架中實現EAV模型(實體-屬性-值)的處理,這個EAV模型實現的目的是支持彈性化的數據庫設計,可以自由擴展數據庫表字段和數據的查詢和存儲,實現的思路是在常規關系數據庫中存儲實體-屬性-值的信息,而在非關系型數據庫MongoDB數據庫中存儲自由字段的數據表集合,之前我們實現了在Winform界面端中對本地數據庫和MongoDB數據庫的處理操作,本篇隨筆基于SqlSugar的開發框架的Web API實現過程,介紹對低代碼EAV模型(實體-屬性-值)的WebAPI實現支持。
1、SqlSugar開發框架的設計思路
SqlSugar的開發框架本身主要是基于常規關系型數據庫設計的框架,支持多種數據庫類型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等數據庫,非關系型數據庫的MongoDB數據庫也可以作為擴展整合到開發框架里面。
SqlSugar的開發框架本身設計是支持多終端的接入的,支持Winform、WPF、Vue3+ElementPlus、H5的APP應用等多終端的接入的,而Winform、WPF由于運行在客戶端的,因此可以自由切換基于本地數據庫還是Web API的服務接入,界面呈現效果一致。

對于數據的訪問,我們設計開關變量模式來自由切換本地數據庫模式或Web API的訪問方式。如下所示。

2、EAV模型的設計思路
EAV模型(實體-屬性-值)的處理,主要是用來解決動態定義業務表和數據存儲和查詢的解決方案,我們可以通過動態定義表和字段信息的方式,實現低代碼甚至零代碼的設計方案。
對于業務表,我們在系統中利用界面動態定義信息即可。如下面是產品信息表的定義界面,定義表和字段的相關信息即可。

然后通過配置菜單入口,給出了一個常規的數據錄入管理界面,如下所示。

上面的字段錄入,支持文本、數值、字典選擇、單選框、復選框、日期、系統表選擇(包括用戶、角色、機構、定義表)、附件列表等內容的錄入,基本覆蓋了常規的需求,特殊需求進行一定的定制化處理即可。
而對于有些業務的主從表處理,如訂單和訂單明細,也可以通過配置的方式實現界面的自動處理。

動態化的數據,查詢是其中一個難題,EAV模型(實體-屬性-值)他的數據是根據不同的類型進行定義的,不會把所有的內容放在字符型的里面存儲,因此保留了字段的原生類型,寫入到MongoDB的非關系型數據庫中,可以很好的支持各種復雜的查詢處理。

由于我們的表字段是動態化構建的,因此查詢字段就也就需要動態化了,我們把查詢字段通過列表選擇的方式,條件根據不同的數據類型,創建不同的輸入控件來實現查詢處理。

或者

通過下拉列表的方式選擇不同的字段進行查詢,如果是數值型或者日期,我們可以根據不同類型來創建輸入控件組,來實現區間數值或者日期的輸入。


有時候,為了方便,還提供了一個自定義條件查詢的處理功能,可以自由組合多個條件進行數據的查詢過濾。

我們參考了magento的eav模型設計圖,對不同數據類型的內容進行了獨立的存儲。

由于實體類型(表定義)、實體字段屬性、實體記錄、字段復制映射關系、屬性操作日志、刪除日志等表聯合構成了一個完整的裸條,如下所示。

如果我們MongoDB的數據記錄移除了,還可以根據關系表的記錄和屬性值信息,進行MongoDB數據的同步記錄處理,這樣就可以還原MongoDB的數據記錄了,如下所示。

3、基于WebAPI的支持實現
在SqlSugar開發框架中,我們是以接口來串起來整個應用的架構的,并且我們通過泛型基類的封裝和集成,極大的減少常規代碼的編寫。
我們只需要在基類函數里面定義好相關的標準處理:如增、刪、改、查、分頁、導入、導出、排序等通用接口,以及針對不同業務模塊,提供一個接口的擴展和實現即可,如下設計圖所示。

一個良好的產品,可能往往需要支持多種數據庫的接入,根據實際業務的需要進行調整,有時候可能需要2到3種數據庫的支持。

SQLSugar的表和字段信息,都是通過特性描述的方式定義的,它們在不同的數據庫是通用的,而我們要做的就是在啟動的時候,加載不同的數據庫連接字符串,進行初始化即可
而對應Web API的代理調用類,那么為了極大的重用常規的接口處理,我們需要類似的繼承關系。

對于BS的前端和移動端,我們根據框架后端的接口進行前端JS端的類的封裝處理,引入了ES6類的概念實現業務基類接口的統一封裝,簡化代碼。

這樣不管對于終端的調用(Vue3的TS客戶端、WInform端、WPF端、Python前端后端)都是以一定的基類抽象的方式,盡可能的封裝相同邏輯接口的實現,通過泛型類的引入,可以非常彈性化接口的實現處理。
我們根據接口的定義,分別實現WebAPI的控制器實現部分,以及ApiCaller的客戶端調用的封裝處理部分,如下所示。

Web API的部分如下所示。

Web API部分的路由是Restful的格式命名,然后根據實際的接口定義參數入口即可,如果是復雜實體對象的傳遞,一般用POST方式。
Web API的ApiCaller調用封裝類,主要就是調用基類實現數據的調用和解析處理即可。如對于字段屬性的ApiCaller的接口調用封裝,如下所示。
主要就是根據Web API的路由名稱和參數,以及請求方式的處理即可。

由于Winform或者WPF的調用是基于接口的處理方式,它實際的調用是根據開關變量的參數配置進行選擇的。
//根據條件獲取分頁記錄或者全部記錄 var result = await BLLFactory<IAttributeService>.Instance.MongoGetList(pageDto); var dataTable = result.Items; if (pageDto.IsPaging) { this.pager1.PagerInfo.RecordCount = result.TotalCount;//記錄總行數 }
因此在Winform端或者WPF端,我們開發代碼的時候,不用管它來自哪里,都是統一的模型調用處理。
以上就是我們SqlSugar開發框架的多接入方式、多端接入的實現思路,以及EAV實體屬性值模式實現數據的彈性化定義以及查詢、存儲的處理。
專注于代碼生成工具、.Net/Python 框架架構及軟件開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架、Python開發框架等框架產品。
??轉載請注明出處:撰寫人:伍華聰??http://www.iqidi.com?
????
浙公網安備 33010602011771號