当前位置: 首页 > news >正文

Spring Boot集成Spring Statemachine

Spring Statemachine 是 Spring 框架下的一个模块,用于简化状态机的创建和管理,它允许开发者使用 Spring 的特性(如依赖注入、AOP 等)来构建复杂的状态机应用。以下是关于 Spring Statemachine 的详细介绍:

主要特性

  1. 丰富的状态机模型支持:支持多种状态机模型,如简单状态机、层次状态机和并行状态机。层次状态机允许状态嵌套,并行状态机可以同时处理多个独立的状态流。
  2. 灵活的配置方式:可以使用 Java 配置、XML 配置或注解来定义状态机的状态、转移、事件等。
  3. 与 Spring 生态集成:无缝集成 Spring 框架的其他模块,如 Spring Boot、Spring MVC 等,方便构建企业级应用。
  4. 事件驱动机制:通过事件触发状态转移,易于与外部系统进行交互。
  5. 状态监听器:允许开发者在状态转移前后执行自定义逻辑,如日志记录、业务处理等。

快速入门

1. 添加依赖

如果你使用 Maven,在 pom.xml 中添加以下依赖:

xml

<dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-statemachine-core</artifactId><version>3.2.1</version>
</dependency>
2. 定义状态和事件

java

// 定义状态枚举
public enum States {STATE1, STATE2, STATE3
}// 定义事件枚举
public enum Events {EVENT1, EVENT2
}
3. 配置状态机

使用 Java 配置方式:

java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachine;
import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;import java.util.EnumSet;@Configuration
@EnableStateMachine
public class StateMachineConfig extends EnumStateMachineConfigurerAdapter<States, Events> {@Overridepublic void configure(StateMachineConfigurationConfigurer<States, Events> config) throws Exception {config.withConfiguration().autoStartup(true);}@Overridepublic void configure(StateMachineStateConfigurer<States, Events> states) throws Exception {states.withStates().initial(States.STATE1).states(EnumSet.allOf(States.class));}@Overridepublic void configure(StateMachineTransitionConfigurer<States, Events> transitions) throws Exception {transitions.withExternal().source(States.STATE1).target(States.STATE2).event(Events.EVENT1).and().withExternal().source(States.STATE2).target(States.STATE3).event(Events.EVENT2);}
}
4. 使用状态机

java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.statemachine.StateMachine;@SpringBootApplication
public class StateMachineApp implements CommandLineRunner {@Autowiredprivate StateMachine<States, Events> stateMachine;public static void main(String[] args) {SpringApplication.run(StateMachineApp.class, args);}@Overridepublic void run(String... args) throws Exception {stateMachine.start();System.out.println("当前状态: " + stateMachine.getState().getId());stateMachine.sendEvent(Events.EVENT1);System.out.println("触发 EVENT1 后状态: " + stateMachine.getState().getId());stateMachine.sendEvent(Events.EVENT2);System.out.println("触发 EVENT2 后状态: " + stateMachine.getState().getId());}
}

代码解释

  1. 定义状态和事件:使用枚举类型定义状态机的状态和事件,方便管理和使用。
  2. @Configuration:表明这是一个配置类。
  3. @EnableStateMachine:启用状态机功能。
  4. 配置状态机
    • configure(StateMachineConfigurationConfigurer):配置状态机的基本属性,如自动启动。
    • configure(StateMachineStateConfigurer):定义状态机的状态,指定初始状态STATE_A和所有可能的状态。
    • configure(StateMachineTransitionConfigurer):定义状态之间的转移规则,包括源状态、目标状态和触发事件。EVENT_1 事件触发从 STATE_A 到 STATE_B 的转移,EVENT_2 事件触发从 STATE_B 到 STATE_C 的转移。
  5. 使用状态机:在 CommandLineRunner 中注入状态机实例,启动状态机并发送事件,观察状态的变化。

应用场景

  1. 工作流管理:如订单处理流程、审批流程等,通过状态机可以清晰地管理每个步骤的状态转换。
  2. 游戏开发:管理游戏角色的状态,如站立、行走、攻击等,根据用户输入和游戏逻辑进行状态转移。
  3. 设备控制:控制物联网设备的状态,如智能家电的开关、模式切换等。

Spring Statemachine 提供了强大而灵活的功能,帮助开发者更高效地实现状态机应用。

-----------------------------------------------DEMO------------------------------------------------------------------

以下为你提供一个较为完整的 Spring Boot 集成 Spring Statemachine 的示例代码,这个示例模拟了一个简单的订单状态机,包含待支付、已支付、已发货、已完成几种状态。

1. 创建 Spring Boot 项目并添加依赖

可以使用 Spring Initializr 或者 IDE 自带的 Spring Boot 项目创建功能,添加以下依赖:

xml

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.statemachine</groupId><artifactId>spring-statemachine-core</artifactId><version>3.2.1</version></dependency>
</dependencies>

2. 定义状态和事件枚举

java

// 定义订单状态枚举
public enum OrderState {PENDING_PAYMENT, PAID, SHIPPED, COMPLETED
}// 定义订单事件枚举
public enum OrderEvent {PAY, SHIP, DELIVER
}

3. 配置状态机

java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.EnableStateMachine;
import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;import java.util.EnumSet;@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends EnumStateMachineConfigurerAdapter<OrderState, OrderEvent> {@Overridepublic void configure(StateMachineConfigurationConfigurer<OrderState, OrderEvent> config) throws Exception {config.withConfiguration().autoStartup(true);}@Overridepublic void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {states.withStates().initial(OrderState.PENDING_PAYMENT).states(EnumSet.allOf(OrderState.class));}@Overridepublic void configure(StateMachineTransitionConfigurer<OrderState, OrderEvent> transitions) throws Exception {transitions.withExternal().source(OrderState.PENDING_PAYMENT).target(OrderState.PAID).event(OrderEvent.PAY).and().withExternal().source(OrderState.PAID).target(OrderState.SHIPPED).event(OrderEvent.SHIP).and().withExternal().source(OrderState.SHIPPED).target(OrderState.COMPLETED).event(OrderEvent.DELIVER);}
}

4. 创建状态机服务类

java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.statemachine.StateMachine;
import org.springframework.stereotype.Service;@Service
public class OrderStateMachineService {@Autowiredprivate StateMachine<OrderState, OrderEvent> stateMachine;public boolean sendEvent(OrderEvent event) {return stateMachine.sendEvent(event);}public OrderState getCurrentState() {return stateMachine.getState().getId();}
}

5. 创建控制器类

java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderStateMachineService orderStateMachineService;@GetMapping("/currentState")public OrderState getCurrentState() {return orderStateMachineService.getCurrentState();}@PostMapping("/sendEvent/{event}")public String sendEvent(@PathVariable OrderEvent event) {boolean result = orderStateMachineService.sendEvent(event);if (result) {return "事件发送成功,当前状态: " + orderStateMachineService.getCurrentState();} else {return "事件发送失败,当前状态: " + orderStateMachineService.getCurrentState();}}
}

6. 启动 Spring Boot 应用

java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringStatemachineDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringStatemachineDemoApplication.class, args);}
}

代码解释

  • 状态和事件枚举OrderState 定义了订单可能的状态,OrderEvent 定义了触发状态转移的事件。
  • 状态机配置OrderStateMachineConfig 类使用 @EnableStateMachine 注解启用状态机,通过重写三个配置方法分别配置状态机的基本属性、状态和转移规则。
  • 状态机服务类OrderStateMachineService 封装了状态机的操作,包括发送事件和获取当前状态。
  • 控制器类OrderController 提供了两个接口,一个用于获取当前订单状态,另一个用于发送事件触发状态转移。
  • 启动类SpringStatemachineDemoApplication 是 Spring Boot 应用的启动类。

测试

启动应用后,可以使用以下方式进行测试:

  • 获取当前状态:访问 http://localhost:8080/order/currentState
  • 发送事件:访问 http://localhost:8080/order/sendEvent/PAY 触发支付事件,根据状态机配置,订单状态将从 PENDING_PAYMENT 转移到 PAID

------------------------------------------------------------------------------------------------

transitions.withExternal().source(OrderState.PENDING_PAYMENT).target(OrderState.PAID).event(OrderEvent.PAY).and().withExternal().source(OrderState.PAID).target(OrderState.SHIPPED).event(OrderEvent.SHIP).and().withExternal().source(OrderState.SHIPPED).target(OrderState.COMPLETED).event(OrderEvent.DELIVER);

这段代码的主要作用是定义状态机中不同状态之间的转移规则。在一个订单处理的状态机场景里,它明确了订单在不同状态(如待支付、已支付、已发货、已完成)之间如何根据特定事件(如支付、发货、交付)进行转换。

代码结构分析

整体上,这段代码通过多次调用 withExternal() 方法来定义多个外部状态转移规则,每个状态转移规则由 source(源状态)、target(目标状态)和 event(触发事件)三个关键部分组成,不同的状态转移规则之间通过 .and() 方法进行连接。

各部分详细解释

withExternal()

withExternal() 方法用于定义外部状态转移,即状态机从一个状态转移到另一个不同的状态。与之相对的还有内部转移(withInternal()),内部转移不会改变状态机的状态,只是在当前状态下执行一些操作。

.source(OrderState.PENDING_PAYMENT).target(OrderState.PAID).event(OrderEvent.PAY)
  • source(OrderState.PENDING_PAYMENT):指定状态转移的起始状态,这里是 OrderState.PENDING_PAYMENT,表示订单处于待支付状态。
  • target(OrderState.PAID):指定状态转移的目标状态,即 OrderState.PAID,意味着订单在满足条件后将转移到已支付状态。
  • event(OrderEvent.PAY):指定触发状态转移的事件,当 OrderEvent.PAY 事件发生时,状态机将从待支付状态转移到已支付状态。
.and()

and() 方法用于连接多个状态转移规则,它表示一个规则定义的结束和下一个规则定义的开始,使得可以在同一个配置方法中定义多个不同的状态转移规则。

后续规则

java

.withExternal().source(OrderState.PAID).target(OrderState.SHIPPED).event(OrderEvent.SHIP)
.and()
.withExternal().source(OrderState.SHIPPED).target(OrderState.COMPLETED).event(OrderEvent.DELIVER);

这部分代码定义了另外两个状态转移规则:

  • 当 OrderEvent.SHIP 事件发生时,订单从已支付状态(OrderState.PAID)转移到已发货状态(OrderState.SHIPPED)。
  • 当 OrderEvent.DELIVER 事件发生时,订单从已发货状态(OrderState.SHIPPED)转移到已完成状态(OrderState.COMPLETED)。

示例代码扩展

如果需要在状态转移时执行一些额外的操作,比如记录日志或者更新数据库,可以使用 action() 方法。以下是一个扩展后的示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.action.Action;
import org.springframework.statemachine.config.EnableStateMachine;
import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter;
import org.springframework.statemachine.config.builders.StateMachineConfigurationConfigurer;
import org.springframework.statemachine.config.builders.StateMachineStateConfigurer;
import org.springframework.statemachine.config.builders.StateMachineTransitionConfigurer;import java.util.EnumSet;@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends EnumStateMachineConfigurerAdapter<OrderState, OrderEvent> {@Overridepublic void configure(StateMachineTransitionConfigurer<OrderState, OrderEvent> transitions) throws Exception {Action<OrderState, OrderEvent> payAction = context -> {System.out.println("订单已支付,更新订单状态为已支付");// 这里可以添加更新数据库等操作};Action<OrderState, OrderEvent> shipAction = context -> {System.out.println("订单已发货,更新订单状态为已发货");// 这里可以添加更新数据库等操作};Action<OrderState, OrderEvent> deliverAction = context -> {System.out.println("订单已完成,更新订单状态为已完成");// 这里可以添加更新数据库等操作};transitions.withExternal().source(OrderState.PENDING_PAYMENT).target(OrderState.PAID).event(OrderEvent.PAY).action(payAction).and().withExternal().source(OrderState.PAID).target(OrderState.SHIPPED).event(OrderEvent.SHIP).action(shipAction).and().withExternal().source(OrderState.SHIPPED).target(OrderState.COMPLETED).event(OrderEvent.DELIVER).action(deliverAction);}// 其他配置方法保持不变
}

在这个扩展示例中,通过定义 Action 对象,并在状态转移规则中使用 action() 方法,在状态转移时执行了相应的操作。

相关文章:

Spring Boot集成Spring Statemachine

Spring Statemachine 是 Spring 框架下的一个模块&#xff0c;用于简化状态机的创建和管理&#xff0c;它允许开发者使用 Spring 的特性&#xff08;如依赖注入、AOP 等&#xff09;来构建复杂的状态机应用。以下是关于 Spring Statemachine 的详细介绍&#xff1a; 主要特性 …...

压缩空气储能仿真simulink模型

压缩空气储能仿真simulink模型&#xff0c;适合matlab 2017及以上版本 CompressingGas.slx , 40474...

Tomcat 安装

一、Tomcat 下载 官网&#xff1a;Apache Tomcat - Welcome! 1.1.下载安装包 下载安装包&#xff1a; wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.102/bin/apache-tomcat-9.0.102.tar.gz 安装 javajdk。 yum install java-1.8.0-openjdk.x86_64 -y /etc/altern…...

贪心算法和遗传算法优劣对比——c#

项目背景&#xff1a;某钢管厂的钢筋原材料为 55米&#xff0c;工作需要需切割 40 米&#xff08;1段&#xff09;、11 米&#xff08;15 段&#xff09;等 4 种规格 &#xff0c;现用贪心算法和遗传算法两种算法进行计算&#xff1a; 第一局&#xff1a;{ 40, 1 }, { 11, 15…...

系统开发资源

一、前端篇 1.1 菜鸟CSS教程 1.2 HTML/CSS/JS 在线工具 二、后端篇 三、其他篇 3.1 菜鸟官网 3.2 黑马程序员学习路线 3.3 根据地区获取经纬度...

深度学习 bert与Transformer的区别联系

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;和Transformer都是现代自然语言处理&#xff08;NLP&#xff09;中的重要概念&#xff0c;但它们代表不同的层面。理解这两者之间的区别与联系有助于更好地掌握它们在NLP任务中的应用。 …...

unity使用mesh 画图(1)

plane 圆 空心椭圆 椭圆 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class DrawMeshManager {static DrawMeshManager instance;public static DrawMeshManager Instance {get {if (instance ! null){retu…...

SpringMVC响应页面及不同类型的数据,

目录 响应页面 响应数据 文本数据 响应POJO对象 ​编辑 响应生命周期 视图解析器 控制器&#xff08;Controller&#xff09;处理完客户端请求后&#xff0c;生成的并返回给客户端的结果就是响应&#xff0c;响应的结果可以是静态页面&#xff0c;数据&#xff0c;HTM…...

地理信息系统(ArcGIS)在水文水资源及水环境中的应用:空间数据管理‌、空间分析功能‌、‌可视化表达‌

随着全球工业化和经济的快速发展&#xff0c;水资源短缺、水污染等问题日益严峻&#xff0c;成为制约可持续发展的重大瓶颈。地理信息系统&#xff08;GIS&#xff09;以其强大的空间数据管理和分析能力&#xff0c;在水文水资源及水环境的研究和管理中展现出独特优势。本文将深…...

电路原理(电容 集成电路NE555)

电容 1.特性&#xff1a;充放电&#xff0c;隔直流&#xff0c;通交流 2.电容是通过聚集正负电荷来存储电能的 3.电容充放电过程可等效为导通回路 4.多电容并联可以把容量叠加&#xff0c;但是多电容串联就不会&#xff0c;只会叠加电容的耐压值。 6.电容充放电时相当于通路&a…...

C++对象的初始化和对象所占资源的清理-----初始化列表

一、初始化列表 C 提供了 初始化列表&#xff08;initializer list&#xff09; 语法&#xff0c;可以在 构造函数 中用来初始化类的成员变量。它的主要优势是 提高效率&#xff0c;特别是在初始化 const 或 reference 类型的成员时&#xff0c;以及避免额外的赋值操作。 1.…...

零成本搭建Calibre个人数字图书馆支持EPUB MOBI格式远程直读

文章目录 前言1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网使用kindle访问内网私人书库 前言 嘿&#xff0c;各位书虫们&#xff01;今天要给大家安利一个超级炫酷的技能——如何在本地Windows电脑上搭建自己的私人云端书库。亚马逊服务停了&#xff…...

Ansible命令行模式常用模块使用案例(二)

在Ansible中&#xff0c;命令行模式&#xff08;Ad-Hoc 模式&#xff09;是一种快速执行任务的方式&#xff0c;适合临时任务或简单操作。以下是 Ansible 命令行模式中常用模块的使用案例&#xff08;第二部分&#xff09;&#xff1a; 1 file模块 功能特性&#xff1a;主要用于…...

12. Pandas :使用pandas读Excel文件的常用方法

一 read_excel 函数 其他参数根据实际需要进行查找。 1.接受一个工作表 在 11 案例用到的 Excel 工作簿中&#xff0c;数据是从第一张工作表的 A1 单元格开始的。但在实际场景中&#xff0c; Excel 文件可能并没有这么规整。所以 panda 提供了一些参数来优化读取过程。 比如 s…...

Pytorch中矩阵乘法使用及案例

六种矩阵乘法 torch中包含许多矩阵乘法&#xff0c;大致可以分为以下几种&#xff1a; *&#xff1a;即a * b 按位相乘&#xff0c;要求a和b的形状必须一致&#xff0c;支持广播操作 torch.matmul()&#xff1a;最广泛的矩阵乘法 &#xff1a;与torch.matmul()效果一样&…...

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…...

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…...

父组件中循环生成多个子组件时,有且只有最后一个子组件的watch对象生效问题及解决办法

提示&#xff1a;父组件中循环生成多个子组件时&#xff0c;有且只有最后一个子组件的watch对象生效问题及解决办法 文章目录 [TOC](文章目录) 前言一、问题二、解决方法——使用function函数代替箭头函数()>{}总结 前言 ‌‌‌‌‌问题&#xff1a;子组件用that解决watch无…...

stable Diffusion 中的 VAE是什么

在Stable Diffusion中&#xff0c;VAE&#xff08;Variational Autoencoder&#xff0c;变分自编码器&#xff09;是一个关键组件&#xff0c;用于生成高质量的图像。它通过将输入图像编码到潜在空间&#xff08;latent space&#xff09;&#xff0c;并在该空间中进行操作&…...

麒麟v10 ARM64架构系统升级mysql数据库从mysql-5.7.27到mysql-8.4.4图文教程

1、背景与问题说明 因mysql-5.2.27版本存在安全漏洞问题&#xff0c;为保障系统安全&#xff0c;需将处于生产环境的麒麟v10 ARM64架构系统服务器上当前部署的mysql-5.7.27版本升级到mysql-8.4.4&#xff0c;以规避潜在风险&#xff0c;提升系统整体的安全性和稳定性。 1.1 本…...

图论·拓扑排序

拓扑排序 有向无环图的遍历 检查有向图是否连通/有环 核心操作 统计度数&#xff0c;对于度为0的点作为起始点&#xff0c;添加度为0的点作为遍历 如何验证有环&#xff1f;注意不建议直接模拟&#xff0c;如果出现环这起始点的度一定不为0&#xff0c;肯定会少遍历一些点&…...

Uniapp组件 Textarea 字数统计和限制

Uniapp Textarea 字数统计和限制 在 Uniapp 中&#xff0c;可以通过监听 textarea 的 input 事件来实现字数统计功能。以下是一个简单的示例&#xff0c;展示如何在 textarea 的右下角显示输入的字符数。 示例代码 首先&#xff0c;在模板中定义一个 textarea 元素&#xff…...

一文了解JVM的垃圾回收

Java堆内存结构 java堆内存是垃圾回收器管理的主要区域&#xff0c;也被称为GC堆。 为了方便垃圾回收&#xff0c;堆内存被分为新生代、老年代和永久代。 新创建的对象的内存会在新生代中分配&#xff0c;达到一定存活时长后会移入老年代&#xff0c;而永久代存储的是类的元数…...

Vector底层结构和源码分析(JDK1.8)

参考视频&#xff1a;韩顺平Java集合 Vector 类的定义说明&#xff1a; Vector 的底层也是一个对象数组&#xff0c;protected Object[] elementData;Vector 是线程同步的&#xff0c;即线程安全&#xff0c;Vectoe 类的操作方法带有 synchronized 关键字&#xff1a;public sy…...

uni-app+vue3学习随笔

目录相关 static文件 编译器会把static目录中的内容整体复制到最终编译包内&#xff0c; 非 static 目录下的文件&#xff08;vue组件、js、css 等&#xff09;只有被引用时&#xff0c;才会被打包编译。 css、less/scss 等资源不要放在 static 目录下&#xff0c;建议这些…...

JetBrains(全家桶: IDEA、WebStorm、GoLand、PyCharm) 2024.3+ 2025 版免费体验方案

JetBrains&#xff08;全家桶: IDEA、WebStorm、GoLand、PyCharm&#xff09; 2024.3 2025 版免费体验方案 前言 JetBrains IDE 是许多开发者的主力工具&#xff0c;但从 2024.02 版本起&#xff0c;JetBrains 调整了试用政策&#xff0c;新用户不再享有默认的 30 天免费试用…...

移远通信联合德壹发布全球首款搭载端侧大模型的AI具身理疗机器人

在汹涌澎湃的人工智能浪潮中&#xff0c;具身智能正从实验室构想迈向现实应用。移远通信凭借突破性的端侧AI整体解决方案&#xff0c;为AI机器人强势赋能&#xff0c;助力其实现跨行业拓展&#xff0c;从工业制造到服务接待&#xff0c;再到医疗康养&#xff0c;不断改写各行业…...

嵌入式硬件篇---手柄控制控制麦克纳姆轮子

文章目录 前言1. 变量定义2. 摇杆死区设置3. 模式检查4. 摇杆数据处理4.1 右摇杆垂直值&#xff08;psx_buf[7]&#xff09;4.2 右摇杆水平值&#xff08;psx_buf[8]&#xff09;4.3 左摇杆水平值&#xff08;psx_buf[5]&#xff09;4.4 左摇杆垂直值&#xff08;psx_buf[6]&am…...

XML Schema 实例

XML Schema 实例 引言 XML(可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言。XML Schema 是一种用于定义 XML 文档结构的机制,它定义了 XML 文档中允许的数据类型、元素和属性。本文将详细探讨 XML Schema 实例,包括其基本概念、结构、用途以及实例分析。…...

Datax-web部署文档(超详细)

Datax-web部署文档&#xff08;超详细&#xff09; Datax部署 # 参考官方文档 https://github.com/alibaba/DataX/blob/master/userGuid.md# 下载datax已经封装好的文件&#xff0c;不推荐源码自己编译 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202309/datax.…...

基于javaweb的SSM敬老院养老院管理系统(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...

专题地图的立体表达-基于QGIS和PPT的“千层饼”视图制作实践

目录 前言 一、QGIS准备基础数据 1、QGIS 相关插件 2、图层标绘操作 二、PPT中制作 1、调整图片的规格 2、设置旋转 3、添加文字 三、总结 前言 在信息爆炸的时代&#xff0c;数据的可视化呈现变得愈发关键&#xff0c;而专题地图作为传递地理空间信息的有力工具&#…...

DeepSeek-R1 论文阅读总结

1. QA问答&#xff08;我的笔记&#xff09; Q1: DeepSeek如何处理可读性问题&#xff1f; 通过构建冷启动数据&#xff08;数千条长CoT数据&#xff09;微调基础模型&#xff0c;结合多阶段训练流程&#xff08;RL训练、拒绝采样生成SFT数据&#xff09;&#xff0c;并优化输…...

如何选择适合您智能家居解决方案的通信协议?

如何选择适合您智能家居解决方案的通信协议&#xff1f; 在开发智能家居产品时&#xff0c;选择合适的通信协议对于设备的高效运行及其在智能家居系统中的互操作性至关重要。市面上协议众多&#xff0c;了解它们的特性并在做决定前考虑各种因素是非常必要的。以下是一些帮助您…...

蓝桥杯备考:set容器用法(lower_bound)---营业额统计

如图所示&#xff0c;这道题的暴力解法就是枚举每天的营业额&#xff0c;让该营业额和前面的天的营业额依次相减取最小值这样的话我们的时间复杂度就是N平方&#xff0c;我们是很有可能超时的 所以我们选择用set容器的二分查找功能 我们每次遍历到一个数的时候&#xff0c;前…...

vue3 动态添加路由并生成左侧菜单栏

先说下思路&#xff0c;登录后跳转到基础页面&#xff0c; 每访问一个页面时&#xff0c;会进到路由守卫的方法 守卫进行身份验证&#xff0c;登录成功后才能跳转到静态路由外的页面&#xff0c;否则就重定向回login页面 登录后跳转到基础页面&#xff08;因为基础页面包含了左…...

上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力

大型语言模型(LLMs)在开放领域任务中表现出色,但在快速演变的专业领域(如医学、金融)中面临挑战: 知识更新难题:传统指令微调(Instruction Fine-Tuning, IFT)依赖显式指令,难以适应动态知识。灾难性遗忘:持续预训练(Continued Pretraining, CPT)可能导致模型遗忘已…...

L2-4 吉利矩阵

输入样例&#xff1a; 7 3输出样例&#xff1a; 666 这道题是暴力纯搜&#xff0c;但是很难想&#xff0c;我这个是看的别人的代码 #include "bits/stdc.h" using namespace std; int x[20][20]; int l, n; int cnt 0; int sumx[5], sumy[5]; void dfs(int x, in…...

⭐算法OJ⭐汉明距离【位操作】(C++ 实现)Hamming Distance

Hamming Distance&#xff08;汉明距离&#xff09;是用于衡量两个等长字符串在相同位置上不同字符的个数的度量。它通常用于比较两个二进制字符串或编码序列的差异。 定义 给定两个长度相同的字符串 A A A 和 B B B&#xff0c;它们的汉明距离 D ( A , B ) D(A,B) D(A,B)…...

数据可信、隐私可控:CESS 如何打造波卡生态数据新基建?

原文&#xff1a;https://messari.io/report/cess-network-a-deep-dive-into-programmable-data-value-infrastructure作者&#xff1a;Messari编译&#xff1a;OneBlock波卡生态一直以来以其跨链互操作性和灵活性吸引了众多创新项目&#xff0c;尤其是在 DePIN&#xff08;去中…...

HCIA-11.以太网链路聚合与交换机堆叠、集群

链路聚合背景 拓扑组网时为了高可用&#xff0c;需要网络的冗余备份。但增加冗余容易后会出现环路&#xff0c;所以我们部署了STP协议来破除环路。 但是&#xff0c;根据实际业务的需要&#xff0c;为网络不停的增加冗余是现实需要的一部分。 那么&#xff0c;为了让网络冗余…...

网络安全之数据加密(DES、AES、RSA、MD5)

刚到公司时&#xff0c;我的工作就是为app端提供相应的接口。之前app使用的是PHP接口&#xff0c;对数据加密方面做得比较少。到使用java接口时&#xff0c;老大开始让我们使用DES加密&#xff0c;进行数据传输&#xff0c;但是后来觉得DES是对称加密&#xff0c;密钥存在客户端…...

Vim忍者速成秘卷:让你的键盘冒出残影の奥义

🎯 核心原理 通过 超低延迟配置 + 肌肉记忆优化 + 视觉欺骗技术,达成行云流水的操作体验。就像《火影忍者》结印般流畅! ⚡ 残影生成术(基础篇) " 🛩️ 贴地飞行模式(.vimrc 极速配置) set timeoutlen=300 " 快捷键响应时间压缩至300ms(武士刀级响应)…...

致远互联FE协作办公平台 存在SQL注入漏洞(DVB-2025-8942)

免责声明 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x01…...

通俗易懂动态表单自定义字段解决方案

动态表单自定义字段解决方案 1. 背景&#xff1a; 有些项目可能会有要求&#xff0c;客户可以自定义设计字段&#xff0c;并且字段还需要在后台设置可展示、可搜索。 2. 场景&#xff1a; 比如说报名场景&#xff0c;我们并不知道客户想让用户填哪些东西。下面我就举个例子&…...

CentOS7离线部署安装Dify

离线部署安装Dify 在安装 Dify 之前&#xff0c;请确保您的机器满足以下最低系统要求&#xff1a; CPU > 2 核 内存 > 4 GiB 1.安装docker和docker compose 启动 Dify 服务器最简单的方式是通过docker compose。因此现在服务器上安装好docker和docker compose&#xf…...

Dify后端结构与二次开发指南(一)

Dify 的后端基于 Python 编写&#xff0c;使用 Flask 作为 Web 框架&#xff0c;SQLAlchemy 作为 ORM&#xff08;对象关系映射&#xff09;&#xff0c;Celery 作为任务队列&#xff0c;Flask-Login 处理用户认证和授权。以下是对 Dify 后端结构的详细介绍&#xff0c;以及如何…...

vscode arm拓展 keil acm5 到acm6迁移

目录 1. Arm Keil Studio Visual Studio 代码扩展用户指南&#xff08;only support acm6 project&#xff09;&#xff08;能不迁移还是别迁移了&#xff0c;工程量太大啦&#xff0c;会出很多问题的&#xff09; 1. Arm Keil Studio Visual Studio 代码扩展用户指南&#xff…...

软件工程概述、软件过程模型、逆向工程(高软45)

系列文章目录 软件工程概述、软件过程模型、逆向工程。 文章目录 系列文章目录前言一、软件工程概述二、能力成熟度模型1.能力成熟度模型CMM2.能力成熟度模型集成CMMI 三、软件过程模型1.瀑布模型SDLC2.原型化模型3.螺旋模型4.增量模型5.喷泉模型6.敏捷模型7.统一过程模型RUP 四…...

医药制造行业现状 医药制造行业内检实验室LIMS

在医药制造行业中&#xff0c;质量控制是确保产品安全性和有效性的关键环节。随着科技的进步和监管要求的日益严格&#xff0c;传统的实验室信息管理系统&#xff08;LIMS&#xff09;已经难以满足现代医药制造企业对高效、精准管理的需求。面对这一挑战&#xff0c;白码内检实…...