EasyUIEF6 CodeFirst+Repository+Ninject+MVC四+EasyUI实践(玖)

登录成效

 

  • 我们为系统装置了连个账户admin\杰克,admin具有管理员剧中人物,杰克具有操作员剧中人物,由此五个用户登录后见到的菜单是区别的。用户登录参考代码如下:

      [HttpPost]
      public ActionResult Login(mod_Account model)

        {
            if (null != model){
                if (IS_User.Login(model.UserName, DESEncrypt.Encrypt(model.UserPwd))){
                    System.Web.Security.FormsAuthentication.SetAuthCookie(model.UserName, false);
                    return RedirectToAction("Index", "Main");
                }
                else{
                    return View();
                }
            }
            else{
                return View();
            }
        }
    

 

  • 出于选用Form认证,所以大家还亟需在安顿文件中期维修改一下代码:

      <forms loginUrl="/Account/Login" timeout="2880" protection="All" />
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
    

 

  • 剥离时,须要注销阐明用户,参考代码如下: 

      public ActionResult LoginOut()

        {
            System.Web.Security.FormsAuthentication.SignOut();
            return RedirectToAction("Login", "Account");
        }
    

 

  • 到此,大家做到了此示例的基本作用模块,本示例源码已停放网盘,点此下载。不一样用户登录系统显示的页面结果如下:

  EasyUI 1

  

  EasyUI 2

 

权力设置模块

 

  • 页面使用剧中人物列表和菜单列表勾选的法子,即选用剧中人物后勾选可以操作的菜谱,那样有着才角色的用户就全数操作这一个食谱的权力。界面设置如下:

  EasyUI 3

 

  • 界面采纳的roleID和menuID大家选取字符串的艺术展开拼接。在controller中使用object类型举行收纳,然后实行中间转播后就足以获得传入的值。权限设置的参考代码如下:

       public bool SetPermit(object RoleID, object MenuIDs)

        {
            try
            {
                string[] roleArr = RoleID as string[];
                long roleID = Convert.ToInt64(roleArr[0].ToString());
    
                S_Role role = context.S_Roles.Where(x => x.ID.Equals(roleID)).FirstOrDefault(); //获取角色
                role.S_Menus = new List<S_Menu>();
    
                //删除先前设置的roleID的数据
                List<S_Menu> listdate = context.S_Roles.Where(x => x.ID.Equals(roleID)).FirstOrDefault().S_Menus.ToList();
                foreach (var item in listdate)
                {
                    role.S_Menus.Remove(item);
                }
    
                //写入现有的数据
                string[] MenuArr = MenuIDs as string[];
                string[] MenuArrString = MenuArr[0].ToString().TrimEnd(',').Split(',').ToArray();
                List<long> arr = new List<long>();
                foreach (var item in MenuArrString)
                {
                    arr.Add(Convert.ToInt64(item));
                }
    
                //必须转化为list集合,否则会出现“已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭”错误
                List<S_Menu> query = (from m in context.S_Menus where arr.Contains(m.ID) select m).ToList();
    
                foreach (S_Menu menu in query)
                {
                    role.S_Menus.Add(menu);
                    menu.S_Roles = new List<S_Role>();
                    menu.S_Roles.Add(role);
                }
    
                //EF默认启用了事务提交
                context.SaveChanges();
                return true;
            }
            catch
            {
                return false;
            }
        }
    

 

  • 是因为想要在权力设置成功后可以呈现角色有所操作哪些菜单的权能,因而,大家必要对剧中人物的easyui-datagrid追加点击事件,并且异步加载具有的菜单权限。Easyui-Datagrid自己具有二个很有用的数目方法unselectAll(打消选中当前页全数的行)。但必要停放在当选的菜谱权限在此以前。参考代码如下:

    $(‘#dg’).datagrid({

            onClickRow: function (index, data) {
                var row = $('#dg').datagrid('getSelected');
                if (row) {
                    var RoleID = row.ID;
                    $.ajax({
                        url: '/System/GetPermit',
                        type: 'POST',
                        data: { RoleID: RoleID },
                        success: function (data) {
                            $('#dgMenu').treegrid('unselectAll'); //重新加载
    
                            $('#dgMenu').treegrid({
                                onLoadSuccess: function (dataaa) {
                                    $.each(data, function (index, item) {
                                        $('#dgMenu').treegrid('selectRow', item);  //选中设置的权限
                                    });
                                }});
                        }
                    })}} });
    

 

系统登录用户获得菜单操作权限

 

  • 在我们把权力设置模块形成后就能够使分裂剧中人物的用户登录体系后操作分歧的食谱权限。由于菜单选取的是easyui-tree来绑定的数目,所以我们要求定义三个符合easyui-tree属性的数据模型,那样就能够连串化easyui-tree识别的json数据格式呢。(那和前边的easyui-treegrid使用方法是一律的)。参考代码如下:

      public class mod_S_RoleMenuTree

    {
        public long id { get; set; }   // 节点的ID
        public string text { get; set; }  //节点显示的文字
        public string iconCls { get; set; }
        public string url { get; set; }
        public int treelevel { get; set; }
        //节点状态,有两个值  'open' or 'closed', 默认为'open'. 当为‘closed’时说明此节点下有子节点否则此节点为叶子节点
        public string state { get; set; }
        public List<mod_S_RoleMenuTree> children { get; set; }// 子节点集合
    }
    

 

  • 在MainController中大家得以依据登录的用户名取得该用户角色所怀有的菜系权限。由于此示例的菜系只设置了两级,所以未有做递归。假设须要多级菜单,能够参照上壹篇作品将以下措施修改成递归方法,参考代码如下:

      public ActionResult GetRoleMenus()

        {
            string strUser = System.Web.HttpContext.Current.User.Identity.Name;
            List<S_Menu> listData = IS_Role.GetRoleMenus(strUser);
    
            var listDataParent = listData.Where(x => x.PID.Equals(null)).OrderBy(x => x.SerialNO);
    
            List<mod_S_RoleMenuTree> DataModel = new List<mod_S_RoleMenuTree>();
    
            foreach (var item in listDataParent)
            {
                mod_S_RoleMenuTree model = new mod_S_RoleMenuTree();
                model.id = item.ID;
                model.text = item.MenuName;
                model.iconCls = item.Icon;
                model.state = "open";
                model.url = item.Link;
                model.treelevel = item.Level;
                model.children = new List<mod_S_RoleMenuTree>();
    
                var children = listData.Where(x => x.PID.Equals(item.ID)).OrderBy(x => x.SerialNO);
                foreach (var childitem in children)
                {
                    mod_S_RoleMenuTree childmodel = new mod_S_RoleMenuTree();
                    childmodel.id = childitem.ID;
                    childmodel.text = childitem.MenuName;
                    childmodel.iconCls = childitem.Icon;
                    childmodel.state = "open";
                    childmodel.url = childitem.Link;
                    model.treelevel = childitem.Level;
                    model.children.Add(childmodel);
                }
    
                DataModel.Add(model);
            }
    
            return Json(DataModel, JsonRequestBehavior.AllowGet);
        }

 

  • 再将MainController中的Index视图中的获取菜单数据的代码替换到以下代码,那样我们能够动态从数据库中读取菜单,而不是平素读取json文件。

     

    前言

     

    • 这一篇大家将形成系统的权能设置功能以及不一致脚色用户登录种类后动态加载菜单。注意:此示例权限只针对菜单级,要是园友须求更扑朔迷离的种类权限设置,能够开始展览到按钮级或属性级。
    • 用户的报到使用Form认证来贯彻,那样能够使得地预防非授权用户或页面链接对系统造成不安全的操作。