现在的位置: 首页 > 综合 > 正文

浅谈C# WinForm中实现基于角色的权限菜单

2013年01月06日 ⁄ 综合 ⁄ 共 39961字 ⁄ 字号 评论关闭

浅谈C# WinForm中实现基于角色的权限菜单

作者:CodingMouse            日期:2008年12月14日

转载请注明文章来源:http://blog.csdn.net/CodingMouse/archive/2008/12/14/3515969.aspx

本博文完整源码已经上传,欢迎下载讨论:http://download.csdn.net/source/913308

基于角色的权限菜单功能的实现在有开发经验的程序员看来仅仅是小菜一碟,然而却让许多初学者苦不堪言。为此,我将我近期花了几天时间写的权限菜单写成文字贴上博客给初学者参考。由于自己也是一个正在努力学习的菜鸟,对问题的分析和见解必然不够透彻,还望过路的老师们多多批评为谢!

 

 

一、建立 SQL Server 数据库模型

 1、原始方案
 
  一共设立了五个实体模型:
 
  A、操作员(Operator):存储系统登录用户的名称、密码、启用状态等信息。
  B、权限组(RightsGroup):存储系统权限分组(即:权限角色)的名称等信息。
  C、权限关系(RightsRelation):用于将A项和B项之间的多对多关系拆解成两个一对多关系。
  D、权限列表(RightsList):存储系统菜单项(即:权限项)的标题、内部名称、权限状态等信息。
  E、权限组关系(RightGroupRelation):用于将B项和D项之间的多对多关系拆解成两个一对多关系。
  
  通过上面的描述可以清楚看到,C项和E项仅仅是为了拆解多对多关系而设立,实体关系变得相对复杂了点。稍作考虑便知,既然是使用 C# WinForm + SQL Server 来完成这一功能,则可以考虑使用实体类来模拟数据库模型,并将实体类打包成泛型集合后存储到 SQL Server 数据库的 varBinary(max) 字段。这样便可以将原始方案的数据库模型缩减成三个实体模型,降低了关系的复杂程度。将原始方案稍作修改后即可得到如下改进方案。

 
 2、改进方案
  
  如上所述,改进后的方案仅包含如下三个实体模型:
  
  A、操作员(Operator):存储系统登录用户的名称、密码、启用状态、权限集合等信息。
  B、权限组(RightsGroup):存储系统权限分组(即:权限角色)的名称、权限集合等信息。
  C、权限关系(RightsRelation):用于将A项和B项之间的多对多关系拆解成两个一对多关系。
  
  很容易看出,仅将原始方案的 E 项更改为 A项和 B 项的字段,即可将实体关系复杂度降低 40%。现在我们来看看改进方案的 SQL Server 数据库实现脚本代码:

   

   
   
二、建立实体类

 建立了 SQL Server 数据库模型之后,我们开始建立实体类来作为权限管理的数据传输载体。
 
 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#源码清单: