标题中的内容涉及到了系统设计中的权限管理和功能模块化。
通过设计一个 Node 系统 来实现更灵活、更安全的权限控制。Node 更像是一个概念,但在实际应用中,它可以具象化为数据库中的表结构,进而与 Menu 和 User 权限系统关联起来。
Node 系统的必要性
在系统设计中,Node 的核心目的是将功能模块化,以便进行更细粒度的权限控制。Node 可以表示系统中的任何可访问资源,比如:
- 一个具体的页面(如“用户列表”页面)
- 一项操作(如“删除用户”功能)
- 一个 API 接口(如“GET /api/users”)
为什么需要 Node 系统:
- 更细粒度的权限控制:Menu 只是导航入口,而 Node 允许我们控制每一个具体功能或操作的权限。
- 灵活性:通过 Node,可以实现功能模块与菜单、角色权限的灵活绑定。例如,某些用户可以访问“用户管理”菜单,但只能查看用户列表,而不能删除用户。
设计思路
可以将 Node 系统与 Menu 和 User 权限结合起来,形成一个灵活的权限管理机制。
下面举例一套数据库表结构,并解释它们的关联关系。
数据库设计
以下是我们将要设计的几张核心表:
- Menu(菜单表)
- Node(节点表)
- Role(角色表)
- User(用户表)
- Permission(权限表,用于关联角色与节点)
- Role_Menu(角色与菜单的关系表)
1. Menu
表(菜单表)
CREATE TABLE Menu (
id INT PRIMARY KEY AUTO_INCREMENT,
menu_name VARCHAR(50) NOT NULL,
path VARCHAR(100),
parent_id INT DEFAULT NULL,
icon VARCHAR(50),
sort_order INT DEFAULT 0,
is_active BOOLEAN DEFAULT TRUE,
FOREIGN KEY (parent_id) REFERENCES Menu(id)
);
字段解释:
id
: 菜单的唯一标识。menu_name
: 菜单名称。path
: 前端路由路径。parent_id
: 父级菜单 ID,用于表示菜单层级。icon
: 菜单图标(可选)。sort_order
: 菜单显示的顺序。is_active
: 是否激活菜单。
2. Node
表(节点表)
CREATE TABLE Node (
id INT PRIMARY KEY AUTO_INCREMENT,
node_name VARCHAR(50) NOT NULL,
node_type ENUM('page', 'api', 'action') DEFAULT 'page',
description VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE
);
字段解释:
id
: 节点的唯一标识。node_name
: 节点名称,如“用户列表”、“删除用户”等。node_type
: 节点类型,可以是页面(page
)、API 接口(api
)、操作功能(action
)。description
: 节点的描述信息。is_active
: 是否激活节点。
3. Role
表(角色表)
CREATE TABLE Role (
id INT PRIMARY KEY AUTO_INCREMENT,
role_name VARCHAR(50) NOT NULL,
description VARCHAR(255),
is_active BOOLEAN DEFAULT TRUE
);
字段解释:
id
: 角色的唯一标识。role_name
: 角色名称,如“管理员”、“普通用户”。description
: 角色描述。is_active
: 是否激活角色。
4. User
表(用户表)
CREATE TABLE User (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(100) NOT NULL,
role_id INT,
email VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
FOREIGN KEY (role_id) REFERENCES Role(id)
);
字段解释:
id
: 用户的唯一标识。username
: 用户名。password
: 用户密码(需加密存储)。role_id
: 关联的角色 ID。email
: 用户邮箱。is_active
: 是否激活用户。
5. Permission
表(权限表,用于关联角色与节点)
CREATE TABLE Permission (
id INT PRIMARY KEY AUTO_INCREMENT,
role_id INT,
node_id INT,
is_allowed BOOLEAN DEFAULT TRUE,
FOREIGN KEY (role_id) REFERENCES Role(id),
FOREIGN KEY (node_id) REFERENCES Node(id)
);
字段解释:
id
: 权限记录的唯一标识。role_id
: 关联的角色 ID。node_id
: 关联的节点 ID。is_allowed
: 是否允许访问该节点。
6. Role_Menu
表(角色与菜单的关系表)
CREATE TABLE Role_Menu (
id INT PRIMARY KEY AUTO_INCREMENT,
role_id INT,
menu_id INT,
FOREIGN KEY (role_id) REFERENCES Role(id),
FOREIGN KEY (menu_id) REFERENCES Menu(id)
);
字段解释:
id
: 记录的唯一标识。role_id
: 关联的角色 ID。menu_id
: 关联的菜单 ID。
数据表之间的关系图
User ---> Role ---> Permission ---> Node
|
|
Role_Menu ---> Menu
关系解释
-
Menu 和 Node 的关系:
- Menu 主要用于前端导航。
- Node 则用于权限控制,每个 Menu 可以映射到一个或多个 Node。
-
Node 和 Permission 的关系:
Permission
表用于定义某个角色是否对某个 Node 具有访问权限。- 例如,管理员角色可以访问所有 Node,而普通用户角色只能访问部分 Node。
-
Role 和 User 的关系:
- 一个 User 只能有一个 Role(可根据需求扩展为多角色)。
- Role 决定了用户可以访问的菜单和功能。
示例:如何使用这些表来控制权限
假设有以下场景:
- 角色:管理员(Admin)、普通用户(User)
- 菜单:用户管理、系统设置
- 节点:
- 用户列表(Node Type: page)
- 添加用户(Node Type: action)
- 删除用户(Node Type: action)
1. 配置权限
- 管理员角色:可以访问“用户管理”菜单及其所有节点。
- 普通用户角色:只能访问“用户列表”页面节点。
2. 查询菜单和权限
- 根据用户的
role_id
查询Role_Menu
,确定可以展示的菜单。 - 根据用户的
role_id
查询Permission
,判断具体功能(Node)的访问权限。
3. 更多的节点和菜单之间的关系
- 实际用户权限分了节点和菜单两条路。
- 可以考虑设计
Menu_Node
表,即一个菜单可以包含多个节点,这样的自动化程度更高。- 比如列表页面的每条信息都有一个删除功能,如果
列表页
菜单对应列表显示
和删除信息
两个节点,那么当用户没有删除信息
节点权限时,该列表页就不显示删除按钮。
- 比如列表页面的每条信息都有一个删除功能,如果
总结
通过引入 Node 系统,可以实现更灵活的权限控制,并将菜单和功能权限分离开来。这种设计可以支持复杂的业务场景,特别是在权限控制要求高的系统中(如后台管理系统、企业级应用)。