- 博客(44)
- 收藏
- 关注
原创 DataPermissionInterceptor源码解读
DataPermissionInterceptor是MyBatis-Plus中的一个拦截器插件,用于实现数据权限功能,它将查询、删除和修改的SQL进行拦截并获得要执行的SQL,并解析出SQL中的表和原有条件,通过一个DataPermissionHandler接口来回调获取每个表的数据权限条件,再和原有的条件拼接在一起形成新的SQL,执行重写后的新SQL,从而实现数据权限功能。因为添加操作无需数据权限控制,因此不处理添加的情况。BaseMultiTableInnerInterceptor源码解读。
2025-04-03 15:27:44
565
原创 BaseMultiTableInnerInterceptor源码解读
本文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-multi-table-inner-interceptor.htmlBaseMultiTableInnerInterceptor是MyBatis-Plus中的一个抽象类,位于mybatis-plus-jsqlparser-4.9模块中com.baomidou.mybatisplus.extension.plugins.inner包下,提供解析和重写SQL功能,MyBatis-Plus的
2025-03-25 08:53:18
911
原创 芋道源码解析之数据权限
数据权限是一个比较常用的功能,芋道源码通过mybatis-plus自定义插件在SQL执行前拦截并解析到对应的表,根据数据权限规则对这些表追加where条件来实现数据权限控制,对于一些需要单独指定数据权限的业务方法,通过数据权限注解和结合线程上下文对加了注解的方法进行前置和后置的处理,把当前方法适用的数据权限规则传递给数据权限SQL解析器进行额外处理,使得数据权限规则既能全局生效又能局部调整。
2025-02-26 12:22:22
877
原创 基于Hexo实现一个静态的博客网站
hexo默认自带一个叫landscape的主题,根目录下的_config.landscape.yml就是它的配置文件,landscape比较简陋,也不美观,所以很多人选择美观且功能强大的第三方主题,在这里,我使用主题fluid来建站。将压缩包下载下来,解压,压缩包内文件夹名字叫hexo-theme-fluid-1.9.8,这个就是主题,不过要把解压后的文件夹重命名为fluid,并将这个文件夹放在主题文件夹themes内。主题更多玩法,在主题的官网都有文档说明,主题配置文件。
2025-02-06 13:43:01
1410
原创 Docker Compose的使用
Docker Compose是Docker官方的开源项目,负责实现对Docker容器的快速编排,Docker建议每个容器只运行一项服务,因为容器运行的开销很小,但是同时部署多个应用需要每个容器都单独编写Dockerfile会显得非常复杂,因而Docker官方提供了多容器部署的编排工具Docker Compose。Docker Compose允许用户通过一个单独的配置文件来定义一组相关联的应用容器为一个项目,Docker Compose可以管理多个Docker容器组成的一个应用,只需要定义好一个。
2025-02-04 16:47:06
1715
原创 开源项目芋道源码解析 [开篇]
文章首发于我的博客:https://blog.liuzijian.com/post/source-code-about-ruoyi-vue-pro.html芋道(又名yudao,ruoyi-vue-pro)是一个基于spring-boot框架的单体Java后端开源项目,拥有基于RBAC模型的组织架构管理、CRM、ERP、商城、代码生成、AI等多个功能模块。封装了多租户、数据权限、工作流、OAuth,邮件、短信、定时任务、日志、链路追踪等多种技术和业务组件。其在GitHub上的地址是:https://gith
2025-01-23 10:49:51
1804
原创 Java8的新特性
注解:这是一个可选的注解,它可以帮助编译器在编译时检查接口是否符合函数式接口的要求,即是否只有一个抽象方法,如不符合还加这个注解,会导致编译器报错。
2025-01-20 11:30:39
577
原创 Redis概述
Redis即Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写的,遵守BSD协议的高性能的Key-Value数据库。
2025-01-19 15:52:29
711
原创 Java怎样实现将数据导出为Word文档
我们在开发一些系统的时候,例如OA系统,经常能遇到将审批单数据导出为word和excel文档的需求,导出为excel是比较简单的,因为excel有单元格来供我们定位数据位置,但是word文档的格式不像表格那样可以轻松的定位,要想将数据导出为一些带有图片和表格的这种结构复杂的word文档该怎样实现呢。模板绘制好以后,开始使用poi-tl工具生成word文档,首先新建maven项目,引入poi-tl的依赖和需要的其他依赖,然后将这个绘制好的word模板文件放在工程的。如果表格中某一列是图片,则表示为。
2025-01-11 18:48:51
994
原创 OA系统的天数该怎样计算
以半天为最小单位时,机械的加减有时可能无法和实际情况相符,例如我在OA系统提交休假审批,从1号上午到2号上午为假期,如果直接假定开始的小时都一样直接把日期时间简单相减,那么休假时间就是24小时构成的1天,但是实际上假期的构成是1号上午,1号下午,以及2号上午,按照工时的普遍计算逻辑就是1.5个工作日,OA系统应计算实际休假时长是1.5天,那这种场景下OA系统要怎样计算才准确呢,我把情况分为4种分别处理,分别计算休假一天,两天和三天的情况,进而推导到更长时间。
2024-12-31 16:48:52
717
原创 Spring概述
广义上的Spring泛指以Spring Framework为核心的Spring技术栈,经过十多年发展,已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目组成的成熟技术,例如Spring Framework,Spring MVC,Spring Boot,Spring Cloud,Spring Data,Spring Security等,其中Spring Framework是其他框架的基础。狭义上的Spring指的就是Spring Framework,我们通常称之为Spring框架。
2024-12-29 21:19:57
955
原创 安装K8s集群
因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要科学上网访问DockerHub。安装全过程均使用权限。
2024-12-25 09:50:54
1541
原创 SpringBoot配置和启动
logback :log4j2 :jul:不带`-spring`后缀的,直接被日志框架识别带后缀的不被日志框架加载,而由spring boot加载,可是使用spring profile功能,指定某个配置在某个环境生效。
2024-12-17 21:07:28
666
原创 RockyLinux9编译安装MySQL5.7
的MySQL源码包(mysql-boost-5.7.44.tar.gz),进行下载,并将下载到的源码包先放到服务器的。命令,进行编译前的检查和配置,使用CMake配置和生成MySQL源码编译所需的构建系统文件,安装MySQL到。执行后,开始编译,不断输出日志,编译的过程很耗时间,需要等待很久,编译完成后,可以在。文件夹下,可以看到目前版本依赖的boost版本是哪个,一会编译时会用到。在Rocky9上,有的依赖包没有自带,也无法通过。本文最后更新于 2024年12月15日。,初始化完成后,目录内会多出一个。
2024-12-15 23:59:35
1182
原创 Docker与联合文件系统
这样最大的好处就是共享资源,比如多个镜像都从base镜像构建而来,那么宿主机只需要在磁盘上保存一个base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。支持通过拓展现有镜像,创建新的镜像。docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称之为容器层,容器层之下的都叫镜像层,所有对容器的改动,无论添加删除还是修改文件,都只会发生在容器中,只有容器层是可写的,容器层下面所有镜像层都是只读的。本文最后更新于 2024年12月8日。
2024-12-11 19:04:40
792
原创 Docker的安装和配置
因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,从镜像仓库中拉取镜像时,需要科学上网直接访问DockerHub。在CentOS上安装Docker的过程相对简单,可以通过官方提供的安装包安装。Docker的安装包需要从仓库获取,执行以下命令来添加阿里云的Docker仓库。运行以下命令,拉取一个测试镜像并启动一个容器,以验证Docker安装是否正常。安装完成后,需要启动Docker服务,并且将其设置为开机自启。在安装Docker之前,确保安装了一些必要的依赖包。配置文件后,重新启动docker。
2024-12-11 18:58:21
352
原创 MySQL变量
用户变量针对当前连接有效,声明时必须初始化,可以不指定类型。适用于声明的语法,还可以查出一个值赋给变量。查看部分全局变量的值。使用用户变量也需要@
2024-12-11 18:52:51
155
原创 MySQL视图
视图,即基于查询的虚拟表,始于mysql 5.1 ,通过普通表动态生成的数据,适用于复杂查询,在使用时动态生成,只保存了SQL逻辑,适用于多个地方用到同一个SQL,且SQL复杂,可以隐藏列定义,保护数据,不会暴漏原始表。4.WHERE字句子查询引用了from字句中的表时。视图的数据支持更新修改和删除,而且会影响到原始表。创建语法不同,视图数据不占用物理空间,只保存逻辑。,去重, 联合, 子查询等语句。2.from不能更改的视图。存在就修改,不存在就创建。
2024-12-11 18:51:44
228
原创 MySQL插入修改和删除
清空整个表,没有返回值,自增长从1开始,不支持事务回滚。删除,有返回值,自增长从上个记录开始,支持事务回滚。本文最后更新于 2024年11月30日。支持一次性插入多行,支持子查询。删谁delete后面就写谁。
2024-12-11 18:50:40
370
原创 MySQL查询
加号的作用是数学运算不能连接字符串,两个操作数都为数值,则进行运算,其中一方为字符型,则试图将字符转换为数值,如果转换成功,继续运算,如果转换失败,则字符型的值转换为 0,只要其中一方为 NULL,结果为 NULL。查一个表有一个表没有,主表都显示,副表和主表匹配的显示出来,没有匹配的用空填充。百分号代表通配符,任意字符,也包含 0 个字符,下划线 _ 代表任意单个字符,比job_id 是 ‘IT_PROG’的所有的员工工资都少的其他工种的员工。相关子查询,布尔类型,看查询是否有值,括号内写查询语句。
2024-12-11 18:49:36
874
原创 MySQL数据定义语言
对于整形,长度由范围决定,设置的长度用来补零,但必须在建立字段时搭配zerofill,一旦zerofill,默认为无符号,如果不设置无符号,默认是有符号,如果插入数值超出范围,系统会警告,默认插入临界值。外键,从表设置外键关系,数据类型一致或兼容,主表被关联列必须是一个key,一般是主键或唯一,插入数据时,先插入主表在插入从表,删除数据,先删除从表,再删除主表。都可以保证唯一,主键不能为空,每个表只能有1个,可以两个列自合一起,唯一允许为空,一个表可以有多个,不能多个为空,可以两个列自合一起。
2024-12-11 18:47:46
802
原创 Nginx防盗链设置
要防止特定路径下的图片被盗链,可以在Nginx配置中针对图片文件的请求进行防护。以下是一个示例配置,假设你的图片存放在。重新加载Nginx配置后,这将有效防止其他网站直接链接到你存放在/img/路径下的图片。会被允许盗链,而其他图片则受到保护。请根据需要调整文件路径和配置。如果你希望在某个特定图片上允许盗链,可以进行更细粒度的控制。: 这是匹配请求路径的正则表达式。: 这是一个正则表达式匹配操作符,用于进行。:为防止目录穿越,alias使用时,表示大小写敏感的正则匹配,而。的文件(不区分大小写)。
2024-12-11 15:46:15
246
原创 Nginx设置HTTPS监听
这样,你就成功地配置了 Nginx 使用 HTTPS,并将所有 HTTP 请求重定向到 HTTPS。编辑 Nginx 配置文件,按照自己实际情况来,通常在。测试是否实现了 HTTP 到 HTTPS 的重定向。安装证书文件和私钥到服务器,通常是。这里,博主使用这个网站生成。自己确定存放的目录。
2024-12-11 15:42:37
300
原创 MySQL5.7x 主从复制
在MySQL中,主从复制(Master-Slave Replication)是一种常用的数据库复制技术,用于将主服务器(Master)的数据实时复制到一个或多个从服务器(Slave)。这有助于负载均衡、备份和高可用性。,说明主从复制正常。如果不是,可以检查错误信息并进行排查。在主服务器上登录MySQL并创建一个用于复制的用户。打开MySQL主服务器的配置文件 my.cnf。如果能看到相同的表和数据,说明主从复制配置成功。是主服务器的IP地址,,并授予了复制权限。
2024-12-11 15:33:01
895
原创 Java线程的创建和常见方法
守护线程:服务进程,没有服务对象就没有必要继续运行下去了,如果用户线程全部结束,意味着程序需要完成的业务操作已经结束,系统可以退出,当只剩下守护线程时,Java虚拟机会自动退出。当你在主线程中调用另一个线程的 join() 方法时,主线程会暂停执行进入阻塞状态,直到被调用的线程完成为止。用户线程:系统的工作线程,会完成这个程序需要完成的业务操作。方法启动线程,jvm自动调用run()方法。方法启动线程,jvm自动调用run()方法。本文最后更新于 2024年11月3日。方法,然后将该实现传递给。
2024-12-11 11:50:48
775
原创 Java线程的通信
这是一种线程间的协作机制,与争夺锁的竞争机制相对应,当一个线程满足某个条件时,就进入等待状态( wait/wait(m) ),等到其他线程执行完指定的代码后,再将其唤醒,或者可以指定时间,到时间了自动唤醒,有多个线程等待时,如果有需要,可以notifyAll()唤醒所有等待的线程,wait/notify就是一种线程间的协助机制。当需要多个线程共同完成一件任务,而且需要有规律的执行,那么多个线程之间需要一定的通信机制,可以协调他们的工作,以此实现多线程共同操作一份数据。本文最后更新于 2024年11月5日。
2024-12-11 11:45:47
565
原创 Java实现LDAP登录
LDAP的全称是Lightweight Directory Access Protocol(轻量级目录访问协议),是一种用于访问和管理分布式目录信息服务的应用协议。LDAP通常用于存储用户、组和其他组织信息,提供对这些信息的快速查询和管理。标准的一个简化版本,使用更简单的网络协议(如 TCP/IP)来实现,定义了客户端如何与目录服务交互,如添加、删除、修改或查询目录信息。连接LDAP服务器,并搜索用户的DN,验证用户凭据,再检查输入的密码是否正确。本文最后更新于 2024年12月10日。
2024-12-11 11:44:03
559
原创 volatile与内存可见性
在多线程环境中,每个线程都有自己的工作内存(即 CPU 缓存)。当一个线程修改了某个变量,其他线程并不能立即看到这个修改,因为每个线程可能都在使用自己工作内存中的缓存值。Java 内存模型 (JMM) 中的一个核心问题是线程对共享变量的。保证了变量的可见性,即当一个线程修改了。,而不会从线程的工作内存中读取缓存的值。变量后,其他线程能够立即看到最新的值。本文最后更新于 2024年10月19日。,而不是缓存在该线程的工作内存中。修饰的变量进行写操作时,修饰的变量进行读操作时,
2024-12-11 11:42:44
274
原创 Java线程的安全问题
当多个线程同时访问同一资源(变量,文件,记录),如果只有读操作,则不会有线程安全问题,如果有读和写操作,则会产生线程安全问题,必须保证共享数据同一时刻只能有同一个线程操作。lock作为同步监视器,锁住代码块中的操作,谁获得同步监视器,谁运行同步代码块中的代码。,两个线程都在争抢在对方持有的锁,且都在等待对方先释放各自持有的锁,不然就一直等待,线程都一直处在阻塞状态无法继续运行,造成死锁。,锁住的是类的.class对象,每个类的class对象只有一个,所以同时只能有一个线程进入方法。
2024-12-09 16:39:33
757
原创 Docker容器数据卷
数据卷的生命周期一直到没有容器使用为止,挂载数据卷后被继承的父容器,即使被停止,继承的子容器也会保持数据卷和宿主机的关联,也就是说子容器只是继承了父容器文件映射的规则而已。默认情况数据卷是可读可写的,但是有时出于对数据的保护,需要容器内只能读不能写,如果宿主机写入了内容,会同步给容器,只会限制容器,不限制宿主机,容器内强行写,会报错。命令,扩大容器的权限解决挂载目录没有权限的问题,使用该参数,容器内才真正拥有root权限,否则,容器内的root只是外部的一个普通用户权限。节点了解容器数据卷的挂载情况。
2024-12-09 16:37:50
290
原创 Docker的镜像操作
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。
2024-12-07 10:21:20
447
原创 Docker概述
Docker是一个开源的平台,是基于GO语言实现的开源项目,旨在让应用程序更简单地创建、部署和运行,解决了运行环境和配置问题。它是linux容器技术的落地实现,依赖已经存在的linux环境,实现应用程序及其依赖环境的打包,使得软件可以带着环境安装,一次镜像,处处运行,不受具体操作系统环境的限制。Docker必须部署在Linux内核的系统上,实质上是在一个运行中的Linux环境上创建了一个隔离的文件环境。Docker的优点快速的交付和部署提高硬件利用率便捷的升级和扩容缩容更简单的系统运维。
2024-12-07 01:14:48
993
原创 Dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。从应用软件的角度来看,Dockerfile,Docker镜像,Docker容器分别代表软件的三个不同阶段Dockerfile是软件的原材料Docker镜像是软件的交付品Docker容器可以认为是软件的运行态Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及运维和部署,合力充当Docker体系的基石。
2024-12-05 00:26:04
814
原创 Docker网络
为什么要自定义网络?1.容器间的互联和通信以及端口映射2.bridge模式网络分配给容器的IP是可能随着容器的启动关闭而导致分配的地址发生变动的,但是Docker自带的bridge网络比较简单,没有内置DNS功能,自定义网络后,容器IP变动的时候可以通过服务名直连网络而不受影响,当用户创建自定义网络时,Docker自动配置了一个内置DNS服务器,这个DNS服务器会根据容器的名称自动解析对应的IP地址。自定义网络默认也是采用桥接模式bridge。
2024-11-26 23:41:13
2157
原创 Docker的容器操作
进入一个正在运行的容器,附加到其主进程的标准输入、输出和错误流,看到容器中运行的程序的实时输出,并直接与容器的主进程交互,例如正在运行top的容器,可以看到top实时输出,还可以输入命令和top交互。会停止运行的Shell进程,如果这个进程是容器的主进程(例如一个 Bash 会话或主要的服务进程),exit 会直接停止整个容器。,通常是交互式Shell,不依赖容器的主进程,可以独立运行,不影响容器的主进程运行。运行时,必须有一个前台进程,如果容器运行的命令不是那些一直挂起的命令,例如。
2024-11-20 23:44:17
822
原创 使用python实现一个可自动部署hexo博客的gitee webhook
hexo博客想在提交后自动部署,使用持续集成工具比较繁琐也消耗资源,于是用python脚本加gitee webhook实现自动化拉取打包部署。代码优化,加入线程控制,防止webhook链接被并发调用后,两个hook任务线程同时执行出现安全问题。如果你已经安装了 Python 3.x 版本,可以跳过安装 Python 的步骤。首先,确保你已经安装了 Python。如果没有安装,可以使用以下命令来安装 Python 和。设置好签名(密码),设置回调地址,勾选两项。
2024-11-14 12:57:15
350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人