动态菜单设计
需求: 登录不同用户 显示不同的菜单
思路:根据用户id 左关联表 查询出对应的菜单选项
查询SQL
select distinct-- 菜单表 去除重复记录sys_menu.id,sys_menu.parentId, sys_menu.name
from
-- 权限表sys_menu-- 角色与权限表 菜单表id = 角色菜单表的菜单id
left join sys_menu_role ON sys_menu.id = sys_menu_role.mid-- 角色表 角色菜单表的uid = 角色表id
left join sys_role ON sys_menu_role.uid = sys_role.id-- 用户角色表 角色表id = 用户角色表role_id
left join sys_user_role ON sys_role.id = sys_user_role.rid-- 用户表 用户角色表user_id = 用户表的id
left join sys_user ON sys_user_role.uid = sys_user.id
wheresys_user.id=1;
需要五张表
| 用户表 | sys_user |
| 角色表 | sys_role |
| 菜单表(权限表) | sys_menu |
| 用户角色关联表 | sys_user_role |
| 角色菜单关联表 | sys_menu_role |
新建表
sys_user sys_role sys_menu
CREATE TABLE `sys_user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,`nick_name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,`password` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,`mobile` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,`status` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '\'用户账号状态\'',`create_time` datetime(3) NULL DEFAULT (now()) COMMENT '\'创建账号时间\'',`recent_login` datetime(3) NULL DEFAULT (now()) COMMENT '\'最近登录时间\'',`user_name` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;CREATE TABLE `sys_role` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`nameZh` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '角色名称',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;CREATE TABLE `sys_menu` (`id` int NOT NULL AUTO_INCREMENT,`url` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`path` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`component` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`name` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`iconCls` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,`keepAlive` tinyint(1) NULL DEFAULT NULL,`requireAuth` tinyint(1) NULL DEFAULT NULL,`parentId` int NULL DEFAULT NULL,`enabled` tinyint(1) NULL DEFAULT 1,PRIMARY KEY (`id`) USING BTREE,INDEX `parentId`(`parentId` ASC) USING BTREE,CONSTRAINT `sys_menu_ibfk_1` FOREIGN KEY (`parentId`) REFERENCES `sys_menu` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Records of sys_menu
-- ----------------------------
INSERT INTO `sys_menu` VALUES (1, '/', NULL, NULL, '所有', NULL, NULL, NULL, NULL, 1);
INSERT INTO `sys_menu` VALUES (2, '/', '/home', 'Home', '服务器组1', 'fa fa-user-circle-o', NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (3, '/', '/home', 'Home', '服务器组2', 'fa fa-address-card-o', NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (4, '/', '/home', 'Home', '服务器组3', 'fa fa-money', NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (5, '/', '/home', 'Home', '服务器组4', 'fa fa-bar-chart', NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (6, '/', '/home', 'Home', '服务器组5', 'fa fa-windows', NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (7, '/', '/home', 'Home', '服务器组6', 'fa-solid fa-circle-arrow-up', NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (8, '/', '/home', 'Home', '服务器组7', NULL, NULL, 1, 1, 1);
INSERT INTO `sys_menu` VALUES (9, '/personnel/emp/**', '/per/emp', 'PerEmp', '主机资料', NULL, NULL, 1, 3, 1);
INSERT INTO `sys_menu` VALUES (10, '/personnel/ec/**', '/per/ec', 'PerEc', '待开发', NULL, NULL, 1, 3, 1);
INSERT INTO `sys_menu` VALUES (11, '/personnel/train/**', '/per/train', 'PerTrain', '待开发', NULL, NULL, 1, 3, 1);
INSERT INTO `sys_menu` VALUES (12, '/personnel/salary/**', '/per/salary', 'PerSalary', '待开发', NULL, NULL, 1, 3, 1);
INSERT INTO `sys_menu` VALUES (13, '/personnel/remove/**', '/per/mv', 'PerMv', '待开发', NULL, NULL, 1, 3, 1);
INSERT INTO `sys_menu` VALUES (14, '/salary/sob/**', '/sal/sob', 'SalSob', '待开发', NULL, NULL, 1, 4, 1);
INSERT INTO `sys_menu` VALUES (15, '/salary/sobcfg/**', '/sal/sobcfg', 'SalSobCfg', '待开发', NULL, NULL, 1, 4, 1);
INSERT INTO `sys_menu` VALUES (16, '/salary/table/**', '/sal/table', 'SalTable', '待开发', NULL, NULL, 1, 4, 1);
INSERT INTO `sys_menu` VALUES (17, '/salary/month/**', '/sal/month', 'SalMonth', '待开发', NULL, NULL, 1, 4, 1);
INSERT INTO `sys_menu` VALUES (18, '/salary/search/**', '/sal/search', 'SalSearch', '待开发', NULL, NULL, 1, 4, 1);
INSERT INTO `sys_menu` VALUES (19, '/statistics/all/**', '/sta/all', 'StaAll', '待开发', NULL, NULL, 1, 5, 1);
INSERT INTO `sys_menu` VALUES (20, '/statistics/score/**', '/sta/score', 'StaScore', '待开发', NULL, NULL, 1, 5, 1);
INSERT INTO `sys_menu` VALUES (21, '/statistics/personnel/**', '/sta/pers', 'StaPers', '待开发', NULL, NULL, 1, 5, 1);
INSERT INTO `sys_menu` VALUES (22, '/statistics/recored/**', '/sta/record', 'StaRecord', 'IP记录', NULL, NULL, 1, 5, 1);
INSERT INTO `sys_menu` VALUES (23, '/system/basic/**', '/sys/basic', 'SysBasic', '基本资料', NULL, NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (24, '/system/cfg/**', '/sys/cfg', 'SysCfg', '系统配置', 'fa fa-windows', NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (25, '/system/log/**', '/sys/log', 'SysLog', '操作日志管理', NULL, NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (26, '/system/hr/**', '/sys/hr', 'SysHr', '操作员管理', NULL, NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (27, '/system/data/**', '/sys/data', 'SysData', '备份恢复数据库', NULL, NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (28, '/system/site/**', '/sys/site', 'SysSite', '配置文件', NULL, NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (29, '/system/term/**', '/sys/term', 'SysTerm', '命令终端', 'fa fa-terminal', NULL, 1, 6, 1);
INSERT INTO `sys_menu` VALUES (30, '/system/deploy/**', '/sys/deploy', 'SysDeploy', '应用管理', 'fa fa-ad', NULL, 1, 6, 1);
中间关联表
CREATE TABLE `sys_user_role` (`id` int NOT NULL AUTO_INCREMENT,`uid` int NULL DEFAULT NULL,`rid` int NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `rid`(`rid` ASC) USING BTREE,INDEX `hr_role_ibfk_1`(`uid` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 76 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '权限id' ROW_FORMAT = DYNAMIC;CREATE TABLE `sys_menu_role` (`id` int NOT NULL AUTO_INCREMENT,`mid` int NULL DEFAULT NULL,`uid` int NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,INDEX `mid`(`mid` ASC) USING BTREE,INDEX `rid`(`uid` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 288 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Records of sys_menu_role
-- ----------------------------
INSERT INTO `sys_menu_role` VALUES (1, 1, 1);
INSERT INTO `sys_menu_role` VALUES (2, 2, 1);
INSERT INTO `sys_menu_role` VALUES (3, 3, 1);
INSERT INTO `sys_menu_role` VALUES (4, 4, 1);
INSERT INTO `sys_menu_role` VALUES (5, 5, 1);
INSERT INTO `sys_menu_role` VALUES (6, 6, 1);
INSERT INTO `sys_menu_role` VALUES (7, 7, 1);
INSERT INTO `sys_menu_role` VALUES (8, 8, 1);
中间表进行权限关联 user_role 用户角色表

uid为 用户表中的id 其中uid=1 是 超级管理员
uid =1 对应的 
rid=1 对应的 
角色菜单表 对应关系 menu_role
sys_menu_role 代表 超级管理员对应7个菜单 选项

uid=1 表示用户id是1
mid {1,...7} 对应 菜单表的 
查询结果为 uid=1 对应7个菜单项

新增一个用户 需要依赖parentID 即子菜单的父菜单
相关文章:
动态菜单设计
需求: 登录不同用户 显示不同的菜单 思路:根据用户id 左关联表 查询出对应的菜单选项 查询SQL select distinct-- 菜单表 去除重复记录sys_menu.id,sys_menu.parentId, sys_menu.name from -- 权限表sys_menu-- 角色与权限表 菜单表id 角色菜…...
Haproxy负载均衡介绍即部署
haproxy的原理: 提供高可用、负载均衡以及基于TCP(四层)和HTTP(七层)应用的代理,支持虚拟主机,开源可靠的一款软件。 适用于哪些负载特别大的web站点,这些站点通常又需要回话保持和七…...
基于大语言模型的云故障根因分析|顶会EuroSys24论文
*马明华 微软主管研究员 2021年CCF国际AIOps挑战赛程序委员会主席(第四届) 2021年博士毕业于清华大学,2020年在佐治亚理工学院做访问学者。主要研究方向是智能运维(AIOps)、软件可靠性。近年来在ICSE、FSE、ATC、EuroS…...
Windows直接运行python程序
Windows直接运行python程序 一、新建bat脚本二、新建vbs脚本 一、新建bat脚本 新建bat批处理脚本,写入以下内容 echo off call conda activate pytorch python app.pyecho off:在此语句后所有运行的命令都不显示命令行本身,但是本身的指令是…...
经典应用丨光伏行业扫码追溯新标杆,海康机器人AI智能读码器!
去年,光伏发电行业持续高速发展,我国仅在前九个月累计装机521.08GW,同比增长达到45.3%,已成为第二大电源类型超过水电。根据《2023中国与全球光伏发展白皮书》预测,到2030年,中国能够实现国家规划的风电和光…...
逆流而上的选择-积极生活,逆流而上
首先请大家看一个故事 李明坐在公司的开放式办公区,耳边是键盘敲击声的交响乐,眼前是一行行跳跃的代码。他的眼神有些恍惚,显示器的蓝光在他眼镜上反射出时代的光芒,这光芒既耀眼又刺眼。他即将35岁,在这个年纪&#x…...
SpringMVC基础Controller
文章目录 Controller 的编写和配置1. Controller 注解类型2. RequestMapping 注解类型3. 编写请求方法4. 请求参数和路径变量 Controller 的编写和配置 Controller 注解和 RequestMapping 注解是 Spring MVC 最重要的两个注解。 使用基于注解的控制器的优点如下: …...
spark 参数
spark.yarn.executor.memoryOverhead 默认值是384M Configuration - Spark 3.5.1 Documentation...
java调用jacob进行文件转换ppt转pdf或者png
java调用jacob进行文件转换ppt转pdf或者png 前情提要 最近项目上,遇到一个复杂的ppt,最终要求是要将ppt每一页转成图片原本这个是不难,网上一搜一大堆案例,外加我本身也比较精通aspose,那还不是分分钟搞定。结果就是…...
鸿蒙HarmonyOS应用开发之使用DevEco Studio模板构建NDK工程
NDK通过CMake和Ninja编译应用的C/C代码,编译过程如下图所示。 核心编译过程如下: 根据CMake配置脚本以及build-profile.json5中配置的externalNativeOptions构建参数,与缓存中的配置比对后,生成CMake命令并执行CMake。 执行Ninja…...
uniapp流浪动物救助小程序Java宠物领养小程序springboot
uniapp流浪动物救助小程序Java宠物领养小程序springboot 代码40块,需要的私聊 前台基于uniapp小程序 后台管理基于springbootvue前后端分离项目 开发语言:Java 框架:springboot vue JDK版本:JDK1.8(或11…...
工程企业的未来选择:Java版工程项目管理系统平台与数字化管理的融合
在现代化的工程项目管理中,一套功能全面、操作便捷的系统至关重要。本文将介绍一个基于Spring Cloud和Spring Boot技术的Java版工程项目管理系统,结合Vue和ElementUI实现前后端分离。该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个…...
Vue使用el-statistic和el-card显示大屏中的统计数据
一、页面内容: <el-row :gutter"20"><el-col :span"6"><el-card class"box-card"><div><el-statisticgroup-separator",":precision"2":value"value2":title"tit…...
12.2024
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 7 15 16 28 29... 35 8 14 17 27 30... 4 9 13 18 26 31... 10 12 19 25 32... 11 20 24 33... 21 23 34.. 22 35... 容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少…...
【学习心得】Jupyter常用操作与魔法方法
一、安装与打开 Jupyter是什么我就不啰嗦了,直接安装: pip install jupyter 安装完后,在你想要打开的项目路径下,唤出CMD执行下面命令就可以使用jupyter notebook了 jupyter notebook 也可以用更加好用的jupyter lab࿰…...
Linux命令别名
别名是命令的快捷方式。对于需要经常执行,并需要很长时间输入的长命令创建快捷方式很有用。 临时修改 语法: alias 别名原命令 [选项] [参数][rootdd ~]# alias cdtcd /test #切换到/test下的快捷命令 删除别名: unalias 别名 unalias cd…...
Docker和 Containerd 的区别
自 Docker 开启了使用容器的爆发式增长,有越来越多的工具和标准来帮助管理和使用这项容器化技术,与此同时也造成了有很多术语让人感到困惑。 容器生态系统 容器生态系统是由许多令人兴奋的技术、大量的专业术语和大公司相互争斗组成的。 幸运的是&…...
Qt实现TFTP Server和 TFTP Client(二)
3 实现 3.1 Core Core模块包括下面4个类: TFTPBaseUdpTFtpClientFileTFtpServerFile 3.1.1 TFTP TFTP类实现了TFTP协议。 3.1.1.1 TFTP定义 class TFtp { public:TFtp();enum Code {RRQ 0x0001,//Read requestWRQ 0x0002,//Write requestDATA 0x0003…...
【b站李炎恢】Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢
课程地址:【Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢】 https://www.bilibili.com/video/BV1U54y127GB/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 备注:虽然标题声明还在更新中,但是看一些常用…...
AI大语言模型工程师学习路线
文章目录 运行LLMSLLM APIS开源的大语言模型Prompt engineering1. 明确目标2. 理解模型能力3. 使用示例4. 精确和具体的指令5. 考虑上下文6. 避免偏见和不准确的信息7. 测试和迭代8. 使用模板9. 考虑多语言能力10. 注意伦理和合规性结构化输出1. 使用明确的提示(Prompts)2. 采…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
