- 博客(111)
- 问答 (6)
- 收藏
- 关注
原创 Spring Security 工具封装:SecurityUtils 获取当前登录用户
本文基于若依3.9.2与Spring Boot 3,解析SecurityUtils工具类如何封装Spring Security,实现安全上下文中的当前登录用户获取。核心机制为:通过JWT过滤器在请求中写入LoginUser至SecurityContext,SecurityUtils读取并强转getPrincipal()返回LoginUser;若无认证信息或解析失败,捕获异常统一抛出401错误。上下文由ThreadLocal持有,请求结束后由SecurityContextHolderFilter清理,确保线程
2026-11-03 20:00:00
283
原创 Redis 工具封装:RedisCache 对 Operations 体系的二次封装
若依对 Redis 缓存封装了一个类:`com.ruoyi.common.core.redis.RedisCache`。登录态、验证码、参数配置、字典数据、密码错误次数、防重复提交都以它为入口落到 Redis。
2026-10-28 22:27:53
194
原创 Spring MessageSource 国际化消息解析流程
本文沿一次 `MessageUtils.message()` 调用展开,依次看资源文件的组织方式、`MessageSource` 的来源、`Locale` 的确定过程,以及占位符填充和缺键时的行为。
2026-10-20 22:46:58
186
1
原创 常量与枚举设计规范:HttpStatus 自定义 601 警告码
业务代码里的字符串和数字字面量,一旦散落在各个类里,改动时就要全仓库搜索:Redis 的 key 前缀、HTTP 状态码、状态字段取值、分隔符,同一个值可能出现在十几处,改一处漏一处。
2026-09-29 23:13:38
258
原创 若依自定义注解体系:@Log、@DataScope、@DataSource、@Excel 全览
注解本身只是挂在类、方法、字段上的元数据,不含任何执行逻辑,真正干活的是与它配套的切面、拦截器或处理器——注解负责声明意图,配套实现负责兑现。
2026-09-22 22:37:11
263
原创 Controller 基类封装:BaseController 的模板方法设计
本文基于若依3.9.2与Spring Boot 3,阐述BaseController的模板方法设计。该基类统一管理日志、分页、返回值及用户信息获取,减少重复代码。通过@InitBinder实现日期字符串自动转换,支持多格式解析;startPage与getDataTable配合完成分页查询封装;返回值方法对AjaxResult进行轻量封装,提升接口一致性与开发效率。非增删改查类控制器(如登录、文件上传)因无需分页或表格结构,未继承该基类,保持职责清晰。
2026-09-15 22:44:55
168
原创 实体基类设计:BaseEntity 公共字段抽取与 TreeEntity 树形继承
一个管理后台的实体类少则十几个、多则上百个,但不管什么业务,实体中几乎都带有同一批字段:创建者、创建时间、修改者、修改时间、备注。这批字段每个类都重复定义一遍是纯粹的重复劳动,字段名或类型要调整时还得全仓库同步修改
2026-09-08 22:59:58
180
原创 PageHelper 分页封装:TableDataInfo 与 startPage() 的工作原理
任何一个管理后台都离不开列表页,而列表页绕不开分页:前端既要展示当前页数据,还得知道总条数好渲染分页条。分页看似简单,真动手做却发现涉及读参数、拼排序、加 LIMIT、统计 total、包装返回结构,一整套琐碎逻辑。若依把「开启一次分页查询」和「封装分页结果」这两件事,收敛成了 Controller 里的两个方法,业务层完全不用关心分页细节。
2026-09-01 23:45:37
255
原创 统一返回对象设计:AjaxResult 与 R 的取舍
前后端分离的项目里,所有接口的响应必须有一套统一结构,前端才能用一套固定逻辑判断成败、取数据。若依在 `com.ruoyi.common.core.domain` 包下提供了两个统一返回对象,代表两种截然不同的封装思路
2026-08-25 23:10:53
314
原创 一次 HTTP 请求在若依中的完整旅程
# 若依框架HTTP请求处理流程解析 本文通过分析`GET /system/user/list`请求在若依3.9.2(SpringBoot3)中的完整处理链路,揭示其核心架构设计: 1. **安全与跨域处理** - 优先通过CorsFilter处理跨域请求 - JwtAuthenticationTokenFilter实现JWT+Redis双Token认证 - 采用"身份还原+后续拦截"的松耦合设计 2. **请求处理核心流程** - 权限控制分层:URL级(AuthorizationFilter)与方法级(
2026-08-19 22:45:50
240
原创 若依多模块工程化设计
本文介绍了基于SpringBoot 3的若依3.9.2版本多模块工程化设计方案。若依采用Maven多模块架构,包含ruoyi-admin(入口层)、ruoyi-framework(框架核心)、ruoyi-system(业务层)、ruoyi-common(基础层)等6个模块,通过层级依赖实现职责隔离与独立编译。父工程统一管理依赖版本、构建配置和子模块聚合,支持按需裁剪非核心模块(如定时任务、代码生成)。该设计实现了模块化开发、统一版本控制和灵活部署,解决了单体项目耦合度高、构建效率低等问题。
2026-08-18 23:29:37
213
原创 GoF设计模式——23种设计模式总览
本文是GoF设计模式系列的总览,介绍了23种经典设计模式的分类、核心思想及适用场景。设计模式分为三类:创建型(5种,如单例、工厂)、结构型(7种,如适配器、代理)和行为型(11种,如观察者、策略)。文章强调设计模式的核心价值在于管理复杂度,通过复用经验、统一语言和隔离变化来提高代码质量。同时指出模式应用需要灵活变通,理解六大设计原则(如开闭原则、依赖倒置)是掌握模式的关键。最后简要说明了创建型模式的典型代表及其应用场景。
2026-07-30 23:05:45
286
原创 设计模式中的原则
本文是GoF设计模式系列的前置篇,介绍了面向对象设计的七大核心原则,重点解析SOLID原则(单一职责、开闭原则、里氏替换、接口隔离、依赖倒置)及其应用场景。通过典型代码对比,展示了违反原则的"面条代码"与遵循原则的优化方案:如将UserService按职责拆分、用策略模式实现支付扩展、通过依赖注入解耦数据库访问等。文章指出这些原则能提升代码的可维护性、扩展性和复用性,但也强调要避免过度设计,合理把握抽象边界。这些设计原则为后续学习具体模式奠定了理论基础。
2026-07-28 23:37:01
349
原创 GoF设计模式——访问者模式
访问者模式(`Visitor Pattern`)是一种**行为型设计模式**,核心思想是**将操作从对象结构中分离出来,在不修改元素类的前提下定义新的操作**。
2026-07-23 22:13:10
374
原创 GoF设计模式——解释器模式
解释器模式(`Interpreter Pattern`)是一种**行为型设计模式**,核心思想是**给定一个语言,定义它的文法的一种表示,并定义一个解释器,使用该表示来解释语言中的句子**。
2026-07-21 23:21:17
355
原创 文法、BNF与AST
解释器模式是 GoF 23 种设计模式中公认比较难理解的一个。它的难不在代码本身,而在前置概念——**文法**和 **AST(抽象语法树)**。如果不先搞懂这两个概念,直接看解释器模式的代码会一头雾水。
2026-07-21 23:20:02
212
原创 GoF设计模式——责任链模式
责任链模式(`Chain of Responsibility Pattern`)是一种**行为型设计模式**,核心思想是**将请求的发送者和接收者解耦,让多个对象都有机会处理请求,将这些对象连成一条链,沿着链传递请求,直到有一个对象处理它为止**。
2026-07-16 23:10:54
265
原创 GoF设计模式——状态模式
状态模式(`State Pattern`)是一种**行为型设计模式**,核心思想是**允许一个对象在内部状态改变时改变它的行为,使对象看起来好像修改了它的类型**。
2026-07-14 23:23:24
338
原创 GoF设计模式——迭代器模式
迭代器模式(`Iterator Pattern`)是一种**行为型设计模式**,核心思想是**提供一种统一的方式来顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示**。
2026-07-09 22:02:12
258
原创 GoF设计模式——模板方法模式
模板方法模式(`Template Method Pattern`)是一种**行为型设计模式**,核心思想是**定义一个算法的骨架,将某些步骤的实现延迟到子类。子类可以在不改变算法整体结构的情况下,重新定义算法中的某些特定步骤**。
2026-07-07 22:09:20
301
原创 GoF设计模式——备忘录模式
备忘录模式(`Memento Pattern`)也叫快照(`Snapshot`)模式,是一种**行为型设计模式**,核心思想是**在不破坏封装性的前提下,捕获一个对象的内部状态,并将该状态保存到对象外部,以便之后能将对象恢复到先前的状态**。
2026-07-02 21:52:29
414
原创 GoF设计模式——中介者模式
中介者模式(`Mediator Pattern`)是一种**行为型设计模式**,核心思想是**用一个中介对象封装一系列对象之间的交互,使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立改变它们之间的交互**。
2026-06-30 23:24:18
427
原创 GoF设计模式——命令模式
命令模式(`Command Pattern`)是一种**行为型设计模式**,核心思想是**将请求封装为对象**,从而使你可以用不同的请求对客户进行参数化,支持请求的排队、记录日志以及撤销操作。
2026-06-25 22:23:12
417
原创 GoF设计模式——策略模式
策略模式(`Strategy Pattern`)是一种**行为型设计模式**,核心思想是**定义一系列算法,将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端**。
2026-06-23 22:17:48
269
原创 GoF设计模式——观察者模式
观察者模式是一种行为设计模式,用于定义对象间的一对多依赖关系。当主题对象状态改变时,所有依赖它的观察者都会自动收到通知并更新。本文以气象监测系统为例,说明传统写法会导致紧密耦合,而观察者模式通过"订阅-通知"机制解耦主题和观察者。 文章详细介绍了观察者模式的四个角色(主题接口、具体主题、观察者接口、具体观察者),并通过UML类图展示了它们的关系。重点讲解了"拉模型"实现方式:主题通知时将自身传给观察者,观察者按需从中拉取所需状态。最后以气象站和显示面板为例,给出了完整的Java实现代码,演示如何让温度数据变
2026-06-18 22:59:04
256
原创 GoF设计模式——享元模式
享元模式(Flyweight Pattern)是一种**结构型设计模式**,核心思想是**通过共享相同对象来减少内存占用**。
2026-06-16 23:00:59
292
原创 GoF设计模式——组合模式
组合模式(Composite Pattern)是一种结构型设计模式,将对象组织成树状结构,使单个对象和组合对象实现相同接口,实现统一处理。核心思想是: 定义统一接口(Component),包含公共操作和子节点管理方法; 叶子节点(Leaf)实现基础功能,不支持子节点; 组合节点(Composite)持有子节点列表,递归处理操作。 典型应用场景包括文件系统、组织架构等树形结构。通过透明方式实现(子节点管理方法放在接口中),客户端无需区分对象类型。优势在于简化客户端代码,支持递归处理,易于扩展新节点类型。示例展
2026-06-11 23:13:49
413
原创 GoF设计模式——桥接模式
本文介绍了桥接模式(Bridge Pattern),这是一种结构型设计模式,用于解决多维度变化导致的类爆炸问题。桥接模式的核心思想是将抽象与实现分离到两个独立维度,通过组合而非继承实现解耦。文章通过图形编辑器的例子说明传统继承方式的缺陷,详细讲解了桥接模式的四个角色(抽象、修正抽象、实现、具体实现)及其UML结构。代码示例展示了遥控器与电视的桥接实现,解释了抽象层为何使用抽象类而非接口。最后对比了桥接模式与简单组合的区别,强调了桥接模式在解耦维度变化方面的优势。该模式适用于需要多维度独立扩展的场景,能有效减
2026-06-09 22:39:03
376
原创 GoF设计模式——外观模式
外观模式(Facade Pattern)通过提供统一入口,将多个复杂子系统封装在一起,对外暴露简单易用的接口。客户端无需了解内部实现细节,只需调用外观对象即可完成复杂操作,从而降低耦合度,提升系统的易用性和可维护性。
2026-06-04 21:57:30
275
原创 GoF设计模式——装饰模式
装饰模式:动态扩展功能的灵活之道 装饰模式通过组合替代继承,解决了类膨胀问题。它将核心功能与装饰功能分离,以嵌套包装的方式动态添加职责。该模式包含四个角色:组件接口、具体组件、抽象装饰器和具体装饰器。 关键优势在于: 运行时灵活扩展功能,避免继承导致的静态固化 符合开闭原则,新增装饰器不影响现有代码 通过多层嵌套实现功能叠加 典型应用场景包括: 需要动态添加/撤销功能的场合 不适合使用子类扩展的情况 如Java I/O流、GUI组件装饰等 与继承相比,装饰模式更灵活;与组合相比,它能保持接口一致性。但过度使
2026-06-02 23:07:35
331
原创 GoF设计模式——代理模式
有时候我们不能或不想直接访问某个对象。比如对象创建开销很大需要延迟加载,或者需要在访问前做权限检查,或者需要记录访问日志。直接在业务代码中掺杂这些逻辑会让代码臃肿且难以维护。代理模式通过引入一个中间层,将这些控制逻辑从业务代码中分离出来。客户端代码不需要知道它是在和代理交互还是真实对象交互,两者可以透明替换。代理模式本质上是一层"中间人"——为真实对象提供一个替身,在调用前后添加控制逻辑。什么时候用想控制对某个对象的访问(权限、延迟加载、缓存、日志)需要为远程对象提供本地代表。
2026-05-28 21:55:04
587
原创 GoF设计模式——适配器模式
适配器模式是一种结构型设计模式,用于解决接口不兼容问题。它通过适配器类将已有类的接口转换为客户端期望的接口,使原本不兼容的类能够协同工作。适配器模式包含目标接口、适配器和被适配者三个角色,有两种实现方式:对象适配器(推荐,通过组合实现)和类适配器(通过继承实现)。该模式适用于复用已有类、统一第三方库调用、新旧系统过渡等场景,但当接口差异过大时不宜使用。适配器模式如同电源转换头,在不修改原有代码的情况下实现接口转换。
2026-05-26 22:44:05
374
原创 微信人脸认证1.0迁移2.0
微信人脸核身2.0接口迁移指南 摘要:微信平台将于2026年6月30日停止原人脸核身接口服务,新版2.0接口包含四个关键API:获取凭证(getAccessToken)、获取会话ID(getVerifyId)、发起验证(wx.requestFacialVerify)和查询结果(queryVerifyInfo)。实现流程包括:后端获取凭证和会话ID并建立映射关系,前端发起验证后,后端查询最终结果。注意事项包括AppSecret安全保护和凭证缓存机制。迁移需按照官方时序图完成接口改造,确保业务平稳过渡。
2026-05-24 12:33:05
754
原创 GoF设计模式——原型模式
摘要: 原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,避免重复执行昂贵的初始化过程(如数据库查询、复杂计算等)。该模式包含三个核心角色:抽象原型(声明克隆方法)、具体原型(实现克隆逻辑)、原型注册表(管理常用原型)。拷贝方式分为浅拷贝(共享引用对象)和深拷贝(完全独立对象),需根据业务需求选择。实现方式包括GoF标准实现(clone()方法)、拷贝构造器(类型安全推荐方案)和Java的Cloneable接口(存在设计缺陷)。原型模式适用于创建成本高且对象相
2026-05-19 22:20:26
548
2
原创 GoF设计模式——建造者模式
建造者模式是一种创建型设计模式,用于分离复杂对象的构建过程和表示。它通过抽象建造者定义构建步骤,具体建造者实现不同产品变体,指导者封装构建顺序。该模式解决了构造函数参数爆炸、可选参数和构建逻辑分散的问题。标准实现包含产品、抽象建造者、具体建造者和指导者四个角色,适用于构建算法固定的场景。实际开发中常用简化版链式调用(Fluent Builder),省略指导者角色,通过Builder自身支持链式调用来简化构建过程。建造者模式的核心价值在于将构建过程与表示分离,使同一构建算法可以创建不同产品。
2026-05-14 21:57:41
485
原创 GoF设计模式——抽象工厂模式
本文介绍了抽象工厂模式,该模式用于创建一系列相关或相互依赖的对象,确保产品风格统一。与工厂方法模式不同,抽象工厂关注的是产品族的创建,而非单一产品。文章通过家具工厂的示例说明:古典工厂生产配套的古典沙发和椅子,现代工厂生产配套的现代家具,避免风格混搭。模式包含抽象工厂接口、具体工厂类、抽象产品接口和具体产品类四个角色,其中每个具体工厂负责一个完整产品族的创建。代码示例展示了如何实现抽象工厂模式,通过接口约束确保同一工厂创建的产品属于同一风格,解决了产品配套使用的问题。该模式适用于需要保证多产品协同工作的场景
2026-05-12 09:09:35
419
原创 GoF设计模式——工厂方法模式
本文对比了简单工厂模式和工厂方法模式。简单工厂通过集中式的if-else逻辑创建产品,适用于产品类型少且稳定的场景,但当产品增多时会导致工厂类膨胀。工厂方法模式将创建职责分散到具体工厂类中,每个工厂只负责一种产品,符合开闭原则,便于扩展。实现上,简单工厂使用单一工厂类管理所有产品创建,而工厂方法模式定义抽象工厂接口,由具体工厂实现创建逻辑。两种模式的选择取决于产品变化的频率和复杂度。
2026-05-07 22:15:58
478
原创 GoF设计模式——单例模式
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。适用于需要共享资源或保持数据一致的场景。常见实现方式包括: 饿汉式:类加载时创建实例,简单但可能浪费资源 懒汉式:首次请求时创建,需处理多线程安全问题 双重检查锁:线程安全且性能较好 静态内部类:结合懒加载和线程安全 枚举:最安全,天然防反射和序列化 单例模式优点包括节省资源、保持数据一致和全局访问方便,但存在测试困难和隐藏依赖等问题。日常开发推荐使用静态内部类实现,需要序列化时选择枚举方式。示例展示了银行叫号系统中单例模式的应用,确保
2026-05-04 23:56:35
465
原创 C语言——printf()计算参数顺序
`printf()`函数中的表达式参数的计算顺序是从右往左的,当所有表达式计算完后,将最后的值赋给`printf()`函数所有引用当前变量的位置,除了进行了后置自增/自减操作的位置。
2023-02-27 21:29:58
8259
2
空空如也
微信小程序如何接入教务系统
2022-01-21
windows10家庭版升级专业版
2021-09-06
数据结构单链表小问题
2021-09-06
c语言结构体格式问题
2021-09-06
Java的缓冲区怎么清除?
2021-08-29
c语言结构体一个错误
2021-09-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅