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

news2024/11/17 20:20:03

开始进行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.coloradmin.cn/o/816658.html

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

相关文章

pip安装lap出现问题

解决方法一 用conda安装,用以下命令: conda install -c conda-forge lap解决方法二 用pip安装,用以下命令: pip install gitgit://github.com/gatagat/lap.git文章目录 解决方法一解决方法二摘要YoloV8改进策略:基…

最全面的接口自动化测试流程、工具及其实践

1、接口自动化测试简介 接口自动化测试是指通过编写脚本或使用自动化工具,对软件系统的接口进行测试的过程。接口测试是软件测试中的一种重要测试方法,主要用于验证系统组件之间的通信和数据交换是否正常。接口自动化测试可以提高测试效率和准确性&#…

SQL项目实战:银行客户分析

大家好,本文将与大家分享一个SQL项目,即根据从数据集收集到的信息分析银行客户流失的可能性。这些洞察来自个人信息,如年龄、性别、收入和人口统计信息、银行卡类型、产品、客户信用评分以及客户在银行的服务时间长短等。对于银行而言&#x…

zookeeper学习(三)基础数据结构

数据模型 在 zookeeper 中,可以说 zookeeper 中的所有存储的数据是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。 整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。 进入 zookeeper 安装的 …

如何对反编译的安卓应用进行调试并修改

安卓修改大师可以在没有源代码的情况下,直接反编译已经打包的APK安装包,通过修改SMALI代码实现添加和去除部分功能,并在应用的任何地方添加任意代码,增加任意任何您想实现的功能。通过这种方式,把该应用变为您自己的应…

C++STL库中stack

文章目录 stack的介绍 stack的常用接口 stack的模拟实现 关于栈的相关OJ题 一、stack的介绍 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&a…

英文论文(sci)解读复现:基于YOLOv5的自然场景下苹果叶片病害实时检测

对于目标检测算法改进,但是应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读发表高水平学术期刊中的SCI论文,并对…

FitBot-一款先进的以健康为中心的聊天机器人

在健康意识高涨,追求均衡生活方式成为普遍追求的时代,营养问题无疑是核心支柱。然而,饮食计划的复杂性和大量的营养数据往往成为我们实现这种平衡的障碍。例如糖尿病患者,他们需要持续和准确的营养指导来有效管理血糖水平。如果能…

Mendix是如何支持多语言的?

前言 国际化的支持能力,至关重要。这类功能的缺失,将会在市场竞争、用户体验、合作关系以法律法规方面遇到重大挑战,这些都是可能对其成功产生致命影响的问题。 比如在某些国家和地区,政府可能会对不支持本地语言和货币的软件系…

深度学习,神经网络介绍

目录 1.神经网络的整体构架 2.神经网络架构细节 3.正则化与激活函数 4.神经网络过拟合解决方法 1.神经网络的整体构架 ConvNetJS demo: Classify toy 2D data 我们可以看看这个神经网络的网站,可以用来学习。 神经网络的整体构架如下1: 感知器&…

el-table使用xlsx实现导入文件编辑功能

需求:列表根据xlsx文件导入后,和列表进行对比,之后实现编辑功能 1.下载xlsx 我下的是之前的版本,新版不知道兼不兼容,这个包900多k npm install xlsx0.14.5 2.在需要使用表格导入的页面引入 import XLSX from &quo…

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】

从0到1开发go-tcp框架【2-实现Message模块、解决TCP粘包问题、实现多路由机制】 1 实现\封装Message模块 zinx/ziface/imessage.go package zifacetype IMessage interface {GetMsdId() uint32GetMsgLen() uint32GetMsgData() []byteSetMsgId(uint32)SetData([]byte)SetData…

MySQL数据库 【索引事务】

目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 &#xff08…

Python程序设计基础:字典与集合(二)

文章目录 一、字典的整体操作1、字典的遍历2、字典的排序3、字典的合并 二、创建与访问集合1、集合的创建2、集合的访问 三、集合的基本操作1、集合的增、删、查2、集合的数学运算 一、字典的整体操作 字典的整体操作是指以字典为操作对象,对字典进行遍历、排序以及…

hdu foreverlasting and fried-chicken

题意: 在一个有n个点和m条边的图中找到形状是上图的子图,输出个数 思路: 仔细观察上图,设第二行的那个点为x,最后一行的点为y,那么可以知道,如果x和y都和相同的所有点中取四个点分别和xy相连…

DUBBO服务多网卡,服务调用失败

如果服务器是多网卡的,比如安装了docker,有一个docker虚拟网卡,一个实体网卡eth0,当我们运行springboot应用后,dubbo注入到zk的地址是 docker虚拟网卡的地址172网段,而不是实际内网地址192网段,…

OpenLayers实战,OpenLayers使用wind-layer插件实现风场动态效果

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers的气象风场插件wind-layer实现气象风场动态效果,该插件除了可用于OpenLayers之外,还可用于mapgl、leaflet和cesuim等二维/三维地图引擎,还是很强大的,废话少谈,让我们立刻开始实现吧。 二、依赖和…

如何将论文中的字快速复制出来?图片如何提取文字?

在日常的办公中,我们经常会遇到需要将纸质文件里的文字提取出来,再转换为电子档的情况,如果我们采用手动输入的话,不仅速度太慢,而且还可能因此耽误到后边的工作,是不是已经有小伙伴遇到这种现象&#xff0…

element中tabs组件,click事件点击拿到当前item的所有数据

话不多说,直接上代码: 添加一个:value,然后在用JSON.stringify(item)转一下就可以了,这样就会存在$attrs.value这个里面了。 接着在点击事件里面获取使用el.$attrs.value,注意这里在拿到这个值时,再用JSON…