Example #1
0
        /// <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; // 半选状态
                }
            }
        }
Example #2
0
        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);
            }
        }