• ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架


    原文:https://www.cnblogs.com/wuhuacong/p/11125693.html


    前面介绍了很多ABP系列的文章,一步一步的把我们日常开发中涉及到的Web API服务构建、登录日志和操作审计日志、字典管理模块、省份城市的信息维护、权限管理模块中的组织机构、用户、角色、权限、菜单等内容,以及配置管理模块,界面的高级查询处理等内容,同时我们把整个开发理念结合我们的代码生成工具Database2Sharp进行快速的开发,快速开发分为两个部分:一个是Web API部分的ABP框架代码生成,包括领域实体层、应用服务层、公用DTO和接口层、API调用Caller层等内容的生成,并且整合了我们封装的基类,以便生成的代码更加简洁,但却具有更加强大、易用的功能函数;另一个快速生成的部分是界面生成,我们根据我们在Winform领域多年的开发,整合了分页、公用类库和Winform基础界面类的基础上实现了快速的Winform界面生成,并且Winform界面生成可以根据需要配置列表查询条件、列表显示内容,编辑界面的字段显示等等内容,并且生成的Winform界面自动具有和ABP快速框架整体调用通用规则。

    1、ABP框架背景知识介绍

    ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架。ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型。学习使用ABP框架也有一段时间了,一直想全面了解下这个框架的整个来龙去脉,并把想把它使用历程整理成一个系列出来,不过一直没有下笔来写这篇文章的开篇,就是希望能够深入了解,再深入了解一些,希望自己能够理解透彻一些,不能误人子弟,也不想和网上千篇一律的翻译官网的内容,官网的英文介绍也已经很详细了,于是我觉得还是以实际使用的过程进行一定的整理会更好。

    初次了解ABP框架,对它还是非常惊艳的,它基本上是.NET 领域架构的集大成者,几乎囊括了我们.NET领域排的上名的各种技术应用,而且它本身可以支持.net framework和.net core两种技术流派,对它的介绍也是非常感兴趣。

    1)ABP框架的特点

    我们来大概了解下ABP框架涉及到的内容。

    • 依赖注入,这个部分使用 Castle windsor (依赖注入容器)来实现依赖注入,这个也是我们经常使用IOC来处理的方式;
    • Repository仓储模式,已实现了Entity Framework、NHibernate、MangoDB、内存数据库等,仓储模式可以快速实现对数据接口的调用;
    • 身份验证与授权管理,可以使用声明特性的方式对用户是否登录,或者接口的权限进行验证,可以通过一个很细粒度的方式,对各个接口的调用权限进行设置;
    • 数据有效性验证,ABP自动对接口的输入参数对象进行非空判断,并且可以根据属性的申请信息对属性的有效性进行校验;
    • 审计日志记录,也就是记录我们对每个接口的调用记录,以及对记录的创建、修改、删除人员进行记录等处理;
    • Unit Of Work工作单元模式,为应用层和仓储层的方法自动实现数据库事务,默认所有应用服务层的接口,都是以工作单元方式运行,即使它们调用了不同的存储对象处理,都是处于一个事务的逻辑里面;
    • 异常处理,ABP框架提供了一整套比较完善的流程处理操作,可以很方便的对异常进行进行记录和传递;
    • 日志记录,我么可以利用Log4Net进行常规的日志记录,方便我们跟踪程序处理信息和错误信息;
    • 多语言/本地化支持,ABP框架对多语言的处理也是比较友好的,提供了对XML、JSON语言信息的配置处理;
    • Auto Mapping自动映射,这个是ABP的很重要的对象隔离概念,通过使用AutoMaper来实现域对象和DTO对象的属性映射,可以隔离两者的逻辑关系,但是又能轻松实现属性信息的赋值;
    • 动态Web API层,利用这个动态处理,可以把Application Service 直接发布为Web API层,而不需要在累赘的为每个业务对象手工创建一个Web API的控制器,非常方便;
    • 动态JavaScript的AJax代理处理,可以自动创建Javascript 的代理层来更方便使用Web Api,这个在Web层使用。

    除了这些重要特性外,ABP框架还有很多一些特别的功能或者概念。

    • 多租户支持(每个租户的数据自动隔离,业务模块开发者不需要在保存和查询数据时写相应代码;
    • 软删除支持(继承相应的基类或实现相应接口,会自动实现软删除)
    • 系统设置存取管理(系统级、租户级、用户级,作用范围自动管理)
    • EventBus实现领域事件(Domain Events)
    • 模块以及模块的依赖关系实现插件化的模块处理等等

    ABP框架主要还是基于领域驱动的理念来构建整个架构的,其中领域驱动包含的概念有 域对象Entities、仓储对象Repositories、域服务接口层Domain Services、域事件Domain Events、应用服务接口Application Services、数据传输对象DTOs等。

    ABP官方网站:http://www.aspnetboilerplate.com,从里面可以查看很详细的案例和文档说明,可以根据需要下载不同类型的基础框架。

    ABP GitHub源码地址:https://github.com/aspnetboilerplate,可以下载整个基础的框架内容,以及相关的样板案例代码。

    基于ABP框架基础上,我们整理完善了整个权限体系,以及基于这个基础上进行的业务系统快速开发,我们整理后的ABP快速开发框架的架构图示,如下图所示(以字典模块为例说明)

    针对Web API接口调用的封装,为了适应客户端快速调用的目的,这个封装作为一个独立的封装层,以方便各个模块之间进行共同调用。

    2、基于Winform的ABP快速开发框架功能介绍

    1)登陆界面

    2)主体框架界面

    主体框架界面采用的是基于菜单的动态生成,以及多文档的界面布局,具有非常好的美观性和易用性。

    左侧的功能树列表和顶部的菜单模块,可以根据角色拥有的权限进行动态构建,不同的角色具有不同的菜单功能点,如下是测试用户登录后具有的界面。

    3)用户管理界面

    用户列表包括分页查询、导入、导出用户数据,以及可以利用右键菜单进行新增、编辑用户记录,或者对指定用户进行重置密码操作。

    用户编辑界面如下所示。

    当然可以查看这个用户本身拥有的权限功能点,如下界面所示。

    用户数据导入 ,可以根据指定模板的格式进行填写后,然后导入指定的文件内容,如下所示。

    导出文件则是把列表中现有的数据进行导入,导出后提示是否打开Excel文件进行查看。

    4)组织机构管理

    组织机构主要就是一个层级的对象关系,一般包含但不限于公司、部门、工作组等的定义,其中组织机构包含用户成员和角色成员的关系,如下界面所示。

    组织机构的树形列表可以进行拖动实现不同层级的变化

    或者通过右键菜单进行编辑修改操作

     

    组织机构可以修改机构名称和对应的父类节点,如下界面所示。

    组织机构包含的成员可以添加多个人员记录,添加界面如下所示。

     

    添加角色界面如下所示。

    5)角色管理

    角色信息没有层级关系,可以通过列表展示。

    其中角色包含权限分配、角色成员和拥有菜单的维护,如下是角色编辑界面,包含角色基本信息、拥有权限、包含成员、拥有菜单的管理等。菜单对于角色来说,应该是一种界面资源,可以通过配置进行管理对应角色用户的菜单。

    菜单编辑界面如下所示。

    角色的权限包含系统可以用的权限,并可以勾选为角色设置所需的功能点,如下界面所示。

    用户成员则和机构的用户管理一样,可以指定多个用户,这里不再赘述。

    而菜单对于角色来说,应该是一种界面资源,可以通过配置进行管理对应角色用户的菜单,如下界面所示。

    通过配置好的菜单,用户登录系统后,系统根据当前用户具有的菜单项目,动态构建显示对应的列表菜单和工具栏菜单。

     

    6)功能管理

    严格来说,ABP框架并没有统一管理好权限功能点的,它没有任何表来存储这个功能集合,而是通过派生AuthorizationProvider的子类来定义权限功能点

    我在这个基础上引入了一个权限功能的表用来存储功能点的,然后提供管理界面来动态维护这些功能点。如下界面所示。

    我们刚才在角色里面看到可以分配的权限内容,就是基于这个权限表的信息展示。

    这样我们可以动态添加或者批量添加所需要的功能点,并且和整个权限管理模块串联起来,形成一个完整的控制体系。

     

    另外我们还可以通过左侧树列表的右键菜单管理列表,如下所示可以级联删除对应的节点及其下面所有子节点。

    系统登录后,客户端自动获取对应用户的角色功能点,然后我们每次打开一个新的业务窗体,客户端会进行界面的权限逻辑控制,如果没有权限的,那么不可以访问操作,如下是禁止了产品信息的导入、导出、新增、编辑等操作功能,如下界面所示产品界面被动态取消相关权限后,界面禁止了某些操作功能。

    7)菜单管理

    Winform主界面的开发,基本上都是标准的界面,在顶部放置工具栏,中间区域则放置多文档的内容,但是在顶部菜单比较多的时候,就需要把菜单分为几级处理,如可以在顶部菜单放置一二级菜单,这种方式在一般功能点不算太多的情况下,呈现的界面效果较为直观、也较为美观。不过随着一些系统功能的增多,这种方式可能就会显得工具栏比较拥挤,那么我们是否可以在左侧放置一个树形列表,这样通过树形列表的收缩折叠,就可以放置非常多的菜单功能了。

    在ABP快速开发框架里面,我们依旧采用Winform开发框架里面用到的菜单维护方式,在权限模块系统中维护菜单内容,并在用户登录系统后,动态加载菜单展示,并通过菜单的配置信息,可以动态展示不同的窗体信息。

    菜单资源管理的列表界面界面如下所示

    左侧列表依旧可以通过右键菜单进行维护管理。

    双击树列表或者右侧的列表,都可以对已有的菜单进行编辑,菜单编辑界面如下所示。

    我们可以通过选择图标按钮进行菜单图标的选择,如下是选择菜单图片的界面。

    这样我们可以采用DevExpress内置漂亮的系统图标,也可选择系统文件里面的图标文件。

    如果用户登录系统后,觉得自己管理的菜单有些多,那么可以通过菜单配置的方式,选择性的呈现某些菜单,把其他部分的菜单隐藏起来,这个就是自定义应用菜单界面,界面如下所示。

    8)系统登录日志

    登录日志,这个就是用户尝试登录的时候,留下的记录信息,其中包括用户的登录用户名,ID,IP地址、登录时间,以及登录是否成功的状态等信息。

    这个登录日志,就是在系统登录尝试的时候,留下的记录,可供管理员进行跟踪了解某个账户的使用情况,也可以根据这些登录信息进行一个统计报表的分析。

    9)系统审计日志

    审计日志,设置我们在访问或者调用某个应用服务层接口的时候,横切面流下的一系列操作记录,其中记录我们访问的服务接口,参数,客户端IP地址,访问时间,以及异常等信息,这些操作都是在ABP系统自动记录的,如果我们需要屏蔽某些服务类或者接口,则这些就不会记录在里面,否则默认是记录的。

    审计日志的明细展示界面如下所示。

    10)字典管理

    字典管理界面,左侧列出字典类型,并对字典类型下的字典数据进行分页展示,右侧则利用分页展示对应字典类型的字典数据,字典管理界面如下所示。

    新增或者编辑窗体界面如下

    批量添加字典内容的界面如下所示。

    省份城市行政区的模块管理,也主要是为了提供一个三级联动的字典列表给界面使用,因此这里对这些统计局的数据进行一个维护和展示出来,如下界面所示。

    11)参数配置模块

    一般来说,一个系统或多或少都会涉及到一些系统参数或者用户信息的配置,而ABP框架也提供了一套配置信息的管理模块,ABP框架的配置信息,必须提前定义好配置的各项内容,然后才能在系统中初始化或者通过接口查询来使用,本ABP快速开发框架引入了另外一种配置信息的定义,实现更加简化的处理。

    参数配置管理模块界面如下所示。

    配置模块使用主要特点是以键为操作对象,然后内容是JSON序列化后的内容,可以存储用户自定义的类的序列号字符串,通过整合了SettingsProvider.net组件,使得我们操作配置内容更加方便和动态化。

    12) 附件管理模块

    该模块其实是很通用的一个模块,例如我们的一些日常记录,可能会伴随着有图片、文档等的附件管理,如果为每个业务对象都做一个附件管理,或者每次开发系统都重新做,那么效率肯定没有直接采用通用的附件管理那么方便快捷了。

    其实这个模块是基于我的Winform开发框架开发的,同样现在的ABP快速开发框架的Winform端依旧可以使用这些模块的界面和大概的处理规则,我们把它利用ABP框架的获取数据方式调整一下即可。

    首先我们创建一个独立的控件,用于放到编辑数据记录窗口里面,如下所示。

    这样在项目中集成(如数据编辑窗口),直接拖动这个控件到界面中,运行就可以看到下面的效果了。

    由于一般创建记录的时候,给他指定一个GUID的附件组ID,这样我们在数据记录保存前,我们就可以上传附件了,如下所示。

    而且在这个过程中,可以随时查看自己在该记录中已经上传的附件。如果附件不够,可以随时启动上传操作,附件支持多选文件,然后一次性,启动后台线程操作方式,把文件上传及附件记录保存到数据库。

    由于是附件管理,因此有可能上传各种文件,包括Word文档、Excel文档、压缩文件,以及各种类型的图片,因此为了方便对图片的查看,这个控件集成了图片查看控件,可以非常方便直接读取图片附件的数据流作为对象展示,该图片控件支持对图片的滚动放大缩小、左右翻转、选择放大、图片移动、保存图片等功能,不需要查看,直接使用ESC退出即可。

    附件管理在很多信息化管理系统中很普遍使用,例如我在病人管理系统界面里面,可以在一个界面里面分门别类管理很多影像学的图片资料,通过查看附件,可以看到其中一些图片附件的缩略图,需要进一步查看,可以双击图片即可实现预览效果。

    通用附件管理模块,就是基于这些特点,实现图片、Excel文档、Word文档和PDF等文档的在线预览和管理操作,界面截图如下所示。

    以上就是框架里面主要的模块内容展示,当然我们可以结合代码生成工具来快速开发自己的业务管理模块,而这些主要就是设计好数据库后,对框架代码和界面代码的统一生成后进行整合到主体框架里面即可,可以获得高效、统一、快速的开发体验。

    详细的代码生成工具开发过程,可以了解随笔《利用代码生成工具生成基于ABP框架的代码 》、《ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程

    ABP框架代码生成

    最终根据根据选择数据库表信息,一键生成相关ABP架构分层代码,文件结构如下所示。

    ABP框架的Winform界面开发

    设置好后直接生成,代码工具就可以依照模板来生成所需要的WInform列表界面和编辑界面的内容了,如下是生成的界面代码。

    放到VS项目里面,就看到对应的窗体界面效果了。

    生成界面后,进行一定的布局调整就可以实际用于生产环境了,省却了很多时间。

    系列文章列表如下所示:

     
  • 相关阅读:
    一个简单的knockout.js 和easyui的绑定
    knockoutjs + easyui.treegrid 可编辑的自定义绑定插件
    Knockout自定义绑定my97datepicker
    去除小数后多余的0
    Windows Azure Web Site (15) 取消Azure Web Site默认的IIS ARR
    Azure ARM (1) UI初探
    Azure Redis Cache (3) 创建和使用P级别的Redis Cache
    Windows Azure HandBook (7) 基于Azure Web App的企业官网改造
    Windows Azure Storage (23) 计算Azure VHD实际使用容量
    Windows Azure Virtual Network (11) 创建VNet-to-VNet的连接
  • 原文地址:https://www.cnblogs.com/springsnow/p/13901953.html
Copyright © 2020-2023  润新知