我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于ABP框架实现数据字典开发

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于ABP框架实现数据字典开发

在业务型的系统开发中,我们需要维护各种个样的类型,比如客户类型、客户行业、商品类型等等,这些类型往往信息量不多,并且相似度极高,如果采用一类型一表去设计,将会造成极大的工作量,通过将这部分类型的信息进行抽象,利用字段去存储类型区分,共用表结构,来达到兼容各种类型的功能,也就是设计一个数据字典,而对于一个具体类型来讲,是有多个选项的,比如性别,有男女,行业有工农商等,对于这部分选项,可抽象为某个类型下的字典项,即数据字典项。

一、数据字典设计思路

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

到此这篇关于基于ABP框架实现数据字典开发的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于ABP框架实现数据字典开发

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js开发教程之基于OnceIO框架实现文件上传和验证功能

OnceIO 是 OnceDoc 企业内容(网盘)的底层Web框架,它可以实现模板文件、静态文件的全缓存,运行起来完全不需要I/O操作,并且支持客户端缓存优化,GZIP压缩等(只在第一次压缩),拥有非常好的性能,为您节约服务器成本。它的模块
2022-06-04

Element基于el-input数字范围输入框的实现

本文主要介绍了 Element基于el-input数字范围输入框的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-18

分布式开发医疗挂号系统数据字典模块web前后端怎么实现

这篇文章主要介绍了分布式开发医疗挂号系统数据字典模块web前后端怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇分布式开发医疗挂号系统数据字典模块web前后端怎么实现文章都会有所收获,下面我们一起来看看吧
2023-06-30

关于python实现json/字典数据中所有key路径拼接组合问题

这篇文章主要介绍了关于python实现json/字典数据中所有key路径拼接组合问题,文中有详细的代码说明,需要的朋友可以参考下
2023-05-16

asp.net怎么使用WebAPI和EF框架结合实现数据的基本操作

这篇文章主要介绍“asp.net怎么使用WebAPI和EF框架结合实现数据的基本操作”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“asp.net怎么使用WebAPI和EF框架结合实现数据的基本操作”
2023-06-30

如何使用Go语言开发基于Websocket的实时数据传输系统

如何使用Go语言开发基于Websocket的实时数据传输系统,需要具体代码示例Websocket是一种全双工协议,它可以在不刷新页面的情况下实现实时数据传输。在现代Web应用程序中,实时数据传输是至关重要的一部分。本文将介绍如何使用Go语言
如何使用Go语言开发基于Websocket的实时数据传输系统
2023-12-18

从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例

本文实例讲述了Node.js基于connect和express框架的多页面实现数学运算。分享给大家供大家参考,具体如下: 1、使用connect框架 .use方法用于绑定中间件到connect服务器,它会配置一系列在接到请求时调用的中间件模
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录