博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】Winform开发框架之权限管理系统
阅读量:6701 次
发布时间:2019-06-25

本文共 4806 字,大约阅读时间需要 16 分钟。

在前一篇随笔《》中介绍过我Winform开发框架的总体情况,其中最重要的思路就是把常用的模块封装成控件进行重复使用,一则可以避免重复开发,提高开发效率;二则可以使用成熟的控件及技术,使得用户体验更好,更加专业。在前面介绍过的Winfrom开发框架总体思路如下所示。

 在Winform框架中,其中权限管理系统、字典管理系统,都是可以做成独立的程序来使用,而且应该可以在程序中引用来查询或者获取相关的字典数据,如找某个键值的字典列表作为下拉列表,而且由于实际项目中,有的是SqlServer、有的是Access数据库的或者其他数据库,所以支持多数据库是最好的选择。 

本篇主要介绍经过优化完善的权限管理系统, 其既独立又具整合性的权限管理系统,既相互独立,有相互整合,方便重用,又不需重新开发,非常方便、更提高效率。 由于权限系统精简而又能满足日常绝大多数的需要,不会复杂的难于管理,而且也是基于角色的授权访问机制(RBAC),最重要是非常适合软件的整合使用。

权限管理系统作为一个独立的模块,其主要由登陆界面、权限管理主界面(管理用户、角色、机构、功能,以及控制角色的权限等操作功能,部分界面如下所示。 

 

 

给用户分配权限,首先是给相应角色授权,角色授权功能如下所示,可以编辑角色使用的功能,也可以管理该角色包含的用户,从而实现间接实现给用户分配权限的功能(这也是基于业界通用的基于角色的访问控制(RBAC)的控制法则)。

  

经过优化后的权限管理系统,界面及业务逻辑封装到一个类库中,我们开发的业务管理系统中集成就很简单了,主要的项目工程界面如下所示:

 

我编写了一个测试工程,用来模拟业务系统中调用权限管理模块的例子,界面如下所示:

 

相关的代码很简单,这也是利用权限管理系统后简化很多代码的根本所在:

         private void Form1_Load(object sender, EventArgs e)
        {
            
//
获取所有权限管理系统的用户,并在下拉列表中展示
            List
<
UserInfo
>
 userList 
=
 BLLFactory
<
User
>
.Instance.GetAll();
            
this
.txtLogin.Items.Clear();
            
foreach
 (UserInfo info 
in
 userList)
            {
                
this
.txtLogin.Items.Add(info.Name);
            }
        }
        
private
 
void
 btnSecurity_Click(
object
 sender, EventArgs e)
        {
            
//
独立启动权限管理系统,只需一行代码即可
            WHC.Security.UI.Portal.StartLogin();
        }

 

当然,如果要判断用户的登录及角色等,可以通过下面代码来实现。

                         //判断用户是否登录成功
 
               
string
 identity 
=
 BLLFactory
<
User
>
.Instance.VerifyUser(
this
.txtLogin.Text, 
this
.txtPassword.Text, Guid.NewGuid().ToString());
                
if
 (
!
string
.IsNullOrEmpty(identity))
                {
                    
//
进一步判断用户角色
                    
if
 (BLLFactory
<
User
>
.Instance.UserInRole(
this
.txtLogin.Text, 
"
管理员
"
))
                    {
                        MessageUtil.ShowTips(
string
.Format(
"
用户【{0}】身份验证正确
"
this
.txtLogin.Text));
                    }
                    
else
                    {
                        MessageUtil.ShowWarning(
"
该用户没有管理员权限
"
);
                        
return
;
                    }
                }
                
else
                {
                    MessageUtil.ShowWarning(
"
用户名或密码错误
"
);
                    
return
;
                }

 

权限控制的精髓就是,用户登录后,通过把用户拥有的权限获取出来,放到一个功能列表中,然后在每一个窗体中,根据用户的功能列表,显示或者屏蔽对应的功能即可,获取功能列表代码如下所示:

                   UserInfo info 
=
 userBLL.GetUserByName(loginName);
                    
#region
 获取用户的功能列表
                    Function functionBLL 
=
 
new
 Function();
                    List
<
FunctionInfo
>
 list 
=
 functionBLL.GetFunctionsByUser(info.ID, 
"
WareMis
"
);
                    
if
 (list 
!=
 
null
 
&&
 list.Count 
>
 
0
)
                    {
                        
foreach
 (FunctionInfo functionInfo 
in
 list)
                        {
                            
if
 (
!
Portal.gc.FunctionDict.ContainsKey(functionInfo.ControlID))
                            {
                                Portal.gc.FunctionDict.Add(functionInfo.ControlID, functionInfo);
                            }
                        }
                    }
                    #endregion 

 

 判断的时候,放在一个函数,判断用户访问的功能是否在列表中即可,代码如下所示

        /// <summary> 
       
///
 看用户是否具有某个功能
        
///
 
</summary>
        
///
 
<param name="controlID"></param>
        
///
 
<returns></returns>
        
public
 
bool
 HasFunction(
string
 controlID)
        {
            
bool
 result 
=
 
false
;
            
if
 (FunctionDict.ContainsKey(controlID))
            {
                result 
=
 
true
;
            }
            
return
 result;
        }

 

那么控制用户显示的界面代码如下所示:

             
#region
 KTV包间管理
            
if
 (Portal.gc.HasFunction(
"
KTV
"
))
            {
                OutlookBarBand myBasicBand 
=
 
new
 OutlookBarBand(
"
KTV包间管理
"
);
                myBasicBand.SmallImageList 
=
 
this
.imageList;
                myBasicBand.LargeImageList 
=
 
this
.imageList;
                
if
 (Portal.gc.HasFunction(
"
KTV/View
"
))
                {
                    myBasicBand.Items.Add(
new
 OutlookBarItem(
"
KTV包间状态视图
"
0
));
                }
                
if
 (Portal.gc.HasFunction(
"
KTV/Setting
"
))
                {
                    myBasicBand.Items.Add(
new
 OutlookBarItem(
"
KTV包间设置
"
1
));
                }
                
if
 (Portal.gc.HasFunction(
"
KTV/Goods
"
))
                {
                    myBasicBand.Items.Add(
new
 OutlookBarItem(
"
KTV商品设置
"
3
));
                }
                
if
 (Portal.gc.HasFunction(
"
KTV/Waiter
"
))
                {
                    myBasicBand.Items.Add(
new
 OutlookBarItem(
"
KTV服务生管理
"
4
));
                }
                
if
 (Portal.gc.HasFunction(
"
KTV/BookIn
"
))
                {
                    myBasicBand.Items.Add(
new
 OutlookBarItem(
"
KTV预订管理
"
5
));
                }
                
if
 (Portal.gc.HasFunction(
"
KTV/OtherIncome
"
))
                {
                    myBasicBand.Items.Add(
new
 OutlookBarItem(
"
KTV其他款项登记
"
6
));
                }
                myBasicBand.Background 
=
 SystemColors.AppWorkspace;
                myBasicBand.TextColor 
=
 Color.White;
                outlookBar1.Bands.Add(myBasicBand);
            }
            
#endregion

   判断菜单或者功能按钮,也只需要判断某功能点是否在已有集合中即可,如下所示:

         /// <summary>
        
///
 根据权限屏蔽功能
        
/// 
</summary>
        
private 
void
 InitAuthorizedUI()
        {
            
this
.tool_Report.Enabled 
=
 Portal.gc.HasFunction(
"
Report
"
);
            
this
.tool_Dict.Enabled
=
 Portal.gc.HasFunction(
"
Dictionary
"
);
            
this
.tool_ItemDetail.Enabled 
=
 Portal.gc.HasFunction(
"
ItemDetail
"
);
            
this
.tool_Purchase.Enabled 
=
 Portal.gc.HasFunction(
"
Purchase
"
);
            
this
.tool_StockSearch.Enabled 
=
 Portal.gc.HasFunction(
"
StockSearch
"
);
            
this
.tool_TakeOut.Enabled 
=
 Portal.gc.HasFunction(
"
TakeOut
"
);
            
this
.menu_WareHouse.Enabled 
=
 Portal.gc.HasFunction(
"
WareHouse
"
);
            
this
.menu_Dictionary.Enabled 
=
 Portal.gc.HasFunction(
"
Dictionary
"
);
            
this
.menu_run_systemLog.Enabled 
=
 Portal.gc.HasFunction(
"
LoginLog
"
);
            
this
.menu_Parameters.Enabled 
=
 Portal.gc.HasFunction(
"
Parameters
"
);
            
this
.menu_MonthlyStatistic.Enabled 
=
 Portal.gc.HasFunction(
"
MonthlyStatistic
"
);
            
this
.menu_AnnualStatistic.Enabled 
=
 Portal.gc.HasFunction(
"
AnnualStatistic
"
);
            
this
.menu_ClearAll.Enabled 
=
 Portal.gc.HasFunction(
"
ClearAllData
"
);
            
this
.menu_ImportItemDetail.Enabled 
=
 Portal.gc.HasFunction(
"
ImportItemDetail
"
);
        }
 

至此,权限管理模块介绍已经完毕,下面给出一个调用例子Demo程序给大家参考学习,下载地址如下:

  

 

前一篇文件的字典组件模块调用例子Demo程序下载地址也一并提供下载,下载地址如下:

 

转载于:https://www.cnblogs.com/fx2008/archive/2011/12/09/2281948.html

你可能感兴趣的文章
【计算机视觉】OpenCV篇(3) - 图像几何变换(仿射变换/透视变换)
查看>>
条件渲染vue
查看>>
数据库不完全恢复 以及恢复到测试环境:
查看>>
day 05 多行输出与多行注释、字符串的格式化输出、预设创建者和日期
查看>>
nodejs 实现文件拷贝
查看>>
laravel框架——composer导入laravel
查看>>
c# 扩展方法奇思妙用高级篇五:ToString(string format) 扩展
查看>>
MyEclipse/Eclipse 中使用javap
查看>>
docker registry v2与harbor的搭建
查看>>
求二叉树的高度
查看>>
TCP三次握手及四次挥手详细图解(转)
查看>>
数据结构02-链表
查看>>
UWP学习记录
查看>>
Matrix Computations 1
查看>>
C#中几种数据库的大数据批量插入
查看>>
[flask]gunicorn配置文件
查看>>
牵丝戏
查看>>
OC-封装、继承、多态
查看>>
改需求
查看>>
linq中let关键字学习
查看>>