Dev 简易权限管理

目标:对DEV的RibbonControl进行简易的权限

因为是简易版所以不涉及角色管理,数据库只建立user和function两个表,结构简单紧做参考。

Dev 简易权限管理

user表

用户的权限信息以字符串存储在functionlist字段里。(格式为:“functionId;functionId”)

function表

存储RibbonControl,functionId控件ID,pId控件父级ID,functionName存储控件名称,annotation存储显示文本。

定义用户权限窗口

说明:权限treeview会列出展示的所以权限,管理员勾选选择开通。

Dev 简易权限管理

用户权限获取逻辑代码

internal List<String> CurrentUserFunctions()
        {
            List<string> result = new List<string>();
            using (JTDataClassesDataContext db = new JTDataClassesDataContext())
            {
                if (DataTableInMemory.datas.CurrentUser.functionlist == null) return null;
                string[] functions = DataTableInMemory.datas.CurrentUser.functionlist.Split(';');
                CheckFuncitons(ref functions);
                var q = from c in db.ZJ_T_FUNCTION
                        where functions.ToList().Contains(c.functionId.ToString())
                        select c;
                q.ToList().ForEach(p => result.Add(p.functionName));
                return result;
            }            
        }
        /// <summary>
        /// 因为权限定义规则是abc三级,c级显示是,上两级也要显示
        /// 以后跟扩展为aabbcc三级
        /// </summary>
        /// <param name="functions"></param>
        private void CheckFuncitons(ref string[] functions)
        {
            List<string> tempFunctions = new List<string>();
            foreach (string item in functions)
            {
                if (!tempFunctions.Contains(item))
                {
                    tempFunctions.Add(item);
                    if (Convert.ToInt32(item) % 10 != 0)
                    {
                        string p1 = item.Substring(0, 2) + "0";
                        if (!tempFunctions.Contains(p1))
                        {
                            tempFunctions.Add(p1);
                        }
                        string p2 = item.Substring(0, 1) + "00";
                        if (!tempFunctions.Contains(p2))
                        {
                            tempFunctions.Add(p2);
                        }
                    }
                }
            }
            functions = tempFunctions.ToArray();
        }

主窗口中调用显示

private void SetCurrentUserFunctions()
        {
            
            if (DataTableInMemory.datas.IsAdmin)
            {//该功能仅仅为管理员提供
                ribbonPageGroup4.Visible = true;
                barHeaderItemUserName.Caption = DataTableInMemory.datas.AdminUser.userName;
                return;
            }
            barHeaderItemUserName.Caption = DataTableInMemory.datas.CurrentUser.userName;
            List<string> toolsVisibleData = new List<string>();
            toolsVisibleData = new dao.FunctionsDao().CurrentUserFunctions();
            foreach (RibbonPage rpPage in this.ribbonControl1.Pages)
            {
                rpPage.Visible = toolsVisibleData.Contains(rpPage.Name) ? true : false;
                if (rpPage.Visible)
                {
                    foreach (RibbonPageGroup rpgPageGroup in rpPage.Groups)
                    {
                        rpgPageGroup.Visible = toolsVisibleData.Contains(rpgPageGroup.Name) ? true : false;
                        if (rpgPageGroup.Visible)
                        {
                            foreach (BarItemLink bbilLink in rpgPageGroup.ItemLinks)
                            {
                                bbilLink.Visible = toolsVisibleData.Contains(bbilLink.Item.Name) ? true : false;
                                
                            }
                        }
                    }
                }
            }
        }