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人 ...
随机推荐
- ArcMap中地图输出(Options)选项显示不完整
首先,我开始遇到的时候,认为是高分辨屏幕的问题,所以修改了屏幕的分辨率,结果并没有改变. 然后,认为是对话窗口的显示,修改字体大小,也没有显示完整. 最后,是修改了ArcGIS的注册表才解决.解决方式 ...
- Linux中的输入重定向,变量
1 :分号 格式:命令1:命令2;命令3 说明:命令之间用分号隔开是顺序执行,命令之间没有任何逻辑关系 2 && 逻辑与 格式:命令1 && 命令2 说明:命令1正 ...
- httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系
学习servlet的时候经常感到疑惑 HttpServletRequest是服务器创建的?还是servlet容器创建的? 过滤器是服务器创建的?还是servlet容器创建的? serlet容器和tom ...
- Java多线程简析
一.线程的状态: 线程共有下面4种状态: 1.新建状态(New): 新创建了一个线程对象,当你用new创建一个线程时,该线程尚未运行. 2.就绪状态(Runnable): 线程对象创建后,其他线程调用 ...
- GPU高性能计算-CUDA
前段时间有个同学的毕设是搞并行计算的,他基本不懂编程把我拉过去帮忙,我之前也没弄过,帮着搞了2天.先把代码贴上去,等有时间在把详细补充一些内容. CUDA编程主要是利用了显卡优越的并行计算能力,把一个 ...
- tkinter 在 x window 下的字体设置格式
X Font Descriptors # X Font Descriptors are strings having the following format (the asterisks repre ...
- J2EE之oracle、mysql存储过程调用
最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...
- moss2003 sp3补丁安装
安装完成以后自己在产品库里增加的存储过程不见了,自我保护?
- shell学习--grep1
一. grep的来源 通过ex编辑器来查找某个字串: :/pattern/p 其中p是打印,包含字符串pattern的第一行将被打印:如果需要打印包含pattern的所有行,可以这样: :/g/pat ...
- 如果因特网中的所有链路都提供可靠的交付服务,TCP可靠传输服务是多余的吗?
IP协议因为是无连接的, 所以其传输是不可靠的.虽然链路保证了数据包在端到端的传输中不发生差错,但是它不能保证IP数据包是按照正确的书需到达最终的目的地.IP数据包可以使用不同的路由通过网络,到达接收 ...