X-Admin&ABP框架開發-數據字典

来源:https://www.cnblogs.com/CKExp/archive/2019/07/07/11107312.html
-Advertisement-
Play Games

在業務型的系統開發中,我們需要維護各種個樣的類型,比如客戶類型、客戶行業、商品類型等等,這些類型往往信息量不多,並且相似度極高,如果採用一類型一表去設計,將會造成極大的工作量,通過將這部分類型的信息進行抽象,利用欄位去存儲類型區分,共用表結構,來達到相容各種類型的功能,也就是設計一個數據字典,而對於 ...


  在業務型的系統開發中,我們需要維護各種個樣的類型,比如客戶類型、客戶行業、商品類型等等,這些類型往往信息量不多,並且相似度極高,如果採用一類型一表去設計,將會造成極大的工作量,通過將這部分類型的信息進行抽象,利用欄位去存儲類型區分,共用表結構,來達到相容各種類型的功能,也就是設計一個數據字典,而對於一個具體類型來講,是有多個選項的,比如性別,有男女,行業有工農商等,對於這部分選項,可抽象為某個類型下的字典項,即數據字典項。

 

一、數據字典設計思路

  1、從客戶類型、商品類型、行業類型來抽象考慮,首先三者都存在一個類型描述,即客戶、商品、行業,同時,三者是本質是不同的,並且,隨著業務上的需求越來越多,更多的xx類型將會加入,因此,單從類型考慮出發,就存在三個點了,如類型名稱、類型獨立、數量擴展,因此在考慮表結構設計時,就可以先考慮到這三點了,同時還有一個關鍵的信息,便是,在系統設計過程中,這些類型其實便已經確定完畢了,而不是說,在開發完畢,再去系統中增加類型。

   

   2、從具體的某個類型出發考慮,比如以商品類型為例,存在日用品、電子產品、化妝品等,同樣是存在幾個關鍵信息,比如類型項名稱、類型項獨立、類型項數量擴展,類型項的歸屬,而這部分信息,往往是由客戶去維護的,屬於系統開發完畢後期的信息維護,在此,不考慮類型項的先後順序問題,如有需要可以擴展。

   

  按照這些信息點,可以對數據字典設計一些必要的欄位,如類型名稱即TypeName、 類型獨立便是類型間相互獨立,但是這裡也存在一個類型間的上下父子問題,暫不加入進來,該父子問題使用場景較少,但又存在,如果按照“二八原則”的話,我還是喜歡把“八”的部分完成。對於數據字典項而言,按照給定的必要信息,設計成如下結構,其中的業務代碼,是需要唯一的,比如對於性別來將,業務代碼便是1或0,來代表男女,這部分可由客戶的系統管理員進行維護。

  

 

二、完成數據字典設計

   在明確了這些基礎信息後,開始在項目中完成設計過程,首先得明確數據字典本身的歸屬,數據字典是為整個業務而服務的,因此我把它劃分到核心層這一級別中,首先在領域層設置Core層文件夾,用來存放為整個業務提供基礎設施的功能模塊。

   

  1、在Core層中加入數據字典模塊,結構設計如:

  

  開始創建數據字典類,並添加設計的欄位,以保證夠用為前提,或許更多場景下會出現諸如父子字典情形,或是對字典內容的描述等,暫不考慮。

/// <summary>
/// 核心_數據字典
/// </summary>
[Table("Core_DataDictionary")]
public class DataDictionary : Entity<long>
{
    public const int MaxNameLength = 30;

    /// <summary>
    /// 字典類型
    /// </summary>
    [StringLength(MaxNameLength)]
    public string TypeName { get; set; }

    /// <summary>
    /// 關聯數據字典項
    /// </summary>
    public virtual ICollection<DataDictionaryItem> DataDictionaryItem { get; set; }
}

   在增加數據字典項類,並添加設計時的欄位信息,這裡我通過數據註解完成對欄位的一些約束,如長度約束,表名的映射等。

/// <summary>
/// 核心_數據字典項
/// </summary>
[Table("Core_DataDictionaryItem")]
public class DataDictionaryItem : Entity<long>
{
    public const int MaxCodeLength = 5;
    public const int MaxNameLength = 30;

    /// <summary>
    /// 業務代碼
    /// </summary>
    [StringLength(MaxCodeLength)]
    public string Code { get; set; }

    /// <summary>
    /// 類型項名稱
    /// </summary>
    [StringLength(MaxNameLength)]
    public string Name { get; set; }

    /// <summary>
    /// 數據字典Id
    /// </summary>
    public long DataDictionaryId { get; set; }

    /// <summary>
    /// 關聯數據字典項
    /// </summary>
    public virtual DataDictionary DataDictionary { get; set; }
}

  加入到DbContext中,添加一個遷移並更新資料庫。

  

  2、開始完成應用層的封裝工作,在應用層定義了幾個常用的對字典的一些操作,諸如添加刪除修改等常見操作,此處的數據字典暫時通過手動加入,而不是將已有數據字典或是更改了的數據字典自動更新到資料庫中。

/// <summary>
/// 獲取數據字典集合
/// </summary>
/// <returns></returns>
Task<ListResultDto<DataDictionaryListDto>> GetAllDataDictionaryListAsync();

/// <summary>
/// 獲取數據字典記錄
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<DataDictionaryEditDto> GetDataDictionaryForEditAsync(NullableIdDto<long> input);

/// <summary>
/// 添加或更新數據字典記錄
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task CreateOrUpdateDataDictionaryAsync(CreateOrUpdateDataDictionaryInput input);

/// <summary>
/// 刪除數據字典記錄
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task DeleteDataDictionaryAsync(List<EntityDto<long>> inputs);

/// <summary>
/// 根據字典類型名稱獲取數據字典集合
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ListResultDto<DataDictionaryListDto>> GetDataDictionaryListByTypeNamesAsync(GetDataDictionaryListByTypeNamesInput input);

   對數據字典項也準備了幾個方法,用於對某一具體數據字典類型增加刪除修改數據字典項。

/// <summary>
/// 獲取數據字典項
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<DataDictionaryItemEditDto> GetDataDictionaryItemForEditAsync(NullableIdDto<long> input);

/// <summary>
/// 添加或更新數據字典項
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task CreateOrUpdateDataDictionaryItemAsync(CreateOrUpdateDataDictionaryItemInput input);

/// <summary>
/// 刪除數據字典項
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task DeleteDataDictionaryItemAsync(List<EntityDto<long>> inputs);

/// <summary>
/// 根據字典類型和字典項名稱獲取字典項值
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<GetDataDictionaryItemNameOutput> GetDataDictionaryItemNameAsync(GetDataDictionaryItemNameInput input);

/// <summary>
/// 獲取數據字典列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ListResultDto<DataDictionaryItemListDto>> GetDataDictionaryItemListAsync(GetDataDictionaryItemListInput input);

   在應用層建立一個全局常量數據字典類,用於存儲數據字典信息,該部分信息也將成為需要維護到系統中的必備信息,並且,在系統中如有地方需要調用到數據字典類型時,不需要寫死代碼。

/// <summary>
/// 數據字典類型存儲表
/// </summary>
public class DataDictionaryTypeConsts
{
    #region 分瓶規則
    public const string GroupRule_FixAtive = "固定劑及使用";

    public const string GroupRule_ContainerType = "容器類型";
    #endregion
}

   3、完成控制器層調用及頁面中對數據字典的管理 ,對於字典信息而言,足夠在界面中一覽全貌,因此頁面設計時,直接以樹形結構加表格展示即可,左側數據類型樹形結構,右側相應的數據類型項表格。

<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}">業務代碼</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>

 

三、數據字典頁面展示

  利用layui節省了不少時間,對於前端東西不太精通,只能夠用,勉強實現了數據字典的一些操作,其中的數據字典類型是按照開發過程中可能用到的進行加入的,合理的存在,而不是空穴來風,在之前的DataDictionaryConst類中可以定義需要用到的數據字典類型,此處並沒有直接從那裡增加後自動導入到資料庫中。 

 

 至此,數據字典的初步邏輯設計完畢,至於要加入更為豐富的功能,諸如排序,父子數據類型,或是數據類型描述,均可擴展。 

 代碼地址:https://gitee.com/530521314/Partner.Surround.git

 

2019-07-07,望技術有成後能回來看見自己的腳步

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Scala環境基礎 Scala對Java相關的類,介面進行了包裝,所以依賴Jvm環境。 二、配置Scala解壓版 1)註意路徑無空格和中文 2)配置環境變數 添加到path目錄 3)檢測是否安裝 配置成功,沒錯就是這麼簡單。 3、配置Idea開發 1)插件安裝,就是點點點 2)新建兩個maven ...
  • 問題描述: 假設需要生成前N個自然數的一個隨機置換。例如,{4,3,1,5,2}和{3,1,4,2,5}就是合法的置換,但{5,4,1,2,1}卻不是,因為數1出現兩次而數3卻沒有。這個程式常常用於模擬一些演算法。我們假設存在一個隨機數生成器RandInt(i,j),它以相同的概率生成i和j之間的一個 ...
  • 捕捉信號 Go // 運行此程式,控制台將列印"Waiting for signal" // 按Ctrl + C 發送信號以關閉程式,將發生中斷 // 隨後控制台依次列印"Signal .."、"Exiting..." package main import ( "os" "os/signal" " ...
  • 客戶端與服務端多功能傳輸小程式 server.py ...
  • 擁抱開源的腳步,我們從來都是一直在路上;.NETCore作為後起之秀,帶給我們太多的驚喜和感動;但是也正是由於年輕,.NETCore 的生態還是不夠完善,這就非常需要我們社區的力量,需要大家一起參與,把開源社區好的工具、組件、應用接入到 .NETCore 應用中。 ...
  • 系列目錄 1. "第一章|理論基礎+實戰控制台程式實現AutoFac註入" 1. 第二章|AutoFac的常見使用套路 1. 第三章|實戰Asp.Net Framework Web程式實現AutoFac註入 1. 第四章|實戰Asp.Net Core自帶DI實現依賴註入 1. 第五章|實戰Asp.N ...
  • 非同步轉同步-PushFrame 本文通過PushFrame,實現非同步轉同步 首先有一個非同步方法,如下非同步任務延時2秒後,返回一個結果 在UI線程執行此任務,嘗試轉化為同步 PushFrame非同步轉同步的實現: 測試結果: Task不帶返回值的處理: PushFrame的缺陷 PS:pushFrame ...
  • 前言: 平時在實際工作中很少用到這個,雖然都是一些比較基礎的東西,但一旦遇到了,又不知所云。剛好最近接觸了一些相關這方面的項目,所以也算是對 這些內容重新溫習實踐了一遍。所以這篇不僅作為個人備忘,也分享給各位重溫一遍。 要學會位運算,首先要清楚什麼是位運算?程式中的所有內容在電腦記憶體中都是以二進位 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...