ASP.NET核心项目实战权限管理系统(8)动态加载菜单-研发项目管理

>>ASP.NET核心项目实战权限管理系统(8)动态加载菜单-研发项目管理

ASP.NET核心项目实战权限管理系统(8)动态加载菜单-研发项目管理

引言:当今社会市场竞争激烈,软件开发企业想要占据前列需要在研发管理上下功夫,“向管理要效益”已经成为软件开发企业的共识,研发项目管理在软件企业中的普及也是大势所趋。国内做软件项目管理工具的开发商翼发云近几年发展十分迅速,越来越多的软件开发企业认识到研发项目管理的重要性,能切实有效降低成本,规范软件开发流程,提高软件产品质量。国内研发项目管理系统、敏捷开发管理工具的领导品牌翼发云敏捷项目管理系统采用可视化业务流程技术,支持瀑布模型等传统软件研发项目管理,同时也支持scrum等敏捷开发流程,是理想的敏捷开发管理工具,涵盖软件项目管理工作的整个生命周期。为提高国内软件开发企业的项目管理水平,分享一篇企业管理相关的知识文章。

0 ASP.NET核心项目物权管理系统(0)

1 ASP。NET核心项目实战的权限管理系统(1)使用adminlte建立前端 scrum

2 ASP.NET核心项目实战权限管理系统(2)功能与实体设计

3 ASP。NET核心项目真正的版权管理系统(3)通过使用PostgreSQL EntityFramework核心 软件项目管理

4 ASP.NET核心项目物权管理系统(4)依赖于多项目分层实施注入、仓储和服务。

5 ASP.NET核心项目实战权限管理系统(5)用户登录 敏捷开发流程

6 ASP.NET核心项目实战权限管理系统(6)功能管理

7 ASP.NET核心项目版权管理系统(7)组织、角色、用户权限 研发项目管理

8 ASP.NET核心项目版权管理系统(8)功能菜单动态加载

GitHub源地址

0服务层实现

系统登录后,会在session中记录当前登录用户的信息。

检查用户信息无功/ /用户= _userappservice.checkuser(model.username,模型。密码);如果(用户!= null){ //会议记录(“httpcontext.session.setstring currentUserId”)(用户。id.tostring);HttpContext.Session.Set(“中”,byteconverthelper.object2bytes(用户));//返回RedirectToAction主页跳转到系统(“指数”、“家”)};

由于一个用户可以拥有多个角色,我们需要做的是,根据当前登录用户的Id,得到其拥有的所有角色信息,然后取当前用户所有角色拥有的功能权限求合集,得到的就是当前登录用户所拥有的功能权限信息。

定义应用程序服务接口

在IMenuAppService中定义接口

总结& gt;/ / / / / / & lt;根据用户访问的功能菜单/ / / & lt;/摘要>/ / / & lt;参数名称=“用户名”>ID & lt /参数>用户;/ / / & lt;返回></返回>表& lt;menudto >GetMenusByUser(GUID标识符);

服务接口的实现

在MenuAppService中实现接口

Summary> / / / / / / < according to the user access to the function menu / / / < /summary> / / / < param name= “userId” > ID&lt /param> user; / / / < returns> < /returns> public List< MenuDto> GetMenusByUser (Guid userId) {List&lt = new; MenuDto> result List< MenuDto> () VaR; allMenus = _menuRepository.GetAllList (it=> it.Type = 0) and.OrderBy (it => it.SerialNumber); if (userId = = Guid.Empty) / / super administrator return Mapper.Map< List< MenuDto> > VaR; user (allMenus) = _userRepository.GetWithRoles (userId); if (user = = null) return result VaR; userRoles = user.UserRoles; List< Guid> menuIds = new; List< Guid> foreach (VaR) (role in userRoles) { MenuIds = menuids。联盟(_rolerepository.getallmenulistbyrole(角色。roleid)。ToList(allmenus));} = allmenus。那里(= & gt;menuids。包含(它。ID)。OrderBy(它)= & gt;返回映射。地图&lt;&lt这名单。SerialNumber);menudto &;gt;&gt;(allmenus);}

1动态加载菜单使用viewcomponent

在以前的Asp.net MVC中,我们会经常使用@Html.Action来发起一个ChildAction请求,渲染并得到一个分部视图填充的主功能视图中,以此来实现一些公用的或者是独立的界面区域。在Asp.Net Core中,不在存在将以ViewComponent替代。

你可以将View Component看做是一个mini的Controller——它只负责渲染一小部分内容,而非全部响应,所有分部视图能解决的问题,你都可以使用View Component来解决,比如:动态导航菜单、Tag标签、登录窗口、购物车、最近阅读文章等等。

1 viewcomponent创作

ViewComponent创建非常简单,只需要将我们的类继承自ViewComponent类就行了。每个ViewComponent需要包括一个名称为Invoke的约定方法,你可以在此方法中传入你需要的任何参数,系统也支持InvokeAsync方法实现异步功能,此约定方法为该ViewComponent的最终输出出口。

在Fonour.MVC项目中新建一个名称为“Components”的文件夹,用来存放我们所有的视图组件类,在该文件夹下新建一个名称为NavigationViewComponent的组件。

[ viewcomponent(name=“导航”)公开课navigationviewcomponent ]:viewcomponent只读imenuappservice {私人_menuappservice;私人只读iuserappservice _userappservice;公共navigationviewcomponent(imenuappservice menuappservice,iuserappservice userappservice){ _menuappservice = menuappservice;_userappservice = userappservice;}市民IViewComponentResult Invoke(VAR){用户名= httpcontext.session.getstring(“currentUserId”);var = _menuappservice.getmenusbyuser菜单(guid.parse(用户名));return View(菜单);} }

1.1组件对应视图文件创建

上面实现的约定方法Invoke中,最后Return View(Menus),与我们控制器中Action返回视图的方法很相似。ViewComponent寻找视图也是遵照约定的。他会自动从以下路径去寻找对应的视图文件。

/观点/ [电流] /部件/ [ nameofcomponent ] / default.cshtml /观点/共享/组件/ [ nameofcomponent ] / default.cshtml

对于某个具体功能对应的组件,我们最好按照上面第一种路径规则,把对应的视图文件放在功能对应的Controller下面

对于系统级别的视图组件,比如我们现在要实现的左侧功能导航菜单,建议按照第二种路径规则,放在Views/Shared下面。

在Views/Shared文件夹下新建一个名称为Components的文件夹,然后在该文件夹下创建一个名称为“Navigation”的文件夹,注意这个文件夹名与我们上面定义的组件名称是要保持一直的。

Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载

在“Navigation”文件夹下创建一个名称为Default.cshtml的视图页。内容如下:

@模型列表& lt;fonour。应用。menuapp。DTO。menudto &gt;&lt;李class=“头”& gt;& lt /李&gt;@每个权限管理;(在VAR模型菜单){ var活跃= viewbag.currentmenu = =菜单。代码;//判断激活& lt当前函数;李类=(@活跃吗?”主动”:“>”);& lt;“href =“@menu.url“&gt;&lt;我class=“FA链接& gt”;&lt;/我&gt;&lt;跨度&gt;“菜单”。名称& lt;跨&gt;及lt;/ &gt;&lt;/李&gt;}

该视图接受一个在我们组件类中返回的菜单集合对象,并根据此菜单集合渲染我们需要的菜单。我们根据ViewBag.CurrentMenu是否等于当前菜单的编码,来确定该菜单是否属于激活状态,这样可以实现我们单击某个菜单界面刷新后,该功能菜单处于激活状态。

基于此,我们需要在每个功能页面指定ViewBag.CurrentMenu的值。如用户管理功能,我们在/Views/User/Index.cshtml顶部添加如下代码即可。

“{ viewbag.currentmenu =“用户”;}

当然,如果你觉得这种硬编码的方式你不喜欢,你可以在菜单单击的时候,把当前菜单对应的code值传至服务端,由服务端在返回对应的视图之前,指定ViewBag.CurrentMenu的值即可。

1.2使用viewcomponent

我们修改布局页_Layout.cshtml中菜单加载部分的代码,将写死的功能菜单信息,修改为通过使用ViewComponent根据用户Id动态加载功能菜单。

< UL class= “sidebar-menu” > @await Component.InvokeAsync (“Navigation”); @*&lt Li; class= “treeview” > &lt a; href= > < “#” I class= “Fa fa-link” > < /i> < span> Multilevel< /span> span & lt; class= pull-right-container > < I “class=” Fa fa-angle-left pull-right “> < /i> < /span> < /a> < UL class=” treeview-menu “> < li> < a href= &gt Link in” # “; level 2< /a& gt; < /li> < li> < a href= &gt Link in” # “; level 2< /a> < /li> < /ul> < /li> *@ < /ul>

此时我们使用一个只分配了其中三个菜单权限的账户登录系统,一切按照我们预想的,可以根据当前登录用户动态加载该用户所拥有权限的功能菜单了,而且我们进入某个功能后,页面刷新后已经可以自动把我们进入的功能菜单设置为激活状态了。

Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载

Asp.Net Core 项目实战之权限管理系统(8) 功能菜单的动态加载

2总结

本次主要学习了ViewComponent的使用,实现了功能菜单的动态加载。

最开始是本着自己学习的态度写这个系列的,内容总体来说属于基础入门级的,到现在也算是基本功能都已经实现了,里面有很多不足或不完善的地方,可以根据需要进行调整吧。

从一个孩子的出生到现在,眨眼间3个月了,每天都熬夜了,工作很忙,有的朋友给我留言,我会回复空荡荡的,有的朋友,可能我没有时间去看,也可能在业余时间帮你找到问题,要麻烦你自己多动手练习,请原谅我。

文章从互联网整理而来,旨在传播scrum、软件项目管理、研发项目管理、敏捷开发管理工具的知识与应用,帮助软件开发企业真正了解研发项目管理的价值和意义,如果本文侵犯了您的权益或者您需要具体了解更多国内做研发项目管理系统的公司翼发云敏捷项目管理系统的相关信息,欢迎和我们联络:

【网址】www.effapp.com

2018-02-22T14:47:31+08:002018-02-22 14:47:31|Categories: scrum项目管理|