概念、框架简介--ruoyi学习(一)
开始进行ruoyi框架的学习,比起其他的前后端不分离的,这个起码看的清晰一些吧。
这一节主要是看了ruoyi的官方文档后,记录了以下不懂的概念,并且整理了ruoyi框架中的相关内容。
一些概念
前端
- store
store是状态管理库,用于管理前端应用程序(在浏览器中运行的Web应用程序)的状态。前端应用程序通常由多个组件组成,这些组件之间可能共享数据和状态,因此为了统一管理和共享状态,使用状态管理库来创建一个全局的store,存储应用程序的状态数据。
"store"存储了应用程序的各种状态,例如用户登录状态、页面内容、选项状态等。组件可以从"store"中获取状态数据,并且可以通过派发(dispatch)操作来触发状态的变化。变化后的状态将被存储在"store"中,并且会自动更新相关的组件。
通过使用"store",前端开发人员可以更好地组织和管理应用程序的状态,避免了状态分散和数据流混乱的问题。它提供了一种可预测和可维护的方式来处理状态变化,并使得状态在应用程序中的传递和共享更加简单和高效。
后端
- Servlet
servlet用于在Web服务器上处理客户端请求和生成响应。servlet是一种服务器端的Java程序,主要用于开发动态的Java程序。Servlet主要用于处理Web请求和生成动态Web内容。它可以接收来自Web浏览器的请求,执行相应的任务,并将生成的结果发送回浏览器。Spring框架的核心是基于Servlet的,Spring框架提供了一个称为DispatcherServlet的前端控制器,它是一个特殊的Servlet,用于处理所有的Web请求。DispatcherServlet负责将传入的请求路由到相应的处理程序(也称为控制器),并处理视图渲染、数据绑定等任务。因此,Spring框架在Servlet的基础上提供了更高级的抽象和功能,使得开发Web应用程序更加方便和灵活。
- Spring Security
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。
可以实现的功能:
Authentication认证,就是用户登录Authorization授权,判断用户拥有什么权限,可以访问什么资源- 安全防护,可以抵御 跨站脚本攻击,
session攻击等
spring security和shiro的关系:
- 都可以完成认证功能、授权功能、加密功能、会话管理、缓存支持以及remember me功能(当用户短暂地关闭浏览器后,仍然可以通过存储在本地的token不重复登录地情况下发送请求)。
- spring security需要依托spring容器进行开发,shiro的配置和使用比较简单,无需依赖任何容器和框架。
- Jetty
jetty和tomcat一样,都是为基于java的web容器,比如JSP和Servlet提供运行环境。但是相比于tomcat,jetty要更轻量级一些,而且jetty更加灵活,体现在jetty的可插拔性和可扩展性,jetty提供了很多接口,可以通过这些接口进行进一步开发。但是在大规模的企业级应用时,jetty需要实现大量的扩展,在这种情况tomcat是更优的选择。
- Spring EL
EL:Expression Language表达式语言。其作用是用于在JSP页面中获取数据,从而让我们的JSP脱离java代码块和JSP表达式。例如:在浏览器中输出请求域中名称为message的内容。(感觉这个就很像之前前后端不分离的时候,在前端渲染数据)

Spring3 中引入了 Spring 表达式语言 — Spring EL,SpEL 是一种强大,简洁的装配 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的对应方法判断接口调用者的权限。
数据权限示例:

角色权限示例:

公开接口
如果某个接口不需要验证权限就可以访问,那么直接对这个接口的请求放行就可以。
- 把@PreAuthorize注释掉或者直接删掉。
- 使用@Anonymous注解。
但是我没有使用@Anonymous注解,只是把pre注解注释掉了也可以访问呢。因为如果这两个注解都不加的话,就相当于默认放行了。
坏了,如果用@Anonymous注解,那么一定得把@PreAuthorize注释掉啊,不然还是会进行权限控制的。因为@pre的优先级要比@ano的高一些。

事务管理
@Transactional注解只能应用到public可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务。
实现事务管理比较简单,在类或者方法上添加@Transactional注解就行。
1.在Spring中进行事务管理的时候,默认的事务规则是遇到运行时异常(RuntimeException)或者程序错误(Error)才会回滚。所以如果想对其他的异常进行检查并事务回滚,可以使用rollbackFor属性明确指定异常。
2.在业务层捕捉完异常之后,不能直接处理异常,要把它抛出去,然后在控制层统一管理。如果在业务层直接处理了异常,那么Spring不知道你的事务到底有没有成功执行,怎么会对异常进行处理并回滚呢。
正确做法示例:

异常处理
在实际开发中,如果我们在业务模块中使用try...catch...对异常进行捕获和处理,很容易造成代码的重复和繁杂。所以我们在业务中只保留业务相关的代码,在可能发生异常的方法里把异常throw给控制器,然后由全局异常处理器对异常统一管理。
步骤:
- 定义一个异常类。
- 定义一个全局异常controller。在这个controller上要添加@RestControllerAdvice注解。添加了这个注解后,就可以捕获全局异常后使用这个controller来处理。
- 在2中的全局异常类中,进行相关异常的处理。首先在不同的处理方法上面添加@ExceptionHandler(value = BusinessException.class),表示这个方法用于处理抛出的BusinessException异常。
全局异常controller类的代码如下:

参数验证
使用@Validate来校验数据,如果数据异常则统一抛出异常,方便全局异常处理器统一处理。
数据校验
- 在字段的GET方法或者直接在字段上声明数据的校验逻辑:

- 在对应方法的参数列表中加入注解@Validated,表示对这个参数按照提前设计好的校验逻辑进行校验。

自定义分组校验
如果对于同一个字段在不同的方法中有不同的校验逻辑,可以通过groups属性设置,根据操作类型不同进行不同情况的校验。
- 新增接口,标识不同的操作类型。

- 添加字段的校验逻辑,并且设置它所涉及的操作类型。

- 在接收方法的参数列表中声明当前方法调用该字段的哪一类操作校验。

防重复提交
在接口方法上添加@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.*的包)。
相关文章:
概念、框架简介--ruoyi学习(一)
开始进行ruoyi框架的学习,比起其他的前后端不分离的,这个起码看的清晰一些吧。 这一节主要是看了ruoyi的官方文档后,记录了以下不懂的概念,并且整理了ruoyi框架中的相关内容。 一些概念 前端 store store是状态管理库&#x…...
IDEA的基础使用——【初识IDEA】
IDEA的基础使用——【初识IDEA】 文章目录 IDEA简介前言官网 IDEA的下载与安装选择下载路径勾选自己需要的其余按默认选项进行即可 目录简介安装目录简介 运行Hello WorldIDEA快捷键常用模板模板一:psvm(main)模板二:模板三&#…...
LeetCode刷题总结-动态规划篇
LeetCode刷题总结-动态规划篇 本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道。具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难…...
el-table使用xlsx实现导入文件编辑功能
需求:列表根据xlsx文件导入后,和列表进行对比,之后实现编辑功能 1.下载xlsx 我下的是之前的版本,新版不知道兼不兼容,这个包900多k npm install xlsx0.14.5 2.在需要使用表格导入的页面引入 import XLSX from &quo…...
Android9、11 有线网络开关设置
Android9、11 有线网络开关设置 Android9、11 有线网络开关设置_android 以太网开关_峥嵘life的博客-CSDN博客...
【MySQL】mysql问题 | [ERROR] unknown variable ‘column-statistics=0‘
一、说明 1、用到一个开源项目,dbBkTool[asurplus] 2、这个项目用于MySQL定时备份的 3、然后有个执行的时候,发下报错 [ERROR] unknown variable column-statistics0 二、解决 1、把MySQL客户端升级到8.0.19之后,就不报错了 2、column-stat…...
ElasticSearch 7.x
前言 elastic表示可伸缩,search表示查询。所以es的核心即为查询。通常情况下,我们的数据可以分为三类:结构化数据、非结构化数据、半结构化数据。 结构化数据:一般会用特定的结构来组织和管理数据,表现为二维表结构。…...
MVC乱码问题
RequestMapping(value "insert",produces {"text/html;charsetutf-8"}) //前端响应回去加响应头,解决乱码问题,这个还跟JSP响应头还不一样,这是响应的字符串,纯文本,那个前端的是out.Writer()对象ÿ…...
1004. 最大连续1的个数 III
题目描述: 主要思路: 刚看到这个问题首先想到的是二分答案,二分长度,然后利用滑动窗口判断是否可以达成。 class Solution { public:bool find(int x,vector<int> nums, int k){int now0;for(int i0,j0;i<nums.size();…...
【机器学习】西瓜书学习心得及课后习题参考答案—第3章线性模型
过了一遍第三章,大致理解了内容,认识了线性回归模型,对数几率回归模型,线性判别分析方法,以及多分类学习,其中有很多数学推理过程以参考他人现有思想为主,没有亲手去推。 术语学习 线性模型 l…...
面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来...
一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么,大多数回答都是说请求响应之后 DOM 怎么被构建,被绘制出来。但是你有没有想过,收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建…...
树莓派Pico|RP2040|官方文档|在MS Windows上构建“Hello World”及环境配置
9.2. 在MS Windows上构建 在Microsoft Windows 10或Windows 11上安装工具链与其他平台有些不同。然而安装后,RP2040的构建代码基本类似。 警告 官方不支持在Windows 7或8上使用Raspberry Pi Pico,但在Windows 7或8上可以使其工作。 9.2.1. 安装工具…...
全球公链进展| 2023/7/31
一周速览 过去一周,明星项目动态如下: 第114次以太坊核心开发者共识会议:Devnet #8 最早下周推出 Layer2网络Shibarium跨链桥已上线公开测试 Optimism 推出「Law of Chains」v0.1 版本 Sui 通过 SIP#6 ,允许开发人员构建流动…...
Spring源码(三)Spring Bean生命周期
Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…...
【iOS】Cydia Impactor 错误:file http.hpp; line:37; what: _assert(code == 200)
Cydia Impactor 报错,信息如下 file http.hpp; line:37; what: _assert(code 200)解决方案:Cydia Impactor 已被弃用,切换到sideloadly 即可,亲测成功,并且支持双重验证登录 csdn备份地址 HERE...
3ds MAX绘制茶壶
综合一下之前的内容画个茶壶 长方形,然后转化为可编辑多边形,添加节点并设置圆角,如下图 车削生成一个圆环,其实这一步也可以用一个圆柱体和两个圆角圆柱体解决 效果如下: 茶壶的底座绘制好了 接下来是茶壶的上半边 …...
【element-plus】 table表格每行圆角解决方案 element也通用
系列文章目录 【Vue3ViteTselement-plus】使用tsx实现左侧栏菜单无限层级封装 前言 我们在使用element-plus或element 的table时是否有时UI给到的UI效果是如下面这样的,但是我们翻遍了组件库的文档 调整了很多次样式 发现在 左右侧栏固定的时候 普通的方法是完全…...
【状态估计】基于UKF、AUKF的电力系统负荷存在突变时的三相状态估计研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
webstorm格式化代码后单引号转成了双引号
webStorm格式化js代码时单引号变成了双引号,问题如下: 格式化前: 格式化后: 解决办法: window: File -> Settings -> Editor -> Code Style -> Javascript; mac: webStorm -> Preference …...
在langchain中使用带简短知识内容的prompt template
简介 langchain中有个比较有意思的prompt template叫做FewShotPromptTemplate。 他是这句话的简写:“Prompt template that contains few shot examples.” 什么意思呢?就是说在Prompt template带了几个比较简单的例子。然后把这些例子发送给LLM&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
