WPF权限实例讲解
权限顾名思义就是某人做某事的权利;在家里,在社会,以及国际间也同样纯在权限的限制。而我们做某些管理系统项目时就需要用到权限了,通过给角色,用户赋予或禁用对某些项目某块进行操作的权限;那么它具体是怎么实现的呢,主要有后台和数据库控制。本实例是用WPF的三层架构(DAL,BLL,WPF窗体程序项目)来做的,DAL是连接数据库的并定义连接操作数据库方法的层,知道在BLL如何调用DAL的方法即可;在BLL我们写的是通过传参数获取数据库存储过程具体的方法,在这里就不多做解释了
1、 首先在数据库建好权限某块表,用户表,用户角色表三张最基本的表,表如下
具体流程就是 用户角色功能模块(权限) 意思是角色拥有一定的权限,把角色赋予用户,用户同样也就拥有了对应的权限,个人的表达能力不好,看各位自己理解了。
2、写存储过程;因为我这里的是WPF的应用程序,所以查询语句就在数据库的存储过程中编写了。
首先声明需要的参数接收项目后台传来的数据,然后编写一个验证登录的查询语句,并且连表查询出用户对应的角色的权限(所能管理的模块);再查询不能操作的模块,并把模块组拆分成单个模块ID
2、 写权限维护的存储过程代码;
查询角色模块组信息和角色拥有所有模的ID
3、 数据库存储过程写完了,我们就去项目的BLL层写我们的逻辑代码,验证登录、查询模块权限信息等
namespace BLL
{
[ServiceContract]
public class US_LimitsOfPower
{
DAL.DALMethod myDALMethod = new DAL.DALMethod();
//1.0查询操作信息(菜单)
[OperationContract]
public DataSet Select_User_ByUseAndPwd(string strName,string strPwd)
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
new SqlParameter ("@user_name",SqlDbType.Char), new SqlParameter ("@user_pwd",SqlDbType.Char),
};
SQLCMDpas[0].Value = "Select_User_ByUseAndPwd";
SQLCMDpas[1].Value = strName;
SQLCMDpas[2].Value = strPwd;
DataSet myDataSet = myDALMethod.QueryDataSet("US_LimitsOfPower", SQLCMDpas);
return myDataSet;
}
//1.1查询权限组表
[OperationContract]
public DataSet Select_User_group()
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
};
SQLCMDpas[0].Value = "Select_User_group";
DataSet myDataSet = myDALMethod.QueryDataSet("US_LimitsOfPower", SQLCMDpas);
return myDataSet;
}
//1.2查询权限组表
[OperationContract]
public DataSet Select_FunctionByGroupPower(string strGroupPower)
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
new SqlParameter ("@group_power",SqlDbType.Char),
};
SQLCMDpas[0].Value = "Select_FunctionByGroupPower";
SQLCMDpas[1].Value = strGroupPower;
DataSet myDataSet = myDALMethod.QueryDataSet("US_LimitsOfPower", SQLCMDpas);
return myDataSet;
}
//1.3查询权限组表
[OperationContract]
public DataSet Select_AllFunction()
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
};
SQLCMDpas[0].Value = "Select_AllFunction";
DataSet myDataSet = myDALMethod.QueryDataSet("US_LimitsOfPower", SQLCMDpas);
return myDataSet;
}
//1.4新增权限组
[OperationContract]
public int Insert_UserGroup(string strGroupName, string strGroupPower)
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
new SqlParameter ("@group_name",SqlDbType.Char),
new SqlParameter ("@group_power",SqlDbType.Char),
};
SQLCMDpas[0].Value = "Insert_UserGroup";
SQLCMDpas[1].Value = strGroupName;
SQLCMDpas[2].Value = strGroupPower;
int count = myDALMethod.UpdateData("US_LimitsOfPower", SQLCMDpas);
return count;
}
//1.5修改权限组
[OperationContract]
public int Update_UserGroup(string strGroupName, string strGroupPower,int intGroupId)
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
new SqlParameter ("@group_name",SqlDbType.Char),
new SqlParameter ("@group_power",SqlDbType.Char),
new SqlParameter ("@group_id",SqlDbType.Int),
};
SQLCMDpas[0].Value = "Update_UserGroup";
SQLCMDpas[1].Value = strGroupName;
SQLCMDpas[2].Value = strGroupPower;
SQLCMDpas[3].Value = intGroupId;
int count = myDALMethod.UpdateData("US_LimitsOfPower", SQLCMDpas);
return count;
}
//1.6删除权限组
[OperationContract]
public int Delete_UserGroup(int intGroupId)
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
new SqlParameter ("@group_id",SqlDbType.Int),
};
SQLCMDpas[0].Value = "Delete_UserGroup";
SQLCMDpas[1].Value = intGroupId;
int count = myDALMethod.UpdateData("US_LimitsOfPower", SQLCMDpas);
return count;
}
//1.7查询不能操作的菜单功能
[OperationContract]
public DataSet Select_FunctionNotInUserGroup(string strGroupPower)
{
SqlParameter[] SQLCMDpas ={
new SqlParameter ("@Type",SqlDbType.Char),
new SqlParameter ("@group_power",SqlDbType.Char),
};
SQLCMDpas[0].Value = "Select_FunctionNotInUserGroup";
SQLCMDpas[1].Value = strGroupPower;
DataSet myDataSet = myDALMethod.QueryDataSet("US_LimitsOfPower", SQLCMDpas);
return myDataSet;
}
}
}
4、 WPF的页面代码;页面则需要设置对应的矢量按钮来实现操作对应的模块,如图:
这只是一部分矢量按钮,具体操作思路就是数据库查询出来的模块代码来控制页面的控件显示隐藏;
5、 登录页面后台代码,验证登录并查询该用户对应角色的权限,并传到主页面;
主页面加载通过权限控制具体控件显示隐藏
//页面加载事件
private void Main_Loaded(object sender, RoutedEventArgs e)
{
//权限调用
LimitsOfPower();//权限调用
}
#region 权限应用(菜单的显示和隐藏)
private void LimitsOfPower()
{
//显示的菜单
DataTable dtYes = myLimitsOfPower.Select_FunctionByGroupPower(strGroupPowerV).Tables[0];
//不能显示的菜单
DataTable dtNo= myLimitsOfPower.Select_FunctionNotInUserGroup(strGroupPowerV).Tables[0];
//循环遍历每个可显示的菜单控制菜单显示
for (int i = 0; i < dtYes.Rows.Count; i++)
{
//调用方法获取按钮
CalendarButton dtn = LoadButton(dtYes.Rows[i]["f_name"].ToString());
//控制菜单按钮显示
dtn.Visibility = Visibility.Visible;
}
//循环遍历每个不可显示的菜单控制隐藏
for (int i = 0; i < dtNo.Rows.Count; i++)
{
//调用方法获取按钮
CalendarButton dtn = LoadButton(dtNo.Rows[i]["f_name"].ToString());
//控制菜单按钮隐藏
dtn.Visibility = Visibility.Collapsed;
}
}
#endregion
#region 权限封装
private Hashtable _Sfz = new Hashtable();//创建哈希表封装菜单(按钮)模块
private void LoadSfzHashTable()
{
_Sfz.Add("btnUpdatePassword", btnUpdatePassword);
_Sfz.Add("btnStaffInformation", btnStaffInformation);
_Sfz.Add("btnTravellerInformation", btnTravellerInformation);
_Sfz.Add("btnStaffAccountManage", btnStaffAccountManage);
_Sfz.Add("btnPowerManage", btnPowerManage);
_Sfz.Add("btnSystemOperateLog", btnSystemOperateLog);
_Sfz.Add("btnCreateLine", btnCreateLine);
_Sfz.Add("btnStationManage", btnStationManage);
_Sfz.Add("btnCompartment", btnCompartment);
_Sfz.Add("btnCarOrder", btnCarOrder);
_Sfz.Add("btnTicket", btnTicket);
_Sfz.Add("btnTicketDetails", btnTicketDetails);
_Sfz.Add("btnTicketPrice", btnTicketPrice);
_Sfz.Add("btnSaleStatistics", btnSaleStatistics);
_Sfz.Add("btnSitePeopleStream", btnSitePeopleStream);
_Sfz.Add("btnWebShopTicketNumber", btnWebShopTicketNumber);
}
// 根据编号获得按钮
public CalendarButton LoadButton(string strName)
{
//判断数据是否为空
if (strName.Length != 0)
{
//判断哈希表是否有数据,没有就执行LoadSfzHashTable() 插入数据
if (_Sfz.Count == 0) LoadSfzHashTable();
//实例化矢量按钮,把查询出来的菜单按钮转换为矢量按钮
CalendarButton btn = _Sfz[strName] as CalendarButton;
if (btn == null) return null;
//返回按钮
return btn;
}
return null;
}
具体流程思路上面有注释就不一一解释了,其实不管审核类型的项目权限的思路基本都是这样的,Web类型的项目就是通过控制链接(URL)的显示。