单应用系统规划Node(节点)、Menu(菜单) 和 User(用户)之间关系

标题中的内容涉及到了系统设计中的权限管理和功能模块化。

通过设计一个 Node 系统 来实现更灵活、更安全的权限控制。Node 更像是一个概念,但在实际应用中,它可以具象化为数据库中的表结构,进而与 MenuUser 权限系统关联起来。

在这里插入图片描述

Node 系统的必要性

在系统设计中,Node 的核心目的是将功能模块化,以便进行更细粒度的权限控制。Node 可以表示系统中的任何可访问资源,比如:

  • 一个具体的页面(如“用户列表”页面)
  • 一项操作(如“删除用户”功能)
  • 一个 API 接口(如“GET /api/users”)

为什么需要 Node 系统:

  • 更细粒度的权限控制:Menu 只是导航入口,而 Node 允许我们控制每一个具体功能或操作的权限。
  • 灵活性:通过 Node,可以实现功能模块与菜单、角色权限的灵活绑定。例如,某些用户可以访问“用户管理”菜单,但只能查看用户列表,而不能删除用户。

设计思路

可以将 Node 系统与 Menu 和 User 权限结合起来,形成一个灵活的权限管理机制。

下面举例一套数据库表结构,并解释它们的关联关系。

数据库设计

以下是我们将要设计的几张核心表:

  1. Menu(菜单表)
  2. Node(节点表)
  3. Role(角色表)
  4. User(用户表)
  5. Permission(权限表,用于关联角色与节点)
  6. 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

关系解释

  1. Menu 和 Node 的关系

    • Menu 主要用于前端导航。
    • Node 则用于权限控制,每个 Menu 可以映射到一个或多个 Node。
  2. Node 和 Permission 的关系

    • Permission 表用于定义某个角色是否对某个 Node 具有访问权限。
    • 例如,管理员角色可以访问所有 Node,而普通用户角色只能访问部分 Node。
  3. 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 系统,可以实现更灵活的权限控制,并将菜单和功能权限分离开来。这种设计可以支持复杂的业务场景,特别是在权限控制要求高的系统中(如后台管理系统、企业级应用)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Node.js——fs模块-文件重命名和移动

1、在Node.js中,我们可以使用 rename 或 renameSync 来移动或重命名文件或文件夹 2、语法: fs.rename(oldPath,newPath,callback) fs.renameSync(oldPath,newPath) 参数说明: oldPath 文件当前的路径 newPath 文件新的路径 callback 操…

MySQL性能测试方案设计

在现代互联网系统中,数据库性能直接影响到整体应用的速度和用户体验。而MySQL作为广泛使用的关系型数据库,随着数据量和并发请求的增长,其性能问题也日益突出。今天我们将深入探讨如何设计一套高效的MySQL性能测试方案,帮助你精准…

[Linux]:高级IO

1. IO 理解 1.1 IO 的基本概念 I/O即输入/输出(input/output),是计算机系统中极为关键的操作环节。 在经典的冯诺依曼体系结构框架下,其核心在于数据的传输流向界定了输入与输出的概念。具体而言,当把数据从诸如键盘…

数据结构之二叉树--前序,中序,后序详解(含源码)

二叉树 二叉树不能轻易用断言,因为树一定有空 二叉树链式结构的实现 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType _data;struct B…

Java-I/O框架13:文件夹的递归遍历和递归删除

视频链接:16.29 递归遍历和递归删除_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Tz4y1X7H7?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p29 1.文件夹的递归遍历 public class ListDirectoryDemo01 {pub…

Qt 无法获取调试输出

问题 使用Qt进行编程时,发现在应用程序输出窗口无法输出调试信息,在源代码里的debug输出信息一个也不显示。 如下图: 解决方案 同一个IDE开启多次,会导致出现这样的问题,可以把QtCreator关闭只留一个。

影响神经网络速度的因素- FLOPs、MAC、并行度以及计算平台

影响神经网络速度的四个主要因素分别是 FLOPs(浮点操作数)、MAC(内存访问成本)、并行度以及计算平台。这些因素共同作用,直接影响到神经网络的计算速度和资源需求。 1. FLOPs(Floating Point Operations&a…

02_ElementUI

一.前端工程化 1.1 概述 前端工程化是使用软件工程的方法来单独解决前端的开发流程 中模块化、组件化、规范化、自动化的问题,其主要目的为了 提高效率和降低成本。 1.2 NodeJS的安装 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环 境,可以使 JavaS…

Pytorch实现运动鞋识别

Pytorch实现运动鞋识别 🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊 电脑系统:Windows11 显卡型号:NVIDIA Quadro P620 语言环境:python 3.9.7 编译器:j…

[卷积神经网络]使用YOLOv11训练自己的模型

YoloV11的源码:YOLOv11 一、数据集准备 首先,准备好自己的数据集,包含图像文件和标注文件,因为我的数据集上Voc格式,所以需要先转为yolo格式,可以使用下面的脚本进行转换。 import os import shutil impo…

vue+exceljs前端下载、导出xlsx文件

首先安装插件 npm install exceljs file-saver第一种 简单导出 //页面引入 import ExcelJS from exceljs; import {saveAs} from file-saver; export default {methods: { /** 导出操作 */async handleExportFun() {let that this// 获取当前年月日 用户下载xlsx的文件名称设…

pytest自动化测试框架详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 Pytest是一种基于Python编程语言的自动化测试框架,它提供了丰富的功能和灵活的扩展性,可以用于单元测试、集成测试、功能测试、端到端测试…

解决com.mysql.jdbc.NonRegisteringDriver内存泄漏问题

1. 问题背景 线上出现内存报警,通过dump文件,MAT分析,发现mysql-connector-java 有内存泄漏问题 2.问题分析 然后看大对象列表,NonRegisteringDriver 对象确实占内存比较多,里面村的数据库连接的虚引用占比较多 3.解…

Golang | Leetcode Golang题解之第547题身份数量

题目: 题解: func findCircleNum(isConnected [][]int) (ans int) {n : len(isConnected)parent : make([]int, n)for i : range parent {parent[i] i}var find func(int) intfind func(x int) int {if parent[x] ! x {parent[x] find(parent[x])}re…

CSS实现文字渐变效果

效果图: 代码: h1 {font-size: 100px;color:linear-gradient(gold,deeppink);background-image:linear-gradient( -gold, deeppink); /*春意盎然*///背景被裁剪成文字的前景色。background-clip:text;/*兼容内核版本较低的浏览器*/-webkit-background-c…

24/11/8 算法笔记 t-SNE降维算法

t-SNE算法的核心实现涉及几个关键步骤,主要包括概率分布的构建、梯度计算和优化。以下是这些步骤的简要说明: 1. **概率分布的构建**: - 在高维空间中,t-SNE使用高斯分布(Gaussian distribution)来构建…

企业微信-消息推送之微信客服-接收消息和事件

一:企微实现和企业间的微信客服消息接收和事件原理 新版企微主要通过2个阶段实,第一个:消息推送 概述 - 文档 - 企业微信开发者中心 ,第二个:微信客服 接收消息和事件 - 文档 - 企业微信开发者中心 二:代码…

Ascend Extension for PyTorch是个what?

1 Ascend Extension for PyTorch Ascend Extension for PyTorch 插件是基于昇腾的深度学习适配框架,使昇腾NPU可以支持PyTorch框架,为PyTorch框架的使用者提供昇腾AI处理器的超强算力。 项目源码地址请参见Ascend/Pytorch。 昇腾为基于昇腾处理器和软…

【React】React 生命周期完全指南

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 React 生命周期完全指南一、生命周期概述二、生命周期的三个阶段2.1 挂载阶段&a…

开源模型应用落地-glm模型小试-glm-4-9b-chat-压力测试(六)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异&a…