winform:C# WinForm中实现基于角色的权限菜单来源: 发布时间:星期四, 2009年2月12日 浏览:216次 评论:0
基于角色 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 1、原始方案 ![]() A、操作员(Operator):存储系统登录用户 ![]() ![]() B、权限组(RightsGroup):存储系统权限分组(即:权限角色) ![]() ![]() C、权限关系(RightsRelation):用于将A项和B项的间 ![]() ![]() ![]() D、权限列表(RightsList):存储系统菜单项(即:权限项) ![]() ![]() E、权限组关系(RightGroupRelation):用于将B项和D项的间 ![]() ![]() ![]() 通过上面 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 2、改进方案 如上所述 ![]() ![]() A、操作员(Operator):存储系统登录用户 ![]() ![]() B、权限组(RightsGroup):存储系统权限分组(即:权限角色) ![]() ![]() C、权限关系(RightsRelation):用于将A项和B项的间 ![]() ![]() ![]() 很容易看出 ![]() ![]() ![]() ![]() ![]() ![]() -- 判断是否存在 操作员信息表(Operator) ![]() ![]() ![]() Drop Table [Operator] Go -- 创建 操作员信息表(Operator) Create Table [Operator] ( -- 主键列 ![]() [Id] ![]() ![]() -- 操作员姓名 [OperatorName] nVarChar(50) Constra ![]() -- 密码 [Password] nVarChar(50) Constra ![]() -- 操作员权限列表 [RightsList] varBinary(max) Null, -- 用户当前状态 [State] bit Constra ![]() ![]() ) Go -- 判断是否存在 权限组信息表(RightsGroup) ![]() ![]() ![]() Drop Table [RightsGroup] Go -- 创建 权限组信息表(RightsGroup) Create Table [RightsGroup] ( -- 主键列 ![]() [Id] ![]() ![]() -- 权限组名称 [GroupName] nVarChar(50) Constra ![]() -- 组权限列表 [GroupRightsList] varBinary(max) Null, ) Go -- 判断是否存在权限关系表(RightsRelation) ![]() ![]() ![]() drop table [RightsRelation] Go -- 创建 权限关系表(RightsRelation) Create Table [RightsRelation] ( -- 主键列 ![]() [Id] ![]() ![]() -- 操作员 Id [OperatorId] ![]() ![]() -- 权限组 Id [RightsGroupId] ![]() ![]() ) Go 2、建立实体类 建立了 SQL Server 数据库模型的后 ![]() ![]() ![]() 1、实体模型基类(ModelBase) C#源码清单: using ![]() using ![]() using ![]() ![]() { /// <summary> /// 实体模型基类 /// </summary> [Serializable] public ![]() { #region Private Members ![]() ![]() #endregion #region Public Properties /// <summary> /// 实体模型 ID /// </summary> public ![]() { get { ![]() ![]() } /// <summary> /// 实体模型名称 /// </summary> public ![]() { get { ![]() ![]() } #endregion #region Public Methods /// <summary> /// 无参构造 /// </summary> public ModelBase ![]() /// <summary> /// 带参构造 /// </summary> /// <param name="id">实体模型 ID</param> /// <param name="modelName">实体模型名称</param> public ModelBase( ![]() ![]() { this.Id = id; this.ModelName = modelName; } #endregion } } 2、操作员实体类(Operator) C#源码清单: using ![]() using ![]() using ![]() ![]() { /// <summary> /// 操作员实体类 /// </summary> [Serializable] public ![]() { #region Private Members ![]() Dictionary< ![]() bool _state; #endregion #region Public Properties /// <summary> /// 操作员密码 /// </summary> public ![]() { get { ![]() ![]() } /// <summary> /// 权限集合(键值用于存储菜单/工具栏项 ![]() /// </summary> public Dictionary< ![]() { get { ![]() ![]() } /// <summary> /// 操作员状态 /// </summary> public bool State { get { ![]() ![]() } #endregion #region Public Methods /// <summary> /// 无参构造(基类属性赋值介绍说明:Id - 操作员 ID / ModelName - 操作员名称) /// </summary> public Operator ![]() /// <summary> /// 带参构造 /// </summary> /// <param name="operatorId">操作员 ID</param> /// <param name="name">操作员名称</param> /// <param name="password">操作员密码</param> /// <param name="rightsCollection">权限集合(键值用于存储菜单/工具栏项 ![]() /// <param name="state">操作员状态</param> public Operator( ![]() ![]() ![]() Dictionary< ![]() bool state) : base(operatorId, name) { this.Password = password; this.RightsCollection = rightsCollection; this.State = state; } #endregion } } 3、权限组实体类(RightsGroup) C#源码清单: using ![]() using ![]() using ![]() ![]() { /// <summary> /// 权限组实体类 /// </summary> [Serializable] public ![]() { #region Private Members Dictionary< ![]() #endregion #region Public Properties /// <summary> /// 组权限集合 /// </summary> public Dictionary< ![]() { get { ![]() ![]() } #endregion #region Public Methods /// <summary> /// 无参构造(基类属性赋值介绍说明:Id - 权限组 ID / ModelName - 权限组名称) /// </summary> public RightsGroup ![]() /// <summary> /// 带参构造 /// </summary> /// <param name="groupId">权限组 ID</param> /// <param name="groupName">权限组名称</param> /// <param name="groupRightsCollection">组权限集合</param> public RightsGroup( ![]() ![]() Dictionary< ![]() : base(groupId, groupName) { this.GroupRightsCollection = groupRightsCollection; } #endregion } } 4、权限关系实体类(RightsRelation) C#源码清单: using ![]() using ![]() using ![]() ![]() { /// <summary> /// 权限关系实体类 /// </summary> [Serializable] public ![]() { #region Private Members ![]() ![]() ![]() ![]() ![]() #endregion #region Public Properties /// <summary> /// 权限关系 ID /// </summary> public ![]() { get { ![]() ![]() } /// <summary> /// 操作员 ID /// </summary> public ![]() { get { ![]() ![]() } /// <summary> /// 操作员名称(便于在 WinForm ![]() /// </summary> public ![]() { get { ![]() ![]() } /// <summary> /// 权限组 ID /// </summary> public ![]() { get { ![]() ![]() } /// <summary> /// 权限组名称(便于在 WinForm ![]() /// </summary> public ![]() { get { ![]() ![]() } #endregion #region Public Methods /// <summary> /// 无参构造 /// </summary> public RightsRelation ![]() /// <summary> /// 带参构造 /// </summary> /// <param name="id">权限关系 ID</param> /// <param name="operatorId">操作员 ID</param> /// <param name="operatorName">操作员名称</param> /// <param name="rightsGroupId">权限组 ID</param> /// <param name="rightsGroupName">权限组名称</param> public RightsRelation( ![]() ![]() ![]() ![]() ![]() { this.Id = id; this.OperatorId = operatorId; this.OperatorName = operatorName; this.RightsGroupId = rightsGroupId; this.RightsGroupName = rightsGroupName; } #endregion } } 3、具体代码实现 采用多层开发模式有助于降低耦合度 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ( ![]() 1、操作员数据访问操作类(OperatorService) C#源码清单: using ![]() using ![]() using ![]() using ![]() using ![]() using ![]() using ![]() using ![]() using DBUtility = CodingMouse.CMHotelManager.DBUtility; using IDAL = CodingMouse.CMHotelManager.IDAL; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 操作员数据访问操作类 /// </summary> public ![]() { #region IOperatorService 成员 /// <summary> /// 根据操作员名称和密码获取操作员实体 /// </summary> /// <param name="name">操作员名称</param> /// <param name="pwd">操作员密码</param> /// < ![]() ![]() public Model.Operator GetOperatorInfoByName( ![]() ![]() { //SQL命令 ![]() ![]() //创建操作员实体 Model.Operator tmpOperator = ![]() ![]() // 转换数据库存储 ![]() ![]() ![]() // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using (SqlConnection conn = ![]() { SqlCommand cmd = ![]() conn.Open ![]() using (SqlDataReader myReader = cmd.ExecuteReader( CommandBehavior.CloseConnection | CommandBehavior.SingleResult | CommandBehavior.SingleRow)) { ![]() ![]() { //将数据集转换成实体集合 tmpOperator.Id = Convert.ToInt32(myReader["Id"]); tmpOperator.ModelName = Convert. ![]() tmpOperator.Password = Convert. ![]() tmpOperator.State = Convert.ToBoolean(myReader["State"]); // 读取权限集合 ![]() ![]() // 将流反序列化为权限集合对象 BinaryFormatter bf = ![]() ![]() ![]() ![]() tmpOperator.RightsCollection = (bf.Deserialize( ![]() ![]() // ![]() // throw ![]() ![]() ![]() } ![]() //如果没有读取到内容则抛出异常 throw ![]() } } // 如果操作员已经被禁用 ![]() throw ![]() ![]() ![]() // 返回结果 ![]() } /// <summary> /// 添加操作员 /// </summary> /// <param name="addOperator">要添加 ![]() /// < ![]() ![]() public bool AddOperator(Model.Operator addOperator) { // 验证密码长度 ![]() ![]() throw ![]() // 转换操作员权限集合为数据库可存取 ![]() ![]() ![]() MemoryStream ms = ![]() ![]() BinaryFormatter bf = ![]() ![]() bf.Serialize(ms, addOperator.RightsCollection); ![]() ![]() ![]() ![]() ![]() ms.Position = 0; ms.Read(rigthsByteArray, 0, ( ![]() ms.Close ![]() // 拼接 SQL 命令 ![]() "(@OperatorName, @Password, @RightsList, @State)"; // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using (SqlConnection conn = ![]() { SqlCommand cmd = ![]() SqlParameter prm1 = ![]() prm1.Value = addOperator.ModelName; SqlParameter prm2 = ![]() prm2.Value = addOperator.Password; SqlParameter prm3 = ![]() ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray); SqlParameter prm4 = ![]() prm4.Value = addOperator.State; cmd.Parameters.AddRange( ![]() ![]() conn.Open ![]() ![]() ![]() ![]() ![]() ![]() } } /// <summary> /// 删除操作员 /// </summary> /// <param name="id">要删除 ![]() /// < ![]() ![]() public bool DeleteOperatorByID( ![]() { // 删除单个信息 SQL 命令 ![]() ![]() // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行 删除操作 ![]() dbProvider.RunCommand(sqlTxt, out rowsAffected); ![]() ![]() ![]() ![]() } /// <summary> /// 修改操作员 /// </summary> /// <param name="currentOperator">要修改 ![]() /// < ![]() ![]() public bool Mod ![]() { // 验证密码长度 ![]() ![]() throw ![]() // 转换操作员权限集合为数据库可存取 ![]() ![]() ![]() MemoryStream ms = ![]() ![]() BinaryFormatter bf = ![]() ![]() bf.Serialize(ms, currentOperator.RightsCollection); ![]() ![]() ![]() ![]() ![]() ms.Position = 0; ms.Read(rigthsByteArray, 0, ( ![]() ms.Close ![]() // 拼接 SQL 命令 ![]() "Password = @Password, RightsList = @RightsList, State = @State Where Id = @Id"; // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using(SqlConnection conn = ![]() { SqlCommand cmd = ![]() SqlParameter prm1 = ![]() prm1.Value = currentOperator.ModelName; SqlParameter prm2 = ![]() prm2.Value = currentOperator.Password; SqlParameter prm3 = ![]() ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray); SqlParameter prm4 = ![]() prm4.Value = currentOperator.State; SqlParameter prm5 = ![]() prm5.Value = currentOperator.Id; cmd.Parameters.AddRange( ![]() ![]() conn.Open ![]() ![]() ![]() ![]() ![]() ![]() } } /// <summary> /// 获取所有操作员信息 /// </summary> /// < ![]() ![]() public Dictionary< ![]() ![]() { //SQL命令 ![]() //创建操作员实体集合 Dictionary< ![]() ![]() ![]() ![]() //定义操作员实体 Model.Operator tmpOperator = null; // 转换数据库存储 ![]() ![]() ![]() // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using (SqlConnection conn = ![]() { SqlCommand cmd = ![]() conn.Open ![]() using (SqlDataReader myReader = cmd.ExecuteReader( CommandBehavior.CloseConnection)) { while (myReader.Read ![]() { // 创建操作员实体 tmpOperator = ![]() ![]() //将数据集转换成实体集合 tmpOperator.Id = Convert.ToInt32(myReader["Id"]); tmpOperator.ModelName = Convert. ![]() tmpOperator.Password = Convert. ![]() tmpOperator.State = Convert.ToBoolean(myReader["State"]); // 读取权限集合 ![]() ![]() // 将流反序列化为权限集合对象 BinaryFormatter bf = ![]() ![]() ![]() ![]() tmpOperator.RightsCollection = (bf.Deserialize( ![]() ![]() // 添加到操作员实体集合 operatorCollection.Add(tmpOperator.ModelName, tmpOperator); } } } // 返回结果 ![]() } /// <summary> /// 根据操作员名称校验操作员是否存在 /// </summary> /// <param name="operatorName">操作员名称</param> /// < ![]() ![]() public bool CheckOperatorExist( ![]() { //创建查询信息 ![]() ![]() ![]() "Select Count(*) From Operator Where OperatorName = '{0}'", operatorName); //创建SQL执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() //执行查询操作 ![]() ![]() ![]() ![]() ![]() } #endregion } } 2、权限组数据访问操作类(RightsGroupService) C#源码清单: using ![]() using ![]() using ![]() using ![]() using ![]() using ![]() using ![]() using ![]() using DBUtility = CodingMouse.CMHotelManager.DBUtility; using IDAL = CodingMouse.CMHotelManager.IDAL; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 权限组数据访问操作类 /// </summary> public ![]() { #region IRightsGroupService 成员 /// <summary> /// 获取所有权限组信息 /// </summary> /// < ![]() ![]() public Dictionary< ![]() ![]() { //SQL命令 ![]() //创建权限组实体集合 Dictionary< ![]() ![]() ![]() ![]() //定义权限组实体 Model.RightsGroup tmpRightsGroup = null; // 转换数据库存储 ![]() ![]() ![]() // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using (SqlConnection conn = ![]() { SqlCommand cmd = ![]() conn.Open ![]() using (SqlDataReader myReader = cmd.ExecuteReader( CommandBehavior.CloseConnection)) { while (myReader.Read ![]() { // 创建权限组实体 tmpRightsGroup = ![]() ![]() //将数据集转换成实体集合 tmpRightsGroup.Id = Convert.ToInt32(myReader["Id"]); tmpRightsGroup.ModelName = Convert. ![]() // 读取权限集合 ![]() ![]() // 将流反序列化为权限集合对象 BinaryFormatter bf = ![]() ![]() ![]() ![]() tmpRightsGroup.GroupRightsCollection = (bf.Deserialize( ![]() ![]() // 添加到权限组实体集合 rightsGroupCollection.Add(tmpRightsGroup.ModelName, tmpRightsGroup); } } } // 返回结果 ![]() } /// <summary> /// 添加权限组 /// </summary> /// <param name="addRightsGroup">要添加 ![]() /// < ![]() ![]() public bool AddRightsGroup(Model.RightsGroup addRightsGroup) { // 转换权限组权限集合为数据库可存取 ![]() ![]() ![]() MemoryStream ms = ![]() ![]() BinaryFormatter bf = ![]() ![]() bf.Serialize(ms, addRightsGroup.GroupRightsCollection); ![]() ![]() ![]() ![]() ![]() ms.Position = 0; ms.Read(rigthsByteArray, 0, ( ![]() ms.Close ![]() // 拼接 SQL 命令 ![]() "(@GroupName, @GroupRightsList)"; // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using (SqlConnection conn = ![]() { SqlCommand cmd = ![]() SqlParameter prm1 = ![]() prm1.Value = addRightsGroup.ModelName; SqlParameter prm2 = ![]() ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray); cmd.Parameters.AddRange( ![]() ![]() conn.Open ![]() ![]() ![]() ![]() ![]() ![]() } } /// <summary> /// 删除权限组 /// </summary> /// <param name="id">要删除 ![]() /// < ![]() ![]() public bool DeleteRightsGroupByID( ![]() { // 删除单个信息 SQL 命令 ![]() ![]() // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行 删除操作 ![]() dbProvider.RunCommand(sqlTxt, out rowsAffected); ![]() ![]() ![]() ![]() } /// <summary> /// 修改权限组 /// </summary> /// <param name="currentRightsGroup">要修改 ![]() /// < ![]() ![]() public bool Mod ![]() { // 转换权限组权限集合为数据库可存取 ![]() ![]() ![]() MemoryStream ms = ![]() ![]() BinaryFormatter bf = ![]() ![]() bf.Serialize(ms, currentRightsGroup.GroupRightsCollection); ![]() ![]() ![]() ![]() ![]() ms.Position = 0; ms.Read(rigthsByteArray, 0, ( ![]() ms.Close ![]() // 拼接 SQL 命令 ![]() // 从配置文件读取连接 ![]() ![]() // 执行 SQL 命令 using (SqlConnection conn = ![]() { SqlCommand cmd = ![]() SqlParameter prm1 = ![]() prm1.Value = currentRightsGroup.ModelName; SqlParameter prm2 = ![]() ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, rigthsByteArray); SqlParameter prm3 = ![]() prm3.Value = currentRightsGroup.Id; cmd.Parameters.AddRange( ![]() ![]() conn.Open ![]() ![]() ![]() ![]() ![]() ![]() } } /// <summary> /// 根据权限组名称校验权限组是否已经存在 /// </summary> /// <param name="rightsGroupName">权限组名称</param> /// < ![]() ![]() public bool CheckRightsGroupExist( ![]() { //SQL命令 ![]() ![]() //创建SQL执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() //执行查询操作 ![]() ![]() ![]() ![]() ![]() } #endregion } } 3、权限关系数据访问操作类(RightsRelationService) C#源码清单: using ![]() using ![]() using ![]() using ![]() using ![]() using DBUtility = CodingMouse.CMHotelManager.DBUtility; using IDAL = CodingMouse.CMHotelManager.IDAL; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 权限关系数据访问操作类 /// </summary> public ![]() { #region IRightsRelationService 成员 /// <summary> /// 添加单个权限关系 /// </summary> /// <param name="rightsRelation">权限关系实体</param> /// < ![]() ![]() public bool AddRightsRelation(Model.RightsRelation rightsRelation) { // 拼接 SQL 命令 ![]() ![]() "Insert Into RightsRelation (OperatorId, RightsGroupId) " + "Values ({0}, {1})", rightsRelation.OperatorId, rightsRelation.RightsGroupId); // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行 SQL ![]() dbProvider.RunCommand(sqlTxt, out rowsAffected); ![]() ![]() { ![]() } ![]() { ![]() } } /// <summary> /// 根据权限关系 ID 删除权限关系 /// </summary> /// <param name="id">权限关系 ID</param> /// < ![]() ![]() public bool DeleteRightsRelationById( ![]() { bool isOk = false; // 删除单个信息 SQL 命令 ![]() ![]() // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行 删除操作 ![]() dbProvider.RunCommand(sqlTxt, out rowsAffected); ![]() { isOk = true; } ![]() { isOk = false; } ![]() } /// <summary> /// 根据操作员 ID 删除对应 ![]() /// </summary> /// <param name="operatorId">操作员 ID</param> /// < ![]() ![]() public bool DeleteRightsRelationByOperatorId( ![]() { bool isOk = false; // 删除单个信息 SQL 命令 ![]() ![]() // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行 删除操作 ![]() dbProvider.RunCommand(sqlTxt, out rowsAffected); ![]() { isOk = true; } ![]() { isOk = false; } ![]() } /// <summary> /// 修改单个权限关系 /// </summary> /// <param name="rightsRelation">权限关系实体</param> /// < ![]() ![]() public bool Mod ![]() { // 拼接 SQL 命令 ![]() ![]() "Update RightsRelation Set OperatorId = {0}, RightsGroupId = {1} Where Id = {2}", rightsRelation.OperatorId, rightsRelation.RightsGroupId, rightsRelation.Id); // 创建 SQL 执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行 SQL ![]() dbProvider.RunCommand(sqlTxt, out rowsAffected); ![]() ![]() { ![]() } ![]() { ![]() } } /// <summary> /// 获取所有 ![]() /// </summary> /// < ![]() ![]() public List<Model.RightsRelation> GetAllRightsRelation ![]() { //创建数据集 DataSet dsRightsRelation = ![]() //创建客户集合 List<Model.RightsRelation> rightsRelationList = ![]() ![]() //创建查询客户信息 ![]() ![]() "G.GroupName As [RightsGroupName] From RightsRelation As R Join Operator As O " + "On R.OperatorId = O.Id Join RightsGroup As G _disibledevent=>//创建SQL执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() //执行查询操作 dsRightsRelation = dbProvider.RunCommand(sqlTxt, "RightsRelation"); //将数据集转换成实体集合 foreach (DataRow row in dsRightsRelation.Tables["RightsRelation"].Rows) { Model.RightsRelation tmpRightsRelation = ![]() ![]() tmpRightsRelation.Id = Convert.ToInt32(row["Id"]); tmpRightsRelation.OperatorId = Convert.ToInt32(row["OperatorId"]); tmpRightsRelation.OperatorName = Convert. ![]() tmpRightsRelation.RightsGroupId = Convert.ToInt32(row["RightsGroupId"]); tmpRightsRelation.RightsGroupName = Convert. ![]() rightsRelationList.Add(tmpRightsRelation); } //返回所有客户集合 ![]() } /// <summary> /// 根据操作员 ID 获取对应 ![]() /// </summary> /// <param name="id">操作员 ID</param> /// < ![]() ![]() public List<Model.RightsRelation> GetRightsRelationByOperatorId( ![]() { //创建数据集 DataSet dsRightsRelation = ![]() //创建客户集合 List<Model.RightsRelation> rightsRelationList = ![]() ![]() //创建查询客户信息 ![]() ![]() ![]() "G.GroupName As [RightsGroupName] From RightsRelation As R Join Operator As O " + "On R.OperatorId = O.Id Join RightsGroup As G _disibledevent=>"Where OperatorId = {0}", id); //创建SQL执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() //执行查询操作 dsRightsRelation = dbProvider.RunCommand(sqlTxt, "RightsRelation"); //将数据集转换成实体集合 foreach (DataRow row in dsRightsRelation.Tables["RightsRelation"].Rows) { Model.RightsRelation tmpRightsRelation = ![]() ![]() tmpRightsRelation.Id = Convert.ToInt32(row["Id"]); tmpRightsRelation.OperatorId = Convert.ToInt32(row["OperatorId"]); tmpRightsRelation.OperatorName = Convert. ![]() tmpRightsRelation.RightsGroupId = Convert.ToInt32(row["RightsGroupId"]); tmpRightsRelation.RightsGroupName = Convert. ![]() rightsRelationList.Add(tmpRightsRelation); } //返回所有客户集合 ![]() } /// <summary> /// 根据权限组 ID 获取和此权限组相关 ![]() /// </summary> /// <param name="id">权限组 ID</param> /// < ![]() ![]() public ![]() ![]() { // SQL命令 ![]() ![]() // 创建SQL执行对象 DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance ![]() // 执行查询操作 ![]() // 返回结果 ![]() } #endregion } } ( 2)业务逻辑层(在本文中仅仅起到 ![]() ![]() 1、操作员数据访问操作类(OperatorManager) C#源代码清单 using ![]() using ![]() using ![]() using DALFactory = CodingMouse.CMHotelManager.DALFactory; using IBLL = CodingMouse.CMHotelManager.IBLL; using IDAL = CodingMouse.CMHotelManager.IDAL; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 操作员数据访问操作类 /// </summary> public ![]() { #region IOperatorManager 成员 /// <summary> /// 根据操作员名称和密码获取操作员实体 /// </summary> /// <param name="name">操作员名称</param> /// <param name="pwd">操作员密码</param> /// < ![]() ![]() public Model.Operator GetOperatorInfoByName( ![]() ![]() { // 超级后门管理员账户(测试用 ![]() ![]() ![]() ![]() ![]() { Model.Operator adminOperator = ![]() ![]() adminOperator.Id = 0; adminOperator.ModelName = name; adminOperator.Password = pwd; adminOperator.RightsCollection = ![]() ![]() ![]() adminOperator.State = true; ![]() } //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IOperatorService operatorService = absDALFactory.BuildOperatorService ![]() // ![]() ![]() } /// <summary> /// 添加操作员 /// </summary> /// <param name="addOperator">要添加 ![]() /// < ![]() ![]() public bool AddOperator(Model.Operator addOperator) { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IOperatorService operatorService = absDALFactory.BuildOperatorService ![]() // ![]() ![]() } /// <summary> /// 删除操作员 /// </summary> /// <param name="id">要删除 ![]() /// < ![]() ![]() public bool DeleteOperatorByID( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IOperatorService operatorService = absDALFactory.BuildOperatorService ![]() // ![]() ![]() } /// <summary> /// 修改操作员 /// </summary> /// <param name="currentOperator">要修改 ![]() /// < ![]() ![]() public bool Mod ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IOperatorService operatorService = absDALFactory.BuildOperatorService ![]() // ![]() ![]() ![]() } /// <summary> /// 获取所有操作员信息 /// </summary> /// < ![]() ![]() public Dictionary< ![]() ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IOperatorService operatorService = absDALFactory.BuildOperatorService ![]() // ![]() ![]() ![]() } /// <summary> /// 根据操作员名称校验操作员是否存在 /// </summary> /// <param name="operatorName">操作员名称</param> /// < ![]() ![]() public bool CheckOperatorExist( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IOperatorService operatorService = absDALFactory.BuildOperatorService ![]() // ![]() ![]() } #endregion } } 2、权限组数据访问操作类(RightsGroupManager) C#源码清单: using ![]() using ![]() using ![]() using DALFactory = CodingMouse.CMHotelManager.DALFactory; using IBLL = CodingMouse.CMHotelManager.IBLL; using IDAL = CodingMouse.CMHotelManager.IDAL; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 权限组数据访问操作类 /// </summary> public ![]() { #region IRightsGroupManager 成员 /// <summary> /// 获取所有权限组信息 /// </summary> /// < ![]() ![]() public Dictionary< ![]() ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsGroupService rightsGroupService = absDALFactory.BuildRightsGroupService ![]() // ![]() ![]() ![]() } /// <summary> /// 添加权限组 /// </summary> /// <param name="addRightsGroup">要添加 ![]() /// < ![]() ![]() public bool AddRightsGroup(Model.RightsGroup addRightsGroup) { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsGroupService rightsGroupService = absDALFactory.BuildRightsGroupService ![]() // ![]() ![]() } /// <summary> /// 删除权限组 /// </summary> /// <param name="id">要删除 ![]() /// < ![]() ![]() public bool DeleteRightsGroupByID( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsGroupService rightsGroupService = absDALFactory.BuildRightsGroupService ![]() // ![]() ![]() } /// <summary> /// 修改权限组 /// </summary> /// <param name="currentRightsGroup">要修改 ![]() /// < ![]() ![]() public bool Mod ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsGroupService rightsGroupService = absDALFactory.BuildRightsGroupService ![]() // ![]() ![]() ![]() } /// <summary> /// 根据权限组名称校验权限组是否已经存在 /// </summary> /// <param name="rightsGroupName">权限组名称</param> /// < ![]() ![]() public bool CheckRightsGroupExist( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsGroupService rightsGroupService = absDALFactory.BuildRightsGroupService ![]() // ![]() ![]() } #endregion } } 3、权限关系数据访问操作类(RightsRelationManager) C#源码清单: using ![]() using ![]() using ![]() using DALFactory = CodingMouse.CMHotelManager.DALFactory; using IBLL = CodingMouse.CMHotelManager.IBLL; using IDAL = CodingMouse.CMHotelManager.IDAL; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 权限关系数据访问操作类 /// </summary> public ![]() { #region IRightsRelationManager 成员 /// <summary> /// 添加单个权限关系 /// </summary> /// <param name="rightsRelation">权限关系实体</param> /// < ![]() ![]() public bool AddRightsRelation(Model.RightsRelation rightsRelation) { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() } /// <summary> /// 根据权限关系 ID 删除权限关系 /// </summary> /// <param name="id">权限关系 ID</param> /// < ![]() ![]() public bool DeleteRightsRelationById( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() } /// <summary> /// 根据操作员 ID 删除对应 ![]() /// </summary> /// <param name="operatorId">操作员 ID</param> /// < ![]() ![]() public bool DeleteRightsRelationByOperatorId( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() } /// <summary> /// 修改单个权限关系 /// </summary> /// <param name="rightsRelation">权限关系实体</param> /// < ![]() ![]() public bool Mod ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() ![]() } /// <summary> /// 获取所有 ![]() /// </summary> /// < ![]() ![]() public List<Model.RightsRelation> GetAllRightsRelation ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() ![]() } /// <summary> /// 根据操作员 ID 获取对应 ![]() /// </summary> /// <param name="id">操作员 ID</param> /// < ![]() ![]() public List<Model.RightsRelation> GetRightsRelationByOperatorId( ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() } /// <summary> /// 根据权限组 ID 获取和此权限组相关 ![]() /// </summary> /// <param name="id">权限组 ID</param> /// < ![]() ![]() public ![]() ![]() { //定义并例子化抽象工厂类 DALFactory.AbstractDALFactory absDALFactory = DALFactory.AbstractDALFactory.Instance ![]() // ![]() IDAL.IRightsRelationService rightsRelationService = absDALFactory.BuildRightsRelationService ![]() // ![]() ![]() } #endregion } } ( 3)界面表示层(由于界面操作逻辑 ![]() ![]() 1、权限菜单数据管理类(RightsMenuDataManager) C#源码清单: using ![]() using ![]() using ![]() using ![]() using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 权限菜单数据管理类 /// </summary> public ![]() { #region Private Members /// <summary> /// 保存当前被管理 ![]() /// </summary> MenuStrip _msMain = null; /// <summary> /// 保存当前权限项 ID /// </summary> ![]() #endregion #region Internal Properties /// <summary> /// 被管理 ![]() /// </summary> ![]() { get { ![]() ![]() } #endregion #region Private Methods /// <summary> /// 使用递归法读取菜单权限子项 /// </summary> /// <param name="rightCollection">要保存到 ![]() /// <param name="tsmiRootLevel">当前菜单权限相对根项</param> private Model.Rights GetMenuRightsChildrenItem(Dictionary< ![]() { // 显示下级菜单项元素 Text Model.Rights secondRights = null; // 使用 ToolStripItem 基类遍历获取下级菜单项 foreach (ToolStripItem tsmiNextLevel in tsmiRootLevel.DropDownItems) { // ID 号累加 _rightsId ![]() // 显示下级菜单项元素 Text secondRights = ![]() ![]() secondRights.Id = _rightsId; secondRights.ModelName = tsmiNextLevel.Name; secondRights.RightsState = false; secondRights.ParentLevelRightsName = rightCollection[tsmiRootLevel.Name].ModelName; // 如果是菜单项而不是其它菜单项类型 ![]() { secondRights.RightsCaption = tsmiNextLevel.Text; // 添加当前项到集合 rightCollection.Add(secondRights.ModelName, secondRights); // 使用递归添加所有次级子项到集合 GetMenuRightsChildrenItem(rightCollection, tsmiNextLevel as ToolStripMenuItem); } // 如果是分隔项而不是其它菜单项类型 ![]() ![]() { secondRights.RightsCaption = "━━━━"; // 添加此菜单分隔项到集合 rightCollection.Add((tsmiNextLevel as ToolStripSeparator).Name, secondRights); } } ![]() } /// <summary> /// 使用递归法加载菜单权限子项 /// </summary> /// <param name="rightCollection">权限集合</param> /// <param name="tsmiRootLevel">当前菜单权限相对根项</param> private void LoadMenuRightsChildrenItem(Dictionary< ![]() { // 使用 ToolStripItem 基类遍历获取下级菜单项 foreach (ToolStripItem tsmiNextLevel in tsmiRootLevel.DropDownItems) { foreach (Model.Rights tmpRights in rightCollection.Values) { // 如果是菜单项而不是其它菜单项类型 ![]() { // 如果内部名称相同 ![]() ![]() { // 设置名称和显隐状态 tsmiNextLevel.Text = tmpRights.RightsCaption; tsmiNextLevel.Visible = tmpRights.RightsState; // 使用递归加载所有次级子项 LoadMenuRightsChildrenItem(rightCollection, tsmiNextLevel as ToolStripMenuItem); ![]() } } // 如果是分隔项而不是其它菜单项类型 ![]() ![]() { // 如果内部名称相同 ![]() ![]() { // 设置显隐状态 tsmiNextLevel.Visible = tmpRights.RightsState; ![]() } } } } } #endregion #region Internal Methods /// <summary> /// 使用递归法读取菜单权限项 /// </summary> /// <param name="rightCollection">要保存到 ![]() /// < ![]() ![]() ![]() ![]() ![]() { ![]() throw ![]() ![]() ![]() ![]() // ![]() ![]() ![]() } /// <summary> /// 使用递归法读取菜单权限项 /// </summary> /// <param name="msCurrentMenu">当前被管理 ![]() /// <param name="rightCollection">要保存到 ![]() /// < ![]() ![]() ![]() ![]() ![]() { // 遍历获取菜单根项 foreach (ToolStripMenuItem tsmiRootLevel in msCurrentMenu.Items) { ![]() { // ID 号累加 _rightsId ![]() // 显示菜单根项元素 Text Model.Rights rootRights = ![]() ![]() rootRights.Id = _rightsId; rootRights.ModelName = tsmiRootLevel.Name; rootRights.RightsCaption = tsmiRootLevel.Text; rootRights.RightsState = false; rootRights.ParentLevelRightsName = msCurrentMenu.Name; // 如果未添加此权限则添加此权限到菜单根项 ![]() bool isExist = false; foreach (Model.Rights tmpRights in rightCollection.Values) { ![]() ![]() isExist = true; } ![]() rightCollection.Add(rootRights.ModelName, rootRights); // 使用递归添加所有子项 GetMenuRightsChildrenItem(rightCollection, tsmiRootLevel); } } ![]() } /// <summary> /// 使用递归法加载菜单权限项 /// </summary> /// <param name="rightCollection">要保存到 ![]() /// < ![]() ![]() ![]() ![]() { ![]() throw ![]() ![]() ![]() ![]() // ![]() ![]() this.LoadMenuRightsItem(this._msMain, rightCollection); } /// <summary> /// 使用递归法加载菜单权限项 /// </summary> /// <param name="msCurrentMenu">当前被管理 ![]() /// <param name="rightCollection">权限集合</param> ![]() ![]() { foreach (Model.Rights tmpRights in rightCollection.Values) { // 遍历获取菜单根项 foreach (ToolStripMenuItem tsmiRootLevel in msCurrentMenu.Items) { ![]() { // 如果内部名称相同 ![]() ![]() { // 设置名称和显隐状态 tsmiRootLevel.Text = tmpRights.RightsCaption; tsmiRootLevel.Visible = tmpRights.RightsState; // 使用递归加载所有子项 LoadMenuRightsChildrenItem(rightCollection, tsmiRootLevel); ![]() } } } } } #endregion } } 2、权限菜单界面管理类(RightsMenuUIManager) C#源码清单: using ![]() using ![]() using ![]() using ![]() using ![]() using IBLL = CodingMouse.CMHotelManager.IBLL; using BLLFactory = CodingMouse.CMHotelManager.BLLFactory; using Model = CodingMouse.CMHotelManager.Model; ![]() { /// <summary> /// 权限菜单界面管理类 /// </summary> public ![]() { #region Private Members DataGridView _dgvOperatorList = null; DataGridView _dgvRightsList = null; TreeView _tvRightsView = null; MenuStrip _msMain = null; Forms.frmRightsManager _rightsManagerUI = null; #endregion #region Internal Properties /// <summary> /// 要操作 ![]() /// </summary> ![]() { get { ![]() ![]() } /// <summary> /// 要操作 ![]() /// </summary> ![]() { get { ![]() ![]() } /// <summary> /// 要操作 ![]() /// </summary> ![]() { get { ![]() ![]() } /// <summary> /// 被管理 ![]() /// </summary> ![]() { get { ![]() ![]() } /// <summary> /// 当前被管理 ![]() /// </summary> ![]() { get { ![]() ![]() } #endregion #region Private Methods /// <summary> /// 加载所有树子节点 /// </summary> /// <param name="currentChildTreeNode">当前子节点</param> /// <param name="rightsCollection">所有权限集合</param> /// < ![]() ![]() ![]() private TreeNode LoadAllChildTreeNode(TreeNode currentChildTreeNode, Dictionary< ![]() { // 如果是菜单分隔则设置突出显示 ![]() ![]() { currentChildTreeNode.ForeColor = Color.Red; currentChildTreeNode.ToolTipText = "<-- 菜单分隔 -->"; } // 遍历同父权限项集合 foreach (Model.Rights tmpRights in rightsCollection.Values) { // 如果当前父级权限项 ![]() ![]() ![]() ![]() ![]() { // 为当前节点创建新 ![]() TreeNode ![]() ![]() ![]() ![]() // 创建同父权限项集合 List<Model.Rights> sameNessParentRightsList = ![]() ![]() // 获取所有和当前权限项具有相同父权限项 ![]() foreach (Model.Rights sameNessParentRights in rightsCollection.Values) { ![]() ![]() sameNessParentRightsList.Add(sameNessParentRights); } // 递归添加到当前节点及其所有子节点 currentChildTreeNode.Nodes.Add(LoadAllChildTreeNode( ![]() } } // 返回当前处理 ![]() ![]() } #endregion #region Internal Methods /// <summary> /// 将操作员集合数据绑定显示到数据视图 /// </summary> /// <param name="operatorCollection">操作员集合</param> ![]() ![]() { try { // 如果包含操作员信息 ![]() { // 将权限集合绑定显示在数据视图中 BindingSource source = ![]() ![]() source.DataSource = operatorCollection.Values; this._dgvOperatorList.DataSource = source; // 设置中文列名及可写状态 this._dgvOperatorList.Columns["Id"].HeaderText = "编号"; this._dgvOperatorList.Columns["Id"].ToolTipText = "[只读列]"; this._dgvOperatorList.Columns["Id"].DisplayIndex = 0; this._dgvOperatorList.Columns["Id"].ReadOnly = true; this._dgvOperatorList.Columns["ModelName"].HeaderText = "操作员名称"; this._dgvOperatorList.Columns["ModelName"].ToolTipText = "[只读列]"; this._dgvOperatorList.Columns["ModelName"].DisplayIndex = 1; this._dgvOperatorList.Columns["ModelName"].ReadOnly = true; this._dgvOperatorList.Columns["Password"].HeaderText = "密码"; this._dgvOperatorList.Columns["Password"].DisplayIndex = 2; this._dgvOperatorList.Columns["State"].HeaderText = "状态"; this._dgvOperatorList.Columns["State"].DisplayIndex = 3; this._dgvOperatorList.Columns["RightsCollection"].HeaderText = "权限列表"; this._dgvOperatorList.Columns["RightsCollection"].DisplayIndex = 4; this._dgvOperatorList.Columns["RightsCollection"].ReadOnly = true; this._dgvOperatorList.Columns["RightsCollection"].Visible = false; // 设置菜单分隔项 ![]() foreach (DataGridViewRow dgvRow in this._dgvOperatorList.Rows) { // 设置单元格工具栏提示 foreach (DataGridViewCell dgvCell in dgvRow.Cells) { ![]() dgvCell.ToolTipText = "[只读格]"; ![]() dgvCell.ToolTipText = "[可写格]"; } } } } catch (Exception ex) { MessageBox.Show( ex.Message, "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// <summary> /// 将权限集合数据绑定显示到数据视图 /// </summary> /// <param name="rightsCollection">权限集合</param> ![]() ![]() { try { // 保存所有选择单元格 List< ![]() ![]() ![]() ![]() foreach (DataGridViewCell dgvCell in _dgvRightsList.SelectedCells) { selectedCellValueList.Add(dgvCell.Value. ![]() ![]() ![]() } // 将权限集合绑定显示在数据视图中 BindingSource source = ![]() ![]() source.DataSource = rightsCollection.Values; this._dgvRightsList.DataSource = source; // 设置中文列名及可写状态 this._dgvRightsList.Columns["Id"].HeaderText = "编号"; this._dgvRightsList.Columns["Id"].ToolTipText = "[只读列]"; this._dgvRightsList.Columns["Id"].ReadOnly = true; this._dgvRightsList.Columns["Id"].DisplayIndex = 0; this._dgvRightsList.Columns["RightsCaption"].HeaderText = "权限标题"; this._dgvRightsList.Columns["RightsCaption"].DisplayIndex = 1; this._dgvRightsList.Columns["ModelName"].HeaderText = "内部名称"; this._dgvRightsList.Columns["ModelName"].ToolTipText = "[只读列]"; this._dgvRightsList.Columns["ModelName"].ReadOnly = true; this._dgvRightsList.Columns["ModelName"].DisplayIndex = 2; this._dgvRightsList.Columns["RightsState"].HeaderText = "权限状态"; this._dgvRightsList.Columns["RightsState"].DisplayIndex = 3; this._dgvRightsList.Columns["ParentLevelRightsName"].HeaderText = "父级权限"; this._dgvRightsList.Columns["ParentLevelRightsName"].ToolTipText = "[只读列]"; this._dgvRightsList.Columns["ParentLevelRightsName"].ReadOnly = true; this._dgvRightsList.Columns["ParentLevelRightsName"].DisplayIndex = 4; // 设置菜单分隔项 ![]() foreach (DataGridViewRow dgvRow in this._dgvRightsList.Rows) { // 如果是菜单分隔项则设置为只读 ![]() ![]() ![]() ![]() ![]() dgvRow.Cells["RightsCaption"].ReadOnly = true; // 设置单元格工具栏提示 foreach (DataGridViewCell dgvCell in dgvRow.Cells) { ![]() { dgvCell.ToolTipText = "[只读格]"; ![]() ![]() ![]() ![]() ![]() dgvCell.ToolTipText ![]() } ![]() dgvCell.ToolTipText = "[可写格]"; } } // 禁用关联选择 RightsManagerUI.IsRelatingChooseCells = false; // 清除所有单元格选择 _dgvRightsList.ClearSelection ![]() // 还原原有选择 foreach ( ![]() { foreach (DataGridViewRow dgvRow in _dgvRightsList.Rows) { foreach (DataGridViewCell dgvCell in dgvRow.Cells) { ![]() ![]() ![]() ![]() ![]() dgvCell.Selected = true; } } } // 启用关联选择 RightsManagerUI.IsRelatingChooseCells = true; } catch (Exception ex) { MessageBox.Show( ex.Message, "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// <summary> /// 将数据绑定加载到树形视图 /// </summary> /// <param name="rightsCollection">权限集合</param> ![]() ![]() { // 禁用树视图 ![]() _tvRightsView.BeginUpdate ![]() // 清除原有节点 _tvRightsView.Nodes.Clear ![]() // 遍历权限集合以加载数据 foreach (Model.Rights tmpRights in rightsCollection.Values) { // 定义权限根项 TreeNode rootTreeNode = null; // 如果是权限根项 ![]() ![]() { rootTreeNode = ![]() rootTreeNode.Tag = tmpRights.ModelName; rootTreeNode.Checked = tmpRights.RightsState; _tvRightsView.Nodes.Add(rootTreeNode); } // 如果是权限子项 ![]() { // 创建权限子项 TreeNode childTreeNode = ![]() childTreeNode.Tag = tmpRights.ModelName; childTreeNode.Checked = tmpRights.RightsState; // 将子项添加到对应 ![]() foreach (TreeNode tmpTreeNode in _tvRightsView.Nodes) { // 如果和现存 ![]() ![]() ![]() ![]() ![]() { // 递归添加所有层级子节点 tmpTreeNode.Nodes.Add(LoadAllChildTreeNode(childTreeNode, rightsCollection)); } } } } // 展开所有树节点 _tvRightsView.ExpandAll ![]() // 启用树视图 ![]() _tvRightsView.EndUpdate ![]() } /// <summary> /// 选中/取消树节点及其子节点勾选状态 /// </summary> /// <param name="currentTreeNode">当前操作 ![]() ![]() { // 如果有选中单元格 ![]() { // 保存当前选中行 ![]() ![]() ![]() ![]() ![]() // 同步权限状态 RightsManagerUI.OperatorCollection[operatorName].RightsCollection[currentTreeNode.Tag. ![]() ![]() // 同时选中/取消子节点 ![]() foreach (TreeNode childTreeNode in currentTreeNode.Nodes) { // 同步子节点勾选状态 childTreeNode.Checked = currentTreeNode.Checked; // 递归勾选下层子节点 CheckOrUnCheckTreeNode(childTreeNode); } } } /// <summary> /// 加载操作员列表 /// </summary> ![]() ![]() { BLLFactory.BLLFactory bllFactory = ![]() ![]() IBLL.IOperatorManager operatorManager = bllFactory.BuildOperatorManager ![]() // 加载操作员列表 try { RightsManagerUI.OperatorCollection = operatorManager.GetAllOperatorInfo ![]() // 检查所有操作员 ![]() foreach (Model.Operator tmpOperator in RightsManagerUI.OperatorCollection.Values) { // 如果权限为空就创建 ![]() ![]() ![]() ![]() { tmpOperator.RightsCollection = ![]() ![]() ![]() // 创建权限管理类例子 Common.RightsMenuDataManager rmdManager = ![]() ![]() // 创建权限集合空结构 tmpOperator.RightsCollection = rmdManager.ReadMenuRightsItem(_msMain, tmpOperator.RightsCollection); } } // 如果包含操作员信息 ![]() { // 将操作员集合数据绑定显示到数据视图 BindOperatorInfoToDataGridView(RightsManagerUI.OperatorCollection); // 重新指定当前登录操作员对象 foreach (Model.Operator tmpOperator in RightsManagerUI.OperatorCollection.Values) { ![]() ![]() { RightsManagerUI.CurrentOperator = RightsManagerUI.OperatorCollection[RightsManagerUI.CurrentOperator.ModelName]; // 将数据绑定显示到数据视图 BindDataToDataGridView(RightsManagerUI.CurrentOperator.RightsCollection); // 将数据绑定加载到树形视图 BindDataToTreeView(RightsManagerUI.CurrentOperator.RightsCollection); // 在操作员列表中选中当前操作员 foreach (DataGridViewRow dgvRow in _dgvOperatorList.Rows) { ![]() ![]() ![]() ![]() ![]() { dgvRow.Selected = true; ![]() } } ![]() } } } ![]() { // 清空操作员列表 ![]() DgvOperatorList.Rows.Clear ![]() } } catch (Exception ex) { MessageBox.Show( ex.Message, "加载失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } #endregion } } 4、文章结语 以上内容并未提供完整 ![]() ![]() ![]() ![]() ![]() ( ![]() 1、将集合对象存储到数据库中(先使用序列化将集合对象流化 ![]() ![]() ![]() 2、使用递归法解析菜单对象及应用权限菜单项 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 3、BindingSource 界面数据绑定对象 和 DataGridView 数据视图Control控件 ![]() ![]() ![]() ![]() ![]() 4、TreeView 树形视图Control控件 ![]() ![]() ![]() 5、隶属于多个权限组 ![]() ![]() ![]() ![]() ![]() ![]() ( 2)扩展研究 此外 ![]() ![]() ![]() ![]() ![]() ![]() ![]() 1、让管理员用户完全自定义各个操作员 ![]() ![]() 2、让权限菜单项在禁用时同时将该项 ![]() ![]() ![]() ![]() ![]() ![]() 3、让管理员自由选择使用基于用户或基于角色 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 0
相关文章
读者评论发表评论 |