一、问题描述
目前基本上的系统都会涉及到权限的控制,而且粒度都比较小,一般都要控制到具体窗口的具体操作上。而要达到这种要求,一个可行的数据库设计将显得非常有帮助。下面我们就设计一个通用型的数据库来达到权限的控制
二、测试环境
操作系统:windows xp
数据库:mysql5.0
辅助设计工具:PowerDesigner15
三、设计过程
1、利用PowerDesigner设计出需要的表,如下图
2、导出sql脚本,如下
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2013-1-25 11:19:43 */
/*==============================================================*/
drop table if exists T_MENU;
drop table if exists T_MENU_PRIVILEGE;
drop table if exists T_PRIVILEGE;
drop table if exists T_ROLE;
drop table if exists T_USER;
drop table if exists T_USER_ROLE;
/*==============================================================*/
/* Table: T_MENU */
/*==============================================================*/
create table T_MENU
(
MENUID int(4) not null auto_increment,
NAME varchar(50),
URL varchar(100) comment '目标网址',
PARENTID bigint comment '父菜单',
LFT int(4) comment '左边界',
RGT int(4) comment '右边界',
primary key (MENUID)
);
alter table T_MENU comment '菜单表';
/*==============================================================*/
/* Table: T_MENU_PRIVILEGE */
/*==============================================================*/
create table T_MENU_PRIVILEGE
(
MENU_PRIVILEGE_ID bigint not null auto_increment,
MENUID int(4),
PRIVILEGEID int(3),
ROLEID int(3),
primary key (MENU_PRIVILEGE_ID)
);
alter table T_MENU_PRIVILEGE comment '角色菜单权限表';
/*==============================================================*/
/* Table: T_PRIVILEGE */
/*==============================================================*/
create table T_PRIVILEGE
(
PRIVILEGEID int(3) not null auto_increment,
NAME varchar(50) comment '权限名称(增加,删除……)',
primary key (PRIVILEGEID)
);
alter table T_PRIVILEGE comment '权限表';
/*==============================================================*/
/* Table: T_ROLE */
/*==============================================================*/
create table T_ROLE
(
ROLEID int(3) not null auto_increment,
ROLENAME varchar(20) comment '角色名称',
primary key (ROLEID)
);
alter table T_ROLE comment '角色表';
/*==============================================================*/
/* Table: T_USER */
/*==============================================================*/
create table T_USER
(
USERID bigint not null auto_increment,
USERNAME varchar(50),
PASSWORD varchar(20),
primary key (USERID)
);
alter table T_USER comment '用户表';
/*==============================================================*/
/* Table: T_USER_ROLE */
/*==============================================================*/
create table T_USER_ROLE
(
USER_ROLE_ID bigint not null auto_increment,
USERID bigint,
ROLEID int(3),
primary key (USER_ROLE_ID)
);
alter table T_USER_ROLE comment '用户角色';
alter table T_MENU_PRIVILEGE add constraint FK_Reference_3 foreign key (MENUID)
references T_MENU (MENUID) on delete restrict on update restrict;
alter table T_MENU_PRIVILEGE add constraint FK_Reference_4 foreign key (ROLEID)
references T_ROLE (ROLEID) on delete restrict on update restrict;
alter table T_MENU_PRIVILEGE add constraint FK_Reference_5 foreign key (PRIVILEGEID)
references T_PRIVILEGE (PRIVILEGEID) on delete restrict on update restrict;
alter table T_USER_ROLE add constraint FK_Reference_1 foreign key (USERID)
references T_USER (USERID) on delete restrict on update restrict;
alter table T_USER_ROLE add constraint FK_Reference_2 foreign key (ROLEID)
references T_ROLE (ROLEID) on delete restrict on update restrict;
从脚本中可以清晰的看出每个表和字段的作用及数据类型,这里面着重要理解的是menu数据表中的左右边界问题,可以结合下面的图进行理解
3、对于菜单的操作,我们开发以下几个存储过程来进行操作
1)添加子菜单AddChildMenu,每次添加的子菜单都在最前面,如果需要添加到后面,则可以采用下面的AppendMenu来实现,代码如下
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddChildMenu`(
IN P_PARENTID int(11),
IN P_MENUNAME VARCHAR(50),
IN P_MENUURL VARCHAR(100))
BEGIN
DECLARE VAL_LFT INT(4);
-- 获取父菜单的lft值
SELECT LFT INTO VAL_LFT FROM T_MENU WHERE MENUID=P_PARENTID;
-- 将所有rgt大于当前父菜单lft值的菜单的rgt+2
UPDATE T_MENU SET RGT=RGT+2 WHERE RGT>VAL_LFT;
-- 将所有lft大于当前父菜单lft值的菜单的lft+2
UPDATE T_MENU SET LFT=LFT+2 WHERE LFT>VAL_LFT;
-- 插入新的子菜单lft=lft+1,rgt=lft+2
INSERT INTO T_MENU(NAME,URL,PARENTID,LFT,RGT) VALUES(P_MENUNAME,P_MENUURL,P_PARENTID,VAL_LFT+1,VAL_LFT+2);
-- 显示结果
SELECT * FROM T_MENU;
END;
调用示例 CALL AddChildMenu(1,'用户管理',');
2)、附加菜单AppendMenu,将菜单附加都某个菜单的后面,代码如下
CREATE DEFINER=`root`@`localhost` PROCEDURE `AppendMenu`(
IN P_MENUID int(11),
IN P_MENUNAME VARCHAR(50),
IN P_MENUURL VARCHAR(100))
BEGIN
DECLARE VAL_RGT INT(4);
DECLARE VAL_PARENTID INT(11);
-- 获取当前菜单的rgt值
SELECT RGT,PARENTID INTO VAL_RGT,VAL_PARENTID FROM T_MENU WHERE MENUID=P_MENUID;
-- 将所有rgt大于当前菜单rgt值的菜单的rgt+2
UPDATE T_MENU SET RGT=RGT+2 WHERE RGT>VAL_RGT;
-- 将所有lft大于当前菜单rgt值的菜单的lft+2
UPDATE T_MENU SET LFT=LFT+2 WHERE LFT>VAL_RGT;
-- 插入新的菜单lft=rgt+1,rgt=rgt+2
INSERT INTO T_MENU(NAME,URL,PARENTID,LFT,RGT) VALUES(P_MENUNAME,P_MENUURL,VAL_PARENTID,VAL_RGT+1,VAL_RGT+2);
-- 显示结果
SELECT * FROM T_MENU;
END;
调用示例,CALL AppendMenu(2,'角色管理','');
3)、删除菜单DelMenu,代码如下
CREATE DEFINER=`root`@`localhost` PROCEDURE `DelMenu`(
IN P_MENUID int(11)
)
BEGIN
DECLARE VAL_LFT INT(4);
DECLARE VAL_RGT INT(4);
DECLARE VAL_WIDTH INT(4);
-- 获取当前菜单的lft和rgt值
SELECT LFT,RGT INTO VAL_LFT,VAL_RGT FROM T_MENU WHERE MENUID=P_MENUID;
SET VAL_WIDTH=VAL_RGT-VAL_LFT+1;
-- 删除lft到rgt之间的菜单
DELETE FROM T_MENU WHERE LFT BETWEEN VAL_LFT AND VAL_RGT;
-- 将所有的右边界大于第一步中得到的rgt的所有节点的rgt的值减去第一步中得到的宽度width
UPDATE T_MENU SET RGT=RGT-VAL_WIDTH WHERE RGT>VAL_RGT;
-- 将所有的左边界大于第一步中得到的rgt的所有节点的lft的值减去第一步中得到的宽度width
UPDATE T_MENU SET LFT=LFT-VAL_WIDTH WHERE LFT>VAL_RGT;
-- 显示结果
SELECT * FROM T_MENU;
END;
调用示例 CALL DelMenu(2);
4)、每个存储过程的实现和算法具体参考代码注释
4、测试结果
1)、在执行过插入菜单操作后的数据如下
2)、利用sql语句查询出所有菜单及其层次关系,代码如下
SELECT MENU.MENUID,
MENU.PARENTID,
MENU.NAME,
MENU.URL,
MENU.LFT,
MENU.RGT,
COUNT(PARENT.MENUID) MENULEVEL
FROM T_MENU MENU,T_MENU PARENT
WHERE MENU.LFT BETWEEN PARENT.LFT AND PARENT.RGT
GROUP BY MENU.MENUID,MENU.PARENTID,MENU.NAME,MENU.URL,MENU.LFT,MENU.RGT
ORDER BY MENULEVEL
结果如下
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
对不起,刚才传错附件了,只穿了一个数据库设计图,下载地址是:http://download.csdn.net/source/3269301 花了一天时间研究一篇网上关于OA系统权限设计的文档,下载下来并且说动创建的数据库以及表,有想要了解的...
权限管理及数据库设计 权限管理及数据库设计 最新设计的
公交线路查询系统的数据库设计 【摘 要】随着城市规划建设的发展,城市人口数量的持续激增,城市公交由于其价格低廉、 安全稳定、乘坐方便、线路数量多、环境污染小等特征,成为了城市人们出行的首选交 通方式。...
公交线路查询系统的数据库设计 公交线路查询系统的数据库设计 随着城市规划建设的持续展开,公交线路发展速度越来越快,城市公交系统规模日 益复杂。由于城市公交数量的增多,进而带来了道路拥堵、环境污染和交通...
RBAC 数据库设计方案 是一个Excel 文档,分析了数据库的结构!
为了设计一套具有较强可扩展性的用户认证管理,需要建立用户、角色和权限等数据库表,并且建立之间的关系
主要介绍了复杂系统中的用户权限数据库设计解决方案,针对大型、复杂的B/S系统,需要的朋友可以参考下
数据库设计 省级政务平台数据库设计 数据库设计原则 (1)标准化 严格按照相关技术标准完成数据库的设计,包括国土资源部颁发的相应数据库建库规 范标准、国家已经发布的许多基础的行业分类、代码标准,以及在信息化...
人事工资管理系统 1问题...3数据库设计 4。3.1数据库介绍 所谓数据库(Database)就是指按一定组织方式存储在一起的,相互有关的若 干个数据的结合,数据库管理系统(database Management System)就是一种操纵和管理
系统设计 (1)图书管理系统的功能划分如下简图: 三 详细数据库设计方案 图书表Book 用于增加图书信息 "列明 "数据类型 "是否为空 "默认值 "引用 "简单描述 " "ID "Int "否 " " "主键 自增 " "Name "Nvarchar(50) ...
广工数据库课设选题个人方案:车站售票管理系统 //内有源码及安装说明书 ①具有方便、快速的售票功能,包括车票的购买和退票功能,情况提供多种查询和统计功能,如车次的查询、时刻表的查询等; ②能准确地了解售票...
商业银行信贷管理系统的数据库设计要点 [摘 要] 信贷管理系统的数据库设计是信贷管理系统建设的重点之一,直接关系到应用系统的架构 、性能、安全等。本文将从系统的业务功能、性能需求方面结合3年来信贷管理系统实施...
水电收费管理系统设计方案数据库设计水电收费管理系统具有规范实用的特点,能够规范高校的水电管理提高业务处理效率。从而使高校水电管理实现现代化管理手段。分析水电收费管理系统,了解其系统功能,根据系统功能所...
为了设计一套具有较强可扩展性的用户认证管理,需要建立用户、角色和权限等数据库表,并且建立之间的关系,提供的一种设计方案
在数据库上它就是一个中间表的作用。 授权是这样的: 授权分为两种: 角色授权 对角色统一授权,继承这种角色的用户就自动拥有该角色所拥有的权限,并且权限分有优先级,这样两种权限如果之间发生冲突则取高...
想着借鉴一下以上那些管理系统软件设计一个工业、商业企业均可使用的仓储物资管理系统,那样子首先得给仓库分类,如仓库可分为材料库、成品库,入库方式可分为原材料入库、产成品入库、生产易耗品入库、调拨入库等,...
对于数据库的数据优化,主要有四个不同的调整级别,第一级调整是操作系统级包括硬 件平台,第二级调整是RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级 是SQL级。通常依此四级调整级别对数据库进行...
用asp.netc做的在线考试系统,内有数据库设计及系统源代码.rar1、测试帐户 管理员:admin/admin 普通用户:user1/user1, user2/user2, user3/user3 普通用户可以自注册,管理员只能在数据库中的ST_Users表中添加 2...
此次对于 微信平台的数据库设计主要对部分需要微信平台提供存储信息功能进行需求分析及设计 。以下将对微信平台的主要需求做简要的分析并且根据分析做出数据流图使得对于微信 平台数据库的设计有更好的理解。 微信的...
登陆界面的设计方案主要是为了设置访问系统的权限使特定的人才能访问该数据库系统.doc