Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!
全文目录:
- 开篇语
- 前言
- 一、责任链模式概述
- 责任链模式的组成部分:
- 二、责任链模式的核心优势
- 三、使用责任链模式解耦复杂接口
- 1. 定义 Handler 接口
- 2. 实现具体的 Handler
- 3. 创建订单对象
- 4. 在 Spring Boot 中使用责任链模式
- 5. 配置责任链
- 6. 客户端调用
- 四、责任链模式的动态编排
- 五、总结
- 文末
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
随着业务需求的不断增加,很多系统中的业务逻辑变得越来越复杂,特别是在涉及多个服务或者多个步骤的接口中,如何确保每个环节的灵活性、可扩展性以及可维护性,成为了开发中必须考虑的重要问题。在这种场景下,责任链模式(Chain of Responsibility Pattern)应运而生,它为我们提供了一种非常好的解决方案。
在本文中,我们将介绍如何在 Spring Boot 项目中使用责任链模式来解耦复杂接口的逻辑,并且通过动态编排的方式提高系统的灵活性和可扩展性。
一、责任链模式概述
责任链模式是一种行为型设计模式,旨在通过将请求沿着处理链传递来实现解耦。它允许多个对象有机会处理请求,从而避免请求发送者与接收者之间的耦合关系。每个处理者在处理请求时决定是否将请求传递给链中的下一个处理者,这种方式使得责任的分配更加灵活。
责任链模式的组成部分:
- Handler(处理者):定义一个接口,通常包含一个处理请求的方法和指向下一个处理者的引用。
- ConcreteHandler(具体处理者):实现处理请求的方法,并决定是否继续传递请求到链中的下一个处理者。
- Client(客户端):向链中的处理者发送请求。
二、责任链模式的核心优势
- 解耦:请求发送者不需要知道哪个对象会处理它,它只需要发出请求并交给链上的某个处理者,处理者的选择完全由责任链决定。
- 灵活性和可扩展性:可以轻松地增加、删除处理者,或者动态地改变处理链的顺序,增加了系统的灵活性和可维护性。
- 动态编排:责任链模式适用于有多个处理步骤且每个步骤可能根据不同条件进行执行的场景。通过将处理逻辑分散到不同的处理者中,用户可以根据业务需求动态调整处理链。
三、使用责任链模式解耦复杂接口
在实际业务中,常常会遇到这样的问题:一个接口的执行需要多个步骤,而每个步骤都有不同的处理逻辑。如果这些逻辑直接写在接口中,接口会变得非常复杂且难以维护。
例如,假设我们有一个订单处理的场景,其中订单需要经过多个环节的处理,如验证订单、计算订单金额、检查库存、处理支付等。如果把所有这些处理逻辑都放到一个方法中,代码会非常混乱,且扩展不方便。责任链模式可以将每个处理环节抽象为一个独立的处理者,并根据需要动态构建责任链。
1. 定义 Handler 接口
首先,我们需要定义一个处理者接口,所有的具体处理者都会实现这个接口:
public interface OrderHandler {void handle(Order order);void setNextHandler(OrderHandler nextHandler);
}
handle(Order order)
:处理当前请求的方法,订单对象作为请求传递。setNextHandler(OrderHandler nextHandler)
:设置下一个处理者。
2. 实现具体的 Handler
接下来,我们实现多个具体的处理者。例如,OrderValidationHandler
用于订单验证,OrderCalculationHandler
用于计算订单金额,OrderPaymentHandler
用于支付处理等:
public class OrderValidationHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void handle(Order order) {System.out.println("Validating order...");// 执行订单验证逻辑if (order.isValid()) {if (nextHandler != null) {nextHandler.handle(order);}} else {System.out.println("Order validation failed.");}}@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}
}public class OrderCalculationHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void handle(Order order) {System.out.println("Calculating order amount...");// 执行订单金额计算逻辑order.setAmount(order.getAmount() * 1.1); // 假设给订单加上10%的税if (nextHandler != null) {nextHandler.handle(order);}}@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}
}public class OrderPaymentHandler implements OrderHandler {private OrderHandler nextHandler;@Overridepublic void handle(Order order) {System.out.println("Processing payment...");// 执行支付逻辑if (order.getAmount() > 0) {System.out.println("Payment processed successfully!");if (nextHandler != null) {nextHandler.handle(order);}} else {System.out.println("Payment failed due to invalid amount.");}}@Overridepublic void setNextHandler(OrderHandler nextHandler) {this.nextHandler = nextHandler;}
}
3. 创建订单对象
Order
类包含订单的基本信息,例如金额、验证状态等:
public class Order {private double amount;private boolean valid;public Order(double amount, boolean valid) {this.amount = amount;this.valid = valid;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public boolean isValid() {return valid;}public void setValid(boolean valid) {this.valid = valid;}
}
4. 在 Spring Boot 中使用责任链模式
通过 Spring Boot,我们可以将这些责任链的处理者作为 Spring 的 Bean 注入,从而灵活地在服务中动态创建和修改责任链的顺序。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderService {private final OrderHandler firstHandler;@Autowiredpublic OrderService(OrderHandler firstHandler) {this.firstHandler = firstHandler;}public void processOrder(Order order) {firstHandler.handle(order);}
}
5. 配置责任链
在 Spring Boot 中,我们可以通过配置类来定义责任链的顺序:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class OrderConfig {@Beanpublic OrderHandler orderHandler() {OrderValidationHandler validationHandler = new OrderValidationHandler();OrderCalculationHandler calculationHandler = new OrderCalculationHandler();OrderPaymentHandler paymentHandler = new OrderPaymentHandler();validationHandler.setNextHandler(calculationHandler);calculationHandler.setNextHandler(paymentHandler);return validationHandler;}
}
6. 客户端调用
客户端可以通过调用 OrderService
来执行订单处理的责任链:
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {ApplicationContext context = SpringApplication.run(OrderApplication.class, args);OrderService orderService = context.getBean(OrderService.class);Order order = new Order(100, true); // 有效订单orderService.processOrder(order); // 处理订单}
}
四、责任链模式的动态编排
责任链模式最大的优势之一就是动态编排。在业务流程变化或者新增业务处理逻辑时,我们可以在运行时灵活地调整处理者的顺序,甚至添加新的处理环节,而无需大幅修改现有的代码结构。
例如,在实际业务中,如果我们要在订单处理中加入新的环节(如 OrderNotificationHandler
),只需要简单地创建一个新的处理者,并将其加入到责任链中。
五、总结
责任链模式在 Spring Boot 项目中的应用非常灵活,它通过解耦复杂接口的逻辑、动态编排处理顺序,为我们提供了一种可扩展、易维护的解决方案。通过将业务处理流程分解为多个独立的处理者,我们可以方便地管理每个环节的业务逻辑,并在必要时灵活调整和扩展业务流程。
使用责任链模式,我们不仅能够优化系统的结构,还能够提升系统的灵活性和可维护性,特别是当面对复杂的业务流程时,责任链模式尤为有效。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
相关文章:
Spring Boot 项目基于责任链模式实现复杂接口的解耦和动态编排!
全文目录: 开篇语前言一、责任链模式概述责任链模式的组成部分: 二、责任链模式的核心优势三、使用责任链模式解耦复杂接口1. 定义 Handler 接口2. 实现具体的 Handler3. 创建订单对象4. 在 Spring Boot 中使用责任链模式5. 配置责任链6. 客户端调用 四、…...
学习笔记八——内存管理相关
📘 目录 内存结构基础:栈、堆、数据段Rust 的内存管理机制(对比 C/C、Java)Drop:Rust 的自动清理机制Deref:为什么 *x 能访问结构体内部值Rc:多个变量“共享一个资源”怎么办?Weak&…...
Deepseek Bart模型相比Bert的优势
BART(Bidirectional and Auto-Regressive Transformers)与BERT(Bidirectional Encoder Representations from Transformers)虽然均基于Transformer架构,但在模型设计、任务适配性和应用场景上存在显著差异。以下是BART…...
Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)
Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM) 问题模板解题思路1. 导入必要的库2. 加载数据3. 划分训练集和测试集4. 数据预处理5. 定义算法及其参数6. 存储算法和对应指标7. 训练模型并计算指标8. 找…...
达梦数据库-学习-20-慢SQL优化之CTE等价改写
目录 一、环境信息 二、介绍 三、优化过程 1、原始SQL 2、源SQL执行时间 3、原始SQL执行计划 4、拆分问题 5、过滤性 6、统计信息收集 7、改写思路一 8、改写SQL一 9、改写SQL一的执行计划 10、改写思路二 11、改写SQL二 12、改写SQL二的执行计划 一、环境信息…...
软件生命周期模型:瀑布模型、螺旋模型、迭代模型、敏捷开发、增量模型、快速原型模型
目录 1.软件生命周期 2.软件生命周期模型 2.1瀑布模型 缺点【存在的问题】: 优点: 2.2 螺旋模型 特点: 2.3 迭代模型 优点: 2.4 敏捷开发 2.5 增量模型 增量模型一般和迭代模型一起使用: 2.6 快速原型模型…...
AI agents系列之全面介绍
随着大型语言模型(LLMs)的出现,人工智能(AI)取得了巨大的飞跃。这些强大的系统彻底改变了自然语言处理,但当它们与代理能力结合时,才真正释放出潜力——能够自主地推理、规划和行动。这就是LLM代理大显身手的地方,它们代表了我们与AI交互以及利用AI的方式的范式转变。 …...
Ubuntu 下通过 Docker 部署 WordPress 服务器
最近想恢复写私人博客的习惯,准备搭建一个wordpress。 在这篇博客中,我将记录如何在 Ubuntu 环境下通过 Docker 部署一个 WordPress 服务器。WordPress 是一个流行的内容管理系统(CMS),它让用户能够轻松地创建和管理网…...
Elasticsearch生态
目录 Elasticsearch核心概念 Elasticsearch实现全文检索的原理 Elasticsearch打分规则 常用的查询语法 ES数据同步方案 Elasticsearch生态非常丰富,包含了一系列工具和功能,帮助用户处理、分析和可视化数据,Elastic Stack是其核心部分&a…...
idea配置spring MVC项目启动(maven配置完后)
springmvc项目在idea中配置启动总结,下面的内容是在maven配置好后进行的。 配置 Tomcat 服务器 添加 Tomcat 到 IDEA: File → Settings → Build, Execution, Deployment → Application Servers → 点击 → 选择 Tomcat Server。 指定 Tomcat 安装目…...
大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!
微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法,超级快! 上图左侧是我的原文档,右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型,然后本地模型生成有关问题,并基于文…...
【排序算法】快速排序
目录 一、递归版本 1.1 hoare版本 问题1:为什么left 和 right指定的数据和key值相等时不能交换? 问题2:为什么跳出循环后right位置的值⼀定不⼤于key? 1.2 挖坑法 1.3 lomuto前后指针版本 二、快排优化 2.1 时间复杂度的计算 2.1.…...
爬虫:IP代理
什么是代理 代理服务器 代理服务器的作用 就是用来转发请求和响应 在爬虫中为何需要使用代理? 有些时候,需要对网站服务器发起高频的请求,网站的服务器会检测到这样的异常现象,则会讲请求对应机器的ip地址加入黑名单ÿ…...
JUC.atomic原子操作类原理分析
摘要 多线程场景下共享变量原子性操作除了可以使用Java自带的synchronized关键字以及AQS锁实现线程同步外,java.util.concurrent.atomic 包下提供了对基本类型封装类(AtomicBoolean|AtomicLong|AtomicReference|AtomicBoolean) 以及对应的数组封装。对于已有的包含…...
【XCP实战】AUTOSAR架构下XCP从0到1开发配置实践
目录 前言 正文 1.CAN功能开发 1.1 DBC的制作及导入 1.2 CanTrcv模块配置 1.3 Can Controller模块配置 1.4 CanIf模块配置 2.XCP模块集成配置配置 2.1.XCP模块配置 2.2.XCP模块的Task Mapping 2.3.XCP模块的初始化 3.在链接文件中定义标定段 4.编写标定相关的测试…...
【STM32】STemWin库,使用template API
目录 CubeMX配置 工程文件配置 Keil配置 STemwin配置 GUIConf.c LCDConf.c 打点函数 修改屏幕分辨率 GUI_X.c 主函数 添加区域填充函数 移植过程中需要一些参考手册,如下 STemwin使用指南 emWin User Guide & Reference Manual CubeMX配置 参考驱…...
Web开发-JavaEE应用动态接口代理原生反序列化危险Invoke重写方法利用链
知识点: 1、安全开发-JavaEE-动态代理&序列化&反序列化 2、安全开发-JavaEE-readObject&toString方法 一、演示案例-WEB开发-JavaEE-动态代理 动态代理 代理模式Java当中最常用的设计模式之一。其特征是代理类与委托类有同样的接口,代理类…...
C语言中while的相关题目
一、题目引入 以下程序中,while循环的循环次数是多少次? 二、代码分析 首先要明确的一点 while循环是当循环条件为真 就会一直循环 不会停止 while中i是小于10的 说明i可以取到0 1 2 3 4 5 6 7 8 9 进入第一个if判断i小于1为真时执行continue i0是为真的 执行continue 后…...
在Ubuntu下交叉编译 Qt 应用程序(完整步骤)
1、下载交叉编译器下: st-example-image-qt wayland-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-snapshot.sh 通过网盘分享的文件:STM32项目 链接: https://pan.baidu.com/s/1hTvJT2r6czWCrKSuNEZCuw?pwdth7t 提取码: th7t --来自百度网盘超级…...
深入剖析 Axios 的 POST 请求:何时使用 qs 处理数据
在前端开发中,Axios 是一个广泛使用的用于发送 HTTP 请求的库,特别是在处理 POST 请求时,数据的处理方式会直接影响到请求能否正确被后端接收和处理。其中,使用 qs 库对数据进行处理是一个常见的操作点,本文将深入探讨…...
Python中NumPy的随机操作
在数据科学、机器学习和科学计算中,随机数的生成和操作是不可或缺的一部分。NumPy作为Python中强大的数值计算库,提供了丰富的随机数生成工具,能够满足从简单随机数生成到复杂概率分布模拟的多种需求。本文将深入探讨NumPy的随机操作功能&…...
从代码学习深度学习 - 多头注意力 PyTorch 版
文章目录 前言一、多头注意力机制介绍1.1 工作原理1.2 优势1.3 代码实现概述二、代码解析2.1 导入依赖序列掩码函数2.2 掩码 Softmax 函数2.3 缩放点积注意力2.4 张量转换函数2.5 多头注意力模块2.6 测试代码总结前言 在深度学习领域,注意力机制(Attention Mechanism)是自然…...
通过扣子平台工作流将数据写入飞书多维表格
1. 进入扣子平台,并创建工作流扣子 扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力,扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体,并发布到豆包、飞书等各个平台。https://www.coze.cn…...
python专题2-----用python生成多位,值均是数字的随机数
有很多方法可以用 Python 生成 多位随机数。我将向您介绍几个常用的方法,并解释它们的优缺点(此处以4位随机数为例): 1. 使用 random.randint() 这是最简单直接的方法: import randomrandom_number random.randint…...
Mybatis的简单介绍
文章目录 MyBatis 简介 1. MyBatis 核心特点2. MyBatis 核心组件3. MyBatis 基本使用示例(1) 依赖引入(Maven)(2) 定义 Mapper 接口(3) 定义实体类(4) 在 Service 层调用 4. MyBatis 与 JPA/Hibernate 对比 MyBatis 简介 MyBatis 是一款优秀的 持久层框…...
山东大学软件学院创新项目实训(11)之springboot+vue项目接入deepseekAPI
因为该阶段是前后端搭建阶段,所以没有进大模型的专项训练,所以先用老师给的deepseek接口进行代替 且因为前端设计部分非本人负责且还没有提交到github上,所以目前只能先编写一个简易的界面进行功能的测试 首先进行创建model类 然后创建Cha…...
Qt绘图事件
目录 1.绘图事件 1.1绘图事件 1.2声明一个画家对象 2.画线、画圆、画矩形、画文字 2.1画线 编辑 2.2画圆 2.3画矩形 2.4画文字 3.设置画笔 3.1设置画笔颜色 3.2设置画笔宽度 3.3设置画笔风格 4.设置画刷 4.1填色 4.2设置画刷风格 5.绘图高级设置 5.1设置抗锯…...
Linux 内核 BUG: Android 手机 USB 网络共享 故障
众所周知, 窝日常使用 ArchLinux 操作系统, 而 ArchLinux 是一个滚动发行版本, 也就是各个软件包更新很快. 然而, 突然发现, Android 手机的 USB 网络共享功能 BUG 了. 经过一通排查, 发现是 Linux 内核造成的 BUG. 哎, 没办法, 只能自己动手修改内核代码, 修复 BUG 了. 本文…...
程序化广告行业(82/89):解锁行业术语,开启专业交流之门
程序化广告行业(82/89):解锁行业术语,开启专业交流之门 在程序化广告这个充满活力与挑战的行业里,持续学习是我们不断进步的动力源泉。一直以来,我都期望能和大家一起深入探索这个领域,共同成长…...
Linux的网络配置的资料
目前有两种方式,network和NetworkManager。 network方式是在CentOS 6及更早版本中引入的配置方法,支持使用配置文件的方式管理网卡的配置。 NetworkManager是在CentOS 7及后续的版本中使用的配置方法,支持使用命令行和图形化界面的方式来管理…...
linux: 文件描述符fd
目录 1.C语言文件操作复习 2.底层的系统调用接口 3.文件描述符的分配规则 4.重定向 1.C语言文件操作复习 文件 内容 属性。所有对文件的操作有两部分:a.对内容的操作;b.对属性的操作。内容是数据,属性其实也是数据-存储文件,…...
每天学一个 Linux 命令(16):mkdir
每天学一个 Linux 命令(16):mkdir 命令简介 mkdir(Make Directory)是 Linux 和类 Unix 系统中用于创建新目录的基础命令。它允许用户快速创建单个目录、多级嵌套目录,并能灵活设置目录权限。 主要用途 创建单个目录:快速生成新的空目录。递归创建多级目录:自动生成缺…...
Java微服务注册中心深度解析:环境隔离、分级模型与Eureka/Nacos对比
在微服务架构体系中,注册中心如同神经系统般承担着服务发现与健康管理的核心职能。本文将从生产环境实践出发,系统剖析注册中心的环境隔离策略、分级部署模型,并通过Eureka与Nacos两大主流组件的全方位对比,帮助开发者构建高可用服…...
c++:new关键字
目录 基本语法 使用举例 应用场景 使用 new 时的注意事项 基本语法 Type* ptr new Type;Type 是你要创建的类型(可以是基本类型、结构体、类等) new Type 表示在堆上创建一个 Type 类型的对象 ptr 是一个指针,指向这个对象 使用举例 …...
理解 MCP 协议的数据传递:HTTP 之上的一层“壳子
以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现,内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用,以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区,结构清晰,适合分享。 理…...
word中的mathtype公式编辑时,大(中)括号会存在很大的空白
如下所示,公式编辑的时候发现总会多一个空白,怎么删也删不掉 这主要是公式的分隔符问题,选择:“格式”-“分隔符对齐”,选择第三个可以消除下面的空白 点击“确认”,效果如下所示:...
【Java】查看当前 Java 使用的垃圾回收器
一、查询 Code import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.util.Arrays; import java.util.List;public class GCTypeDetector {public static void main(String[] args) {List<GarbageCollectorMX…...
Linux编程c/c++程序
前言 我们Windows系统下的idea可以说是非常智能了,集成了各种开发工具,包括并不限于编辑器/编译器/调试器/自动化构建工具/版本控制工具……而在Linux系统中,每个组件之间是相互独立的,每个组件各司其职,共同协作完成…...
【前端网络请求入门】XMLHttpRequest与Fetch保姆级教程
新手学前端时,经常会被「如何让网页和服务器说话」难住。今天我们用最通俗的语言,把浏览器最常用的两种网络请求方式——XMLHttpRequest和Fetch讲清楚,还会带完整的代码示例,跟着敲一遍就能上手! 一、先搞懂「网络请求…...
redis单机安装
redis单机安装 下载地址 官网:https://redis.io/下载列表页面:https://download.redis.io/releases/ 说明 版本选择:redis-7.0.0.tar.gz下载地址:https://download.redis.io/releases/redis-7.0.0.tar.gz 安装前准备 在linu…...
从零手写RPC-version0
参考文档 https://github.com/he2121/MyRPCFromZero Version-0 0、写项目第一步,先添加远程仓库 先在 github 上新建仓库,然后将本地新建的项目推送到远程仓库中 由于网上很多教程,所以本节不再赘述(可以让 chatGPT给出一个完…...
MOM成功实施分享(八)汽车活塞生产制造MOM建设方案(第二部分)
在制造业数字化转型的浪潮中,方案对活塞积极探索,通过实施一系列数字化举措,在生产管理、供应链协同、质量控制等多个方面取得显著成效,为行业提供了优秀范例。 1.转型背景与目标:活塞在数字化转型前面临诸多挑战&…...
二、Android Studio环境安装
一、下载安装 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Studio 提供了一些应用构建器以及一个已针对 Android 应用进行优化的集成式开发环境 (IDE)。立即下载 Android Studio。https://developer.android.google.cn/studio?hlzh-c…...
构件与中间件技术:概念、复用、分类及标准全解析
以下是对构件与中间件技术相关内容更详细的介绍: 一、构件与中间件技术的概念 1.构件技术 定义:构件是具有特定功能、可独立部署和替换的软件模块,它遵循一定的规范和接口标准,能够在不同的软件系统中被复用。构件技术就是以构…...
亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结
亲手打造可视化故事线管理工具:开发全流程、难点突破与开发过程经验总结 作为还没入门的业余编程爱好者,奋战了2天,借助AI开发一款FLASK小工具,功能还在完善中(时间轴可以跟随关联图缩放,加了一个用C键控制…...
CSS 字体学习笔记
在网页设计中,字体的使用对于提升用户体验和页面美观性至关重要。CSS 提供了一系列字体属性,用于控制文本的显示效果。以下是对 CSS 字体属性的详细学习笔记。 一、字体系列(font-family) 1. 字体系列的分类 在 CSS 中…...
通过 spring ai 对接 deepseek ai 大模型通过向量数据库,完成 AI 写标书及构建知识库功能的设计与开发
AI写标书及知识库构建详细设计方案 一、系统架构设计 +-------------------+ +-------------------+ +-------------------+ | 用户交互层 | | AI服务层 | | 知识库存储层 | | (Web/API) |---->| (Spring AI) |---…...
cropperjs 2.0裁剪图片后转base64提示“Tainted canvases may not be exported”跨域问题的解决办法。
目录 为什么会有这边文章 辛酸历程,不看也罢 想解决问题,看这里就够了 问题已解决,后边还是废话 为什么会有这边文章 最近,做一个项目需要用在前端实现图片裁剪功能,毋庸置疑,cropperjs是不二选择。当在…...
2、JSX:魔法世界的通行证——用魔法符号编织动态界面
一、开篇:魔法符号的觉醒 "看呐,赫敏!这根魔杖(React组件)为何能自动绘制出动态界面?"年轻的巫师学徒罗恩指着闪烁的屏幕惊呼。 "这就是JSX魔法阵的威力,"邓布利多校长挥舞…...
八大排序算法
目录 八大排序算法排序算法的稳定性比较排序插入排序直接插入排序希尔排序希尔排序的时间复杂度计算 选择排序直接选择排序堆排序 交换排序冒泡排序快速排序递归hoare版本挖坑法lomuto前后指针 非递归 归并排序排序性能对比 非比较排序计数排序 比较排序算法总结 八大排序算法 …...