基于SqlSugar的开发框架循序渐进介绍-- 快速构建系统参数管理界面

news2025/1/11 17:15:02
  1. 在参照一些行业系统软件的时候,发现一个做的挺不错的系统功能-系统参数管理,相当于把任何一个基础的系统参数碎片化进行管理,每次可以读取一个值进行管理,这样有利于我们快速的处理业务需求,是一个挺好的功能。本篇随笔模拟这个功能,基于SqlSugar开发框架的基础上,利用代码生成工具快速生成系统参数管理界面和相关的业务类生成。

    1、参考和具体实现的效果对比

    参照的界面效果如下所示。

    最终基于SqlSugar的开发框架,基于DevExpress的界面效果,构建的Winform界面如下所示。

    2、 快速构建系统参数管理界面及后台业务代码

    为了实现业务代码及UI界面的内容生成,我们首先要设计好数据库,基于数据库表,可以利用代码生成工具Database2Sharp 快速生成相关的业务代码和Winform界面代码。

    系统参数的信息,应该设计为包含一个大类参数目录和一个具体的参数项目,如下基于SQLServer的数据库表设计所示(基于PoweDesigner设计,便于生成Sql执行)。

    其中大类目录如下设计所示,为了方便,设计为一个树形结构的层次。

    参数项目表设计如下所示。

    生成相关的Sql ,在数据库中构建好相关的表结构。

    然后利用代码生成工具生成相关的代码即可。

    打开代码生成工具,并展开相关的数据库表,由于我们选择基于SqlSugar开发框架架构进行的界面生成,因此选择对应的界面生成【SqlSugar框架Winform界面生成】。

     在弹出的【常规Winform界面生成】面板中,勾选相关的设置信息,定制UI界面,如下界面效果所示。

     利用代码生成工具,默认会生成一个类似下面的设计窗体的界面效果。

     为了能够展示多层级的参数目录,我们需要在左侧模仿做一个树形列表,这样才能更好的查看相关的参数信息,相当于把参数项目分类管理。

    因此我们在生成的窗体界面上,增加SplitContainerControl的一个拆分面板区域的控件,并把左侧放置树形列表及查询框,如下界面效果。

    3、快速构建系统参数管理的后台业务代码

    上面介绍的是Winform的界面生成,为了使得系统能够顺利的跑起来,我们还需要对相关的系统参数表目录和项目访问所需的业务代码,一般的业务代码都需要有CRUD等常规操作的代码,不过还好基于框架的基础上,我们只需要生成一个简单的类,继承自基类就默认具有了这些操作,不需要重复编写代码,简化了代码的处理并提高开发效率。

    同样的,我们利用现有表结构信息,基于代码生成工具快是生成相关的业务类文件,合并到系统框架中就可以了。

    选择两个刚创建的表:TB_SystemParams 、TB_SystemParamsDir,并填写对应的主命名空间,如下所示。

     最后生成的代码文件如下所示。

    由于是基于框架的目录机构生成的,因此直接复制Core目录到解决方案项目上就可以了,如下所示。

    复制过去后,对应业务表的实体类、接口类、实现类都一一设置好了相关的继承关系,如下是具体业务实现类的代码,是基于数据库表结构信息生成的。

    复制代码

        /// <summary>
        /// 系统参数配置 应用层服务接口实现
        /// </summary>
        public class SystemParamsService : MyCrudService<SystemParamsInfo,string, SystemParamsPagedDto>, ISystemParamsService
      {
           //相关代码
      }

    复制代码

    详细类文件如下所示,生成了相关的排序条件、查询条件等处理信息。

     由于这个系统界面比较简单,因此我们不需要增加任何代码。

    我们再次回到UI界面的处理上来,由于默认我们生成的界面,都具有了分页查询及编辑明细的功能,因此这部分代码我们不需要调整,我们额外增加了树展示和过滤的功能,因此需要适当修改一下生成的界面代码。

    窗体界面的处理主逻辑如下所示。

    复制代码

            /// <summary>
            /// 编写初始化窗体的实现,可以用于刷新
            /// </summary>
            public override void FormOnLoad()
            {
                InitSearchControl();
                InitTree();
                BindTree();
    
                InitDictItem();
                BindData();
            }

    复制代码

    标注红色的部分是我们需要额外增加的代码。

    初始化树的界面代码如下所示,主要的逻辑就是创建显示的列,以及确定好层次关系和实现拖动效果处理,以及对选中节点的事件处理。

    复制代码

          /// <summary>
            /// 初始化树控件
            /// </summary>
            private void InitTree()
            {
                this.tree.Columns.Clear();
    
                //控件扩展函数封装处理
                this.tree.CreateColumn("CategoryName", "系统参数目录", 160, true);
                this.tree.InitTree(Id_FieldName, "PID", null, false, false);
                this.tree.OptionsDragAndDrop.DragNodesMode = DragNodesMode.Single;
    
                //设置树的图标集合及逐级图标
                this.tree.SelectImageList = this.imageList1;
                this.tree.CustomDrawNodeImages += (object sender, CustomDrawNodeImagesEventArgs e) =>
                {
                    int maxCount = this.imageList1.Images.Count;
                    var index = e.Node.Level < maxCount ? e.Node.Level : 0;
                    e.SelectImageIndex = index;
                };
    
                //初始化树节点选择事件
                this.tree.FocusedNodeChanged += delegate (object sender, FocusedNodeChangedEventArgs e)
                {
                    this.FocusedNodeChanged();
                };
                this.tree.MouseDoubleClick += (s, e) => { menu_EditType_Click(null, null); };
            }

    复制代码

    而对于树节点的过滤,我们对查询的输入框架进行如下处理代码即可。

    复制代码

            /// <summary>
            /// 实现树节点的过滤查询
            /// </summary>
            private void InitSearchControl()
            {
                this.searchControl1.Client = this.tree;
                this.tree.FilterNode += (object sender, FilterNodeEventArgs e) =>
                {
                    if (tree.DataSource == null)
                        return;
    
                    string nodeText = e.Node.GetDisplayText("CategoryName");//参数填写FieldName  
                    if (string.IsNullOrWhiteSpace(nodeText))
                        return;
    
                    bool isExist = nodeText.IndexOf(searchControl1.Text, StringComparison.OrdinalIgnoreCase) >= 0;
                    if (isExist)
                    {
                        var node = e.Node.ParentNode;
                        while (node != null)
                        {
                            if (!node.Visible)
                            {
                                node.Visible = true;
                                node = node.ParentNode;
                            }
                            else
                                break;
                        }
                    }
                    e.Node.Visible = isExist;
                    e.Handled = true;
                };
            }

    复制代码

    触发树节点查询,以及绑定树数据源的处理如下代码所示

    复制代码

            /// <summary>
            /// 选中树节点触发的查询处理
            /// </summary>
            private void FocusedNodeChanged()
            {
                if (this.tree.FocusedNode != null)
                {
                    BindData();
                }
            }
            /// <summary>
            /// 绑定树的数据源
            /// </summary>
            private async void BindTree()
            {
                var result = await BLLFactory<ISystemParamsDirService>.Instance.GetAllAsync();
                if (result != null)
                {
                    this.tree.DataSource = result.Items;
                    this.tree.ExpandAll();
                }
            }

    复制代码

    其中数据源的获取,我们直接调用基类函数获取对应的列表项目就可以了,如上的代码

    BLLFactory<ISystemParamsDirService>.Instance.GetAllAsync();

    对于编辑参数明细的界面项目,我们如果需要微调界面,修改下即可。

     到此功能基本就完成了,整合编译运行就可以出效果了。构建的Winform界面如下所示。

     编辑明细部分的界面效果如下所示。

     以上就是基于SqlSugar开发框架的基础上,利用代码生成工具快速生成系统参数管理界面和相关的业务类生成的全部过程,希望对大家开发处理有所裨益。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/870747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FastColoredTextBox】C# 开源文本编辑控件

主界面截图 使用Demos演示 FastColoredTextBox 是一个用于在 C# 程序中实现高亮语法着色、代码编辑和文本显示的自定义控件。它提供了许多功能&#xff0c;包括&#xff1a; 语法高亮&#xff1a;FastColoredTextBox 支持多种语言的语法高亮&#xff0c;可以根据语法规则将不同…

Linux 终端操作命令(2)内部命令

Linux 终端操作命令 也称Shell命令&#xff0c;是用户与操作系统内核进行交互的命令解释器&#xff0c;它接收用户输入的命令并将其传递给操作系统进行执行&#xff0c;可分为内部命令和外部命令。内部命令是Shell程序的一部分&#xff0c;而外部命令是独立于Shell的可执行程序…

32 | 全球新冠肺炎确诊病例趋势分析

任务背景 过去一年多的时间,对我们影响最大的事件就是全球新冠肺炎的大流行。新冠肺炎除了对患者带来痛苦之外,对医疗系统也带来了巨大的挑战。许多患者陷入危险的本质原因就是医疗资源的紧张,如果可以根据现有确诊的数据来预测将来可能的确诊数,那政府和医院就能够提前对…

【python可视化】爬取豆瓣电影Top250(附源码)

前言 在网络爬虫的开发过程中&#xff0c;经常会遇到需要处理一些反爬机制的情况。其中之一就是网站对于频繁访问的限制&#xff0c;即IP封禁。为了绕过这种限制&#xff0c;我们可以使用代理IP来动态改变请求的来源IP地址。在本篇博客中&#xff0c;将介绍如何使用代理IP的技术…

【第二阶段】在函数中定义参数是函数的函数

1.理解&#xff1a;在一个函数中有一个参数a,这个参数a又属于一个函数&#xff0c;a即时参数又是函数 2.用kotlin实现登录 /*** You can edit, run, and share this code.* play.kotlinlang.org*/ fun main() {//调用传参//普通参数传入即可,针对在调用函数中的参数函数传入使用…

Leetcode34 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 代码&#xff1a; c…

SpringBoot第35讲:SpringBoot集成连接池 - 默认连接池HikariCP

SpringBoot第35讲&#xff1a;SpringBoot集成连接池 - 默认连接池HikariCP 本文是SpringBoot第35讲&#xff0c;主要介绍数据库连接池&#xff0c;以及SpringBoot集成默认的HikariCP的实践。 文章目录 SpringBoot第35讲&#xff1a;SpringBoot集成连接池 - 默认连接池HikariCP1…

【STM32】简介

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星T…

Exploiting Proximity-Aware Tasks for Embodied Social Navigation 论文阅读

论文信息 题目&#xff1a;Exploiting Proximity-Aware Tasks for Embodied Social Navigation 作者&#xff1a;Enrico Cancelli&#xff0c; Tommaso Campari 来源&#xff1a;arXiv 时间&#xff1a;2023 Abstract 学习如何在封闭且空间受限的室内环境中在人类之间导航&a…

StarGANv2: Diverse Image Synthesis for Multiple Domains论文解读及实现

StarGAN v2: Diverse Image Synthesis for Multiple Domainsp github:https://github.com/clovaai/stargan-v2 0 小结 0.1 模型 4个 模型四个&#xff1a; Generator&#xff1a; G网络 输入图片x&#xff0c;和风格编码s&#xff08;可以是F网络或者E网络生成的s&#xff…

LeetCode 778. Swim in Rising Water【最小瓶颈路;二分+BFS或DFS;计数排序+并查集;最小生成树】2096

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

城市最短路

题目描述 下图表示的是从城市A到城市H的交通图。从图中可以看出&#xff0c;从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。 输入输出格式 输入格式&#xff1a; 无 输出格式&#xff1a; 倒序输出经过城市最少的一条路线 输入输出样例 输入样例…

【LeetCode75】第二十七题(933)最近的请求次数

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 首先这是LeetCode75里第一道设计类的题目&#xff0c;这种类型的题目会比较新颖&#xff0c;就是按照题目要求来设计一个类。然后…

GIL 锁或将在 CPython 中成为可选项

哈喽大家好&#xff0c;我是咸鱼 几天前有媒体报道称&#xff0c;经过多次辩论&#xff0c;Python 指导委员会打算批准通过 PEP 703 提案&#xff0c;让 GIL&#xff08;全局解释器&#xff09;锁在 CPython 中成为一个可选项 PEP 703 提案主要目标是使 GIL 变成可选项&#…

二叉树的讲解

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

定义行业新标准?谷歌:折叠屏手机可承受20万次折叠

根据Patreon账户上的消息&#xff0c;Android专家Mishaal Rahman透露&#xff0c;谷歌计划推出新的硬件质量标准&#xff0c;以满足可折叠手机市场的需求。Android原始设备制造商&#xff08;OEM&#xff09;将需要完成谷歌提供的问卷调查&#xff0c;并提交样品设备进行严格审…

读书笔记 |【项目思维与管理】➾ 顺势而动

读书笔记 |【项目思维与管理】➾ 顺势而动 一、企业步入“终结者时代”二、过去成功的经验也许是最可怕的三、做好非重复性的事四、适应客户是出发点五、向知识型企业转变六、速度是决胜条件 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; …

【C++ 学习 ⑬】- 详解 list 容器

目录 一、list 容器的基本介绍 二、list 容器的成员函数 2.1 - 迭代器 2.2 - 修改操作 三、list 的模拟实现 3.1 - list.h 3.2 - 详解 list 容器的迭代器 3.2 - test.cpp 一、list 容器的基本介绍 list 容器以类模板 list<T>&#xff08;T 为存储元素的类型&…

ruoyi-vue-v3.8.6-搭建

一、准备工作 环境&#xff1a; win10、MySQL8、JDKjdk1.8.0_311 redis6.2.6 IDEA 2022.3.3 maven3.9 Node v18.14.2 npm 9.5.0 版本&#xff1a; 若依框架官方文档&#xff1a;http://doc.ruoyi.vip/ 官网导航&#xff1a;http://120.79.202.7/ 若依项目地址&#xff…

将数组(矩阵)旋转根据指定的旋转角度scipy库的rotate方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数组(矩阵)旋转 根据指定的旋转角度 scipy库的rotate方法 关于下列代码说法正确的是&#xff1f; import numpy as np from scipy.ndimage import rotate a np.array([[1,2,3,4], …