一、首先我们需要有三张基础表

1.用户表(Account):包含用户id、登录名、密码、手机号、邮箱、创建时间、账户状态(停用或启用)、备注。

2.角色表(Roles):不同的角色代表了不同的权限, 字段:角色id、角色名、角色信息(不是必要)、角色状态(停用或启用)、备注。

3.菜单表(Menus):不同的菜单进入的页面具有不同的功能,字段:菜单id、菜单名称、跳转url、是否菜单(因为有些地方可能会把添加模块作为一个单独的页面,而又不希望其直接出现在系统的侧边栏里面,当然我一般使用弹框做添加数据)、菜单icon图标(不必要)、备注、二级菜单id。

二.有了三张基础表后,我们需要思考三张表之间有怎样的关系。

用户——角色——菜单:

1、用户面对角色:一个用户可以有多个角色,一个角色也可以有多个用户,但一般我们只分配一个角色。所以也可以在用户表中再加一个角色id,不过我这里设计的是一个用户可以有多个角色的情况,所以是多对多的。

那么就需要有一个用户角色关联表(AccountRoles):关联id、用户id、角色id

2、角色面对菜单:一个角色可以有多个菜单,一个菜单也可以被多个角色拥有。所以也是多对多的关系。

那么就要有角色菜单关联表(RoleMenus):关联id、角色id、菜单id

到这里数据库的设计就完成了。

总体的关系图就是这样的

三、模拟一个场景

在登录成功之后,我们可以根据用户的id去查询它对应的角色,再查出角色对应的菜单,然后在页面渲染菜单集合。就实现了不同用户进入系统得到的是不同的菜单。

首先用户不直接面对菜单,而是面对角色,而角色拥有菜单,这样用户就间接的拥有了菜单。并且如果我们想给用户新增一个菜单时,只需要给对应的角色多分配一个菜单就可以了。同时如果用户在地址栏强行改url跳转时,也可以通过过滤器对其进行验证,判断是否拥有此菜单。

四、一级菜单和二级菜单的实现

然后重点说一下一级菜单和二级菜单怎么区分,以及怎么把二级菜单归属到一级菜单中:

首先我们知道,一级菜单是直接显示在侧边栏的,而二级则在一级菜单的下面,如:

那么如果数据库中只有二级菜单,而这些二级菜单都没有所属的一级菜单,是无法显示出来的。但一级菜单下面却可以不需要一定有二级菜单。

回过来看数据库,我们最后有一个pid,用来判断是否是一级还是二级,拟定0为一级,那么不为0的都为二级,那如何判断二级是属于哪个一级下面的呢,这时我们可以把二级的pid设定为一级菜单的MenuID,如图,账户管理、角色管理、菜单管理的pid都是10,而10是一级菜单权限管理的MenuID。

然后可以看我的数据

用户表

用户有一个角色,这个角色是超级管理员

这个角色对应的菜单

我们需要渲染在页面上的时候可以封装一个类

public class ResultMenu{public string MenuName { get; set; }public string MenuUrl { get; set; }public string MenuRemark { get; set; }public List<ResultMenu> SubMenu { get; set; }}

递归获取菜单

protected List<ResultMenu> GetMenu(List<Menu> menus){List<ResultMenu> resultMenus = new List<ResultMenu>();// 顶级菜单var pMenus = menus.Where(x => x.Pid == 0).ToList();foreach (var itemMenu in pMenus){ResultMenu resultMenu = new ResultMenu{MenuName = itemMenu.Name,MenuRemark = itemMenu.Remark,MenuUrl = itemMenu.Url,SubMenu = GetChildrenMenu(itemMenu.MenuId, menus)};resultMenus.Add(resultMenu);}return resultMenus;}/// <summary>/// 获取子菜单/// </summary>/// <param name="mid">菜单id</param>/// <param name="menus">角色拥有的所有菜单</param>/// <returns></returns>protected List<ResultMenu> GetChildrenMenu(int mid,List<Menu> menus){List<ResultMenu> resultMenus = new List<ResultMenu>();// 获取子菜单var childrenMenus = menus.Where(x => x.Pid == mid).ToList();foreach (var itemMenu in childrenMenus){ResultMenu resultMenu = new ResultMenu{MenuName = itemMenu.Name,MenuRemark = itemMenu.Remark,MenuUrl = itemMenu.Url,SubMenu = GetChildrenMenu(itemMenu.MenuId, menus)};resultMenus.Add(resultMenu);}return resultMenus;}

最后得到这样的数据格式

需要源码的可以加.net core学习交流群:831181779,在群里@群主即可

简单的权限管理系统——数据库设计和实现相关推荐

  1. 权限管理系统数据库设计的简单构思

    最近在工作中接触到权限管理的设计,于是,自己在网上查阅了部分资料,再加上自己的一些思考,构思了一个简单的权限管理系统的数据库设计. RBAC与Tag 说到权限管理,一般都会想到基于角色的访问控制(Ro ...

  2. 用户权限管理系统数据库设计UML

    建表语句: https://pan.baidu.com/s/10rswkItk6cKq4ben361AJg  密码 :gdld

  3. SQL——一种简单的基于角色控制的权限管理数据库设计DEMO

    -- ---------------------------- -- Table structure for resource -- ---------------------------- DROP ...

  4. 电影院票务管理系统数据库设计(1)

    这两天听到一道面试题:设计一个电影院票务管理系统的表结构. 挺有意思的,我自己也试着做了一做,感觉还是有不少收获的.在本文中我想把做这道题的整个思路重新理一下,也算做个整理了. 现在能得到的需求只有一 ...

  5. 电影院票务管理系统数据库设计(2)

    在电影院票务管理系统数据库设计(1)中我们从一道面试题展开,最后给出如下影院票务管理系统的表关系图 以上的设计是否易用? 首先想一下订票最简单的过程,不包括意外情况. 顾客先来到柜台,跟柜台服务员说要 ...

  6. 固定资产管理mysql_固定资产管理系统数据库设计

    固定资产管理系统数据库设计 如何看待固定资产管理系统数据库设计呢?近年来越来越多的企业在资产管理方面投入着更多的精力,主要就是因资产管理是企业生产经营活动中比较重要的环节.而其中固定资产又是企业中资产 ...

  7. 医院管理系统数据库设计

    医院管理系统数据库设计 数据库名:hisdb 一基本信息表 1.科室表(keshi) 字段名 中文名 类型 能否为空 备注 ID 科室编号 Int N 主键,自增 Name 科室名称 Varchar ...

  8. 毕业设计管理系统 数据库设计

    毕业设计管理系统 数据库设计 一.需求分析 1.1 可行性分析 1.1.1经济可行性 该管理系统的设计使用的是 Microsoft SQL Server2016数据库开发平台进行代码编写.运行和调试, ...

  9. 学生成绩管理系统数据库设计--MySQLSQL Server

    MySQL 数据库设计-学生成绩管理系统 设计大纲 友情链接 1.医疗信息管理系统数据库–MySQL 2.邮件管理数据库设计–MySQL 3.点餐系统数据库设计–SQL Server 4.商品管理系统 ...

  10. 学生管理系统的mysql数据库设计_MySQL 数据库 -- 学生管理系统数据库设计

    MySQL 数据库 -- 学生管理系统数据库设计 目录 学生管理系统数据库设计 学生管理系统功能介绍 数据库设计步骤 第 1 步: 找对象 第 2 步: 找属性 第 3 步: 找关系 建表遵守原则 第 ...

最新文章

  1. PHP Session变量
  2. 过程控制系统模拟信号标准
  3. 【机器视觉】 repeat算子
  4. C语言学习及应用笔记之三:C语言const关键字及其使用
  5. 渗透测试入门3之隐匿攻击
  6. [偏序关系与CDQ分治]【学习笔记】
  7. 高级着色语言HLSL入门(5)
  8. mysql数据库优化6_mysql数据库优化
  9. 计蒜客·中国邮递员问题
  10. sql CASE WEN 函数
  11. GEO数据挖掘(学习笔记)
  12. 17分钟过桥,过桥最短时间问题
  13. python计算时差
  14. 20201224 windows10下多显示器在多虚拟桌面下如何保持某个显示器一直显示相同的内容
  15. 在线头像制作网站FaceYourManga
  16. iOS中WKWebView清除cookies
  17. 三十岁仍一事无成,一个失败工程师的自白
  18. 2010年新版俏皮话
  19. AutoSAR系列讲解(实践篇)10.2-EcuM的上下电流程
  20. 如何给PDF文件添加页眉页脚,一分钟轻松搞定

热门文章

  1. Python实现电影抢票系统需要几行代码?猜对有奖
  2. android怎么安装apk文件,apk文件怎么安装?如何安装apk文件
  3. 品优购psd文档分享
  4. 2021年中国银行业金融机构普惠型小微企业贷款情况分析:贷款余额不断增加,增速也不断下降[图]
  5. 显卡RTX2080 + CUDA10 + win10 + tensorflow配置安装探坑记
  6. Flutter:视频全屏切换
  7. <毕业设计>最适合大学生的12个Java系统项目(附源码)
  8. 计算机专业wor知识,计算机专业毕业实习日记精选
  9. 三角网格上高斯曲率和平均曲率
  10. HTML鼠标移到a上面让a变色