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 啦~

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

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

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

相关文章

数学建模入门-如何从0开始,掌握数学建模的基本技能

一、前言 本文主要面向没有了解过数学建模的同学,帮助同学们如何快速地进行数学建模的入门并且尽快地在各类赛事中获奖,或者写出优秀的数学建模论文。 在本文中,我将从什么是数学建模、数学建模的应用领域、数学建模的基本步骤、数学建模的技…

DevOps系列文章之 Git知识大全

这里是结合实际业务场景输出。 使用的 Git版本:git version 2.24.0 命令 git log 查看日志,常规操作,必备 # 输出概要日志,这条命令等同于 # git log --prettyoneline --abbrev-commit git log --oneline# 指定最近几个提交可以带上 - 数…

SpringBoot整合SpringData JPA

SpringBoot整合SpringData JPA 下一节直通车 JPA的一对一、一对多、多对多查询 简介 JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR 338,这些接口所在包为javax.persistence,详细…

【《Spring Boot微服务实战(第2版)》——一本关于如何在Spring Boot中构建微服务的全面指南】

使用Spring Boot框架构建基于Java的微服务架构,将应用程序从小型单体架构蜕变为由多个服务组成的事件驱动架构。这个最新版本围绕服务发现、负载均衡、路由、集中式日志、按环境配置和容器化等知识点,循序渐进地讲述微服务架构、测试驱动的开发和分布式系…

Mac 预览(Preview)丢失PDF标注恢复

感谢https://blog.csdn.net/yaoyao_chen/article/details/127462497的推荐! 辛苦用预览在pdf上做的阅读标记,关闭后打开全丢失了,推荐尝试下网站导入文件进行恢复: 直接使用该网页应用PDF Annotation Recovery 或者访问该项目&a…

下载|GitLab 2023 年 DevSecOps 全球调研报告:安全左移深入人心、AI/ML 蔚然成风

目录 谁应该对应用程序安全负主要责任? 安全实践的最大挑战 AI 驱动研发,提升研发效率 各个角色使用的工具数量是多少? 一体化 DevSecOps 平台有哪些优势? 56%、74%、71%、65%、57% 这些数字和 DevSecOps 结合在一起&#xf…

MySQL一些知识

六、MySQL命令参数 七、远程登录 use mysql 八、SQL语句和常见的SQL操作 九、数据库和表的创建及插入 指定字段名称,按照表的字段名称顺序写: 指定字段名称: 字段名称可以不全部指定:

K8s Service网络详解(二)

Kube Proxy Kubernetes 在设计之初就充分考虑了针对容器的服务发现与负载均衡机制。 Service 资源,可以通过 kube-proxy 配合 cloud provider 来适应不同的应用场景。 Service相关的事情都由Node节点上的 kube-proxy处理。在Service创建时Kubernetes会分配IP给Ser…

vue3-Vite原理

1. vite的优势 1. 极速的服务启动2. 轻量快速的预加载.....2. 对vite的理解(和webpack对比说明) webpack要经过打包,然后在开发阶段启动服务器vite不需要打包 下图的"准备"就是编译的意思。 css的内容会编译程一个字符串。 组件会…

海盗王基于golang重制版的商城服务端

海盗王原始的商城服务端,附带有很多其他功能(如GM留言管理,商品管理接口),配置起来非常麻烦,而且运行时问题也很多,经常会出现弹出停止响应,无法正常提供服务。 在很早的时候&#x…

系统架构设计师-软件架构设计(1)

目录 一、软件架构的概念 1、架构的本质 2、架构的作用 二、架构发展历史 三、架构的 “4 1” 视图 1、逻辑视图(Logical View) 2、开发视图(Development View) 3、进程视图(Process View) 4、物理视图…

【车载开发系列】AUTOSAR DemComponent和DemDTC

【车载开发系列】AUTOSAR DemComponent和DemDTC 【车载开发系列】AUTOSAR DemComponent和DemDTC 【车载开发系列】AUTOSAR DemComponent和DemDTC一. DemComponent概念二. DemDTC概念三. 常用设置参数DemDTCClass1) DemDTCFunctional2)DemDTCSeverity3&am…

ChatGPT开放自定义系统级别的指令,可设置偏好变成专属助理

OpenAI官方消息https://openai.com/blog/custom-instructions-for-chatgpt OpenAI为其大型语言模型接口ChatGPT引入了自定义指令,旨在为用户提供更加量身定制和个性化的体验,可以设置您的偏好,ChatGPT将在未来的所有对话中记住它们。 该功…

PhpStudy靶场首页管理

PhpStudy靶场首页管理 一、源码一二、源码二三、源码三四、源码四 一、源码一 index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>靶场访问首页</title><style>body {background-color: #f2f2f2;colo…

Python采集某网站小视频内容, m3u8视频内容下载

目录标题 前言环境使用:模块使用:代码实现步骤代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 环境使用: python 3.8 运行代码 pycharm 2021.2 辅助敲代码 模块使用: import requests >>> pip install requests 内置模块 你安装好python环境就…

Clion开发STM32之W5500系列(NTP服务封装)

概述 在w5500基础库中进行封装&#xff0c;获取服务端的时间&#xff0c;来校准本地时间。本次使用的方案是通过ntp获取时间定时器更新保证时间准确。 NTP封装 头文件 /*******************************************************************************Copyright (c) [sc…

【业务功能篇48】后端接口开发的统一规范

业务背景&#xff1a;日常工作中&#xff0c;我们开发接口时&#xff0c;一般都会涉及到参数校验、异常处理、封装结果返回等处理。而我们项目有时为了快速迭代&#xff0c;在这方面上有所疏忽&#xff0c;后续导致代码维护比较难&#xff0c;不同的开发人员的不同习惯&#xf…

整合spring cloud云服务架构 - 企业分布式微服务云架构构建

1. 介绍 Commonservice-system是一个大型分布式、微服务、面向企业的JavaEE体系快速研发平台&#xff0c;基于模块化、服务化、原子化、热插拔的设计思想&#xff0c;使用成熟领先的无商业限制的主流开源技术构建。采用服务化的组件开发模式&#xff0c;可实现复杂的业务功能。…

玩转ChatGPT:Custom instructions (vol. 1)

一、写在前面 据说GPT-4又被削了&#xff0c;前几天让TA改代码&#xff0c;来来回回好几次才成功。 可以看到之前3小时25条的限制&#xff0c;现在改成了3小时50条&#xff0c;可不可以理解为&#xff1a;以前一个指令能完成的任务&#xff0c;现在得两条指令&#xff1f; 可…

leetcode743. 网络延迟时间 DJ

https://leetcode.cn/problems/network-delay-time/ 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信…