/// <summary> /// 将模块表中的权限值更新为角色所拥有的权限 /// </summary> private void FillRolePermissions(List <RoleModuleDto> roleModules) { // 系统具有的所有模块(必须是应用层面的DTO) roleAllModules = PropertyHelper.Modules.MapTo <List <ModuleDto> >(); ModuleDto sys = roleAllModules.Find(q => q.ModuleName == "系统管理"); //非系统管理员不可使用系统管理 if (tvRole.FocusedNode.GetDisplayText("RoleName") != "系统管理员" && sys != null) { roleAllModules.RemoveAll(q => q.ParentID == sys.ID); roleAllModules.Remove(sys); } // 根据角色对模块的使用权限,给模块赋值 for (int i = roleAllModules.Count - 1; i >= 0; i--) { RoleModuleDto dto = roleModules.Find(h => h.ModuleName == roleAllModules[i].ModuleName); if (dto != null) { roleAllModules[i].Permissions = dto.Permissions; // 模块内具体操作的使用权限 roleAllModules[i].Enabled = dto.Enabled; // 模块是否可用 } else if (PropertyHelper.CurrentUser.RoleName == "超级管理员" || PropertyHelper.RoleModules.Exists(h => h.ModuleName == roleAllModules[i].ModuleName && h.Enabled)) { roleAllModules[i].Permissions = 0; roleAllModules[i].Enabled = false; } else if (PropertyHelper.CurrentUser.RoleName != "超级管理员" && roleAllModules[i].ParentID != null) { roleAllModules.RemoveAt(i);//当前用户的角色没有的权限不可见 } } //儿子不可用,父亲也不可用 List <ModuleDto> parents = roleAllModules.Where(q => q.ParentID == null).ToList(); parents.ForEach(q => { if (roleAllModules.Count(t => t.ParentID == q.ID) == 0) { roleAllModules.Remove(q); } }); // 保存修改前的副本 oldRoleAllModules = new List <ModuleDto>(); oldRoleAllModules = roleAllModules.MapTo <List <ModuleDto> >(); // 给模块权限表关联数据源 tvPermission.DataSource = roleAllModules; // 展开树形目录 tvPermission.ExpandAll(); if (tvRole.FocusedNode.GetDisplayText("RoleName") == "系统管理员" && PropertyHelper.CurrentUser.RoleName != "超级管理员") { tvPermission.OptionsView.ShowCheckBoxes = false;//没用? tvPermission.OptionsBehavior.ReadOnly = true; btnSave.Enabled = false; } else { tvPermission.OptionsView.ShowCheckBoxes = true; btnSave.Enabled = true; tvPermission.OptionsBehavior.ReadOnly = false; tvPermission.Columns["ModuleName"].OptionsColumn.AllowEdit = false; tvPermission.Columns["ModuleTag"].OptionsColumn.AllowEdit = false; } // 迭代执行节点对应模块的权限设置 tvPermission.NodesIterator.DoOperation(new InitialStateTreeListOperation()); // 根据子模块的权限选择情况确定父模块的选中状态 foreach (TreeListNode node in tvPermission.Nodes) { int checkedNum = 0; // 遍历该模块下子模块的选中情况 foreach (TreeListNode no in node.Nodes) { if (no.Checked) { checkedNum++; } } if (checkedNum == 0) { // 子模块都未选中 node.CheckState = CheckState.Unchecked; } else if (checkedNum == node.Nodes.Count) { // 子模块全选中 node.CheckState = CheckState.Checked; } else { // 子模块部分选中 node.CheckState = CheckState.Indeterminate; // 半选状态 } } }
private void btnSave_Click(object sender, EventArgs e) { tvModule.CloseEditor(); try { // 发生变化的模块实体 List <ModuleDto> toUpdate = curModules.Except(PropertyHelper.Modules, new Comparer()).ToList(); // 更新角色-模块关系记录 CallerFactory.Instance.GetService <IAuthorityService>().UpdateModules(toUpdate); //若数据库中无系统管理员身份,则添加该身份 RoleDto sysRole = CallerFactory.Instance.GetService <IAuthorityService>().GetAllRoles().Find(q => q.RoleName == "系统管理员"); if (sysRole == null) { //初始化 sysRole = new RoleDto { ID = Guid.NewGuid().ToString("N"), RoleName = "系统管理员", SerialNo = 0 }; CallerFactory.Instance.GetService <IAuthorityService>().AddRole(sysRole); List <RoleModuleDto> dtos = new List <RoleModuleDto>(curModules.Select(q => { RoleModuleDto dto = new RoleModuleDto { // 角色-模块关系实体中的角色信息 RoleId = sysRole.ID, RoleName = sysRole.RoleName, // 角色-模块关系实体中的模块信息 ModuleId = q.ID, Enabled = q.Enabled, ModuleName = q.ModuleName, Permissions = q.Permissions }; return(dto); })); // 更新系统管理员角色-模块关系记录 CallerFactory.Instance.GetService <IAuthorityService>().UpdateRole(dtos); } // 更新当前登录用户的权限信息 PropertyHelper.Modules = CallerFactory.Instance.GetService <IAuthorityService>().GetAllModules(); ////若无系统管理员用户,则增加系统管理员用户 List <UserDto> users = CallerFactory.Instance.GetService <IAuthorityService>().GetRoleUsers("系统管理员"); if (CallerFactory.Instance.GetService <IAuthorityService>().GetRoleUsers("系统管理员").Count == 0) { UserDto user = new UserDto { ID = Guid.NewGuid().ToString("N"), UserCode = "sysadmin", Password = "******", UserName = "******", RoleId = sysRole.ID }; CallerFactory.Instance.GetService <IAuthorityService>().Add(user); } MessageUtil.ShowTips("保存成功!"); } catch (Exception ex) { MessageUtil.ShowError(ex.Message); } }