【2025】camunda API接口介绍以及REST接口使用(3)
前言
在前面的两篇文章我们介绍了Camunda的web端和camunda-modeler的使用。这篇文章主要介绍camunda结合springboot进行使用,以及相关api介绍。
该专栏主要为介绍camunda的学习和使用
- 🍅【2024】Camunda常用功能基本详细介绍和使用-下(1)
- 🍓【2024】Camunda常用功能基本详细介绍和使用(业务决策和定时事件)-下(2)
- 🍇【2025】camunda API接口介绍以及REST接口使用(3)
一、项目搭建
1、依赖引入
先创建好一个springboot项目,这里依旧使用的camunda7.20
的版本,然后jdk使用的是17
的版本,springboot版本使用的是3.3.0
。这里可以根据自己的项目情况去跟换camunda7.20版本。可以在官方文档查看版本适配。
尽量选择适配的避免增加不必要的麻烦!
➡️官网地址
依赖我主要添加了几个camunda引擎还有web页面以及rest接口和openapi的几个依赖;数据库用的是mysql的数据库;swagger文档用了knife4j的。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.zheng</groupId><artifactId>camunda-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>camunda-demo</name><description>camunda-demo</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><camunda.version>7.20.0</camunda.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- camunda相关 依赖-->
<!-- 引擎--><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter</artifactId><version>${camunda.version}</version></dependency>
<!-- web ui界面--><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId><version>${camunda.version}</version></dependency>
<!-- rest接口--><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-rest</artifactId><version>${camunda.version}</version></dependency>
<!-- openapi 文档 --><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-rest-openapi</artifactId><version>${camunda.version}</version></dependency><!-- swagger文档--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifactId><version>4.4.0</version></dependency><!-- mysql 数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
2、配置文件
2.1、yaml配置文件
主要配置了数据库连接配置,camunda基础配置,以及swagger相关配置
server:port: 8090spring:application:name: camunda-demo# 数据库配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/camunda?nullDatabaseMeansCurrent=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falseusername: rootpassword: 123456type: com.mysql.cj.jdbc.MysqlDataSource# camunda基础配置
camunda.bpm:
# auto-deployment-enabled: false #如果不是第一次启动可以把这个打开,避免每次去检查自动部署数据库admin-user:id: admin #用户名password: 123456 #密码firstName: yufilter:create: All tasksgeneric-properties:# 历史生存时间properties:historyTimeToLive: P10D# swagger文档配置
springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alphaurls:- url: /openapi.json # camunda中编写好的api的文档信息name: camunda- url: /v3/api-docs # 咱们自己在项目中自定义的文档信息name: camundaapi-docs:path: /v3/api-docsenabled: true
2.2、添加openapi.json
把依赖下载下来之后我们需要到camunda-engine-rest-openapi
把openapi.json文件添加到resources.static
目录下供配置文件读取
存放位置
3、验证
-
启动项目,访问
http://localhost:8090/camunda/app/cockpit/default/#/dashboard
使用自己yaml配置的 账号 密码登陆则代表页面成功
-
访问swagger
http://localhost:8090/swagger-ui/index.html
需要把端口改为自己的端口,或者直接修改openapi.json文件
-
doc.html
访问
http://localhost:8090/doc.html#/home登陆,然后还需要修改这个地方,改为实际地址的前缀
二、REST API介绍
1、Camunda API介绍
中心起点是 ProcessEngine,可以通过配置部分中描述的几种方式创建。从 ProcessEngine,您可以获取包含工作流/BPM 方法的各种服务。ProcessEngine 和服务对象是线程安全的。因此,您可以为整个服务器保留对其中一个的引用。
ProcessEngines.getDefaultProcessEngine()将在第一次调用时初始化并构建流程引擎,之后始终返回相同的流程引擎。可以使用 和 正确创建和关闭所有流程ProcessEngines.init()引擎ProcessEngines.destroy()。
创建流程引擎的时候我们要知道一点,所有流程引擎服务都是无状态的。这意味着您可以轻松地在集群中的多个节点上运行 Camunda 7,每个节点都访问同一个数据库,而不必担心哪台机器实际执行了之前的调用。对任何服务的任何调用都是幂等的,无论它在何处执行。
下面就是我们流程引擎内部的api service,这些service都注入到bean容器里面去了,我们可以直接跟其他的接口一样,使用spring的方式在使用时直接引入
常用介绍:
RepositoryService
:RepositoryService是你与Camunda引擎交互的第一个切入点。它主要用于管理流程定义的部署,包括上传流程定义文件(如BPMN文件)到引擎中。- 部署和管理流程定义
- 查询已部署的流程定义和部署信息
- 挂起和激活流程定义,控制其是否可以被启动
- 检索流程定义中的文件和流程图。
RuntimeService
:RuntimeService是用于在流程执行期间与引擎交互的服务。它允许启动流程实例,并且可以查询正在执行的流程实例状态- 启动流程实例
- 存储和检索流程实例的变量。
- 查询正在执行的流程实例和执行实例(指向流程实例当前位置的“令牌”)
- 处理流程实例的外部触发。
TaskService
:TaskService专注于管理流程中的任务,特别是那些需要人为干预的任务。- 查询分配给用户的任务。
- 创建新的任务,这些任务可以独立于任何流程实例。
- 分配任务给用户或组。
- 认领和完成任务。
IdentityService
:IdentityService提供了管理用户和组的功能,但请注意,核心引擎并不会在运行时验证用户身份。- 创建、更新、删除和查询用户和组。
- 尽管可以将任务分配给任何用户,但实际的身份验证和授权需在应用层实现。
FormService
:FormService是可选的,它支持流程中的表单功能,比如启动流程前展示的表单或任务完成时所需的表单。- 管理和渲染开始表单和任务表单。
- 表单数据与流程变量的交互。
HistoryService
:HistoryService提供了访问流程执行历史记录的功能。- 查询流程实例的历史数据,如开始时间、执行用户、任务耗时等
- 数据持久化级别可配置
FilterService
:FilterService允许创建和管理过滤器,用于简化常见的查询需求- 创建存储的查询,如任务查询。
- Tasklist应用使用过滤器来筛选任务。
ExternalTaskService
:ExternalTaskService专门处理外部任务,即在流程引擎之外执行的工作项。- 提供对流程外部任务的访问和管理
- 支持异步处理模式下的任务领取和完成。
2、常用API详细使用
2.1、 RepositoryService
下面的查询接口我们要知道一点,如ProcessDefinition
这个返回出来的实际是使用多态,实际的实体对象会是ProcessDefinitionEntity
,Camunda中全部的api返回都是这个格式,要查看实体对象则需要加Entity
。
// 管理流程定义相关的api@Autowiredprivate RepositoryService repositoryService;/*** 流程部署*/@Testvoid testRepositoryService(){// 添加流程/** 表示把test.bpmn作为流程部署到数据库设置name为test** */// Deployment deployment = repositoryService.createDeployment() //添加流程部署记录 ACT_RE_DEPLOYMENT// .name("test") //name// .addClasspathResource("test.bpmn") //文件地址// .deploy(); //添加流程定义 实际数据 ACT_RE_PROCDEF// 查询 流程部署 数据执行器 ACT_RE_PROCDEFProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();// 返回全部数据List<ProcessDefinition> processDefinitionList = processDefinitionQuery.list();processDefinitionList.forEach(it-> System.out.println(it.getName()));// 根据key查询返回符合的流程定义列表(每一个版本算一条记录)List<ProcessDefinition> processDefinitionList2 = processDefinitionQuery.processDefinitionKey("shopping").list();// 根据流程name查询,并且按照版本号查询最新的数据ProcessDefinition processDefinition = processDefinitionQuery.processDefinitionName("shopping").latestVersion().singleResult();// 查询 流程定义 数据执行器 ACT_RE_DEPLOYMENTDeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();List<Deployment> deploymentList = deploymentQuery.list();List<Resource> resourceList = repositoryService.getDeploymentResources("036d2809-b795-11ef-9e74-46c5fd5dfd3a");System.out.println(resourceList);List<CaseDefinition> caseDefinitionList = repositoryService.createCaseDefinitionQuery().list();System.out.println(caseDefinitionList);// 查询ACT_RE_DECISION_DEFList<DecisionDefinition> decisionDefinitionList = repositoryService.createDecisionDefinitionQuery().list();System.out.println(decisionDefinitionList);List<DecisionRequirementsDefinition> decisionRequirementsDefinitionList = repositoryService.createDecisionRequirementsDefinitionQuery().list();System.out.println(decisionRequirementsDefinitionList); 根据流程定义删除数据// repositoryService.deleteDeployment("WorkOrderProcess:4:3659eb47-b794-11ef-9e74-46c5fd5dfd3a",true);// 根据流程部署id删除数据// repositoryService.deleteProcessDefinition("db155b13-b793-11ef-9e74-46c5fd5dfd3a");}
2.2、TaskService
// 查询流程中的任务相关的api@Autowiredprivate TaskService taskService;/*** 任务查询*/@Testvoid testTaskService() {taskService.createTaskQuery();// Java 对象查询 数据执行器 ACT_RU_TASKTaskQuery taskQuery = taskService.createTaskQuery();List<Task> taskList1 = taskQuery.list();taskList1.forEach(task -> System.out.println(task.getName()));// 根据用户查询代办任务List<Task> taskList2 = taskQuery.taskAssignee("admin").list();System.out.println(taskList2);// Native sql 查询 数据执行器NativeTaskQuery nativeTaskQuery = taskService.createNativeTaskQuery();List<Task> taskList3 = nativeTaskQuery.sql("SELECT * from ACT_RU_TASK").list();taskList3.forEach(task -> System.out.println(task.getName()));taskList3.forEach(task -> System.out.println(task.getName()));}
2.3、RuntimeService
// 管理流程实例相关的api@Autowiredprivate RuntimeService runtimeService;@Testvoid testRuntimeService(){// 查询 (执行在流程上的每一种结果) Execution可以代表这个执行过程中的某一个分支或上下文List<Execution> executionList = runtimeService.createExecutionQuery().list();System.out.println(executionList);// 获取查询流程实例 ProcessInstance表示整个流程的一次完整执行List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().list();// 查询当前正在活动的任务ActivityInstance activityInstance = runtimeService.getActivityInstance("86f6ef7d-b935-11ef-8a29-46c5fd5dfd3a");System.out.println(activityInstance);// 根据任务id查询任务参数Map<String, Object> variables = runtimeService.getVariables("86f6ef7d-b935-11ef-8a29-46c5fd5dfd3a");}
3、REAT API介绍使用
很多时候我们在开发的项目过程中不想和工作流引擎过于紧密,我们通常可能需要做到解耦合。在其他的服务通过调用camunda的Open API的方式去获取工作流中的相关数据,这时候我们就需要了解常用到的API接口,这时候我们可能需要获取到对应的接口的实体接收类,但又不想添加工作流引擎的依赖,这时候我们需要添加两个依赖。
3.1、依赖
添加这两个依赖,这两个依赖主要是一些实体类和API接口的相关参数
<!-- 实体对象--><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-spring-6</artifactId><version>7.20.0</version></dependency><!-- open api接口以及相关的DTO对象--><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-rest-core-jakarta</artifactId><version>7.20.0</version></dependency>
3.2、REST API接口介绍
我们打开camunda-engine-rest-core-jakarta
依赖的sub
包下的对应的这些文件夹是不是很熟悉,是的这些文件夹就是对应的Camunda API中的service名字。
分别对应着task、runtime、repository、management、identity、history
六个service,每个service的具体的介绍就看上面就行。
3.2.1、接口介绍
这里介绍一下task,可以看到不同的接口文件分别是表示一个分类。对应着task相关的接口。可以看到这里的一个类对应着swagger 中接口文档的一个类
- TaskResource
文件中的TaskResource类就是对应的swagger的task,@GET注解表示请求方式,@Path表示路径,@Path表示拼接的路径后缀。
- TaskAttachmentResource
这个就可以很明显看到他们的区别
3.2.2、接口组成
以这个接口举例
http://localhost:8080/engine-rest/task/47398c44-bab7-11ef-81ba-024191f3177f/form
- http://localhost:8080/engine-rest:是服务和统一的路径,不用管
- task:表示这个类名的前缀
- 47398c44-bab7-11ef-81ba-024191f3177f:{id}是我们传入的路径参数,还没到接口的位置就被解析了,所以在这个位置没有参数
- form:表示接口的路径
所以我们接收的参数就是FormDto
对象,一般可以直接使用,有部分是内部还包裹着的类属性就不能直接使用,需要做自己去声明对应的属性。
相关文章:
【2025】camunda API接口介绍以及REST接口使用(3)
前言 在前面的两篇文章我们介绍了Camunda的web端和camunda-modeler的使用。这篇文章主要介绍camunda结合springboot进行使用,以及相关api介绍。 该专栏主要为介绍camunda的学习和使用 🍅【2024】Camunda常用功能基本详细介绍和使用-下(1&…...
35.Word:公积金管理中心文员小谢【37】
目录 Word1.docx Word2.docx Word2.docx 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列:格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…...
关于使用numpy进行数据解析性能优化的几点认识
前言:数据解析的性能严重影响用户体验,针对需要批量处理的数据,考虑使用numpy自定义矢量化计算函数提升数据解析的性能。下面的表述都是网上查找的资料,仅供大家参考,具体情况还是需要具体分析的。 1. 使用numpy自定义…...
扣子平台的选择器节点:让智能体开发更简单,扣子免费系列教程(17)
欢迎来到涛涛聊AI。今天,我们来聊聊一个非常实用的工具——扣子平台的选择器节点。即使你不是计算机专业人员,但对计算机操作比较熟悉,这篇文章也能帮你快速上手。我们会从基础知识讲起,一步步带你了解选择器节点的使用方法和应用…...
java s7接收Byte字节,接收word转16位二进制
1图: 2.图: try {List list getNameList();//接收base64S7Connector s7Connector S7ConnectorFactory.buildTCPConnector().withHost("192.168.46.52").withPort(102).withTimeout(1000) //连接超时时间.withRack(0).withSlot(3).build()…...
学习日记250205
一.论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 二、计划: 理一下微调相关的文章 三. )——( 明天认真学习了,不能再打这么久的星露谷了!!࿰…...
位置-速度双闭环PID控制详解与C语言实现
目录 概述 1 控制架构解析 1.1 级联控制结构 1.2 性能对比 2 数学模型 2.1 位置环(外环) 2.2 速度环(内环) 3 C语言完整实现 3.1 控制结构体定义 3.2 初始化函数 3.3 双环计算函数 4 参数整定指南 4.1 整定步骤 4.2 典型参数范围 5 关键优化技术 5.1 速度前馈 …...
21.2.1 基本操作
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 Excel的基本操作步骤: 1、打开Excel:定义了一个Application对象: Microsoft.Office.Interop.E…...
Python-基于PyQt5,Pillow,pathilb,imageio,moviepy,sys的GIF(动图)制作工具
前言:在抖音,快手等社交平台上,我们常常见到各种各样的GIF动画。在各大评论区里面,GIF图片以其短小精悍、生动有趣的特点,被广泛用于分享各种有趣的场景、搞笑的瞬间、精彩的动作等,能够快速吸引我们的注意…...
c++ stl 遍历算法和查找算法
概述: 算法主要由头文件<algorithm> <functional> <numeric> 提供 <algorithm> 是所有 STL 头文件中最大的一个,提供了超过 90 个支持各种各样算法的函数,包括排序、合并、搜索、去重、分解、遍历、数值交换、拷贝和…...
Java学习进阶路线
Java基础 Java Web 前端HTML/css/js,J2EE(Servlet/jsp),数据库(Mysql/oracle) Java开发框架 Spring MVC/Mybatis/Herbernate/maven 《Java编程思想》 深入了解java基础 Java设计模式 《Effective j…...
探寻系统响应的奥秘:为何常用以 e 为底的指数组合表示
一、引言 在工程与科学领域的系统分析中,常常会发现系统响应多以 e e e 为底的指数组合来表示。从电路系统里的电流电压变化,到机械系统的振动情况,再到控制系统的动态特性,这种表示方法无处不在。那么,究竟是什么原…...
java 进阶教程_Java进阶教程 第2版
第2版前言 第1版前言 语言基础篇 第1章 Java语言概述 1.1 Java语言简介 1.1.1 Java语言的发展历程 1.1.2 Java的版本历史 1.1.3 Java语言与C/C 1.1.4 Java的特点 1.2 JDK和Java开发环境及工作原理 1.2.1 JDK 1.2.2 Java开发环境 1.2.3 Java工作原理 1.…...
Ext文件系统
文件内容属性 被打开的文件在内存中,没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘(硬件) 磁盘的存储结构 磁头在传动臂的运动下共同进退,向磁盘写入的时候是向柱面批量写入的 OS文件系统访…...
C++滑动窗口技术深度解析:核心原理、高效实现与高阶应用实践
目录 一、滑动窗口的核心原理 二、滑动窗口的两种类型 1. 固定大小的窗口 2. 可变大小的窗口 三、实现细节与关键点 1. 窗口的初始化 2. 窗口的移动策略 3. 结果的更新时机 四、经典问题与代码示例 示例 1:和 ≥ target 的最短子数组(可变窗口…...
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…...
【加餐】使⽤指针实现链表
【加餐】使⽤指针实现链表 面向过程方式和面向对象方式(把面向过程的封装一下就行了)是两种不同的编程方法论...
用 Python 绘制爱心形状的简单教程
1. 引言 在本教程中,我们将学习如何使用 Python 和 Matplotlib 库来绘制一个简单的爱心形状。这是一个有趣且简单的项目,适合初学者练习图形绘制和数据可视化。 2. 环境准备 首先,确保您的系统上安装了 Python 和 Matplotlib 库。如果还未…...
DeepSeek安装
安装运行环境 https://ollama.com/ 安装验证 cmd指令 ollama -v 安装运行模型 https://ollama.com/library/deepseek-r1:14b-qwen-distill-q4_K_M 例如: ollama run deepseek-r1:1.5b-qwen-distill-q4_K_M 结果 再次使用时,直接cmd运行上一步的ru…...
Git--使用教程
Git的框架讲解 Git 是一个分布式版本控制系统,其架构设计旨在高效地管理代码版本,支持分布式协作,并确保数据的完整性和安全性。 Git 的核心组件: 工作区(Working Directory): - 作区是你在本…...
【HTML性能优化】提升网站加载速度:GZIP、懒加载与资源合并
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
C#从XmlDocument提取完整字符串
方法1:通过XmlDocument的OuterXml属性,见XmlDocument类 该方法获得的xml字符串是不带格式的,可读性差 方法2:利用XmlWriterSettings控制格式等一系列参数,见XmlWriterSettings类 例子: using System.IO; …...
wordpress每隔24小时 随机推荐一个指定分类下的置顶内容。
在WordPress中实现每隔24小时随机推荐一个指定分类下的置顶内容,可以通过以下步骤实现: 1. 创建自定义函数 在主题的functions.php文件中添加以下代码,用于创建一个定时任务,每隔24小时随机选择一个置顶文章并存储到选项中&…...
《chatwise:DeepSeek的界面部署》
ChatWise:DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现,再到测试与优化,全面阐述了整个部署过程中的关键步骤和解决方案。通过本文,读者可以深入了解DeepSee…...
HTTP请求响应周期步骤
一个典型的 HTTP 请求/响应周期 从建立连接开始,经过客户端向服务器发送请求、服务器处理请求并返回响应,最终关闭连接。这个过程可以分为多个阶段,以下是详细的步骤: 一、建立连接(TCP连接) 客户端发起连接请求:在HTTP通信中,客户端通常是浏览器,首先通过 DNS 查询…...
synchronized, volatile 在 DCL 的作用
背景 最近在看设计模式,在单例模式的 Double Check Lock(DCL)中,存在两个关键字:volatile & synchronized。 之前都知道 DCL 怎么写,直接套娃。但是这两关键字在单例里面的作用还没深究过,…...
Java进阶笔记(中级)
-----接Java进阶笔记(初级)----- 目录 集合多线程 集合 ArrayList 可以通过List来接收ArrayList对象(因为ArrayList实现了List接口) 方法:接口名 柄名 new 实现了接口的类(); PS: List list new ArrayList();遍历…...
人生总有终点,不必好高骛远
夕阳西下,我漫步在河堤上。河水缓缓流淌,倒映着天边最后一抹晚霞。岸边垂柳依依,枝条轻拂水面,荡起一圈圈涟漪。这涟漪由近及远,渐渐消散在暮色中,如同我们每个人在时间长河中泛起的微澜。 记得年少时&…...
C#中堆和栈的区别
C#中的堆(Heap)和栈(Stack)详解 基本概念 栈(Stack) 栈是一个后进先出(LIFO)的内存结构由系统自动分配和释放存储空间连续,大小固定主要用于存储值类型和对象引用 堆…...
如何利用i18n实现国际化
1.首先新建i18.js文件 // i18n配置 import { createI18n } from vue-i18n // import ElementPlus from element-plus import zhCn from element-plus/es/locale/lang/zh-cn import zh from ./zh-cn import en from ./en import ru from ./ru const messages {en_US: {...en,//…...
SpringMVC响应
第一章:数据处理及跳转 1. 结果跳转方式 ①.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . <bean id"templateResolver" class"org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolv…...
深入理解特征值与稳定性密码:以弹簧 - 质量 - 阻尼典型二阶系统为例
从看特征值决定稳定性的原因 摘要 本文以弹簧 - 质量 - 阻尼系统这一典型二阶系统为研究对象,深入剖析特征值决定系统稳定性的内在原因。通过详细的数学推导和直观的物理意义阐释,全面揭示了特征值与系统稳定性之间的紧密关联,为理解和分析…...
python pandas 读取合并单元格并保留合并信息
读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题:合并单元格的信息将会丢失,从而导致我们的数据出现重复或缺失的情况。 在本篇文章中将介绍使用 pandas 正确地读…...
Go-Gin Web 框架完整教程
1. 环境准备 1.1 Go 环境安装 Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开发。在开始使用 Gin 框架之前,我们需要先安装 Go 环境。 安装步骤: 访问 Go 官网下载页面:https://golang.org/dl…...
机器学习专业毕设选题推荐合集 人工智能
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...
Java程序员 面试如何介绍项目经验?
项目经历是面试过程中重点问的,但是很多人在回答的时候往往会有问题: 重点是介绍项目,而忽略了个人的经历。 经历是你做了什么、你怎么做的、做完后的结果。例如:项目中的哪些部分是你做的?你是不是核心人员…...
YONBIP后端环境搭建-IDEA
1、IDEA环境搭建 1.1、插件安装 打开设置窗口,添加自定义插件存储库路径。 https://nccdev.yonyou.com/ide/idea/latest/updatePlugin.xml 在 Marketplace 中搜索 YonBuilder Premium开发者工具 ,点击安装。 1.2、Home配置 点击Home配置按钮…...
Java 微服务实用指南(一)
Java 微服务:基础 要真正理解 Java 微服务,就必须从最基本的东西开始:为人诟病的 Java 大型单体应用是什么,它的优点和缺点是什么。 什么是 Java 大型单体应用? 假设你正在为一家银行或一家金融科技初创公司工作。你为…...
Windows图形界面(GUI)-QT-C/C++ - QT Frame
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 分隔内容区域 2. 装饰性边框 3. 自定义控件容器 三、常见样式 1. 框架形状(Shape) 2. 框架阴影(Shadow)…...
优选算法合集————双指针(专题二)
好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …...
WebSocket协议里客户端发送给服务器的数据会用4字节的掩码循环异或的分析
首先,我需要回顾WebSocket协议中对掩码处理的具体要求。根据RFC 6455,客户端发送到服务器的帧必须使用掩码,而服务器发送的帧不需要掩码。掩码是4字节的,应用于有效载荷数据,每个字节依次与掩码的对应字节异或…...
【字节青训营-9】:初探字节微服务框架 Hertz 基础使用及进阶(下)
本文目录 一、Hertz中间件Recovery二、Hertz中间件跨资源共享三、Hertz 响应四、Hertz请求五、Hertz中间件Session 一、Hertz中间件Recovery Recovery中间件是Hertz框架预置的中间件,使用server.Default()可以默认注册该中间件,为Hertz框架提供panic回复…...
新版AndroidStudio 修改 jdk版本
一、问题 之前,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 如下图可以在这修改JDK: 但是升级AndroidStudio之后,比如我升级到了Android Stu…...
cocos spine执行动画报错Cannot read properties of null (reading ‘data‘)
cocos v3.8.3 当想this.spine.setAnimation(0, "action1", false);播放spine动画时报错↓ 解决方法一: 在setAnimation之前调用this.spine.__preload() 解决方法二: 不要让spine或其父节点通过active显隐...
笔记:新能源汽车零部件功率级测试怎么进行?
摘要:本文旨在梳理主机厂对新能源汽车核心零部件功率级测试需求,通过试验室的主流设备仪器集成,快速实现试验方案搭建,并体现测试测量方案的时效性、便捷性优势。目标是通过提升实现设备的有效集成能力、实现多设备测试过程的有效协同、流程化测试,可快速采集、分析当前数…...
【starrocks学习】之将starrocks表同步到hive
目录 方法 1:通过HDFS导出数据 1. 将StarRocks表数据导出到HDFS 2. 在Hive中创建外部表 3. 验证数据 方法 2:使用Apache Spark同步 1. 添加StarRocks和Hive的依赖 2. 使用Spark读取StarRocks数据并写入Hive 3. 验证数据 方法 3:通过…...
Linux提权--SUDO提权
sudo 是 Linux 中常用的特权管理工具,允许普通用户以其他用户(通常是 root 用户)的身份运行命令。如果配置不当,攻击者可能通过滥用 sudo 权限来提升自己的权限。 一.常见的 sudo 提权方法: 误配置的 sudo 权限&…...
【AIGC提示词系统】基于 DeepSeek R1 + Claude 的新年运势占卜系统设计与实现
提示词在最下方 DeepSeek R1调试了整体的提示词,使用Claude进行渲染 引言 在人工智能与传统文化交融的今天,如何让 AI 充分理解并传递东方玄学文化的精髓,成为一个极具挑战性的课题。本文将详细介绍一个基于 Claude 的新年运势占卜系统的设计…...
11. Global Object 全局对象的使用
Global Object 全局对象 1 引言2 制作全局对象3 调用全局对象4 扩展使用1 引言 全局对象适用于大量重复的对象,比如阀门,电机等,如果这些设备的基本逻辑与状态都是一样的,那么就可以使用全局对象的方法来做HMI,省时省力。并且在后期修改的时候只需要修改全局对象即可。 …...
Java synchronized锁升级
偏向锁、轻量级锁和重量级锁是Java中synchronized关键字的三种锁状态,用于优化多线程环境下的性能。以下是它们的简要说明: 1. 偏向锁(Biased Locking) 目的:减少无竞争时的锁开销。适用场景:只有一个线程…...