bootstrap adminlte教程3:实现菜单权限管理菜单树
首先identity就有权限控制,可我们要让不同的人登录进后台,能看见不同的菜单。有没有权限操作是一个,看不看得见是另一个要求。
一、模型设计:
1.先建 Menu模弄,在Models下新建Menu.cs 模型。
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace jsdhh2.Models { public class Menu { /// <summary> /// 菜单ID /// </summary> [Display(Name = "菜单id")] public string Id { get; set; } /// <summary> /// 上级ID /// </summary> [Display(Name = "上级菜单Id")] public string ParentId { get; set; } /// <summary> /// 名称 /// </summary> [Display(Name = "菜单名称")] public string Name { get; set; } /// <summary> /// URL /// </summary> [Display(Name = "菜单网址")] public string Url { get; set; } /// <summary> /// 排序越大越靠后 /// </summary> [Display(Name = "排序数字")] public int Order { get; set; } /// <summary> /// 菜单类型,后其比如是1为菜单,2为按钮,3为模块,这样来。提前考虑。 /// </summary> [Display(Name = "类型")] public string MenuType { get; set; } /// <summary> /// 这个地方,是为了更好接轨adminlte,以后可以在这输入你自己的class,达到LI样式的变化 /// </summary> /// [Display(Name = "菜单样式")] public string MenuCss { get; set; }
/// <summary> /// 这个地方,就是为了达到显示LI菜单前的图标的作用。 /// </summary> [Display(Name = "菜单图标")]
public string MenuIcon { get; set; }
/// <summary>
/// 菜单后面的samall,对应adminlte看,主要为了后期增加个性化菜单使用。
///</summary>
[Display(Name = "小标样式")]
public string MenuSmallCss{ get; set; }
[Display(Name = "小标内容")]
public string MenuSmallValue { get; set; }
public string Code { get; set; } } }
2.再新建一个MenuRole模型,就是角色对应的菜单模型。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnnotations; namespace jsdhh2.Models { public class MenuRole {
[Key]
public int Id { get; set; }
/// <summary> /// 菜单ID作引 /// </summary> public string MenuId { get; set; } /// <summary> /// 角色名字 /// </summary> public string RoleName { get; set; } } }
在这,我没有象其他人一样使用roleId来,而是直接使用了roleName 字段哩,原因我是新手菜鸟,我好多地方都 引用了roleName的Session,我随时可以用当前RoleName进行与表查询,不用再读Role表了,同时我觉得写的时候 方便。
3.建立上下文。
在DAL文件夹下,新建一个:OaDALContent.cs的上下文
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Web; using jsdhh2.Models; namespace jsdhh2.DAL { public class OaDALContent : DbContext { public OaDALContent() : base("MyOaContent") { } public DbSet<Menu> Menus { get; set; } public DbSet<MenuRole> MenuRoles { get; set; } } }
然后准备first code了。
先生成一次解决方案。
然后点上面调测按钮。
调测,使用用户名登录,晕,数据库中竟然 没有新增表,看来得先建控制器才能达到FIRTST CODE了。
4.新建一个控制器,我要使用异步的,同时是基架好的,难得麻烦,他会帮我生成我要的编辑呀之类的菜单,直接新建一个Menu控制器。
然后我们再重新生成解决方案
再调测。
登录系统 后,我们再在地址栏中改一下:
http://localhost:55850/Menus/index 回车,强制他访问一下。
然后我们进数据库看一下。
看见了,果然成功first code,我们会发现Menus视图下,自动生成了详细,编辑,新建,删除等功能,就简单多了,对于新手来说
我们先建一个一级菜单:系统设置。(这是为了SuperAdmin来设计的,主要是实现一些系统 的权限设置)
我们会发现我们新建失败,思考一下,肯定是ID为字符串,要GUID,所以得改一下模型和控制器代码。
我没有用GUID,我是使用将时间设为STRIN,作为主键 的方式。更改后,在Create视图中,删除ID的输入框,控制器代码如下
// POST: Menus/Create // 为了防止“过多发布”攻击,请启用要绑定到的特定属性,有关 // 详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkId=317598。 [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Create([Bind(Include = "ParentId,Name,Url,Order,MenuType,MenuCss,MenuIcon,MenuSmallCss,MenuSmallValue,Code")] Menu menu) { DateTime dt = DateTime.Now; string str = dt.ToString("yyyyMMddHHmmss"); //设置ID的样式。 menu.Id = str; //给模型赋值。 if (ModelState.IsValid) { db.Menus.Add(menu); await db.SaveChangesAsync(); return RedirectToAction("Index"); } return View(menu); }
添加测试成功: