C 实现基于角色的权限系统

本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1068

实例使用C# 实现基于角色的权限菜单管理系统, 管理员可以添加用户,删除用户, 添加分组,删除分组, 添加角色,删除角色,为角色关联权限等功能, 管理员用户自定义各个操作员的权限菜单标题

项目对应的实例代码可以通过右侧【下载实例】按钮获取

开发工具: VS2012 数据库: SQLServer

【项目包含内容】(见下图):

【实例代码】

【DBScript】 脚本

【WinForm中实现基于角色的权限菜单详解.txt】 代码详解

C 实现基于角色的权限系统

【实例简介】

C# WinForm中实现基于角色的权限菜单的完整源码,数据库脚本在DBscript目录下,在sql server 依次执行如下脚本即可

C 实现基于角色的权限系统

执行完毕后 修改下 app.config中的数据库连接串 为你本机的即可

【实例截图】

下面为管理员登陆后的效果

管理员账号:admin

密码:666666

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

C 实现基于角色的权限系统

下面为普通用户登陆后的效果:

普通用户名:user 密码 111111

C 实现基于角色的权限系统

C 实现基于角色的权限系统

【核心代码】

/// <summary>
/// 根据操作员名称和密码获取操作员实体
/// </summary>
/// <param name="name">操作员名称</param>
/// <param name="pwd">操作员密码</param>
/// <returns>操作员实体</returns>
public  Model.Operator GetOperatorInfoByName(string name, string pwd)
{
//SQL命令
string sqltxt = string.Format( "Select Id, OperatorName, Password, RightsList, State From Operator Where OperatorName = '{0}' And Password = '{1}'" , name, pwd);
//创建操作员实体
Model.Operator tmpOperator =  new  Model.Operator();
// 转换数据库存储的 二进制数据为 Byte[] 数组 以便进而转换为操作员权限集合
// 从配置文件读取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[ "SQLSERVER" ].ConnectionString;
// 执行 SQL 命令
using (SqlConnection conn =  new  SqlConnection(connectionString))
{
SqlCommand cmd =  new  SqlCommand(sqltxt, conn);
conn.Open();
using (SqlDataReader myReader = cmd.ExecuteReader(
CommandBehavior.CloseConnection |
CommandBehavior.SingleResult |
CommandBehavior.SingleRow))
{
if  (myReader.Read())
{
//将数据集转换成实体集合
tmpOperator.Id = Convert.ToInt32(myReader[ "Id" ]);
tmpOperator.ModelName = Convert.ToString(myReader[ "OperatorName" ]);
tmpOperator.Password = Convert.ToString(myReader[ "Password" ]);
tmpOperator.State = Convert.ToBoolean(myReader[ "State" ]);
// 读取权限集合
System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes( 3 );  // 只能指定列序号
// 将流反序列化为权限集合对象
BinaryFormatter bf =  new  BinaryFormatter();
if  (!bytes.IsNull)
tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string, Model.Rights>);
//else
// throw new Exception(string.Format("操作员 [{0}] 没有任何权限,禁止登录!", tmpOperator.ModelName));
}
else
//如果没有读取到内容则抛出异常
throw  new  Exception( "登录名称或用户密码不正确!" );
}
}
// 如果操作员已经被禁用
if  (!tmpOperator.State)
throw  new  Exception(string.Format( "操作员 [{0}] 已被禁用,请与管理员联系!" , tmpOperator.ModelName));
// 返回结果
return  tmpOperator;
}
/// <summary>
/// 添加操作员
/// </summary>
/// <param name="addOperator">要添加的操作员实体</param>
/// <returns>True:成功/False:失败</returns>
public  bool AddOperator(Model.Operator addOperator)
{
// 验证密码长度
if  (addOperator.Password.Trim().Length <  6 )
throw  new  Exception( "用户密码长度不能小于六位!" );
// 转换操作员权限集合为数据库可存取的 Byte[] 数组
MemoryStream ms =  new  MemoryStream();
BinaryFormatter bf =  new  BinaryFormatter();
bf.Serialize(ms, addOperator.RightsCollection);
byte [] rigthsByteArray =  new  byte [( int )(ms.Length)];
ms.Position =  0 ;
ms.Read(rigthsByteArray,  0 , ( int )(ms.Length));
ms.Close();
// 拼接 SQL 命令
string sqlTxt =  "Insert Into Operator (OperatorName, Password, RightsList, State) Values "
"(@OperatorName, @Password, @RightsList, @State)" ;
// 从配置文件读取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[ "SQLSERVER" ].ConnectionString;
// 执行 SQL 命令
using (SqlConnection conn =  new  SqlConnection(connectionString))
{
SqlCommand cmd =  new  SqlCommand(sqlTxt, conn);
SqlParameter prm1 =  new  SqlParameter( "@OperatorName" , SqlDbType.NVarChar,  50 );
prm1.Value = addOperator.ModelName;
SqlParameter prm2 =  new  SqlParameter( "@Password" , SqlDbType.NVarChar, 50 );
prm2.Value = addOperator.Password;
SqlParameter prm3 =  new  SqlParameter( "@RightsList" , SqlDbType.VarBinary, rigthsByteArray.Length,
ParameterDirection.Input,  false 0 0 null , DataRowVersion.Current, rigthsByteArray);
SqlParameter prm4 =  new  SqlParameter( "@State" , SqlDbType.Bit);
prm4.Value = addOperator.State;
cmd.Parameters.AddRange( new  SqlParameter[] { prm1, prm2, prm3, prm4 });
conn.Open();
if  (cmd.ExecuteNonQuery() >=  1 )
return  true ;
else
return  false ;
}
}
/// <summary>
/// 删除操作员
/// </summary>
/// <param name="id">要删除的操作员 ID</param>
/// <returns>True:成功/False:失败</returns>
public  bool DeleteOperatorByID( int  id)
{
// 删除单个信息 SQL 命令
string sqlTxt = string.Format( "Delete From Operator Where Id = {0}" , id);
// 创建 SQL 执行对象
DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance();
// 执行 删除操作
int  rowsAffected;
dbProvider.RunCommand(sqlTxt, out rowsAffected);
if  (rowsAffected >=  1 )
return  true ;
else
return  false ;
}
/// <summary>
/// 修改操作员
/// </summary>
/// <param name="currentOperator">要修改的操作员实体</param>
/// <returns>True:成功/False:失败</returns>
public  bool ModifyOperator(Model.Operator currentOperator)
{
// 验证密码长度
if  (currentOperator.Password.Trim().Length <  6 )
throw  new  Exception( "用户密码长度不能小于六位!" );
// 转换操作员权限集合为数据库可存取的 Byte[] 数组
MemoryStream ms =  new  MemoryStream();
BinaryFormatter bf =  new  BinaryFormatter();
bf.Serialize(ms, currentOperator.RightsCollection);
byte [] rigthsByteArray =  new  byte [( int )(ms.Length)];
ms.Position =  0 ;
ms.Read(rigthsByteArray,  0 , ( int )(ms.Length));
ms.Close();
// 拼接 SQL 命令
string sqlTxt =  "Update Operator Set OperatorName = @OperatorName, "
"Password = @Password, RightsList = @RightsList, State = @State Where Id = @Id" ;
// 从配置文件读取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[ "SQLSERVER" ].ConnectionString;
// 执行 SQL 命令
using(SqlConnection conn =  new  SqlConnection(connectionString))
{
SqlCommand cmd =  new  SqlCommand(sqlTxt, conn);
SqlParameter prm1 =  new  SqlParameter( "@OperatorName" , SqlDbType.NVarChar,  50 );
prm1.Value = currentOperator.ModelName;
SqlParameter prm2 =  new  SqlParameter( "@Password" , SqlDbType.NVarChar, 50 );
prm2.Value = currentOperator.Password;
SqlParameter prm3 =  new  SqlParameter( "@RightsList" , SqlDbType.VarBinary, rigthsByteArray.Length,
ParameterDirection.Input,  false 0 0 null , DataRowVersion.Current, rigthsByteArray);
SqlParameter prm4 =  new  SqlParameter( "@State" , SqlDbType.Bit);
prm4.Value = currentOperator.State;
SqlParameter prm5 =  new  SqlParameter( "@Id" , SqlDbType.Int);
prm5.Value = currentOperator.Id;
cmd.Parameters.AddRange( new  SqlParameter[] { prm1, prm2, prm3, prm4, prm5 });
conn.Open();
if  (cmd.ExecuteNonQuery() >=  1 )
return  true ;
else
return  false ;
}
}
/// <summary>
/// 获取所有操作员信息
/// </summary>
/// <returns>操作员实体集合</returns>
public  Dictionary<string, Model.Operator> GetAllOperatorInfo()
{
//SQL命令
string sqltxt =  "Select Id, OperatorName, Password, RightsList, State From Operator" ;
//创建操作员实体集合
Dictionary<string, Model.Operator> operatorCollection =  new Dictionary<string, Model.Operator>();
//定义操作员实体
Model.Operator tmpOperator =  null ;
// 转换数据库存储的 二进制数据为 Byte[] 数组 以便进而转换为操作员权限集合
// 从配置文件读取连接字符串
string connectionString = ConfigurationManager.ConnectionStrings[ "SQLSERVER" ].ConnectionString;
// 执行 SQL 命令
using (SqlConnection conn =  new  SqlConnection(connectionString))
{
SqlCommand cmd =  new  SqlCommand(sqltxt, conn);
conn.Open();
using (SqlDataReader myReader = cmd.ExecuteReader(
CommandBehavior.CloseConnection))
{
while  (myReader.Read())
{
// 创建操作员实体
tmpOperator =  new  Model.Operator();
//将数据集转换成实体集合
tmpOperator.Id = Convert.ToInt32(myReader[ "Id" ]);
tmpOperator.ModelName = Convert.ToString(myReader[ "OperatorName" ]);
tmpOperator.Password = Convert.ToString(myReader[ "Password" ]);
tmpOperator.State = Convert.ToBoolean(myReader[ "State" ]);
// 读取权限集合
System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes( 3 );  // 只能指定列序号
// 将流反序列化为权限集合对象
BinaryFormatter bf =  new  BinaryFormatter();
if  (!bytes.IsNull)
tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string, Model.Rights>);
// 添加到操作员实体集合
operatorCollection.Add(tmpOperator.ModelName, tmpOperator);
}
}
}
// 返回结果
return  operatorCollection;
}
/// <summary>
/// 根据操作员名称校验操作员是否存在
/// </summary>
/// <param name="operatorName">操作员名称</param>
/// <returns>True:存在/Flase:不存在</returns>
public  bool CheckOperatorExist(string operatorName)
{
//创建查询信息的 SQL
string sqlTxt = string.Format(
"Select Count(*) From Operator Where OperatorName = '{0}'" ,
operatorName);
//创建SQL执行对象
DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance();
//执行查询操作
int  result = Convert.ToInt32(dbProvider.RunCommand(sqlTxt));
if  (result >=  1 )
return  true ;
else
return  false ;
}
#endregion
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容: 1、mysql——原始 文件: 博客网址:https://blog.csdn.net/weixin_42167759/article/details/80848259 存在的问题: 1、新增用户时候id ,删除后再增加会出错,id有冲突; 2、删除用户时候,若该用户创建过其他用户(不能改此用户名、不能改此用户角色,不能删除此用户); 3、(下一步加入)增加时候,若改用户名存在(给出用户存在的提示信息); 2、db_修改过(用户 角色 权限) 文件: 博客网址:https://blog.csdn.net/weixin_42167759/article/details/80848780 修改的问题: 1、新增用户时候id 改为最大id值加一,之前用的select查看出来的记录数加一,删除后再增加会出错; 2、删除用户时候,若该用户创建过其他用户(不能改此用户名、不能改此用户角色,不能删除此用户); 3、(下一步加入)增加时候,若改用户名存在(给出用户存在的提示信息); 4、修改了用户的表字段信息,新增了认证方式的字段; 5、用户有三种认证方式,当选择口令认证的时候,syn_sn_有输入信息,当选择KEY认证的时候,dyn_pass_sn_字段有输入信息 3、userGroupUser_intfac 文件: 博客的网址:https://blog.csdn.net/weixin_42167759/article/details/80848991 整理的文档: 《Mysql 最后程序的总结—— Linux系统C语言编程连接MySql数据库实现的用户角色权限管理系统》 修改的问题: 1、新增 添加用户组模块; 2、新增 显示用户组模块; 3、修改 新增用户模块 选择 其所属用户组 并把用户id与用户组id 写入用户用户组关系表; 4、新增 修改用户以及删除用户组模块(有用户属于该用户组 用户组名字不允许更改 用户组不允许删除); 5、新增 增加用户、用户组时候,若要增加的用户名已存在(给出用户存在的提示信息); 6、修改了 显示的界面问题; 7、修改部分switch case 输入为字符; 8、修改部分 操作完成后 有两次回车 确认的问题; 遗留的问题: 1、switch case 输入为字符,应该改为case a:bresk; case b:break;…… 否则输入的1与10是一样的执行结果; 字符中只有数字0-9; 2、在remark字段中 scanf()函数是不允许输入空格的。 __________________________________________________________________________________________________ 4、user-role-authoritys-usergroup文件: 数据库的图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值