概念、框架简介--ruoyi学习(一)

开始进行ruoyi框架的学习,比起其他的前后端不分离的,这个起码看的清晰一些吧。

这一节主要是看了ruoyi的官方文档后,记录了以下不懂的概念,并且整理了ruoyi框架中的相关内容。

一些概念

前端

  1. store

store是状态管理库,用于管理前端应用程序(在浏览器中运行的Web应用程序)的状态。前端应用程序通常由多个组件组成,这些组件之间可能共享数据和状态,因此为了统一管理和共享状态,使用状态管理库来创建一个全局的store,存储应用程序的状态数据。

"store"存储了应用程序的各种状态,例如用户登录状态、页面内容、选项状态等。组件可以从"store"中获取状态数据,并且可以通过派发(dispatch)操作来触发状态的变化。变化后的状态将被存储在"store"中,并且会自动更新相关的组件。

通过使用"store",前端开发人员可以更好地组织和管理应用程序的状态,避免了状态分散和数据流混乱的问题。它提供了一种可预测和可维护的方式来处理状态变化,并使得状态在应用程序中的传递和共享更加简单和高效。

后端

  1. Servlet

servlet用于在Web服务器上处理客户端请求和生成响应。servlet是一种服务器端的Java程序,主要用于开发动态的Java程序。Servlet主要用于处理Web请求和生成动态Web内容。它可以接收来自Web浏览器的请求,执行相应的任务,并将生成的结果发送回浏览器。Spring框架的核心是基于Servlet的,Spring框架提供了一个称为DispatcherServlet的前端控制器,它是一个特殊的Servlet,用于处理所有的Web请求。DispatcherServlet负责将传入的请求路由到相应的处理程序(也称为控制器),并处理视图渲染、数据绑定等任务。因此,Spring框架在Servlet的基础上提供了更高级的抽象和功能,使得开发Web应用程序更加方便和灵活。

  1. Spring Security

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。

可以实现的功能:

  1. Authentication 认证,就是用户登录
  2. Authorization 授权,判断用户拥有什么权限,可以访问什么资源
  3. 安全防护,可以抵御    跨站脚本攻击,session攻击等

spring securityshiro的关系:

  1. 都可以完成认证功能、授权功能、加密功能、会话管理、缓存支持以及remember me功能(当用户短暂地关闭浏览器后,仍然可以通过存储在本地的token不重复登录地情况下发送请求)。
  2. spring security需要依托spring容器进行开发,shiro的配置和使用比较简单,无需依赖任何容器和框架。
  1. Jetty

jetty和tomcat一样,都是为基于java的web容器,比如JSP和Servlet提供运行环境。但是相比于tomcat,jetty要更轻量级一些,而且jetty更加灵活,体现在jetty的可插拔性和可扩展性,jetty提供了很多接口,可以通过这些接口进行进一步开发。但是在大规模的企业级应用时,jetty需要实现大量的扩展,在这种情况tomcat是更优的选择。

  1. Spring EL

EL:Expression Language表达式语言。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。例如:在浏览器中输出请求域中名称为message的内容。(感觉这个就很像之前前后端不分离的时候,在前端渲染数据)

 

Spring3 中引入了 Spring 表达式语言 Spring ELSpEL 是一种强大,简洁的装配 Bean 的方式,它可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用 JDK 中提供的静态常量,获取外部 Properties 文件中的的配置。Spring EL中用的是#{},举个例子:

 

框架

权限注解

Spring Security允许开发者在定义接口访问的方法上面添加注解,控制访问权限。

权限方法

@PreAuthorize注解用于配置接口要求用户拥有某些权限才可访问,它拥有如下方法:

方法

参数

描述

hasPermi

String

验证用户是否具备某权限

lacksPermi

String

验证用户是否不具备某权限,与 hasPermi逻辑相反

hasAnyPermi

String

验证用户是否具有以下任意一个权限

hasRole

String

判断用户是否拥有某个角色

lacksRole

String

验证用户是否不具备某角色,与 isRole逻辑相反

hasAnyRoles

String

验证用户是否具有以下任意一个角色,多个逗号分隔

使用示例

其中@ss代表的是PermissionService(ruoyi自定的权限服务)服务,对每个接口拦截并调用PermissionService的对应方法判断接口调用者的权限。

数据权限示例:

 


角色权限示例:

 

公开接口

如果某个接口不需要验证权限就可以访问,那么直接对这个接口的请求放行就可以。

  1. 把@PreAuthorize注释掉或者直接删掉。
  2. 使用@Anonymous注解。

但是我没有使用@Anonymous注解,只是把pre注解注释掉了也可以访问呢。因为如果这两个注解都不加的话,就相当于默认放行了。

坏了,如果用@Anonymous注解,那么一定得把@PreAuthorize注释掉啊,不然还是会进行权限控制的。因为@pre的优先级要比@ano的高一些。

 

事务管理

@Transactional注解只能应用到public可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务。

实现事务管理比较简单,在类或者方法上添加@Transactional注解就行。

1.Spring中进行事务管理的时候,默认的事务规则是遇到运行时异常(RuntimeException)或者程序错误(Error)才会回滚。所以如果想对其他的异常进行检查并事务回滚,可以使用rollbackFor属性明确指定异常。

2.在业务层捕捉完异常之后,不能直接处理异常,要把它抛出去,然后在控制层统一管理。如果在业务层直接处理了异常,那么Spring不知道你的事务到底有没有成功执行,怎么会对异常进行处理并回滚呢。

正确做法示例:

 

异常处理

在实际开发中,如果我们在业务模块中使用try...catch...对异常进行捕获和处理,很容易造成代码的重复和繁杂。所以我们在业务中只保留业务相关的代码,在可能发生异常的方法里把异常throw给控制器,然后由全局异常处理器对异常统一管理。

步骤:

  1. 定义一个异常类。
  2. 定义一个全局异常controller。在这个controller上要添加@RestControllerAdvice注解。添加了这个注解后,就可以捕获全局异常后使用这个controller来处理。
  3. 在2中的全局异常类中,进行相关异常的处理。首先在不同的处理方法上面添加@ExceptionHandler(value = BusinessException.class),表示这个方法用于处理抛出的BusinessException异常。

全局异常controller类的代码如下:

 

参数验证

使用@Validate来校验数据,如果数据异常则统一抛出异常,方便全局异常处理器统一处理。

数据校验

  1. 在字段的GET方法或者直接在字段上声明数据的校验逻辑:​​​​​​​​​​​​​​
  2. 在对应方法的参数列表中加入注解@Validated,表示对这个参数按照提前设计好的校验逻辑进行校验。


 

自定义分组校验

如果对于同一个字段在不同的方法中有不同的校验逻辑,可以通过groups属性设置,根据操作类型不同进行不同情况的校验。

  1. 新增接口,标识不同的操作类型。
  2. 添加字段的校验逻辑,并且设置它所涉及的操作类型。
  3. 在接收方法的参数列表中声明当前方法调用该字段的哪一类操作校验。

 

防重复提交

在接口方法上添加@RepeatSubmit注解即可,注解参数说明:

参数

类型

默认值

描述

interval

int

5000

间隔时间(ms),小于此时间视为重复提交

message

String

不允许重复提交,请稍后再试

提示消息

实体类

AjaxResult

ruoyi里面封装了AjaxResult这个实体类,还以为这个类是和前端有什么特别的关系。原来就是一个继承了HashMap的子类,里面封装了error和success两个方法,负责在后端返回数据失败/成功时返回对应的处理结果。

注解

异常相关注解

在controller类上添加@ControllerAdvice或者@RestControllerAdvice,这两个注解的作用是差不多的,都是为了实现自定义的全局异常管理,加了这个注解的类就是一个全局异常控制类。

当自定义类加@ControllerAdvice注解时,方法需要返回json数据时,每个方法还需要添加@ResponseBody注解。

当自定义类加@RestControllerAdvice注解时,方法自动返回json数据,每个方法无需再添加@ResponseBody注解。

如果添加了相关注解之后,仍然不能捕捉到业务层抛出的全局异常并进行相应处理,可能是因为SpringBoot启动类没有扫描到这个异常处理类。如:启动类在“com.galen.cloud.portal”包下,那么只有com.galen.cloud.portal包下的类会被扫描加载)。所以添加上对应的scanBasePackages 即可(我这边改为扫描所有匹配com.galen.*的包)。

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

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

相关文章

数值线性代数: 共轭梯度法

本文总结线性方程组求解的相关算法,特别是共轭梯度法的原理及流程。 零、预修 0.1 LU分解 设,若对于,均有,则存在下三角矩阵和上三角矩阵,使得。 设,若对于,均有,则存在唯一的下三…

中科院放大招:FastSAM快速细分任何东西

FastSAM是一个用于图像分割的快速模型,它是对SAM(Segment Anything Model)模型的改进和优化。FastSAM模型的目标是提高计算效率,使得图像分割任务能够更快地完成。 FastSAM模型的优势主要体现在以下几个方面: 快速性…

2023年7月26日 单例模式

单例模式 饿汉模式 package com.wz.cinema.platform.server.util;public class DataManager {/*** 单例模式:整个类在运行中只会有一个实例* 既然是在运行中只有一个实例,那么就必须* 考虑多线程环境** 单例模式分为懒汉模式和饿汉模式* 饿汉模式本身就是…

opencv03-Mat矩阵API的使用

opencv03-Mat矩阵API的使用 构造方法(具体介绍看API文档) int main() {Mat m1 Mat(200, 100, CV_8UC1);imshow("o1", m1);Mat m2 Mat(Size(100, 200), CV_8UC1);imshow("o2", m2);Mat m3 Mat(200, 100, CV_8UC3, Scalar(255, 0, 0));imshow("o3&…

【Linux进程篇】进程概念(1)

【Linux进程篇】进程概念(1) 目录 【Linux进程篇】进程概念(1)进程基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类 组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程——fork初识 作者&#xff…

Qt几种字符类型的相互转换

Qt几种字符类型的相互转换 将const QString转换为const char*将const char*转换为const QStringQstring转换为string把string转换为QstringQt中弹出一个窗口 将const QString转换为const char* #include <QString> #include <iostream>int main() {const QString …

【Docker】Docker应用部署之Docker容器安装Redis

目录 一、搜索Redis镜像 二、拉取Redis镜像 三、创建容器 四、测试使用 一、搜索Redis镜像 docker search redis 二、拉取Redis镜像 docker pull redis:版本号 # 拉取对应版本的redis镜像 eg: docker pull redis:5.0 三、创建容器 docker run -id --nameredis -p 6379:637…

Games101学习笔记 - 变换矩阵基础

二维空间下的变换 缩放矩阵 缩放变换: 假如一个点&#xff08;X,Y&#xff09;。x经过n倍缩放&#xff0c;y经过m倍缩放&#xff0c;得到的新点&#xff08;X1&#xff0c;Y1&#xff09;&#xff1b;那么新点和远点有如下关系&#xff0c;X1 n*X, Y1 m*Y写成矩阵就是如下…

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间&#xff0c;ChatGPT吸引了社会各界的目光&#xff0c;它可以撰写会议通知、新闻稿、新年贺信&#xff0c;还可以作诗、写文章&#xff0c;甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声&#xff0c;谷歌、百度等知名企业纷纷宣布要提供类似产品。…

玩转Tomcat:从安装到部署

文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat&#xff0c;我们一般会想到什么&#xff1f;没错&#xff0c;就是他&#xff0c;童年的回忆…

安全基础 --- html标签 + 编码

html标签 &#xff08;1&#xff09;detail标签 <details>标签用来折叠内容&#xff0c;浏览器会折叠显示该标签的内容。 <1> 含义&#xff1a; <details> 这是一段解释文本。 </details> 用户点击这段文本&#xff0c;折叠的文本就会展开&#x…

MySQL_2.6【高级查询2】详细讲解

目录 一、多表查询 1、笛卡尔积现象 2、等值连接查询 3、自连接查询 4、内连接查询 5、外连接 二、子查询 1、单列子查询 2、单行子查询 3、多行子查询 4、多列子查询 5、关联子查询【了解】 6、子查询的综合应用 加油&#xff01;&#xff01;&#xff01; 一、多…

Sklearn学习-iris数据集学习

Sklearn学习-逻辑回归&#xff08;iris数据集&#xff09; 使用load_iris加载数据集&#xff0c;查看包含的keys查看数据的列名&#xff0c;分类目标的名称获取data和target&#xff0c;并打印各自的shape拆分训练集和测试集使用逻辑回归训练。在测试集上计算准确率在测试集上实…

【云原生】Docker容器资源限制(CPU/内存/磁盘)

目录 ​编辑 1.限制容器对内存的使用 2.限制容器对CPU的使用 3.block IO权重 4.实现容器的底层技术 1.cgroup 1.查看容器的ID 2.在文件中查找 2.namespace 1.Mount 2.UTS 3.IPC 4.PID 5.Network 6.User 1.限制容器对内存的使用 ⼀个 docker host 上会运⾏若⼲容…

React几种避免子组件无效刷新的方案

您好&#xff0c;如果喜欢我的文章&#xff0c;可以关注我的公众号「量子前端」&#xff0c;将不定期关注推送前端好文~ 前言 一个很常见的场景&#xff0c;React中父组件和子组件在一起&#xff0c;子组件不依赖于父组件任何数据&#xff0c;但是会一起发生变化。 在探究原…

平面设计软件都有哪些?推荐这7款

优秀的平面广告设计可以给产品带来良好的效益&#xff0c;正确传播品牌的价值和色调&#xff0c;而功能强大、使用方便的平面广告设计软件是创造优秀平面广告设计的关键。本文推荐7款备受好评的平面广告设计软件&#xff0c;易于使用&#xff01; 1.即时设计 即时设计是国内一…

如何通过企业工商信息初步判断企业是否靠谱?

银行、投资机构等对企业进行融资、授信、合作时&#xff0c;需要如何评估企业的可靠性。企业工商信息作为企业的基础信息&#xff0c;是初步判断企业是否靠谱的重要依据之一&#xff0c;通过对企业工商信息的综合分析&#xff0c;我们可以了解企业的经营状况、财务实力、法律风…

Bug记录: CUDA error_ device-side assert triggered

Bug记录&#xff1a; CUDA error: device-side assert triggered 在接触AIGC算法的过程中偶尔会遇到这样的bug&#xff1a;RuntimeError: CUDA error: device-side assert triggered return torch._C._cuda_synchronize() RuntimeError: CUDA error: device-side assert trig…

python在不同坐标系中绘制曲线

文章目录 平面直角坐标系空间直角坐标系极坐标地理坐标 平面直角坐标系 回顾我们的数据可视化的学习历程&#xff0c;其实始于笛卡尔坐标系的创建&#xff0c;并由此建立了数与形的对应关系。在笛卡尔坐标系中随便点上一点&#xff0c;这个点天生具备坐标&#xff0c;从而与数…

CloudDriver一款将各种网盘云盘挂在到电脑本地变成本地磁盘的工具 教程

平时我们的电脑可能由于大量的文件资料之类的导致存储空间可能不够&#xff0c;所以我们可以选择将网盘我们的本地磁盘用来存放东西。 CloudDrive 是一款可以将 115、阿里云盘、天翼云盘、沃家云盘、WebDAV 挂载到电脑中&#xff0c;成为本地硬盘的工具&#xff0c;支持 Window…