abp模块化开发之通用树1:基本使用
一、概述
有些功能在单个项目或多个项目被重复使用,比如:附件,同一个系统中的多个模块都可能使用到,不同项目也有需要。再比如:有无限级分类的树形功能,区域、产品分类、数据字典等。最简单粗暴的办法是直接复制代码,最后本来是同一个功能被复制了多份,而且可能最后都被各自修改得面目全非。
理想的办法是将这些通用功能封装起来,通过迭代升级版本,不同项目都可以引用他们,封装的时候留出扩展点方便每个项目的个性化需求
nuget中搜索bxjg可以找到已发布的模块,源码后续会放github上,猴急的你可以私我
本篇讲解如何使用,下篇讲如何通过abp提供的模块化能力实现一个通用树模块
注:ASP.NET Boilerplate简称abp,是个啥请百个度
二、如何使用
为了各位有个直观感受,我们来看看如何使用模块,后续再讲如何开发它。
2.1、基本使用
1、通过nuget安装通用树模块(最好是所有项目都安装 解决方案 -> 右键 管理解决方案的包 一次安装)
Install-Package BXJG.GeneralTree -Version 1.0.
2、配置DbContext
public class ABPDbContext : AbpZeroDbContext<Tenant, Role, User>{
//其它配置
public virtual DbSet<GeneralTreeEntity> GeneralTrees { get; set; }
3、开启动动态webApi代理生成
public class ABPWebApiModule : AbpModule {
public override void Initialize() {
//other..
Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
.ForAll<IApplicationService>(typeof(GeneralTreeModule).Assembly, "gt/gt")
.Build();
4、数据库迁移
add-migration addGeneralTree
update-database
此时编译调试,如果你有swaggerUI的话,应该可以看得到生成的动态webapi了
5、配置权限,在core项目的AuthorizationProvider中
public class ABPAuthorizationProvider : AuthorizationProvider{
GeneralTreeModuleConfig cfg;//注入模块的配置对象
public ABPAuthorizationProvider(GeneralTreeModuleConfig cfg) {
this.cfg = cfg;
}
public override void SetPermissions(IPermissionDefinitionContext context){
//其它权限的配置
cfg.InitPermission(baseInfo);//通用字典权限的配置
6、配置菜单,配置方式跟权限配置类似。在web项目中的NavigationProvider
public class ABPNavigationProvider : NavigationProvider{
GeneralTreeModuleConfig cfg;
public ABPNavigationProvider(GeneralTreeModuleConfig cfg){
this.cfg = cfg;
}
public override void SetNavigation(INavigationProviderContext context){
//其它菜单配置
var sjzd = cfg.InitNav(jczl);
sjzd.Icon = "shuju";
sjzd.Url = "/baseinfo/generalTree/index.html";
此时你已经可用在项目中使用这个通用的数据字典模块了
2.2、扩展通用字典实现“区域”功能
1、定义实体,继承模块提供的抽象类
[Table("ABPAdministratives")]
public class AdministrativeEntity : GeneralTreeEntity<AdministrativeEntity>{
/// <summary>
/// 行政区域级别
/// </summary>
public XZQ Level { get; set; }
}
2、配置DbContext
public class ABPDbContext : AbpZeroDbContext<Tenant, Role, User>{
//其它配置
public virtual DbSet<AdministrativeEntity> Administratives { get; set; }
3、定义领域服务类
public class AdministrativeManager : GeneralTreeManager<AdministrativeEntity>{
public AdministrativeManager(IRepository<AdministrativeEntity, long> repository) : base(repository){
}
}
4、按abp常规套路实现Application中的接口和dto,偷个懒,截个图
[AutoMapFrom(typeof(AdministrativeEntity))]
public class AdministrativeDto : GeneralTreeGetTreeNodeBaseDto<AdministrativeDto> {
public XZQ Level { get; set; }
public string LevelText { get; set; }
}
[AutoMapTo(typeof(AdministrativeEntity))]
public class EditAdministrativetDto: GeneralTreeNodeEditBaseDto{
[Range(, )]
public int Level { get; set; }
} public interface IAdministrativeAppService : IGeneralTreeAppServiceBase<AdministrativeDto,EditAdministrativetDto>
{} public class AdministrativeAppService : GeneralTreeAppServiceBase<AdministrativeEntity, AdministrativeDto, EditAdministrativetDto>, IAdministrativeAppService{
public AdministrativeAppService(
IRepository<AdministrativeEntity, long> repository,
AdministrativeManager organizationUnitManager)
: base(repository,
organizationUnitManager,
PermissionNames.AdministratorBaseInfoAdministrativeAdd,
PermissionNames.AdministratorBaseInfoAdministrativeUpdate,
PermissionNames.AdministratorBaseInfoAdministrativeDelete,
PermissionNames.AdministratorBaseInfoAdministrative,
"Nationwide", "Administrative")
{} protected override void OnGetAllListItem(AdministrativeEntity entity, AdministrativeDto dto){
dto.LevelText = base.LocalizationSource.GetEnum(entity.Level);
} protected override void OnGetForSelectItem(AdministrativeEntity entity, GeneralTreeNodeDto node){
node.attributes.Level = entity.Level;
node.attributes.LevelText = base.LocalizationSource.GetEnum(entity.Level);
}
三、总结
本篇只讲了使用,下篇会详细分析如何用abp实现模块化
abp模块化开发之通用树1:基本使用的更多相关文章
- asp.net abp模块化开发之通用树2:设计思路及源码解析
一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...
- 初识ABP vNext(9):ABP模块化开发-文件管理
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 创建模块 模块开发 应用服务 运行模块 单元测试 模块使用 最后 前言 在之前的章节中介绍过ABP扩展实体,当时在用户 ...
- Android模块化开发实践
一.前言 随着业务的快速发展,现在的互联网App越来越大,为了提高团队开发效率,模块化开发已经成为主流的开发模式.正好最近完成了vivo官网App业务模块化改造的工作,所以本文就对模块化开发模式进行一 ...
- JS模块化开发:使用SeaJs高效构建页面
一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...
- ABP模块化
基于Abp模块化.插件化的设计,开发人员可以将自定义的功能以模块的形式集成到项目中. 模块的加载 模块: 插件: 模块及插件的加载路线: 1. 扩展的HttpApplication对象(在Abp.We ...
- 详解JavaScript模块化开发
什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...
- Asp.net Mvc模块化开发之分区扩展框架
对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...
- JavaScript模块化开发&&模块规范
在做项目的过程中通常会有一些可复用的通用性功能,之前的做法是把这个功能抽取出来独立为一个函数统一放到commonFunctions.js里面(捂脸),实现类似于snippets的代码片段收集. fun ...
- js模块化开发——前端模块化
在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术 ...
随机推荐
- GDG Xi'an DevFest 2019 闪电演讲 -《假如我是一个浏览器》PPT(经典多图,建议收藏)
GDG Xi'an DevFest2019演讲PPT链接: http://tmp.link/f/5dd9e6bf461b6 闪电演讲<假如我是一个浏览器>PPT链接: https://gi ...
- UML元素绘制方式
UML是由视图(View).图(Diagrams).模型元素(Model elements)是和通用机制等几个部分构成. 视图:视图是对系统的抽象表示,UML共有9种不同的图类型. 模型元素:代表面向 ...
- react create-react-app使用less 及关闭eslint
使用less和关闭eslint都需要先运行命令 npm run eject 来暴露配置文件,(不可逆的) 一.less使用 运行命令安装less npm install less less-load ...
- java8 Optional优雅非空判断
java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...
- .NET高级特性-Emit(2.1)字段
在上篇blog写完的几天后,有读者反映写的过于复杂,导致无法有效的进行实践:博主在考虑到园子里程序员水平高低不一致的情况,所以打算放慢脚步,对类的一些内容进行详细的讲解,顺带的会写一些笔者所遇到过的E ...
- linuxLVM
一.概念性的东西 LVM2:Logical Volume Manager ,Cersion 2 LVM,依赖于内核的dm模块(将一个或多个底层的设备组织成一个逻辑设备的模块).可以将多个物理分区通过软 ...
- vi指令详解
★ vi的模式(命令模式.插入模式.ex模式) 1)命令模式: 在我们刚刚通过vi新建或打开一个已经存在的文件时,首先默认被读取的模式就是“命令模式”,命令模式的特征就是,在编辑器窗口左下角的位置上没 ...
- 带着canvas去流浪系列之七 绘制水球图
[摘要] 用原生canvasAPI实现百度echarts 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- Pycharm常见快捷键
Ctrl+/注释(取消注释)选择的行 Shift + Enter开始新行 Ctrl + Enter智能换行 TAB Shift+TAB缩进/取消缩进所选择的行 Ctrl + Alt + I自动缩进行 ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...