先把图传上来,具体思路下班回家再写呢。
先大概解释一下,有user表、role表、group表、action表、menu表和menuType表,关系表有user_role,user_group,role_action,group_action四张表,均为多对多关系。
user表就是用户表,role是角色表,group是分组表,action是权限表,menu是菜单或者资源表,menutype用来定义menu的。
我的理解是这样的,user自身是没有权限的,user的权限是通过他所具有的角色和所处在组织赋予的。所以在表结构中,user表与action表没有直接关联,而是通过group和role关联action表的。
举个例子:假设存在一个公司,公司有各层组织和员工。公司员工和非公司员工都是user,非公司员工不具备公司内的角色,也不处于公司的某个组织中,所以就没有相应的权限。而公司内部员工,比如经理就有经理的权限,人事就有人事的权限,这些权限是由员工具有的角色赋予的。同时,员工还隶属于公司的某个组织,比如某个员工属于后勤部的,那他就应该有某些操作后勤物资的权限,而这种权限的由于他所在的组赋予的。所以,角色有权限,组有权限,而用户没有权限,表现在表结构上就是user与action表并没有直接关联,而是通过role和group表进行关联的。
DROP TABLE IF EXISTS _user;
CREATE TABLE _user(
ID INT(9)PRIMARY KEY,/*用户id*/
UserName VARCHAR(128) NOT NULL,/*用户名*/
Pword VARCHAR(128)NOT NULL,/*密码*/
Email VARCHAR(100)UNIQUE,/*登录名,用户Email*/
Question VARCHAR(100) ,/*重置密码的问题*/
Answer VARCHAR(100) ,/*重置密码的答案*/
UserGroup INT(9) NOT NULL,/*用户组*/
CreatedTime DATETIME NOT NULL,/*帐户创建时间*/
LastLoginTime DATETIME , /*上一次登录的时间*/
UserStatus INT(1) NOT NULL,/*用户状态*/
IsOnline BIT NOT NULL, /*是否在线*/
IsLimit BIT NOT NULL /*是否受权限限制,0为受限制*/
);
DROP TABLE IF EXISTS _role;
CREATE TABLE _role(
ID INT(9)PRIMARY KEY,/*角色ID*/
RoleName VARCHAR(30) NOT NULL,/*角色名称*/
RoleDesc VARCHAR(50) , /*说明*/
RoleOrder INT NOT NULL /*排序*/
);
DROP TABLE IF EXISTS _action;
CREATE TABLE _action(
ID INT(9)PRIMARY KEY,/*权限ID*/
ActionName VARCHAR(30) NOT NULL,/*权限名称*/
ActionTag VARCHAR(50) NOT NULL,/*权限标识*/
ActionDesc VARCHAR(50) , /*说明*/
ActionOrder INT NOT NULL /*排序*/
);
DROP TABLE IF EXISTS _group;
CREATE TABLE _group(
ID INT(9)PRIMARY KEY,/*分组ID*/
GroupName VARCHAR(30) NOT NULL,/*组名称*/
GroupOrder INT NOT NULL, /*排序*/
GroupDesc VARCHAR(50) , /*说明*/
GroupType INT(1) NOT NULL/*分组类型 用户组0,角色组1*/
);
DROP TABLE IF EXISTS _menutype;
CREATE TABLE _menutype(
ID INT(9)PRIMARY KEY,/*菜单分类ID*/
MenuTypeName VARCHAR(30) NOT NULL,/*菜单类型名称*/
MenuTypeDesc VARCHAR(50) , /*说明*/
MenuTypeDepth INT(1) NOT NULL,/*深度*/
MenuTypeSuperIDINT(9)NOT NULL,/*上级ID*/
MenuTypeNum INT(1) NOT NULL/*下阶个数*/
);
DROP TABLE IF EXISTS _menu;
CREATE TABLE _menu(
ID INT(9)PRIMARY KEY,/*菜单ID*/
MenuTypeID INT(9) NOT NULL,/*菜单类型*/
MenuName VARCHAR(30) NOT NULL,/*菜单名称*/
MenuTag VARCHAR(50) NOT NULL,/*菜单标识*/
MenuURL VARCHAR(500) NOT NULL,/*菜单地址*/
MenuDisabled BIT NOT NULL, /*是否禁用*/
MenuDesc VARCHAR(50) , /*说明*/
IsNav BITNOT NULL/*是否显示在导航菜单中*/
);
ALTER TABLE _menu ADD FOREIGN KEY(MenuTypeID) REFERENCES _menutype(ID);
DROP TABLE IF EXISTS user_role;
CREATE TABLE user_role(
ID INT(9)PRIMARY KEY,/*用户角色ID*/
UserID INT(9) NOT NULL,/*用户ID*/
RoleID INT(9) NOT NULL/*角色ID*/
);ALTER TABLE user_role ADD FOREIGN KEY(UserID) REFERENCES _user(ID);
ALTER TABLE user_role ADD FOREIGN KEY(RoleID) REFERENCES _role(ID);
DROP TABLE IF EXISTS user_group;
CREATE TABLE user_group(
ID INT(9)PRIMARY KEY,/*用户组ID*/
UserID INT(9) NOT NULL,/*用户ID*/
GroupID INT(9) NOT NULL,/*组ID*/
UGName VARCHAR(30) NOT NULL,/*用户分组名称*/
UGDesc VARCHAR(50) NOT NULL,/*用户分组描述*/
Depth INT(1)NOT NULL,/*用户分组深度*/
SuperID INT(9) NOT NULL,/*用户分组上级*/
UGNum INT(1)NOT NULL/*用户分组下级数*/
);
ALTER TABLE user_group ADD FOREIGN KEY(UserID) REFERENCES _user(ID);
ALTER TABLE user_group ADD FOREIGN KEY(GroupID) REFERENCES _group(ID);
DROP TABLE IF EXISTS role_action;
CREATE TABLE role_action(
ID INT(9)PRIMARY KEY,/*编号*/
RoleID INT(9) NOT NULL,/*角色ID*/
ActionID INT(9) NOT NULL,/*权限标识*/
Flag BITNOT NULL/*1为允许,0为不禁止*/
);
ALTER TABLE role_action ADD FOREIGN KEY(RoleID) REFERENCES _role(ID);
ALTER TABLE role_action ADD FOREIGN KEY(ActionID) REFERENCES _action(ID);
DROP TABLE IF EXISTS group_action;
CREATE TABLE group_action(
ID INT(9)PRIMARY KEY,/*编号*/
GroupID INT(9) NOT NULL,/*角色ID*/
ActionID INT(9) NOT NULL,/*权限标识*/
Flag BITNOT NULL/*1为允许,0为不禁止*/
);
ALTER TABLE group_action ADD FOREIGN KEY(GroupID) REFERENCES _group(ID);
ALTER TABLE group_action ADD FOREIGN KEY(ActionID) REFERENCES _action(ID);
DROP TABLE IF EXISTS menu_action;
CREATE TABLE menu_action(
ID INT(9)PRIMARY KEY,/*菜单权限ID*/
MenuID INT(9) NOT NULL,/*菜单ID*/
ActionID INT(9) NOT NULL,/*权限标识*/
);
ALTER TABLE menu_action ADD FOREIGN KEY(MenuID) REFERENCES _menu(ID);
ALTER TABLE menu_action ADD FOREIGN KEY(ActionID) REFERENCES _action(ID);