MyBatis 数据库
yudao-spring-boot-starter-mybatis (opens new window) 技术组件,基于 MyBatis Plus 实现数据库的操作。如果你没有学习过 MyBatis Plus,建议先阅读 《芋道 Spring Boot MyBatis 入门 》 (opens new window) 文章。
友情提示
MyBatis 是最容易读懂的 Java 框架之一,感兴趣的话,可以看看艿艿写的 《芋道 MyBatis 源码解析》 (opens new window)系列,已经有 18000 人学习过!
#1. 实体类BaseDO (opens new window)是所有数据库实体的父类,代码如下:
12345678910111213141516171819202122232425262728293031323334@Datapublic abstract class BaseDO implements Serializable { /** * 创建时间 */ @TableField(fill = FieldFill.INSER ...
系统日志
项目提供 2 类 4 种系统日志:
审计日志:用户的操作日志、登录日志
API 日志:RESTful API 的访问日志、错误日志
#1. 操作日志操作日志,记录「谁」在「什么时间」对「什么对象」做了「什么事情」。
打开 [系统管理 -> 审计日志 -> 操作日志] 菜单,可以看到对应的列表,如下图所示:
操作日志的记录,由 yudao-spring-boot-starter-biz-operatelog (opens new window)技术组件实现,OperateLogAspect (opens new window)通过 Spring AOP 拦声明了 @OperateLog (opens new window)注解的方法,异步记录日志。使用示例如下:
操作日志的存储,由 yudao-module-system 的 OperateLog (opens new window)模块实现,记录到数据库的 system_operate_log (opens new window)表。
#1.1 @OperateLog 注解@OperateLog 注解,一共有 6 个 ...
Excel 导入导出
项目的 yudao-spring-boot-starter-excel (opens new window) 技术组件,基于 EasyExcel 实现 Excel 的读写操作,可用于实现最常见的 Excel 导入导出等功能。
EasyExcel 的介绍?
EasyExcel 是阿里开源的 Excel 工具库,具有简单易用、低内存、高性能的特点。
在尽可用节约内存的情况下,支持百万行的 Excel 读写操作。例如说,仅使用 64M 内存,20 秒完成 75M(46 万行 25 列)Excel 的读取。并且,还有极速模式能更快,但是内存占用会在100M 多一点。
#1. Excel 导出以 [系统管理 -> 岗位管理] 菜单为例子,讲解它 Excel 导出的实现。
#1.1 后端导入实现在 PostController (opens new window)类中,定义 /admin-api/system/post/export 导出接口。代码如下:
123456789101112@GetMapping("/export")@Operation(summary = ...
文件存储(上传下载)
项目支持将文件上传到三类存储器:
兼容 S3 协议的对象存储:支持 MinIO、腾讯云 COS、七牛云 Kodo、华为云 OBS、亚马逊 S3 等等。
磁盘存储:本地、FTP 服务器、SFTP 服务器。
数据库存储:MySQL、Oracle、PostgreSQL、SQL Server 等等。
技术选型?
优先,✔ 推荐方案 1。如果无法使用云服务,可以自己搭建一个 MinIO 服务。参见 《芋道 Spring Boot 对象存储 MinIO 入门 》 (opens new window)文章。
其次,推荐方案 3。数据库的主从机制可以实现高可用,备份也方便,少量小文件问题不大。
最后,× 不推荐方案 2。主要是实现高可用比较困难,无法实现故障转移。
#1. 快速入门本小节,我们来添加个文件配置,并使用它上传下载文件。
#1.1 新增配置① 打开 [基础设施 -> 文件管理 -> 文件配置] 菜单,进入文件配置的界面。
② 点击 [新增] 按钮,选择存储器为【S3 对象存储器】,并填写七牛云的配置。如下图:
节点地址:s3-cn-south-1.qiniucs. ...
分页实现
前端:基于 Element UI 分页组件 Pagination(opens new window)
后端:基于 MyBatis Plus 分页功能,二次封装
以 [系统管理 -> 租户管理 -> 租户列表] 菜单为例子,讲解它的分页 + 搜索的实现。
#1. 前端分页实现#1.1 Vue 界面界面 tenant/index.vue (opens new window)相关的代码如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293<template> <!-- 搜索工作栏 --> <el-form :model="queryParams" ref="queryForm" size=&q ...
参数校验
项目使用 Hibernate Validator (opens new window) 框架,对 RESTful API 接口进行参数的校验,以保证最终数据入库的正确性。例如说,用户注册时,会校验手机格式的正确性,密码非弱密码。
如果参数校验不通过,会抛出 ConstraintViolationException 异常,被全局的异常处理捕获,返回“请求参数不正确”的响应。示例如下:
12345{ "code": 400, "data": null, "msg": "请求参数不正确:密码不能为空"}
#1. 参数校验注解Validator 内置了 20+ 个参数校验注解,整理成常用与不常用的注解。
#1.1 常用注解
注解
功能
@NotBlank
只能用于字符串不为 null ,并且字符串 #trim() 以后 length 要大于 0
@NotEmpty
集合对象的元素不为 0 ,即集合不为空,也可以用于字符串不为 null
@NotNull
不能为 null ...
异常处理(错误码)
本章节,将讲解异常相关的统一响应、异常处理、业务异常、错误码这 4 块的内容。
#1. 统一响应后端提供 RESTful API 给前端时,需要响应前端 API 调用是否成功:
如果成功,成功的数据是什么。后续,前端会将数据渲染到页面上
如果失败,失败的原因是什么。一般,前端会将原因弹出提示给用户
因此,需要有统一响应,而不能是每个接口定义自己的风格。一般来说,统一响应返回信息如下:
成功时,返回成功的状态码 + 数据
失败时,返回失败的状态码 + 错误提示
在标准的 RESTful API 的定义,是推荐使用 HTTP 响应状态码 (opens new window)作为状态码。一般来说,我们实践很少这么去做,主要原因如下:
业务返回的错误状态码很多,HTTP 响应状态码无法很好的映射。例如说,活动还未开始、订单已取消等等
学习成本高,开发者对 HTTP 响应状态码不是很了解。例如说,可能只知道 200、403、404、500 几种常见的
#1.1 CommonResultruoyi-vue-pro (opens new window)项目在实践时,将状态码放在 Resp ...
WebSocket 实时通信
1. 功能简介项目的 yudao-spring-boot-starter-websocket (opens new window)组件,基于 Spring WebSocket (opens new window)进行二次封装,实现了更加简单的使用方式。例如说,WebSocket 的认证、Session 的管理、WebSocket 集群的消息广播等等。
疑问:为什么不使用 Netty 实现 WebSocket?
Netty 的学习和使用门槛较高,对大家可能不够友好,而 Spring WebSocket 足够满足 99.99% 的场景。
#1.1 Token 身份认证① 在 WebSocket 连接建立时,通过 QueryString 的 token 参数,进行认证。例如说:ws://127.0.0.1:48080/ws?token=xxx。
由于 WebSocket 是基于 HTTP 建立连接,所以它的认证可以复用项目的 TokenAuthenticationFilter (opens new window)实现。
为什么 token 不使用 Header 传递?
WebSocket 不 ...
SaaS 多租户【数据库隔离】
本章节,讲解 SaaS 租户的 DATASOURCE 模式,实现数据库级别的隔离。
注意,需要前置阅读 《SaaS 多租户【字段隔离】》 文档。
#0. 极速体验① 克隆 https://gitee.com/zhijiantianya/ruoyi-vue-pro (opens new window)仓库,并切换到 feature/dev-yunai 分支。
② 创建 ruoyi-vue-pro-master、ruoyi-vue-pro-tenant-a、ruoyi-vue-pro-tenant-b 三个数据库。
③ 下载 多租户多db.zip 并解压,将 SQL 导入到对应的数据库中。
友情提示:
随着版本的迭代,SQL 脚本可能过期。如果碰到问题,可以在星球给我反馈下。
④ 启动前端和后端项目,即可愉快的体验了。
#1. 实现原理DATASOURCE 模式,基于 dynamic-datasource (opens new window)进行拓展实现。
核心:每次对数据库操作时,动态切换到该租户所在的数据源,然后执行 SQL 语句。
#2. 功能演示我们来新增一个租户,使用 DATAS ...
SaaS 多租户【字段隔离】
本章节,将介绍多租户的基础知识、以及怎样使用多租户的功能。
相关的视频教程:
01、如何实现多租户的 DB 封装?(opens new window)
02、如何实现多租户的 Redis 封装?(opens new window)
03、如何实现多租户的 Web 与 Security 封装?(opens new window)
04、如何实现多租户的 Job 封装?(opens new window)
05、如何实现多租户的 MQ 与 Async 封装?(opens new window)
06、如何实现多租户的 AOP 与 Util 封装?(opens new window)
07、如何实现多租户的管理?(opens new window)
08、如何实现多租户的套餐?(opens new window)
#1. 多租户是什么?多租户,简单来说是指一个业务系统,可以为多个组织服务,并且组织之间的数据是隔离的。
例如说,在服务上部署了一个 ruoyi-vue-pro (opens new window)系统,可以支持多个不同的公司使用。这里的一个公司就是一个租户,每个用户必然属于某 ...
