浅谈C.docx
- 文档编号:29944650
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:14
- 大小:1.41MB
浅谈C.docx
《浅谈C.docx》由会员分享,可在线阅读,更多相关《浅谈C.docx(14页珍藏版)》请在冰豆网上搜索。
浅谈C
浅谈C#WinForm中实现基于角色的权限菜单
基于角色的权限菜单功能的实现在有开发经验的程序员看来仅仅是小菜一碟,然而却让许多初学者苦不堪言。
为此,我将我近期花了几天时间写的权限菜单写成文字贴上博客给初学者参考。
由于自己也是一个正在努力学习的菜鸟,对问题的分析和见解必然不够透彻,还望过路的老师们多多批评为谢!
一、建立SQLServer数据库模型
1、原始方案
一共设立了五个实体模型:
A、操作员(Operator):
存储系统登录用户的名称、密码、启用状态等信息。
B、权限组(RightsGroup):
存储系统权限分组(即:
权限角色)的名称等信息。
C、权限关系(RightsRelation):
用于将A项和B项之间的多对多关系拆解成两个一对多关系。
D、权限列表(RightsList):
存储系统菜单项(即:
权限项)的标题、内部名称、权限状态等信息。
E、权限组关系(RightGroupRelation):
用于将B项和D项之间的多对多关系拆解成两个一对多关系。
通过上面的描述可以清楚看到,C项和E项仅仅是为了拆解多对多关系而设立,实体关系变得相对复杂了点。
稍作考虑便知,既然是使用C#WinForm+SQLServer来完成这一功能,则可以考虑使用实体类来模拟数据库模型,并将实体类打包成泛型集合后存储到SQLServer数据库的varBinary(max)字段。
这样便可以将原始方案的数据库模型缩减成三个实体模型,降低了关系的复杂程度。
将原始方案稍作修改后即可得到如下改进方案。
2、改进方案
如上所述,改进后的方案仅包含如下三个实体模型:
A、操作员(Operator):
存储系统登录用户的名称、密码、启用状态、权限集合等信息。
B、权限组(RightsGroup):
存储系统权限分组(即:
权限角色)的名称、权限集合等信息。
C、权限关系(RightsRelation):
用于将A项和B项之间的多对多关系拆解成两个一对多关系。
很容易看出,仅将原始方案的E项更改为A项和B项的字段,即可将实体关系复杂度降低40%。
现在我们来看看改进方案的SQLServer数据库实现脚本代码:
二、建立实体类
建立了SQLServer数据库模型之后,我们开始建立实体类来作为权限管理的数据传输载体。
1、实体模型基类(ModelBase)
C#源码清单:
2、操作员实体类(Operator)
C#源码清单:
3、权限组实体类(RightsGroup)
C#源码清单:
4、权限关系实体类(RightsRelation)
C#源码清单:
三、具体代码实现
采用多层开发模式有助于降低耦合度,便于程序维护。
所以,我们的本文的具体代码实现也使用了多层开发模式。
限于篇幅,只列举出具体的代码实现类源码。
同时,也是由于本文并不是讲解多层开发的文章,所以对于完成本文的主题功能所涉及的简单工厂、抽象工厂、接口定义、数据库访问等类的源码就不再一一罗列。
(一)数据访问层
1、操作员数据访问操作类(OperatorService)
C#源码清单:
2、权限组数据访问操作类(RightsGroupService)
C#源码清单:
3、权限关系数据访问操作类(RightsRelationService)
C#源码清单:
(二)业务逻辑层(在本文中仅仅起到一个数据传递者的作用)
1、操作员数据访问操作类(OperatorManager)
C#源代码清单
2、权限组数据访问操作类(RightsGroupManager)
C#源码清单:
3、权限关系数据访问操作类(RightsRelationManager)
C#源码清单:
(三)界面表示层(由于界面操作逻辑的复杂度较高,在此仅列出部分难点代码)
1、权限菜单数据管理类(RightsMenuDataManager)
C#源码清单:
2、权限菜单界面管理类(RightsMenuUIManager)
C#源码清单:
四、文章结语
以上内容并未提供完整的源代码演示,仅仅提供一种解决此类问题的思路和方法。
(一)技术难点
1、将集合对象存储到数据库中(先使用序列化将集合对象流化,再将其转换为Byte[]数组);
2、使用递归法解析菜单对象及应用权限菜单项的权限设置(注意MenuStrip对象的第一层级的子项集合为Items,其余均为DropDownItems,所以在递归解析或应用设置时只能从第二层级的子项开始进行递归调用);
3、BindingSource界面数据绑定对象与DataGridView数据视图控件的配合使用(注意在绑定Dictionary
4、TreeView树形视图控件的使用(注意在增删树节点时应适当使用BeginUpdate()和EndUpdate()方法来防止闪屏问题);
5、隶属于多个权限组的操作员权限应为其所从属的多个权限组权限的并集(不算难,遍历一下集合即可)。
(二)扩展思考
此外,我所阐述的这种解决方案还可以再扩展一些人性化的功能。
譬如本文没提及的一些人性化功能:
1、让管理员用户完全自定义各个操作员的权限菜单标题(我已在自己的项目扩展此功能);
2、让权限菜单项在禁用时同时将该项的Enabled属性设置为False,以防止被隐藏的菜单项被快捷键呼出(太简单了,读者自己在上面的代码中添加少量代码即可实现)。
3、让管理员自由选择使用基于用户或基于角色的权限管理方案(由于在操作员和权限组两个实体模型中都各自存储了自身的权限集合,所以,在这种相对松散的权限关系下,很容易实现此功能,此功能我也已在自己的项目中实现)。
附上我的截图:
本博文完整源码已经上传,欢迎下载讨论:
修改痕迹:
1、2009年9月25日,重新将代码内容重新插入,套用上CSDN博客的代码样式。
由于2008年发这个博文时的代码样式跟CSDN现在所用的代码样式套用方式不一致,导致代码内容不能正常语法着色,所以重新调整一下,便于阅读。
2008年12月14日
ByCodingMouse
发表于@2008年12月14日 21:
27:
00 |评论(loading...)|编辑|举报|收藏
旧一篇:
各类排序算法java的实现 | 新一篇:
打造自己的C#WinForm应用程序的SQLServer连接配置界面
查看最新精华文章请访问博客首页相关文章
∙发表评论
∙表情:
∙
∙评论内容:
∙
∙用户名:
∙登录注册
匿名评论
∙验证码:
∙
重新获得验证码
∙
∙
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 浅谈