若依-原理

1.代码生成器

1.1源码分析

代码生成器分为两个部分:

第一部分涉及将业务表结构导入到系统中

第二部分是点击生成按钮,系统将根据表结构生成相应的前后端代码,并提供下载。

1.表结构说明

gen_table:存储业务表的基本信息 ,它对应于配置代码基本信息和生成信息的页面

gen_table_column:存储业务表的字段信息 它对应于配置代码字段信息的页面。

这两张表是一对多的关系,一张业务表可以有多个字段的信息,所以在字段信息表中有个外键table_id指向

2.目录结构

3.查询数据库列表

当管理员在界面上点击导入按钮时,会弹出一个对话框,此时,前端需要向后端发送请求,查询数据库并返回到前端,展示当前项目库中所有待导入的业务表。

<select id="selectDbTableList" parameterType="GenTable" resultMap="GenTableResult">select table_name, table_comment, create_time, update_time from information_schema.tableswhere table_schema = (select database())AND table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%'AND table_name NOT IN (select table_name from gen_table)<if test="tableName != null and tableName != ''">AND lower(table_name) like lower(concat('%', #{tableName}, '%'))</if><if test="tableComment != null and tableComment != ''">AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))</if><if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->AND date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')</if><if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->AND date_format(create_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')</if>order by create_time desc</select>

4.导入表结构

当管理员对话框中选中需要导入的业务表,点击确定按钮,此时,前端需要向后端发送请求,保存业务表的基本信息和字段信息

5.生成代码

6.问题分析

(1)每次生成代码都需要修改作者,去除实体类前缀过于繁琐,现在我们可以修改generator.yml配置文件来调整为自己项目的

(2)实体类支持Lombok,Controller类支持Swagger

需要Velocity模板引擎

1.2Velocity模版引擎

Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离 !

1.基础语法

Velocity中的变量有两类

  • 在模板中定义变量: #set开头,比如 #set($name = "velocity")

  • 获取变量的的值: $name 或者 ${name}

获取对象中的数据

循环

循环遍历普通集合

循环遍历对象

if判断

在条件判断中,velocity支持常见的关系操作符,比如:&&(与), ||(或), !(非)

2.Lombok集成

(1)导入坐标(已完成)

dkd-common模块的pom.xml中添加lombok坐标

(2)修改模板

dkd-generator模块的domain.java.vm模板中添加lombok注解

修改完成之后,重启项目,找到代码生成的功能,通过代码预览可以查看实体类的代码:

3.Swagger集成

(1)修改模板

dkd-generator模块的 controller.java.vm模板中添加Swagger注解

返回结果改为R<>

2.RBAC权限控制

Spring Security是一个功能强大的Java安全框架,它提供了全面的安全认证和授权的支持。

1)认证(Authentication) 在Spring Security的世界里,认证就像用户登录时提交的用户名和密码,系统通过这些信息来验证“你是谁”。

2)授权(Authorization) 授权是确认用户在通过认证之后,是否有权限执行某些操作或访问特定资源。

2.1SpringSecurity配置

Spring Security的配置类是实现安全控制的核心部分

开启Spring Security各种功能,以确保Web应用程序的安全性,包括认证、授权、会话管理、过滤器添加等。

2.2用户登录流程

ruoyi-framework模块中com.ruoyi.framework.web.service.SysLoginService类的login方法处理登录逻辑

  1. 验证码校验

  2. 登录前置校验

  3. SS认证管理器用户校验,调用执行UserDetailsServiceImpl.loadUserByUsername

    1. 认证通过后,创建登录用户对象LoginUser包括用户ID、部门ID、用户信息和用户权限信息

  4. 登录成功,记录日志

  5. 修改用户表更新登录信息

  6. 生成token

2.3获取用户角色和权限

ruoyi-framework模块中com.ruoyi.framework.web.service.SysPermissionService

  1. getRolePermission查询该用户角色集合

  2. getMenuPermission查询该用户权限(菜单)集合用set集合,一个用户可能有多个角色,多个角色的权限可能有重复的

页面权限

2.4获取动态菜单路由

2.5权限注解

1.源码分析

在若依框架中,权限的验证最核心的是使用的Spring Security的提供的权限注解`@PreAuthorize `

- @PreAuthorize 是 Spring Security 框架中提供的一个安全注解,用于实现基于注解的访问控制。它允许开发者在**方法级别**上声明特定的安全约束,以确保只有满足指定条件的用户才能调用该方法

- 当 @PreAuthorize 注解被应用于某个方法时,Spring Security 在**该方法执行前**会先对当前认证的用户进行权限检查。如果检查通过,方法调用得以继续;否则,框架会抛出相应的权限异常(如 AccessDeniedException),阻止方法执行。

2.权限方法

3.公开接口

如果有些接口是不需要验证权限可以公开访问的,这个时候就需要我们给接口放行。

使用注解方式,只需要在Controller的类或方法上加入@Anonymous该注解即可

3.异步任务管理器

主要用于处理一些不需要即时返回结果的后台任务,从而提高应用程序的整体性能

// 多线程执行任务me()创建单例对象(饿汉式)
AsyncManager.me().execute(AsyncFactory.createTimerTask());

若依异步任务管理器是一个单例对象使用了线程池+异步工厂(产生任务用)

  • com.dkd.framework.manager.AsyncManager 异步任务管理器

  • com.dkd.framework.manager.factory.AsyncFactory 异步线程工厂

1、 AsyncManager.me()获取AsyncManager对象

2、调用execute方法,执行TimerTask任务(记录登录日志),它实现了runnable接口,由线程Thread去执行

3、execute方法内部调用ScheduledExecutorService异步操作任务调度线程池的schedule方法用于延迟10毫秒执行一个任务

4.操作日志

在需要被记录日志的controller方法上添加@Log注解,使用方法如下:

@Log(title = "订单管理", businessType = BusinessType.INSERT)
public AjaxResult add(...)
{return toAjax(...);
}

若依操作日志使用了自定义注解+AOP切面+异步任务管理器

  • com.ruoyi.common.annotation.Log 自定义注解

  • com.ruoyi.framework.aspectj.LogAspect 在一个aop切面类

    • 通过实现AOP切面编程,对目标方法进行拦截(标注Log注解的方法),实现了操作日志的自动记录

    • 异步任务管理器来将任务(记录操作日志到数据库)交给线程池来完成

5.定时任务

5.1源码分析

1.表结构说明

sys_job 表(一):这是核心的定时任务表,用于存储定时任务的配置信息,如任务名称、任务组、执行的类全名、执行的参数、cron表达式等

sys_job_log 表(多):用于记录定时任务的执行日志,包括任务的开始执行时间、结束执行时间、执行结果等

2.Quartz体系结构

3.Quartz核心API

4.定时任务执行

5.添加定时任务

6.定时任务状态修改

刚才我们分析新增定时任务的源码时,发现了任务在初始化时是处于暂停状态的。

如果要启动任务,可以在页面进行任务状态的开关控制,所以接下来我们对此功能的源码进行分析

5.2集群模式

首先我们来聊下为什么需要quartz集群

在单机模式下,默认所有的jobDetailtrigger都存储在内存中。这样做的好处是读取速度快,但缺点也很明显:一旦服务器故障,所有的任务数据就会丢失,这就是所谓的单点故障问题。

还有如果在一个高峰时段,比如上午9点,需要触发500个任务,这将给服务器带来巨大的负载压力。这不仅影响性能,还可能引发服务中断。

缺点:单点故障、负载压力大

为了解决这些问题,我们可以部署多个服务器节点,将任务信息存储到数据库中。这样,多个节点就可以通过共享数据库来协调任务的执行,形成Quartz集群模式。

这种方式不仅解决了单点故障问题,还能通过负载均衡提升效率。

集群模式的优势

  • 高可用性:即使某个节点出现问题,其他节点仍然可以正常运行。

  • 负载均衡:将任务分散到不同的节点执行,避免单个节点过载。

实现

1.导入sql

将若依提供的quartz.sql导入到数据库中

2.开启配置

打开dkd-quartz模块中ScheduleConfig配置类注释

3.节点复制

首先修改当前SpringBoot的启动类的名称

我们再添加(复制)一个SpringBoot的启动配置

-Dserver.port=8081

4.观察数据库

重启项目即可,观察数据库,已存入jobDetail和trigger,多个服务器节点可以实现共享

6.数据权限

在系统中,权限的分配和控制主要依赖于角色。每个角色可以被赋予不同的菜单权限和数据权限,用户则通过他们的角色来继承这些权限,进而决定他们能访问哪些系统资源。

目前,系统支持以下五种数据权限类型:

  • 全部数据权限:无限制访问所有数据,相当于拥有最高权限的通行证。

  • 自定数据权限:用户可以根据自己的需求设定访问特定数据的规则。

  • 部门数据权限:只能访问自己所在部门的数据,限制在本部门范围内。

  • 部门及以下数据权限:可以访问自己部门及下属部门的数据,适用于管理层级。

  • 仅本人数据权限:只能访问和操作自己的数据,保障个人隐私和数据隔离。

1.源码

1、若依系统的数据权限设计主要通过用户、角色、部门表建立关系,实现对数据的访问控制:

2、在需要数据权限控制方法上添加@DataScope注解,其中du用来表示表的别名

3、在mybatis查询底部标签添加数据范围过滤

其作用就是相当于在一个 select 语句后面拼接一个 and 条件语句,来实现查询限制

若依数据权限底层使用了自定义注解+AOP切面+SQL拼接

  • com.dkd.common.annotation.DataScope 自定义注解

  • com.ruoyi.framework.aspectj.DataScopeAspect:切面类

    • 通过实现AOP编程,对目标方法进行拦截(标注DataScope 注解的方法),实现了构建数据范围SQL过滤条件

仅实体继承`BaseEntity`才会进行处理,`SQL`语句会存放到`BaseEntity`对象中的`params`属性中,然后在`xml`中通过`${params.dataScope}`获取拼接后的语句。

2.改造

需求

我们有一个系统登录日志,里面记录了所有用户的登录信息。

但是,并不是所有人都应该看到所有的日志数据。所以,我们需要根据用户的角色来控制他们能查看的数据范围。

(1)添加权限注解

dkd-system模块的com.dkd.system.service.impl.SysLogininforServiceImpl在服务层的方法上使用 @DataScope 注解

(2)添加表字段

如果sys_logininfo业务表需要实现数据权限,需要有dept_iduser_id这两个字段。

(3)添加实体属性

dkd-system模块的com.dkd.system.domain.SysLogininfor实体类中,需要有deptIduserId这两个属性。

(4)修改映射文件

dkd-system模块的com.dkd.system.domain.SysLogininforMapper.xml映射文件中,通过动态拼接 SQL,实现数据范围的过滤

(5)异步工厂调整

dkd-framework模块的com.dkd.framework.manager.factory.AsyncFactory异步工厂创建登录日志任务时,需要有deptIduserId这两个属性。

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

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

相关文章

硬件工程师笔试面试——无线通讯模块

目录 15、无线通讯模块 15.1 基础 无线通讯模块实物图 15.1.1 概念 15.1.2 常见的无线通讯模块及其特点 15.1.3 无线通讯模块参数 15.1.4 无线通讯模块工作原理 15.2 相关问题 15.2.1 如何根据项目需求选择合适的无线通讯模块? 15.2.2 无线通讯模块的安全性如何,如…

[机器学习]聚类算法

1 聚类算法简介 # 导包 from sklearn.datasets import make_blobs import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.metrics import calinski_harabasz_score # 构建数据 x,ymake_blobs(n_samples1000,n_features2,centers[[-1,-1],[0,0],[1…

硬件工程师笔试面试——电机

目录 18、电机 18.1 基础 电机原理图 电机实物图 18.1.1 概念 18.1.2 电机的一些基本分类和特点 18.2 相关问题 18.2.1 不同类型的电机在实际应用中有哪些具体的优势和劣势 18.2.2 在设计一个电机系统时,我应该如何考虑电机的选型和配置? 18.2.3 对于需要频繁启停的…

[SWPUCTF 2021 新生赛]Do_you_know_http

很基础的一题&#xff0c;就是修改发送的数据包 1.拿到题目&#xff0c;他让我们使用这个WLLM浏览器&#xff0c;那我们就用bp抓包&#xff0c;修改成User-Agent:WLLM 2.得到响应有个a.php文件&#xff0c;那我们就访问一下&#xff0c;发现请求权限不够&#xff0c;ip地址不对…

初始MYSQL数据库(5)—— 索引

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 索引的概念 索引选择的数据结构 MySQL中的页的相关知识 索引的分类 主键索引 普通索引 唯一索引 非聚集索引 回表查询…

Qt 边框border - qss样式

border属性 实际上&#xff0c;border并不是一个单独的属性&#xff0c;在Qt样式表中&#xff0c;它通常指的是一系列与边框相关的属性的组合。然而&#xff0c;你也可以在一条样式规则中一次性设置所有这些值&#xff0c;如下所示&#xff1a; QPushButton { border: 2px sol…

Layout 布局组件快速搭建

文章目录 设置主题样式变量封装公共布局组件封装 Logo 组件封装 Menu 菜单组件封装 Breadcrumb 面包屑组件封装 TabBar 标签栏组件封装 Main 内容区组件封装 Footer 底部组件封装 Theme 主题组件 经典布局水平布局响应式布局搭建 Layout 布局组件添加 Layout 路由配置启动项目 …

Unity实战案例全解析:PVZ 植物放置分析

前篇&#xff1a;Unity实战案例全解析&#xff1a;PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物&#xff1f; 其实就只需要考虑两个步骤加一个后续处理&#xff1a; 1.点击卡牌后就实例化 需要一个植物状态枚举&#xff0c;因为卡牌分为拿在手上和种植下…

道路裂缝,坑洼,病害数据集-包括无人机视角,摩托车视角,车辆视角覆盖道路

道路裂缝&#xff0c;坑洼&#xff0c;病害数据集 包括无人机视角&#xff0c;摩托车视角&#xff0c;车辆视角 覆盖道路所有问题 一共有八类16000张 1到7依次为: [横向裂缝, 纵向裂缝, 块状裂缝, 龟裂, 坑槽, 修补网状裂缝, 修补裂缝, 修补坑槽] 道路病害&#xff08;如裂缝、…

MQ(RabbitMQ)笔记

初识MQ 同步调用优缺点 异步调用优缺点 总结&#xff1a; 时效性要求高&#xff0c;需要立刻得到结果进行处理--->同步调用 对调用结果不关心&#xff0c;对性能要求高&#xff0c;响应时间短--->异步调用

人工智能和大模型的简介

文章目录 前言一、大模型简介二、大模型主要功能1、自然语言理解和生成2、文本总结和翻译3、文本分类和信息检索4、多模态处理三、大模型的技术特性1、深度学习架构2、大规模预训练3、自适应能力前言 随着技术的进步,人工智能(Artificial Intelligence, AI)和机器学习(Mac…

NPM如何切换淘宝镜像进行加速

什么是淘宝镜像NPM&#xff1f; 淘宝镜像NPM和官方NPM的主要区别在于服务器的地理位置和网络访问速度。淘宝镜像NPM是由淘宝团队维护的一个npm镜像源&#xff0c;主要服务于中国大陆用户&#xff0c;提供了一个国内的npm镜像源&#xff0c;地址为 https://registry.npmmirror.…

论文阅读 - SELF-REFINE: Iterative Refinement with Self-Feedback

https://arxiv.org/pdf/2303.17651 目录 Abstract Introduction 2 Iterative Refinement with SELF-REFINE Evaluation 3.1 Instantiating SELF-REFINE 3.2 Metrics 3.3 Results Abstract 与人类一样&#xff0c;大型语言模型&#xff08;LLMs&#xff09;并非总能在首次…

【有啥问啥】深入浅出马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)算法

深入浅出马尔可夫链蒙特卡罗&#xff08;Markov Chain Monte Carlo, MCMC&#xff09;算法 0. 引言 Markov Chain Monte Carlo&#xff08;MCMC&#xff09;是一类用于从复杂分布中采样的强大算法&#xff0c;特别是在难以直接计算分布的情况下。它广泛应用于统计学、机器学习…

【python设计模式2】创建型模式1

目录 简单工厂模式 工厂方法模式 简单工厂模式 简单工厂模式不是23中设计模式中的&#xff0c;但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节&#xff0c;而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有&#xff1a;工厂角色、抽象产品角…

Redis——常用数据类型string

目录 常用数据结构&#xff08;类型&#xff09;Redis单线程模型Reids为啥效率这么高&#xff1f;速度这么快&#xff1f;&#xff08;参照于其他数据库&#xff09; stringsetgetMSET 和 MGETSETNX&#xff0c;SETEX&#xff0c;PSETEXincr&#xff0c;incrby&#xff0c;decr…

go多线程

1、简单使用&#xff08;这个执行完成&#xff0c;如果进程执行比较久&#xff0c;这里不会等待它们结束&#xff09; package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…

STM32 定时器 输入捕获

定时器输入捕获 1 工作原理1.1 单个通道的工作原理 2 输入滤波2.1 输入滤波原理 3 边沿检测3.1 边沿检测3.2 信号选择 4 分频5 通道使能 1 工作原理 1.1 单个通道的工作原理 2 输入滤波 2.1 输入滤波原理 fck_INT&#xff1a;内部时钟频率&#xff0c;当PCLKx_Pre为1时&…

prometheus 集成 grafana 保姆级别安装部署

前言 本文 grafana 展示效果只需要 prometheus node_exporter grafana 其他的选择安装 环境和版本号 系统: CentOS 7.9 prometheus: 2.54.1 pushgateway: 1.9.0 node_exporter: 1.8.2 alertmanager: 0.27.0 grafana:11.2.0 官网:https://prometheus.io/ 下载地址:h…

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程

大家应该都有同一种感觉&#xff0c;学习appium最大的难处之一在于环境的安装&#xff0c;安装流程比较繁琐&#xff0c;安装的工具和步骤也较多&#xff0c;以下是基于Windows系统下的Android手机端的安装流程。就像我们在用Selenium进行web自动化测试的时候一样&#xff0c;我…