017-从零搭建微服务-系统服务(四)

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):https://gitee.com/csps/mingyue

源码地址(前端):https://gitee.com/csps/mingyue-ui

文档地址:https://gitee.com/csps/mingyue/wikis

数据库权限模型设计

设计思路:通过用户关联角色(一个用户可关联多个角色),角色关联菜单(一个角色可关联多个菜单),完成用户权限控制。

  • 用户 1 => 角色 N
  • 角色 1 => 菜单(权限点)N
sys_user           用户表
sys_user_role      用户角色关系表
sys_role           角色表
sys_role_menu      角色菜单关系表
sys_menu           菜单表

image-20230719154628085

用户表

用户表在之前的开发中已经设计并使用了

CREATE TABLE `sys_user` (`user_id`      BIGINT(20)       NOT NULL        COMMENT '用户ID',`username`     VARCHAR(64)      NOT NULL        COMMENT '用户名',`nickname`     VARCHAR(64)      NOT NULL        COMMENT '用户昵称',`sex`          CHAR(1)          DEFAULT '0'     COMMENT '用户性别(0男 1女 2未知)',`password`     VARCHAR(255)     NOT NULL        COMMENT '密码',`phone`        VARCHAR(32)      DEFAULT NULL    COMMENT '手机号码',`email`        VARCHAR(32)      DEFAULT NULL    COMMENT '用户邮箱',`avatar`       VARCHAR(255)     DEFAULT NULL    COMMENT '头像',`status`       CHAR(1)          DEFAULT '0'     COMMENT '帐号状态(0正常 1停用)',`is_deleted`   CHAR(1)          DEFAULT '0'     COMMENT '删除标志(0正常,1删除)',`create_time`  DATETIME         DEFAULT NULL    COMMENT '创建时间',`update_time`  DATETIME         DEFAULT NULL    COMMENT '修改时间',`create_by`    VARCHAR(64)      DEFAULT NULL    COMMENT '创建者',`update_by`    VARCHAR(64)      DEFAULT NULL    COMMENT '更新人',PRIMARY KEY (`user_id`),KEY `user_idx1_username` (`username`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '用户表';BEGIN;
INSERT INTO `sys_user` VALUES (1, 'mingyue', '明月', '0', '123456', '13288888888', NULL, NULL, '0', '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
INSERT INTO `sys_user` VALUES (2, 'strive', 'Strive', '0', '123456', '15388888888', NULL, NULL, '0', '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
COMMIT;

角色表

CREATE TABLE sys_role (`role_id`       BIGINT(20)      NOT NULL         COMMENT '角色ID',`role_name`     VARCHAR(64)     NOT NULL         COMMENT '角色名称',`role_code`     VARCHAR(64)     NOT NULL         COMMENT '角色代码',`order_num`     INT(4)          NOT NULL         COMMENT '显示顺序',`status`        CHAR(1)         DEFAULT '0'      COMMENT '角色状态(0正常 1停用)',`role_desc`     VARCHAR(255)    DEFAULT NULL     COMMENT '角色描述',`is_deleted`    CHAR(1)         DEFAULT '0'      COMMENT '删除标志(0正常,1删除)',`create_time`   DATETIME        DEFAULT NULL     COMMENT '创建时间',`update_time`   DATETIME        DEFAULT NULL     COMMENT '修改时间',`create_by`     VARCHAR(64)     DEFAULT NULL     COMMENT '创建者',`update_by`     VARCHAR(64)     DEFAULT NULL     COMMENT '更新人',PRIMARY KEY (`role_id`),UNIQUE KEY `role_idx1_role_code` (`role_code`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '角色表';BEGIN;
INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 0, '0', NULL, '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
INSERT INTO `sys_role` VALUES (2, '普通用户', 'common', 1, '0', NULL, '0', '2023-07-19 17:06:22', '2023-07-19 17:06:25', 'mingyue', 'mingyue');
COMMIT;

用户角色关系表

管理用户与角色之间关系,用户 1 => 角色 N

DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE sys_user_role (`user_id`   BIGINT(20) NOT NULL COMMENT '用户ID',`role_id`   BIGINT(20) NOT NULL COMMENT '角色ID',PRIMARY KEY (`user_id`, `role_id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '用户和角色关联表';BEGIN;
INSERT INTO `sys_user_role` VALUES (1, 1);
INSERT INTO `sys_user_role` VALUES (2, 2);
COMMIT;

菜单表

菜单表的设计参考前端项目 JSON 数据设计

{// 菜单路径,用于跳转path: '/home',// 菜单 name,用于界面 keep-alive 路由缓存。// 此 name 需要与 component 组件中的 name 值相同(唯一)name: 'home',// 组件路径component: () => import('/@/views/home/index.vue'),// 菜单重定向路径redirect: '/home',// 附加自定义数据meta: {// 菜单标题(国际化写法)title: 'message.router.home',// 菜单外链链接// 开启外链条件,`1、isLink: true 2、链接地址不为空(meta.isLink) 3、isIframe: false`isLink: '',// 菜单是否隐藏(菜单不显示在界面,但可以进行跳转)isHide: false,// 菜单是否缓存isKeepAlive: true,// 菜单是否固定(固定在 tagsView 中,不可进行关闭),右键菜单无 `关闭` 项isAffix: true,// 是否内嵌// 开启条件,`1、isIframe: true 2、链接地址不为空(meta.isLink)`isIframe: false,// 当前路由权限标识,取角色管理。控制路由显示、隐藏。超级管理员:admin 普通角色:common// 之前 auth 取用户(角色下有多个用户)roles: ['admin', 'common'],// 菜单图标icon: 'iconfont icon-shouye',// 自行再添加...},
}
CREATE TABLE `sys_menu` (`menu_id`        BIGINT(20)    NOT NULL                COMMENT '菜单名称',`menu_name`      VARCHAR(32)   NOT NULL                COMMENT '菜单名称',`parent_id`      BIGINT(20)    DEFAULT NULL            COMMENT '父菜单ID',`permission`     VARCHAR(32)   DEFAULT NULL            COMMENT '权限标识',`type`           CHAR(1)       DEFAULT NULL            COMMENT '菜单类型(0菜单 1按钮)',`order_num`      INT(4)        NOT NULL DEFAULT '0'    COMMENT '排序值',`path`           VARCHAR(128)  DEFAULT NULL            COMMENT '路由地址(前端URL)',`component`      VARCHAR(255)  DEFAULT null            COMMENT '组件路径',`redirect`       VARCHAR(255)  DEFAULT null            COMMENT '重定向路径',`is_link`        CHAR(1)       DEFAULT '0'             COMMENT '是否为外链(0否 1是)',`is_hide`        CHAR(1)       DEFAULT '0'             COMMENT '是否隐藏(0否 1是)',`is_keep_alive`  CHAR(1)       DEFAULT '0'             COMMENT '是否开启缓存(0否 1是)',`is_affix`       CHAR(1)       DEFAULT '0'             COMMENT '是否固定(0否 1是)',`is_iframe`      CHAR(1)       DEFAULT '0'             COMMENT '是否内嵌(0否 1是)',`status`         CHAR(1)       DEFAULT '0'             COMMENT '菜单状态(0正常 1停用)',`icon`           VARCHAR(64)   DEFAULT NULL            COMMENT '图标',`is_deleted`     CHAR(1)       DEFAULT '0'             COMMENT '删除标志(0正常,1删除)',`create_time`    DATETIME      DEFAULT NULL            COMMENT '创建时间',`update_time`    DATETIME      DEFAULT NULL            COMMENT '修改时间',`create_by`      VARCHAR(64)   DEFAULT NULL            COMMENT '创建者',`update_by`      VARCHAR(64)   DEFAULT NULL            COMMENT '更新人',PRIMARY KEY (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='菜单权限表';BEGIN;
INSERT INTO `sys_menu` VALUES (1000, '系统管理', -1, NULL, '0', 0, '/system', NULL, NULL, '0', '0', '0', '0', '0', '0', 'iconfont icon-xitongshezhi', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
INSERT INTO `sys_menu` VALUES (1100, '用户管理', 1000, NULL, '0', 0, '/system/user', NULL, NULL, '0', '0', '0', '0', '0', '0', 'iconfont icon-icon-', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
INSERT INTO `sys_menu` VALUES (1200, '角色管理', 1000, NULL, '0', 1, '/system/role', NULL, NULL, '0', '0', '0', '0', '0', '0', 'ele-ColdDrink', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
INSERT INTO `sys_menu` VALUES (1300, '菜单管理', 1000, NULL, '0', 2, '/system/menu', NULL, NULL, '0', '0', '0', '0', '0', '0', 'iconfont icon-caidan', '0', '2023-07-20 17:00:49', '2023-07-20 17:01:09', 'mingyue', 'mingyue');
COMMIT;

角色菜单关联表

管理角色与菜单之间关系,角色 1 => 菜单(权限点)N

DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE sys_role_menu (`role_id`   BIGINT(20) NOT NULL COMMENT '角色ID',`menu_id`   BIGINT(20) NOT NULL COMMENT '菜单ID',PRIMARY KEY (`role_id`, `menu_id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT = '角色和菜单关联表';BEGIN;
INSERT INTO `sys_role_menu` VALUES (1, 1000);
INSERT INTO `sys_role_menu` VALUES (1, 1100);
INSERT INTO `sys_role_menu` VALUES (1, 1200);
INSERT INTO `sys_role_menu` VALUES (1, 1300);
INSERT INTO `sys_role_menu` VALUES (2, 1000);
INSERT INTO `sys_role_menu` VALUES (2, 1100);
COMMIT;

编写关系 SQL

用户与角色

SELECT su.user_id, su.username, su.nickname,sur.role_id,sr.role_name FROM sys_user su
LEFT JOIN sys_user_role sur ON sur.user_id = su.user_id
LEFT JOIN sys_role sr ON sr.role_id = sur.role_id

角色与菜单

SELECT sr.role_id, sr.role_name, sm.menu_id, sm.menu_name FROM sys_role sr
LEFT JOIN sys_role_menu srm ON srm.role_id = sr.role_id
LEFT JOIN sys_menu sm ON sm.menu_id = srm.menu_id

用户与菜单

SELECT su.user_id, su.username, su.nickname,sur.role_id,sr.role_name, sm.menu_id, sm.menu_name FROM sys_user su
LEFT JOIN sys_user_role sur ON sur.user_id = su.user_id
LEFT JOIN sys_role sr ON sr.role_id = sur.role_id
LEFT JOIN sys_role_menu srm ON srm.role_id = sr.role_id
LEFT JOIN sys_menu sm ON sm.menu_id = srm.menu_id

小结

数据库权限模型设计到此就 OK 啦~

接下来把基础代码生成一下,对外提供相应接口

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【实战】 七、Hook,路由,与 URL 状态管理(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十三)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

el-upload将上传的图片转为base64

el-upload将上传的图片转为base64 文章目录 el-upload将上传的图片转为base641. el-upload属性设置2. 图片转base64格式方法3. 在绑定的方法中调用 elementui使用el-upload时将选择的图片转为base64格式,然后再上传 1. el-upload属性设置 使用组件,然后on-change绑定…

【NLP】如何使用Hugging-Face-Pipelines?

一、说明 随着最近开发的库,执行深度学习分析变得更加容易。其中一个库是拥抱脸。Hugging Face 是一个平台,可为 NLP 任务(如文本分类、情感分析等)提供预先训练的语言模型。 本博客将引导您了解如何使用拥抱面部管道执行 NLP 任务…

代码随想录算法训练营day45 70.爬楼梯(进阶) 322.零钱兑换 279.完全平方数

题目链接70.爬楼梯(进阶) class Solution {public int climbStairs(int n) {int[] dp new int[n1];int m 2;dp[0] 1;for(int i 1; i < n; i){for(int j 1; j < m; j){if(i > j)dp[i] dp[i-j];}}return dp[n];} }题目链接322.零钱兑换 class Solution {public …

超详细图文教程:3DS Max 中创建低多边形游戏长剑模型

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 在此&#xff0c;由两部分组成的教程的第一部分中&#xff0c;我将向您展示如何&#xff1a; 对剑柄进行建模剑的护手模型剑刃建模 1. 如何制作剑柄 步骤 1 在本教程中使用正交视图。要更改视图&#x…

python安装OpenCV

安装OpenCV pip install opencv-pythonpython OpenCV 打开摄像头 import cv2WIDTH 1080 HEIGHT 720cap cv2.VideoCapture(0, cv2.CAP_DSHOW) cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)while True:ok,frame cap.read()# pri…

阿里巴巴前端开发规范

前言 规范的目的是为了编写高质量的代码&#xff0c;让你的团队成员每天的心情都是愉悦的&#xff0c;大家在一起是快乐的。 现在软件架构的复杂性需要协同开发完成&#xff0c;如何高效地协同呢&#xff1f;无规矩不成方圆&#xff0c;无规范难以协同&#xff0c;比如&#xf…

机器学习概念

文章目录 一、机器学习概念1. 机器学习基本概念2. 基于规则的学习3. 基于模型学习4. 机器学习数据集描述二、机器学习分类1. 监督学习1.1 分类问题1.2 回归问题2. 无监督学习2.1 聚类问题2.2 数据降维3. 半监督学习4. 强化学习三、拟合问题1. 欠拟合2. 过拟合3. 奥卡姆剃刀原则…

Android:aidl简单应用

创建aidl文件&#xff1a;IMyAidlInterface.aidl Build-> Clean Project 重新编译下项目 生成IMyAidlInterface.class文件 interface IMyAidlInterface { void basicTypes(int jk); } --MyService public class MyService extends Service { //定义音乐…

AI时代带来的图片造假危机,该如何解决

一、前言 当今&#xff0c;图片造假问题非常泛滥&#xff0c;已经成为现代社会中一个严峻的问题。随着AI技术不断的发展&#xff0c;人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片&#xff0c;使其看起来真实而难以辨别&#xff0c;之前就看到过一对硕士夫妻为了骗…

uni-app:页面跳转

uni.navigateTo: 不关闭当前页面&#xff0c;跳转到一个新页面。 uni.redirectTo: 关闭当前页面&#xff0c;跳转到应用中的某个页面。 uni.reLaunch: 关闭所有页面&#xff0c;打开应用中的某个页面。 uni.switchTab: 跳转到应用的底部选项卡页面。 uni.navigateBack: 返回上一…

Flink-端到端精确一次(End-To-End Exactly-Once)

1.总结 目的&#xff1a;想要在故障恢复后不丢数据 输入端 保证可以重复发送数据如果是kafka&#xff0c;Flink负责维护offset&#xff0c;不用kafka维护设置kafka的隔离级别为&#xff1a;读已提交flink 开启检查点采用对齐或者不对齐的精确一次输出端 kafka 幂等事务两阶段…

一文了解Python中的while循环语句

目录 &#x1f969;循环语句是什么 &#x1f969;while循环 &#x1f969;遍历猜数字 &#x1f969;while循环嵌套 &#x1f969;while循环嵌套案例 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;Python从入门到精通专栏 循环语句是什…

Mysql表锁与行锁

Mysql锁实战 前言&#xff1a;什么是锁一&#xff1a;全局锁1.1 概念1.2 作用1.3 使用1.4 特点 二&#xff1a;表级锁2.1 概念2.2 分类2.2.1 表锁2.2.2 元数据锁 MDL2.2.3 意向锁 三&#xff1a;行级锁3.1 行锁(Record Lock)3.2 间隙锁(Gap Lock)3.3 临键锁(Next-Key Lock): 四…

C# 委托详解

一.委托的概念 C#中委托也叫代理&#xff0c;委托提供了后期绑定机制(官方解释)&#xff0c;功能类似于C中的函数指针&#xff0c;它存储的就是一系列具有相同签名和返回类型的方法的地址&#xff0c;调用委托的时候&#xff0c;它所包含的所有方法都会被执行。 二.委托的用法…

自然语言处理基础详解入门

1、自然语言的概念 自然语言是指人类社会约定俗成的&#xff0c;并且区别于人工语言&#xff08;如计算机程序&#xff09;的语言&#xff0c;&#xff0c;是自然而然的随着人类社会发展演变而来的语言&#xff0c;它是人类学习生活的重要工具。 2、自然语言处理概述 自然语言…

Redis【实践篇】之RedisTemplate基本操作

Redis 从入门到精通【应用篇】之RedisTemplate详解 文章目录 Redis 从入门到精通【应用篇】之RedisTemplate详解0. 前言1. RedisTemplate 方法1. 设置RedisTemplate的序列化方式2. RedisTemplate的基本操作 2. 源码浅析2.1. 构造方法2.2. 序列化方式2.3. RedisTemplate的操作方…

【数据可视化】基于Python和Echarts的中国经济发展与人口变化可视化大屏

1.题目要求 本次课程设计要求使用Python和ECharts实现数据可视化大屏。要求每个人的数据集不同&#xff0c;用ECharts制作Dashboard&#xff08;总共至少4图&#xff09;&#xff0c;要求输入查询项&#xff08;地点和时间&#xff09;可查询数据&#xff0c;查询的数据的地理…

Stable Diffusion如何生成高质量的图-prompt写法介绍

文章目录 Stable Diffusion使用尝试下效果prompt的编写技巧prompt 和 negative promptPrompt格式Prompt规则细节优化Guidance Scale 总结 Stable Diffusion Stable Diffusion是一个开源的图像生成AI系统,由Anthropic公司开发。它基于 Transformer模型架构,可以通过文字描述生成…

Asp.net Core配置CORS 跨域无效(记录一下)

问题 学习老杨的英语网站项目&#xff0c;运行项目时&#xff0c;发现出现了跨域的问题。 然后自己建一项目&#xff0c;进行配置&#xff0c;测试&#xff0c;发现配置CORS 跨域时&#xff0c;发现跨域的配置无效&#xff0c;依旧报错。 解决 网上找了一天&#xff0c;然后…