ABP框架详解(五)Navigation
ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是。所以为方便起见,Navigation功能默认定义了一个"MainMenu"菜单添加到缓存字典中。该Navigation功能与普通ERP项目中可定制动态生成的导航菜单最大的区别应该是每一个菜单定义(MenuItemDefinition)可以设置一个权限只有用户拥有权限才会显示给该用户,控制更加的细更加的松耦合不是直接绑定到某个用户上。
整体而言,Navigation分为两部分,第一部分是菜单定义部分,业务系统中所有可用菜单项的定义都会存储其中,第二部分是用户导向,是面向具体用户返回具体菜单信息,就是根据用户自身的权限过滤出一部分菜单定义项(MenuItemDefinition)并转换成UserMenuItem返回给用户。
1.菜单定义
菜单定义主要是MenuDefinition和MenuItemDefinition两类。前者代表一个菜单,会拥有一个MenuItemDefinition的集合表示所拥有的菜单选项,每一个MenuItemDefinition自身还会拥有子MenuItemDefinition的集合。
业务项目开发者定义一个菜单的操作与上篇Feature的定义方式基本相同,定义一个集成自NavigationProvider的子类重写SetNavigation方法,在方法体中通过引用到的单例INavigationManager,注册进INavigationManager所拥有的一个缓存字典中,具体实例如下:
public class MyNavigationProvider1 : NavigationProvider
{
public override void SetNavigation(INavigationProviderContext context)
{
context.Manager.MainMenu.AddItem(
new MenuItemDefinition(
"Abp.Zero.Administration",
new FixedLocalizableString("Administration"),
"fa fa-asterisk",
requiresAuthentication: true
).AddItem(
new MenuItemDefinition(
"Abp.Zero.Administration.User",
new FixedLocalizableString("User management"),
"fa fa-users",
"#/admin/users",
requiredPermissionName: "Abp.Zero.UserManagement",
customData: "A simple test data"
)
).AddItem(
new MenuItemDefinition(
"Abp.Zero.Administration.Role",
new FixedLocalizableString("Role management"),
"fa fa-star-o",
"#/admin/roles",
requiredPermissionName: "Abp.Zero.RoleManagement"
)
)
);
}
}
在自定义的AbpModule中通过NavigationConfiguration注册到Providers属性中,而NavigationManager的Initialize方法会获取NavigationConfiguration的Providers逐个调用SetNavigation,完成整个菜单导航的注册。
2.用户菜单
真正会被用作菜单数据的用户菜单也有UserMenu和UserMenuItem两个类和上面的MenuDefinition和MenuItemDefinition是对应的,单例的UserNavigationManager提供了两个方法GetMenuAsync,GetMenusAsync,分别可以根据菜单导航名返回导航数据和根据用户Id,返回该用户所拥有的所有导航菜单。
在GetMenuAsync,GetMenusAsync中会先获取全部的菜单定义项,根据定义项中是否拥有权限控制,有的话就制返回满足权限的菜单项。具体的逻辑如下:
private async Task<int> FillUserMenuItems(int? tenantId, long? userId, IList<MenuItemDefinition> menuItemDefinitions, IList<UserMenuItem> userMenuItems)
{
var addedMenuItemCount = ; using (var featureDependencyContext = _iocResolver.ResolveAsDisposable<FeatureDependencyContext>())
{
featureDependencyContext.Object.TenantId = tenantId; foreach (var menuItemDefinition in menuItemDefinitions)
{
if (menuItemDefinition.RequiresAuthentication && !userId.HasValue)
{
continue;
} if (!string.IsNullOrEmpty(menuItemDefinition.RequiredPermissionName) && (!userId.HasValue || !(await PermissionChecker.IsGrantedAsync(userId.Value, menuItemDefinition.RequiredPermissionName))))
{
continue;
} if (menuItemDefinition.FeatureDependency != null &&
(AbpSession.MultiTenancySide == MultiTenancySides.Tenant || tenantId.HasValue) &&
!(await menuItemDefinition.FeatureDependency.IsSatisfiedAsync(featureDependencyContext.Object)))
{
continue;
} var userMenuItem = new UserMenuItem(menuItemDefinition, _localizationContext);
if (menuItemDefinition.IsLeaf || (await FillUserMenuItems(tenantId, userId, menuItemDefinition.Items, userMenuItem.Items)) > )
{
userMenuItems.Add(userMenuItem);
++addedMenuItemCount;
}
}
} return addedMenuItemCount;
}
用户菜单就是这么简单。
ABP框架详解(五)Navigation的更多相关文章
- ABP框架详解(三)Domain
此处的Domain主要指Abp类库根目录下Domain文件夹.顾名思义该目录下是用来存放与领域实体,领域逻辑执行,存储,领域服务相关的内容. 1.Entities (1)为整个Abp框架后期开发的所有 ...
- ABP框架详解(八)动态ApiController的生成和访问机制
在ABP框架中提供了一套动态生成ApiController的机制(依然支持原生ApiController的使用方式),虽然说是动态生成ApiController但是实际上并没有真正在启动程序的时候生成 ...
- ABP框架详解(七)Caching
在ABP框架中存在一个缓存机制,使用ICache的继承类来存储最终需要缓存的数据,可以吧ICache看成一个字典对象,使用Key作为真实数据的具有唯一性的表示.使用上与字典对象完全相同,Get方法传递 ...
- ABP框架详解(四)Feature
ABP框架中存在一个Feature的特性,功能和设计思路非常类似于框架中的Authorization功能,都是来控制用户是否能够继续操作某项功能,不同点在于Authorization默认是应用在IAp ...
- ABP框架详解(二)AbpKernelModule
AbpKernelModule类是Abp框架自己的Module,它也跟所有其他的Module一样继承自AbpModule,重写PreInitialize,Initialize,PostInitiali ...
- ABP框架详解(一)ABPBootstrapper
在ABP框架的AbpBootstrapper主要用于框架的基本配置的注册和初始化,在Web应用启动阶段实例化一个AbpBootstrapper并调用Initialize方法初始化,该类主要包含两个公有 ...
- ABP框架详解(六)Aspects
这种AOP式的设计非常类似于Asp.net MVC和WebApi中过滤器(Filter)机制,感觉没有太多可讲述的,只能谈谈设计思路. 框架中AspectAttribute特性用于设置到需要被拦截的T ...
- jQuery Validate验证框架详解
转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...
- mina框架详解
转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...
随机推荐
- Android 记录和恢复ListView滚动的位置的三种方法
本文主要介绍记录和恢复listView滚动位置的3种方法(1)记录listView滚动到的位置的坐标(推荐)(2)记录listView显示在屏幕上的第一个item的位置(3)通知适配器数据改变. 有时 ...
- Send SqlParameter to Dapper
Question: I' using Dapper in my project. I have a list of SqlParameters and I want to send it to Dap ...
- typedef 与指针、多维数组
1.在typedef中使用指针往往会带来意外的结果.如下: typedef string *pstring; const pstring cstr; 绝大数人刚开始都会认为cstr是一种指针,它指向c ...
- 怎么将oracle数据库的数据迁移
打开要导出数据的PC,进入cmd界面 先进入数据库输入sqlplus,账号system密码508956.有权限的账户密码 2. create directory dir_555 as 'd:/asd1 ...
- PHP正则表达式 /i, /is, /s, /isU等
PHP正则表达式 /i, /is, /s, /isU等 都是些什么东西呢? i 匹配大小写 s 模式中的圆点元字符(.)匹配所有的字符,包括换行符 x 模式中的空白字符除了被转义的或在字符类中的以外完 ...
- oracle for loop循环以及游标循环
1. for in loop形式 DECLARE CURSOR c_sal IS SELECT employee_id, first_name || last_name ename, salar ...
- margin:0 auto 与 text-align:center 的区别
基本概念: 1.text-align: 属性规定元素中的文本的水平对齐方式; 该属性通过指定行框与哪个点对齐,从而设置块级元素内文本的水平对齐方式; 一般情况下设置文本对齐方式的时使用此属性.支 ...
- base64格式的图片如何上传到oss
---恢复内容开始--- 对于base64图片的上传这个东西,一直是一个问题尤其是上传到oss.我们这次开发由于需要修剪图片,使用了h5的很多新特性. h5修剪图片,使用了我们的canvas.这个步骤 ...
- Process类
public bool Process.Start () 启动(或重用)此 Process 组件的 StartInfo 属性指定的进程资源,并将其与该组件关联. public bool Process ...
- linux下的device tree
在我个人的理解,device tree就是描述硬件设备的,目前有什么配置,把这些配置信息告诉linux内核,让内核去识别,增强了内核的通用性,不用因为平台不同而每次都要编译新内核了. 配置device ...