基于ABP框架實現(xiàn)數(shù)據(jù)字典開發(fā)
在業(yè)務型的系統(tǒng)開發(fā)中,我們需要維護各種個樣的類型,比如客戶類型、客戶行業(yè)、商品類型等等,這些類型往往信息量不多,并且相似度極高,如果采用一類型一表去設計,將會造成極大的工作量,通過將這部分類型的信息進行抽象,利用字段去存儲類型區(qū)分,共用表結構,來達到兼容各種類型的功能,也就是設計一個數(shù)據(jù)字典,而對于一個具體類型來講,是有多個選項的,比如性別,有男女,行業(yè)有工農(nóng)商等,對于這部分選項,可抽象為某個類型下的字典項,即數(shù)據(jù)字典項。
一、數(shù)據(jù)字典設計思路
1、從客戶類型、商品類型、行業(yè)類型來抽象考慮,首先三者都存在一個類型描述,即客戶、商品、行業(yè),同時,三者是本質是不同的,并且,隨著業(yè)務上的需求越來越多,更多的xx類型將會加入,因此,單從類型考慮出發(fā),就存在三個點了,如類型名稱、類型獨立、數(shù)量擴展,因此在考慮表結構設計時,就可以先考慮到這三點了,同時還有一個關鍵的信息,便是,在系統(tǒng)設計過程中,這些類型其實便已經(jīng)確定完畢了,而不是說,在開發(fā)完畢,再去系統(tǒng)中增加類型。
2、從具體的某個類型出發(fā)考慮,比如以商品類型為例,存在日用品、電子產(chǎn)品、化妝品等,同樣是存在幾個關鍵信息,比如類型項名稱、類型項獨立、類型項數(shù)量擴展,類型項的歸屬,而這部分信息,往往是由客戶去維護的,屬于系統(tǒng)開發(fā)完畢后期的信息維護,在此,不考慮類型項的先后順序問題,如有需要可以擴展。
按照這些信息點,可以對數(shù)據(jù)字典設計一些必要的字段,如類型名稱即TypeName、類型獨立便是類型間相互獨立,但是這里也存在一個類型間的上下父子問題,暫不加入進來,該父子問題使用場景較少,但又存在,如果按照“二八原則”的話,我還是喜歡把“八”的部分完成。對于數(shù)據(jù)字典項而言,按照給定的必要信息,設計成如下結構,其中的業(yè)務代碼,是需要唯一的,比如對于性別來將,業(yè)務代碼便是1或0,來代表男女,這部分可由客戶的系統(tǒng)管理員進行維護。
二、完成數(shù)據(jù)字典設計
在明確了這些基礎信息后,開始在項目中完成設計過程,首先得明確數(shù)據(jù)字典本身的歸屬,數(shù)據(jù)字典是為整個業(yè)務而服務的,因此我把它劃分到核心層這一級別中,首先在領域層設置Core層文件夾,用來存放為整個業(yè)務提供基礎設施的功能模塊。
1、在Core層中加入數(shù)據(jù)字典模塊,結構設計如:
開始創(chuàng)建數(shù)據(jù)字典類,并添加設計的字段,以保證夠用為前提,或許更多場景下會出現(xiàn)諸如父子字典情形,或是對字典內(nèi)容的描述等,暫不考慮。
/// <summary> /// 核心_數(shù)據(jù)字典 /// </summary> [Table("Core_DataDictionary")] public class DataDictionary : Entity<long> { public const int MaxNameLength = 30; /// <summary> /// 字典類型 /// </summary> [StringLength(MaxNameLength)] public string TypeName { get; set; } /// <summary> /// 關聯(lián)數(shù)據(jù)字典項 /// </summary> public virtual ICollection<DataDictionaryItem> DataDictionaryItem { get; set; } }
在增加數(shù)據(jù)字典項類,并添加設計時的字段信息,這里我通過數(shù)據(jù)注解完成對字段的一些約束,如長度約束,表名的映射等。
/// <summary> /// 核心_數(shù)據(jù)字典項 /// </summary> [Table("Core_DataDictionaryItem")] public class DataDictionaryItem : Entity<long> { public const int MaxCodeLength = 5; public const int MaxNameLength = 30; /// <summary> /// 業(yè)務代碼 /// </summary> [StringLength(MaxCodeLength)] public string Code { get; set; } /// <summary> /// 類型項名稱 /// </summary> [StringLength(MaxNameLength)] public string Name { get; set; } /// <summary> /// 數(shù)據(jù)字典Id /// </summary> public long DataDictionaryId { get; set; } /// <summary> /// 關聯(lián)數(shù)據(jù)字典項 /// </summary> public virtual DataDictionary DataDictionary { get; set; } }
加入到DbContext中,添加一個遷移并更新數(shù)據(jù)庫。
2、開始完成應用層的封裝工作,在應用層定義了幾個常用的對字典的一些操作,諸如添加刪除修改等常見操作,此處的數(shù)據(jù)字典暫時通過手動加入,而不是將已有數(shù)據(jù)字典或是更改了的數(shù)據(jù)字典自動更新到數(shù)據(jù)庫中。
/// <summary> /// 獲取數(shù)據(jù)字典集合 /// </summary> /// <returns></returns> Task<ListResultDto<DataDictionaryListDto>> GetAllDataDictionaryListAsync(); /// <summary> /// 獲取數(shù)據(jù)字典記錄 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<DataDictionaryEditDto> GetDataDictionaryForEditAsync(NullableIdDto<long> input); /// <summary> /// 添加或更新數(shù)據(jù)字典記錄 /// </summary> /// <param name="input"></param> /// <returns></returns> Task CreateOrUpdateDataDictionaryAsync(CreateOrUpdateDataDictionaryInput input); /// <summary> /// 刪除數(shù)據(jù)字典記錄 /// </summary> /// <param name="ids"></param> /// <returns></returns> Task DeleteDataDictionaryAsync(List<EntityDto<long>> inputs); /// <summary> /// 根據(jù)字典類型名稱獲取數(shù)據(jù)字典集合 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<ListResultDto<DataDictionaryListDto>> GetDataDictionaryListByTypeNamesAsync(GetDataDictionaryListByTypeNamesInput input);
對數(shù)據(jù)字典項也準備了幾個方法,用于對某一具體數(shù)據(jù)字典類型增加刪除修改數(shù)據(jù)字典項。
/// <summary> /// 獲取數(shù)據(jù)字典項 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<DataDictionaryItemEditDto> GetDataDictionaryItemForEditAsync(NullableIdDto<long> input); /// <summary> /// 添加或更新數(shù)據(jù)字典項 /// </summary> /// <param name="input"></param> /// <returns></returns> Task CreateOrUpdateDataDictionaryItemAsync(CreateOrUpdateDataDictionaryItemInput input); /// <summary> /// 刪除數(shù)據(jù)字典項 /// </summary> /// <param name="ids"></param> /// <returns></returns> Task DeleteDataDictionaryItemAsync(List<EntityDto<long>> inputs); /// <summary> /// 根據(jù)字典類型和字典項名稱獲取字典項值 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<GetDataDictionaryItemNameOutput> GetDataDictionaryItemNameAsync(GetDataDictionaryItemNameInput input); /// <summary> /// 獲取數(shù)據(jù)字典列表 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<ListResultDto<DataDictionaryItemListDto>> GetDataDictionaryItemListAsync(GetDataDictionaryItemListInput input);
在應用層建立一個全局常量數(shù)據(jù)字典類,用于存儲數(shù)據(jù)字典信息,該部分信息也將成為需要維護到系統(tǒng)中的必備信息,并且,在系統(tǒng)中如有地方需要調(diào)用到數(shù)據(jù)字典類型時,不需要寫死代碼。
/// <summary> /// 數(shù)據(jù)字典類型存儲表 /// </summary> public class DataDictionaryTypeConsts { #region 分瓶規(guī)則 public const string GroupRule_FixAtive = "固定劑及使用"; public const string GroupRule_ContainerType = "容器類型"; #endregion }
3、完成控制器層調(diào)用及頁面中對數(shù)據(jù)字典的管理,對于字典信息而言,足夠在界面中一覽全貌,因此頁面設計時,直接以樹形結構加表格展示即可,左側數(shù)據(jù)類型樹形結構,右側相應的數(shù)據(jù)類型項表格。
<div class="layui-row"> <div class="layui-col-md2 layui-col-xs12"> <ul id="tree" class="ztree" style="padding: 0px; border: 1px solid #ddd; overflow: auto;"></ul> </div> <div class="layui-col-md10 layui-col-xs12"> <table class="layui-table" lay-data="{height: 'full-180', page:true, id:'mainList'}" lay-filter="list" lay-size="xs"> <thead> <tr> <th lay-data="{checkbox:true, fixed: true}"></th> <th lay-data="{field:'code', sort: true}">業(yè)務代碼</th> <th lay-data="{field:'name'}">名稱</th> @if (await PermissionChecker.IsGrantedAsync(PermissionNames.Pages_Core_DataDictionaryItem_Edit) || await PermissionChecker.IsGrantedAsync(PermissionNames.Pages_Core_DataDictionaryItem_Delete)) { <th lay-data="{fixed:'right', align:'center', toolbar: '#barList'}"></th> } </tr> </thead> </table> </div> </div>
三、數(shù)據(jù)字典頁面展示
利用layui節(jié)省了不少時間,對于前端東西不太精通,只能夠用,勉強實現(xiàn)了數(shù)據(jù)字典的一些操作,其中的數(shù)據(jù)字典類型是按照開發(fā)過程中可能用到的進行加入的,合理的存在,而不是空穴來風,在之前的DataDictionaryConst類中可以定義需要用到的數(shù)據(jù)字典類型,此處并沒有直接從那里增加后自動導入到數(shù)據(jù)庫中。
至此,數(shù)據(jù)字典的初步邏輯設計完畢,至于要加入更為豐富的功能,諸如排序,父子數(shù)據(jù)類型,或是數(shù)據(jù)類型描述,均可擴展。
代碼地址:https://gitee.com/530521314/Partner.Surround.git
到此這篇關于基于ABP框架實現(xiàn)數(shù)據(jù)字典開發(fā)的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
ASP.NET Core文件壓縮常見使用誤區(qū)(最佳實踐)
本文給大家分享ASP.NET Core文件壓縮常見的三種誤區(qū),就每種誤區(qū)給大家講解的非常詳細,是項目實踐的最佳紀錄,對ASP.NET Core文件壓縮相關知識感興趣的朋友一起看看吧2021-05-05asp.net 保存、修改沒有 runat=server控件的控件值的一個解決方案
asp.net 保存、修改沒有 runat=server控件的控件值的一個解決方案,需要的朋友可以參考下。2011-10-10ASP.NET MVC使用EPPlus,導出數(shù)據(jù)到Excel中
這篇文章介紹的是怎樣導出數(shù)據(jù)到Excel文件中,大多數(shù)的后端程序都有報表功能:把顯示在Grid中的數(shù)據(jù)導出到Excel文件中,這篇文章中使用的是EPPlus組件。需要的朋友可以參考借鑒2016-12-12