Пример #1
0
        /// <summary>
        /// 根据权限拥有者类别ID重新设定权限
        /// </summary>
        /// <param name="sysId"></param>
        /// <param name="privilegeMaster"></param>
        /// <param name="IDs">包括菜单、按钮编号</param>
        /// <param name="userName">当前操作用户</param>
        /// <returns></returns>
        public bool SetMenuPrivilege(string sysId, PrivilegeMaster privilegeMaster, string[] IDs, string userName)
        {
            //获取所有菜单
            IEnumerable <SysMenu> allMenus = menuRepository.GetList();
            //获取所有按钮
            IEnumerable <SysButton> allButtons = buttonRepository.GetList();

            //存储传入的menuId集合
            List <string> menus = (from menu in allMenus where IDs.Contains(menu.SysId) select menu.SysId).ToList();

            //存储传入的buttonId集合
            List <string> buttons = (from button in allButtons where IDs.Contains(button.SysId) select button.SysId).ToList();

            using (IDbTransaction tran = privilegeRepository.Connection.BeginTransaction())
            {
                //根据用户ID获取原来用户可用菜单
                //用于和现在选中的菜单进行判断,是否屏蔽原来可用菜单
                IEnumerable <SysMenu> userMenus = ServiceFactory.MenuService.GetPrivilegedSysMenuByUserId(sysId);

                this.privilegeRepository.DeleteSysPrivilegeByMaster(sysId, privilegeMaster, tran);

                #region 如果是用户权限,先将用户和角色的权限进行对比,将用户禁用而角色启用的菜单和按钮设置为禁用
                if (privilegeMaster == PrivilegeMaster.User)
                {
                    #region 设置菜单禁用
                    foreach (SysMenu userMenu in userMenus)
                    {
                        if (!menus.Contains(userMenu.SysId))
                        {
                            SysPrivilege sysPrivilege = new SysPrivilege
                            {
                                PrivilegeAccess    = PrivilegeAccess.Menu,
                                PrivilegeAccessKey = userMenu.SysId,
                                PrivilegeMaster    = privilegeMaster,
                                PrivilegeMasterKey = sysId,
                                PrivilegeOperation = PrivilegeOperation.Disable,
                                RecordStatus       = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName)
                            };

                            int addResult = privilegeRepository.Add(sysPrivilege, tran);

                            if (addResult == 0)
                            {
                                tran.Rollback();
                                return(false);
                            }

                            #region 设置按钮禁用
                            if (userMenu.Buttons != null)
                            {
                                foreach (SysButton button in userMenu.Buttons)
                                {
                                    if (!buttons.Contains(button.SysId))
                                    {
                                        SysPrivilege sysPrivilegeBt = new SysPrivilege
                                        {
                                            PrivilegeAccess    = PrivilegeAccess.Button,
                                            PrivilegeAccessKey = button.SysId,
                                            PrivilegeMaster    = privilegeMaster,
                                            PrivilegeMasterKey = sysId,
                                            PrivilegeOperation = PrivilegeOperation.Disable,
                                            RecordStatus       = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName)
                                        };

                                        addResult = privilegeRepository.Add(sysPrivilege, tran);

                                        if (addResult == 0)
                                        {
                                            tran.Rollback();
                                            return(false);
                                        }
                                    }
                                }
                            }
                            #endregion
                        }
                    }
                    #endregion
                }
                #endregion

                #region 角色权限,只存储可用菜单,不进行和现在选中菜单判断
                foreach (string menu in menus)
                {
                    SysPrivilege sysPrivilege = new SysPrivilege
                    {
                        PrivilegeAccess    = PrivilegeAccess.Menu,
                        PrivilegeAccessKey = menu,
                        PrivilegeMaster    = privilegeMaster,
                        PrivilegeMasterKey = sysId,
                        PrivilegeOperation = PrivilegeOperation.Enable,
                        RecordStatus       = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName)
                    };

                    int addResult = privilegeRepository.Add(sysPrivilege, tran);

                    if (addResult == 0)
                    {
                        tran.Rollback();
                        return(false);
                    }

                    #region 存储菜单下不可用按钮

                    var menuBts = allButtons.Where(x => x.MenuId == menu);

                    menuBts = menuBts.Where(x => (!buttons.Contains(x.SysId)));
                    foreach (SysButton sysButton in menuBts)
                    {
                        sysPrivilege = new SysPrivilege
                        {
                            PrivilegeAccess    = PrivilegeAccess.Button,
                            PrivilegeAccessKey = sysButton.SysId,
                            PrivilegeMaster    = privilegeMaster,
                            PrivilegeMasterKey = sysId,
                            PrivilegeOperation = PrivilegeOperation.Disable,
                            RecordStatus       = string.Format("创建时间:{0},创建人:{1}", DateTime.Now, userName)
                        };

                        addResult = privilegeRepository.Add(sysPrivilege, tran);

                        if (addResult == 0)
                        {
                            tran.Rollback();
                            return(false);
                        }
                    }

                    #endregion
                }
                #endregion

                tran.Commit();
                return(true);
            }
        }