欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: 袁鸣凯

一、权限系统

这一天将报告一个根基的基于数据库的权限打点系统的设计,在这一天的课程的最后将报告“阁下值无限分类实现算法”如何来优化“系统菜单”的布局而了却。本日的内容和前几天的基本框架是一样的它们都属于基本常识,在这些基本常识上还可以扩展出无数的变种与进化设计。

二、先来看客户的一个需求

2.1 用户实际需求

  1. 所有的用户、脚色可动态设置
  2. 所有的系统菜单的权限要求详细到“增,删,改、查、打印、导出”这样的小权限的设计
  3. 所有的权限基于脚色来举办分别和判定
  4. 一个用户大概属于多个脚色
  5. 系统菜单也可以或许动态的“增、删、改、查”

2.2 系统权限菜单样例

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC424410-1R59.jpg" />

三、基于数据库的系统权限表设计

3.1 ER(Entity Relationship)图

环绕上述需求,我们可以在数据库内举办如下的表设计,下面直接给出ER图:

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC4341P-2U60.jpg" />

 

3.2 表干系详解

上述设计有6张表,个中:

T_User表

用于存放用户信息,此处只存放基本信息

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC4560-32021.jpg" />

T_Role表

用于存放系统脚色信息

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC4H620-442U.jpg" />

T_User_Role表

用于存放系统用户与脚色的匹配干系

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC494U0-5Y04.jpg" />

T_Sys_Menu表

这张就是用于存放系统菜单的表了,这张表的设计主要利用了如下的表设计能力:

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC524550-C006.jpg" />

留意这边的MENU_ID与MENU_PID

假如这个菜单项是一级菜单,那么我们把它的MENU_PID设为0

假如这个菜单是另一个菜单的子菜单,那么我们就把它的MENU_PID设为它的父菜单的MENU_ID。

有了这样的布局,我们一个递归就能把这颗“树”显示出来了,是不是?

此处以Oracle数据库为例,不利用递归,直接把树形布局在数据库中就造型造好(虽然,尚有更好的要领如:有人喜欢设level可能是deep这样的字段来简化措施理会树型布局菜单,稍后我们会来讲一个基础不需要用递归的树型菜单的设计来最洪流平优化设计。)

显示整颗树型菜单布局的Oracle语句:

SELECT *FROM T_SYS_MENU

STARTWITH MENU_PID=0

CONNECTBYPRIOR MENU_ID=MENU_PID

orderby MENU_ID

 假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC54VP-NI0.jpg" />

上述语句,已经用数据查询用句就将我们的这个“树”的条理干系理出来了,假如我们手上有一个控件叫dtree.js,那么一个轮回就可以把这个树显示出来了,不是吗?

来看dtree.js的应用

//公式:  d.add(menu_id, menu_pid, ‘menudescr’, ‘menu_url’);

d = new dTree('d');

                   d.add(0,-1,'菜单');

                   d.add(1,0,'报表查询','example01.html');

                   d.add(2,1,'月报','example01.html');

                   d.add(3,1,'季报','example01.html');

                   d.add(4,1,'年报','example01.html');

                   d.add(5,0,'系统打点','example01.html');

                   d.add(6,5,'用户打点','example01.html');

                   d.add(7,6,'新增用户','example01.html');

                   d.add(8,6,'删除用户','example01.html');

              d.add(9,5,'脚色打点','example01.html');

                   d.add(10,9,'新增脚色','example01.html');

                   d.add(11,9,'删除脚色','example01.html')

                   document.write(d);

我们假如不想显示整颗树只想显示如:各人看上面,这个是dtree.js插件,一个专门用于生成树的js插件的利用要领,那么假如我们附以上述的sql语句在数据库中把数据选出来后,是不是只要一个轮回就可以给这个dtree.js插件显示了,不是吗?

只显示系统打点菜单有其下列所有的子菜单,那么我们的Oracle中的Sql应该怎么写呢?

经查“系统打点”这个菜单的MENU_ID=’105’,于是我们的Sql语句如下:

SELECT *FROM T_SYS_MENU

STARTWITH MENU_ID='105'

CONNECTBYPRIOR MENU_ID=MENU_PID

orderby MENU_ID

 假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC5HK0-W332.jpg" />

对吧?很简朴哈!

T_Privilege表

用于存放系统每个菜单的具体子权限如“增,删,改,查”

假如凭据原<a href=劳务调派信息打点系统 来的表布局" src="/uploads/allimg/c180205/151MJC615160-bI9.jpg" />

T_Menu_Privilege表

这张表就是我们的最终终结大BOSS表,它内里是一个完整的系统权限与脚色干系间的对应。

好比说: