循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配
在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,本篇随笔介绍在WPF应用端中实现系统动态菜单的配置和权限分配。
1、系统菜单的管理
为了能够动态的加载应用系统的菜单,我们需要在数据库中存储对应的菜单信息,配置好后进行权限分配即可。
菜单的管理界面如下所示,左侧是一个菜单的树形列表,用来指引选择或者查询特定的菜单,右侧列表列出菜单的相关信息,以及提供新增、编辑、导入、导出、删除等操作入口。

由于菜单的信息,是会在系统中打开指定的页面的,因此需要配置一个供反射方式读取的页面对象,如下所示。

这个WPF窗体类型,也是类似Winform端,用于打开WInform窗体的对象全名,这个是WPF页面的全名,用于我们能够在反射处理中迅速定位到具体的类型,然后打开页面使用的。
系统具体的菜单展示效果如下所示。

单击打开系统菜单项目的时候,会根据相关的设置反射对应的WPF页面类,如下代码所示。
string filePath = Assembly.GetExecutingAssembly().GetName().Name;//默认为当前程序集
string dllFullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath); var tempAssembly = Assembly.LoadFrom(dllFullPath);
if (tempAssembly != null)
{
//wpfTypeName = 我们配置的反射类名称
Type objType = tempAssembly.GetType(wpfTypeName);
return objType;
}
另外图标的选择,也是根据系统的需要进行选择的。

创建一个图标选择的页面,如下所示,供系统图标选择使用。

2、分配角色权限
完成菜单的信息录入后,我们需要对菜单的访问权限进行设置,根据角色分配权限是最广泛使用的方式,如下界面所示。

角色包含的菜单,用户登录系统后,根据用户的角色身份获取对应的菜单即可,然后在系统中进行展示即可。
如系统根据身份信息,动态获取服务端的菜单如下所示。
/// <summary>
/// 获取远程的菜单列表
/// </summary>
/// <returns></returns>
public async Task GetRemoteMenus()
{
//配置使用动态菜单
if (this.UseRemoteMenus)
{
var menuList = await BLLFactory<IMenuService>.Instance.GetMenuNodesByUser(this.UserInfo.Id, this.SystemType);
if (menuList.Count == 0) return; this.NavigationItems.Clear(); var menuItems = AddMenuItem(menuList);
foreach (var item in menuItems)
{
this.NavigationItems.Add(item);
}
}
}
由于程序主窗口里面绑定的菜单信息,如下代码所示。
<ui:NavigationView
x:Name="RootNavigation"
Grid.Row="1"
Padding="20,0,42,0"
BreadcrumbBar="{Binding ElementName=BreadcrumbBar}"
FooterMenuItemsSource="{Binding ViewModel.NavigationFooter, Mode=OneWay}"
IsBackButtonVisible="Visible"
IsPaneToggleVisible="True"
MenuItemsSource="{Binding ViewModel.NavigationItems, Mode=OneWay}"
Navigated="RootNavigation_Navigated"
OpenPaneLength="210"
PaneClosed="NavigationView_OnPaneClosed"
PaneDisplayMode="Left"
PaneOpened="NavigationView_OnPaneOpened"
SelectionChanged="OnNavigationSelectionChanged">
因此系统菜单就可以正常的更新为动态配置的菜单信息了。
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系统动态菜单的配置和权限分配的更多相关文章
- 基于SqlSugar的开发框架循序渐进介绍(3)-- 实现代码生成工具Database2Sharp的整合开发
我喜欢在一个项目开发模式成熟的时候,使用代码生成工具Database2Sharp来配套相关的代码生成,对于我介绍的基于SqlSugar的开发框架,从整体架构确定下来后,我就着手为它们量身定做相关的代码 ...
- 推荐一个基于Vue2.0的的一款移动端开发的UI框架,特别好用。。。
一丶YDUI 一只注重审美,且性能高效的移动端&微信UI. 下面为地址自己研究去吧! 我的项目正在用,以前用的Mint-ui但是现在感觉还是这个好一点,官方给出的解释很清楚,很实用. 官方地址 ...
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
- 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转
在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...
- 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口
在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...
- 基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录
在我们对数据进行重要修改调整的时候,往往需要跟踪记录好用户操作日志.一般来说,如对重要表记录的插入.修改.删除都需要记录下来,由于用户操作日志会带来一定的额外消耗,因此我们通过配置的方式来决定记录那些 ...
- 基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理
在早期的随笔就介绍过,把常规页面的内容拆分为几个不同的组件,如普通的页面,包括列表查询.详细资料查看.新增资料.编辑资料.导入资料等页面场景,这些内容相对比较独立,而有一定的代码量,本篇随笔介绍基于V ...
- 基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
在我们实际项目开发过程中,往往需要根据实际情况,对组件进行封装,以更简便的在界面代码中使用,在实际的前端应用中,适当的组件封装,可以减少很多重复的界面代码,并且能够非常简便的使用,本篇随笔介绍基于El ...
- 基于SqlSugar的开发框架循序渐进介绍(14)-- 基于Vue3+TypeScript的全局对象的注入和使用
刚完成一些前端项目的开发,腾出精力来总结一些前端开发的技术点,以及继续完善基于SqlSugar的开发框架循序渐进介绍的系列文章,本篇随笔主要介绍一下基于Vue3+TypeScript的全局对象的注入和 ...
- 基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理
在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间 ...
随机推荐
- String s=new String(“hello”)的执行过程
一. 介绍 String 是Java.long包下的String类,是一个特殊的引用类型,用于表示字符串.它提供了许多方法来操作和处理字符串,比如连接.截取.查找.替换等.String类内部使用字符数 ...
- 【Spring】@RequestBody的实现原理
@RequestBody注解可以用于POST请求接收请求体中的参数,使用方式如下: @Controller public class IndexController { @PostMapping(va ...
- 【MAUI Blazor踩坑日记】4.只在特定平台上引用包
其实这个并不是MAUI特有的问题,只是在MAUI中可能会遇到. 例如某个包只在Windows上有用,但打包的时候,安卓.ios也会把这个包计算在内 所以需要在不是特定平台时把它排除. 万幸从微软文档找 ...
- linux 问题: ssh登录报错,ssh_exchange_identification,多次几次可以登录
分析 怀疑是句柄数不够,和ssh的最大登录限制 确认 2.1 确认句柄数 过程: ~# systemctl status sshd | grep -i pid Main PID: 3767395 (s ...
- Angular:修改启动端口号
目标 修改预先设定的4200端口号,改为4100 解决方案 在启动命令中添加 --port 4100.参数 --open,会在启动时自动打开浏览器. ng serve --open --port 41 ...
- 代码随想录算法训练营第八天| LeetCode 344.反转字符串 541. 反转字符串II 151.翻转字符串里的单词
344.反转字符串 卡哥建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数 题目链接/文章讲解/视频讲解:https: ...
- [glibc2.23源码]阅读源码&调试,找出free_hook-0x13分配失败的原因
0x00 写在前面 发freebuf了:https://www.freebuf.com/articles/endpoint/373258.html 本次阅读源码是本人第一次,算是一个全新的开始.本次看 ...
- .Net AsyncLocal介绍
AsyncLocal的基本概念 AsyncLocal是一个在异步环境中存储和传递状态的类型.它允许你在线程或任务之间共享数据,而不会受到异步上下文切换的影响. 每一个异步的AsyncLocal的数据都 ...
- 微服务集成redis并通过redis实现排行榜的功能
默认你已经看过我之前的教程了,并且拥有上个教程完成的项目, 之前的教程 https://www.cnblogs.com/leafstar/p/17638933.html 由于redis的安装网上教程很 ...
- .NET API 中的 FromRoute、FromQuery、FromBody 用法
原文链接:https://www.cnblogs.com/ysmc/p/17663663.html 最近技术交流群里,还有不少小伙伴不知道 FromRoute.FromQuery.FromBody 这 ...