Spring Boot 集成 Flowable 7.1.0 完整教程

一、引言

在企業級應用開發中,工作流管理是不可或缺的一部分。從簡單的請假審批到復雜的業務流程,工作流引擎能夠顯著提升系統的靈活性和可維護性。??Flowable?? 作為一個輕量級、基于 Java 的開源工作流引擎,完美支持 ??BPMN 2.0?? 標準,廣泛應用于各類業務流程管理場景。

??Spring Boot?? 憑借其快速開發、自動配置等特性,已成為現代 Java 開發的主流框架。將 ??Spring Boot 3?? 與 ??Flowable 7.1.0?? 集成,不僅能夠快速構建功能強大的工作流應用,還能極大地簡化開發流程,提高開發效率。

本教程將從環境準備、依賴配置、數據庫設置、流程引擎初始化、流程設計與部署、流程運行與監控等多個方面,詳細介紹如何將 Spring Boot 3 與 Flowable 7.1.0 進行深度集成,幫助開發者快速上手并構建專業級的工作流系統。

二、環境準備

在開始集成之前,確保您的開發環境滿足以下要求:

  • ??JDK??: 推薦使用 JDK 17 或更高版本(本教程以 JDK 21 為例)
  • ??IDE??: IntelliJ IDEA、Eclipse 等主流 Java IDE
  • ??構建工具??: Maven 或 Gradle(本教程以 Maven 為例)
  • ??數據庫??: MySQL 8.0(也可根據需要選擇其他支持的數據庫)
  • ??Flowable 版本??: 7.1.0
  • ??Spring Boot 版本??: 3.4.1(根據實際情況選擇)

三、創建 Spring Boot 項目

您可以使用 Spring Initializr 快速創建一個新的 Spring Boot 項目,或者手動創建一個 Maven 項目。以下是主要步驟:

1. 使用 Spring Initializr 創建項目

  1. 訪問 Spring Initializr
  2. 配置項目基本信息:
    • ??Project??: Maven Project
    • ??Language??: Java
    • ??Spring Boot??: 3.4.1(根據最新版本選擇)
    • ??Group??: com.example(根據實際情況修改)
    • ??Artifact??: flowable-demo(根據實際情況修改)
    • ??Name??: flowable-demo
    • ??Package name??: com.example.flowabledemo
    • ??Packaging??: Jar
    • ??Java??: 21
  3. 添加依賴:
    • ??Spring Web??
    • ??Spring Data JPA??(可選,根據需要)
    • ??MySQL Driver??
    • ??Spring Security??(可選,根據需要)
  4. 生成并下載項目,導入到您的 IDE 中。

2. 手動創建 Maven 項目

如果您選擇手動創建 Maven 項目,確保 pom.xml 包含以下基本配置:

<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 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>flowable-demo</artifactId><version>1.0.0</version><packaging>jar</packaging><name>Flowable Demo</name><properties><java.version>21</java.version><spring-boot.version>3.4.1</spring-boot.version><flowable.version>7.1.0</flowable.version></properties><dependencies><!-- 待添加 --></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version></plugin></plugins></build>
</project>

四、添加依賴

pom.xml 中添加 Spring Boot 和 Flowable 7.1.0 所需的依賴。以下是一個完整的依賴配置示例:

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Data JPA (可選,根據需要) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- MySQL 驅動 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- Flowable Spring Boot Starter --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>${flowable.version}</version></dependency><!-- Spring Boot Starter Security (可選,根據需要) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- Lombok (可選,簡化代碼) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 其他依賴根據需要添加 -->
</dependencies>

??說明:??

  • ??flowable-spring-boot-starter??: 這是 Flowable 提供的 Spring Boot 啟動器,包含了集成所需的核心依賴。
  • ??spring-boot-starter-security??: 如果您的應用需要權限控制,可以添加此依賴。
  • ??Lombok??: 可選,用于簡化 Java 類的代碼,如自動生成 Getter、Setter 等。

確保在 <properties> 中定義了 Flowable 和 Spring Boot 的版本:

<properties><java.version>21</java.version><spring-boot.version>3.4.1</spring-boot.version><flowable.version>7.1.0</flowable.version>
</properties>

五、配置數據庫與 Flowable

1. 配置 application.yml

src/main/resources/application.yml 中配置數據源和 Flowable 相關參數。以下是一個基于 MySQL 的配置示例:

server:port: 8080spring:datasource:url: jdbc:mysql://localhost:3306/flowable_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: your_password  # 替換為您的 MySQL 密碼driver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSource  # 推薦使用 HikariCP 作為連接池jpa:hibernate:ddl-auto: none  # 根據需要配置,通常 Flowable 會自行管理其表show-sql: trueproperties:hibernate:dialect: org.hibernate.dialect.MySQLDialectflowable:async-executor-activate: false  # 開發階段建議關閉異步執行器database-schema-update: true  # 啟動時自動創建或更新數據庫表,生產環境建議設置為 falsehistory-level: audit  # 歷史記錄級別,可選:none, activity, audit, full# process-definition-location-prefix: classpath:/processes/  # 流程定義文件存放路徑,根據需要配置

??配置說明:??

  • ??server.port??: 應用啟動端口,可以根據需要修改。
  • ??spring.datasource??: 配置 MySQL 數據源,確保數據庫 flowable_db 已存在,或者 Flowable 能夠自動創建(根據數據庫權限)。
    • ??url??: 數據庫連接地址,確保數據庫名稱(如 flowable_db)正確。
    • ??username?? 和 ??password??: 數據庫用戶名和密碼。
    • ??driver-class-name??: MySQL JDBC 驅動類名。
    • ??type??: 推薦使用 HikariCP 作為連接池,性能更優。
  • ??spring.jpa??: 配置 JPA 相關參數。
    • ??hibernate.ddl-auto??: 設置為 none,避免與 Flowable 的表管理沖突。Flowable 會自行管理其數據庫表。
    • ??show-sql??: 設置為 true,方便調試時查看生成的 SQL 語句。
    • ??properties.hibernate.dialect??: 設置 Hibernate 方言為 MySQL。
  • ??flowable??:
    • ??async-executor-activate??: 開發階段建議設置為 false,避免不必要的異步任務。生產環境可根據需要啟用。
    • ??database-schema-update??: 設置為 true,應用啟動時會自動創建或更新 Flowable 所需的數據庫表。??生產環境強烈建議設置為 false,并通過數據庫遷移工具(如 Flyway 或 Liquibase)管理數據庫 schema。??
    • ??history-level??: 設置歷史記錄級別,audit 級別會記錄較詳細的歷史信息,根據需求可選擇 none, activity, audit, full
    • ??process-definition-location-prefix??: 如果您將 BPMN 流程定義文件存放在特定目錄(如 classpath:/processes/),可以在此配置,Flowable 啟動時會自動部署這些流程定義。

2. 數據庫準備

確保您已經安裝并運行了 MySQL 數據庫,并創建了用于 Flowable 的數據庫。例如,創建名為 flowable_db 的數據庫:

CREATE DATABASE flowable_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

??注意:?? 根據您的配置,確保數據庫名稱、用戶名和密碼與 application.yml 中的配置一致。

六、配置 Flowable

Spring Boot 與 Flowable 的集成主要通過自動配置完成,但您也可以根據需要進行自定義配置。

1. 自動配置

引入 flowable-spring-boot-starter 后,Spring Boot 會自動配置 Flowable 的核心 Bean,包括 ProcessEngineRuntimeServiceTaskServiceRepositoryServiceHistoryService 等。您無需手動配置這些 Bean,除非有特殊需求。

2. 自定義 Flowable 配置(可選)

如果需要自定義 Flowable 的配置,可以創建一個配置類實現 ProcessEngineConfigurationConfigurer 接口。例如,配置郵件服務器或自定義表單類型。

package com.example.flowabledemo.config;import org.flowable.common.engine.api.delegate.Expression;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.form.api.FormEngine;
import org.flowable.form.api.FormRepositoryService;
import org.flowable.form.api.FormService;
import org.flowable.mail.api.MailEngine;
import org.springframework.context.annotation.Configuration;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;@Configuration
public class FlowableConfig implements ProcessEngineConfigurationConfigurer {@Overridepublic void configure(SpringProcessEngineConfiguration configuration) {// 示例:配置郵件服務器(根據需要)/*configuration.setMailServerHost("smtp.example.com");configuration.setMailServerPort(587);configuration.setMailServerUsername("notifications@example.com");configuration.setMailServerPassword("password");configuration.setMailServerDefaultFrom("notifications@example.com");*/// 示例:配置自定義表單類型(根據需要)/*List<FormEngine> customFormEngines = new ArrayList<>();// 添加自定義 FormEngineconfiguration.setCustomFormEngines(customFormEngines);List<FormType> customFormTypes = new ArrayList<>();// 添加自定義 FormTypeconfiguration.setCustomFormTypes(customFormTypes);*/// 其他自定義配置}
}

??說明:??

  • 通過實現 ProcessEngineConfigurationConfigurer 接口,您可以在 Flowable 初始化時自定義其配置。
  • 上述示例中注釋掉了郵件服務器和自定義表單類型的配置,您可以根據實際需求進行配置。

七、流程設計與部署

1. 使用 Flowable Modeler 設計流程

??Flowable Modeler?? 是 Flowable 提供的可視化流程設計工具,您可以通過它設計 BPMN 2.0 流程定義。

1.1 部署 Flowable Modeler

Flowable Modeler 通常作為一個獨立的服務運行。您可以通過 Docker 快速部署 Flowable Modeler:

docker run -d -p 9096:8080 --name flowable-modeler \-e FLOWABLE_COMMON_APP_IDM-URL=http://localhost:8080/flowable-idm \-e FLOWABLE_COMMON_APP_IDM-REDIRECT-ON-ERROR=true \flowable/flowable-modeler:7.1.0

??說明:??

  • 上述命令將 Flowable Modeler 部署在 http://localhost:9096
  • 您需要根據實際情況配置 IDM(身份管理)服務的 URL,如果使用獨立的 Flowable IDM,確保其運行并配置正確。

??注意:?? 本教程重點在于 Spring Boot 與 Flowable 的集成,若您不需要使用 Flowable Modeler 的圖形化設計功能,可以直接在項目中編寫 BPMN 文件。

1.2 使用獨立 Modeler 服務(可選)

如果您選擇使用獨立的 Flowable Modeler 服務,可以按照以下步驟操作:

  1. ??下載并部署 Flowable Modeler??:

    • 訪問 Flowable 官方 Docker 鏡像 或 Flowable 官方文檔 獲取最新的 Modeler 鏡像。
    • 使用 Docker 運行 Modeler,如上所示。
  2. ??配置跨域與數據庫??:

    • 確保 Modeler 服務與您的 Spring Boot 應用使用相同的數據庫,或者根據需要進行配置。
    • 配置跨域支持,以便前端能夠與后端服務通信。

??注意:?? 為了簡化流程,本教程將重點放在直接在 Spring Boot 項目中管理和部署 BPMN 文件。

2. 在項目中管理 BPMN 文件

您可以直接在 Spring Boot 項目的 src/main/resources/processes 目錄下存放 BPMN 2.0 文件,Flowable 啟動時會自動部署這些流程定義。

2.1 創建流程目錄

src/main/resources 下創建一個 processes 目錄,用于存放 BPMN 文件。

src
└── main└── resources└── processes└── leave-process.bpmn20.xml
2.2 編寫 BPMN 文件

以下是一個簡單的請假流程 (leave-process.bpmn20.xml) 示例:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"xmlns:flowable="http://flowable.org/bpmn"targetNamespace="http://flowable.org/examples"><process id="leaveProcess" name="Leave Process" isExecutable="true"><startEvent id="startEvent" /><sequenceFlow id="flow1" sourceRef="startEvent" targetRef="approveTask" /><userTask id="approveTask" name="Approve Leave" flowable:assignee="${assignee}" /><sequenceFlow id="flow2" sourceRef="approveTask" targetRef="endEvent" /><endEvent id="endEvent" /></process></definitions>

??說明:??

  • 這是一個非常簡單的請假流程,包含一個開始事件、一個用戶任務(審批任務)和一個結束事件。
  • flowable:assignee="${assignee}" 表示任務的辦理人通過流程變量 assignee 動態指定。

??注意:?? 您可以根據實際業務需求設計更復雜的流程,包括網關、多個任務、事件等。

八、創建 Spring Boot 應用主類

確保您的 Spring Boot 應用有一個主類,用于啟動應用。例如:

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

九、流程運行與操作

1. 自動部署流程

當您在 src/main/resources/processes 目錄下放置 BPMN 文件并啟動 Spring Boot 應用時,Flowable 會自動掃描并部署這些流程定義。

??驗證流程部署:??

您可以通過訪問 Flowable 提供的 REST API 或編寫簡單的測試控制器來驗證流程是否已成功部署。

2. 編寫流程操作控制器

為了與流程引擎交互,您可以編寫一個 REST 控制器,提供啟動流程、完成任務等接口。

2.1 添加依賴(如果尚未添加)

確保您的項目中包含 Spring Web 依賴,以支持 REST API。

2.2 創建流程服務類

首先,創建一個服務類,用于封裝與 Flowable 引擎的交互邏輯。

package com.example.flowabledemo.service;import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.Map;@Service
public class FlowableService {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;/*** 啟動流程實例* @param processDefinitionKey 流程定義 Key,對應 BPMN 中的 process id* @param variables 流程變量* @return 啟動的流程實例 ID*/public String startProcess(String processDefinitionKey, Map<String, Object> variables) {ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);return processInstance.getId();}/*** 查詢用戶的待辦任務* @param assignee 辦理人* @return 待辦任務列表*/public List<Task> getTasksByAssignee(String assignee) {return taskService.createTaskQuery().taskAssignee(assignee).list();}/*** 完成任務* @param taskId 任務 ID* @param variables 任務變量*/public void completeTask(String taskId, Map<String, Object> variables) {taskService.complete(taskId, variables);}
}
2.3 創建 REST 控制器

接下來,創建一個 REST 控制器,暴露啟動流程和完成任務的接口。

package com.example.flowabledemo.controller;import com.example.flowabledemo.service.FlowableService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/api/flowable")
public class FlowableController {@Autowiredprivate FlowableService flowableService;/*** 啟動請假流程* @param assignee 辦理人* @return 流程實例 ID*/@PostMapping("/startLeaveProcess")public Map<String, String> startLeaveProcess(@RequestParam String assignee) {Map<String, Object> variables = new HashMap<>();variables.put("assignee", assignee);String processInstanceId = flowableService.startProcess("leaveProcess", variables);Map<String, String> response = new HashMap<>();response.put("processInstanceId", processInstanceId);return response;}/*** 獲取指定辦理人的待辦任務* @param assignee 辦理人* @return 待辦任務列表*/@GetMapping("/tasks")public List<?> getTasks(@RequestParam String assignee) {return flowableService.getTasksByAssignee(assignee);}/*** 完成任務* @param taskId 任務 ID* @param approved 是否批準(示例變量)* @return 操作結果*/@PostMapping("/completeTask")public Map<String, String> completeTask(@RequestParam String taskId, @RequestParam boolean approved) {Map<String, Object> variables = new HashMap<>();variables.put("approved", approved);flowableService.completeTask(taskId, variables);Map<String, String> response = new HashMap<>();response.put("message", "任務已完成");return response;}
}

??API 說明:??

  1. ??啟動請假流程??

    • ??URL??: POST /api/flowable/startLeaveProcess?assignee=用戶名
    • ??描述??: 啟動一個請假流程實例,并指定任務的辦理人。
    • ??示例請求??:
      curl -X POST "http://localhost:8080/api/flowable/startLeaveProcess?assignee=user1"
    • ??響應??:
      {"processInstanceId": "12345"
      }
  2. ??獲取待辦任務??

    • ??URL??: GET /api/flowable/tasks?assignee=用戶名
    • ??描述??: 查詢指定辦理人的待辦任務列表。
    • ??示例請求??:
      curl "http://localhost:8080/api/flowable/tasks?assignee=user1"
    • ??響應??:
      [{"id": "task1","name": "Approve Leave","assignee": "user1","created": "...","dueDate": "...",...}
      ]
  3. ??完成任務??

    • ??URL??: POST /api/flowable/completeTask?taskId=任務ID&approved=true|false
    • ??描述??: 完成指定的任務,并傳遞是否批準等變量。
    • ??示例請求??:
      curl -X POST "http://localhost:8080/api/flowable/completeTask?taskId=task1&approved=true"
    • ??響應??:
      {"message": "任務已完成"
      }

??注意:??

  • 確保流程定義中的 process id(在 BPMN 文件中為 <process id="leaveProcess" ...>)與控制器中使用的 processDefinitionKey 一致。
  • 根據實際業務需求,您可以擴展更多的流程操作,如查詢流程實例、歷史記錄、任務表單等。

十、流程監控與歷史記錄

Flowable 提供了強大的歷史記錄和監控功能,您可以通過 HistoryService 查詢歷史流程實例、任務等信息。

1. 查詢歷史流程實例

您可以在服務類中添加方法,使用 HistoryService 查詢歷史記錄。例如:

package com.example.flowabledemo.service;import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class HistoryService {@Autowiredprivate HistoryService historyService;/*** 查詢歷史流程實例* @param processInstanceBusinessKey 業務鍵* @return 歷史流程實例列表*/public List<HistoricProcessInstance> getHistoricProcessInstancesByBusinessKey(String processInstanceBusinessKey) {return historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey).list();}
}

??注意:?? 您需要在啟動流程時設置業務鍵,例如:

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", processInstanceBusinessKey, variables);

然后在控制器中添加相應的接口,供前端或其他服務查詢歷史記錄。

十一、生產環境最佳實踐

在生產環境中,集成 Flowable 需要注意以下最佳實踐,以確保系統的穩定性、安全性和性能。

1. 流程版本管理

隨著業務需求的變化,流程定義可能需要不斷迭代。Flowable 支持流程版本管理,確保新舊版本的流程定義能夠共存,并根據需要啟動不同版本的流程實例。

??操作步驟:??

  1. ??部署新版本流程??:每次更新 BPMN 文件后,將其重新部署,Flowable 會自動為新的流程定義分配一個新的版本號。
  2. ??保留歷史版本??:通過配置,Flowable 會保留所有歷史版本的流程定義,您可以根據需要啟動特定版本的流程實例。

??示例:??

將更新后的 leave-process-v2.bpmn20.xml 文件放置在 src/main/resources/processes 目錄下,啟動應用后,Flowable 會自動部署新版本,并為其分配新的版本號。

2. 表單集成方案

Flowable 支持內嵌表單和外置表單兩種方式,根據業務需求選擇合適的表單集成方案。

  • ??內嵌表單??:在 BPMN 文件中通過 flowable:formField 定義表單字段,通過 TaskService.getTaskFormData() 獲取表單元數據。
  • ??外置表單??:使用 Flowable Form 引擎,支持 HTML/CSS/JavaScript 自定義表單,提供更靈活的用戶界面。

??推薦:?? 對于復雜表單需求,推薦使用外置表單,以實現更高的自定義程度和用戶體驗。

3. 監控與審計

通過 Flowable 提供的 HistoryServiceManagementService,您可以實現流程的全面監控與審計。

  • ??查詢流程執行歷史??:了解流程實例的執行情況、任務處理情況等。
  • ??審計日志??:記錄關鍵操作和流程變更,確保流程的透明性和可追溯性。

??示例:??

List<HistoricProcessInstance> instances = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey("process_123").list();

4. 安全加固

確保 Flowable 集成系統的安全性,防止未經授權的訪問和潛在的安全漏洞。

  • ??權限控制??:通過 Spring Security 或其他安全框架,限制對 Flowable API 的訪問,確保只有授權用戶才能啟動、處理流程。
  • ??流程變量加密??:對敏感的流程變量進行加密存儲,保護用戶數據的隱私。
  • ??防 SQL 注入??:使用 MyBatis 的 #{} 占位符或 JPA 的參數綁定,避免用戶輸入直接拼接到 SQL 語句中,防止 SQL 注入攻擊。

十二、性能優化

為了確保 Flowable 在生產環境中的高效運行,您可以采取以下性能優化措施:

1. 數據庫索引優化

為常用的查詢字段添加數據庫索引,提高查詢性能。例如,為 ACT_RU_TASK 表中的 ASSIGNEE_ 字段添加索引。

??示例:??

Flowable 通常會自動管理其數據庫表的索引,但您可以根據具體查詢需求,手動創建額外的索引。

// 通常不需要手動創建索引,Flowable 自動管理
// 但在特定情況下,您可以通過 ManagementService 執行自定義 SQL

??注意:?? 生產環境中,建議通過數據庫管理員或使用數據庫遷移工具管理索引,確保索引的有效性和性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97906.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp離線打包安卓apk詳細教程,從HbuilderX新建項目到Android Studio詳細配置(一)

目錄 一、基礎離線打包&#xff0c;無引入模塊&#xff0c;無原生插件 1. HbuilderX新建項目&#xff0c;開發者后臺申請證書和離線key 2.HbuilderX生成本地包 二、Android Studio配置 1.下載離線SDK&#xff0c;解壓&#xff0c;SDK版本需要和HbuilderX 版本一致&#xf…

藍牙鼠標頻繁卡頓?一招解決 Win10/11 的 USB 省電機制干擾問題

藍牙鼠標頻繁卡頓&#xff1f;一招解決 Win10/11 的 USB 省電機制干擾問題 問題背景 在使用藍牙鼠標時&#xff0c;很多用戶會遇到以下問題&#xff1a; 鼠標移動卡頓、延遲明顯偶爾斷連&#xff0c;需重新配對尤其在筆記本合蓋或待機后恢復時更明顯 這些問題在 Windows 10/11 …

領碼方案|Spring Boot 異步請求深度剖析:從原理到 AI 驅動的吞吐量優化

摘要 本文以“領碼方案”為核心&#xff0c;深入剖析 Spring Boot 異步請求的底層原理、線程模型、三種常用實現方式&#xff08;Callable、WebAsyncTask、DeferredResult&#xff09;的運行機制與性能特征&#xff0c;并結合 AI 驅動的自適應線程池調優、云原生架構下的彈性伸…

C++基礎(13)——list類的模擬實現

目錄 一、接口函數和類總覽 二、節點結構體的實現 構造函數 三、迭代器結構體的實現 迭代器模版參數 構造函數 重載運算符 重載--運算符 重載運算符 重載*運算符 重載->運算符 四、list的模擬實現 默認成員函數 構造函數 拷貝構造函數 賦值運算符重載函數 …

從 APP 界面設計到用戶體驗優化:如何讓你的應用脫穎而出?

作為一個經驗豐富的設計師&#xff0c;在產品優化方面我踩過不少坑&#xff0c;也見過很多團隊在界面設計和用戶體驗上的誤區。APP 的外觀決定了用戶的第一印象&#xff0c;但能不能留住用戶、讓他們愿意持續使用&#xff0c;最終還是看體驗。今天就結合自己的經驗&#xff0c;…

Kafka如何配置生產者攔截器和消費者攔截器

Kafka 的生產者攔截器和消費者攔截器允許你在消息發送前后以及消息消費前后嵌入自定義邏輯&#xff0c;用于實現監控、審計、消息修改等功能。本文我們就用一個最常見的傳遞TraceId的案例來說明下這兩類攔截器如何來使用。 生產者發送攔截器 生產者攔截器需要實現 org.apache.k…

vue表單彈窗最大化無法渲染復雜組件內容

背景&#xff1a;最大化后選然后復雜組件內容丟失&#xff0c;如下拉框、圖片上傳組件修復方案&#xff1a;使用深拷貝核心代碼this.maximizeDialog {visible: true,title: 患者申請 - 最大化查看,formModel: JSON.parse(JSON.stringify(this.formModel || [])),formLogic: JS…

經典俄羅斯方塊游戲 | 安卓三模式暢玩,暫時無廣告!

大家好&#xff0c;今天想跟大家分享一款安卓版的俄羅斯方塊游戲。適合無聊的時候玩玩&#xff0c;換換腦子&#xff0c;這款游戲太經典。80、90都玩過這個游戲。之前我也給大家推薦過一些離線小游戲&#xff0c;但有些用著用著就開始出現彈窗廣告&#xff0c;這就有點煩&#…

今天開始學習新內容“服務集群與自動化”--crond服務、--syslog服務以及DHCP協議

一.crond簡介1、基本介紹crond是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程&#xff0c;與windows下的計劃任務類似&#xff0c;當安裝完成操作系統后&#xff0c;默認會安裝此服務工具&#xff0c;并且會自動啟動crond進程&#xff0c;crond進程每分鐘…

從go語言出發,搭建多語言云原生場景下全鏈路觀測體系

一、方案背景 在公司內部devops平臺的微服務化改造過程中&#xff0c;我們遇到了典型的分布式系統觀測難題&#xff1a;服務間調用鏈路復雜、性能瓶頸難以定位、故障排查效率低下。特別是在生產環境出現問題時&#xff0c;往往需要花費大量時間在各個服務的日志中尋找蛛絲馬跡。…

Vue 進階實戰:從待辦清單到完整應用(路由 / 狀態管理 / 性能優化全攻略)

Vue 進階實戰&#xff1a;從待辦清單到完整應用&#xff08;路由 / 狀態管理 / 性能優化全攻略&#xff09; 在上一篇博客里&#xff0c;我們一起實現了能本地存儲的待辦清單&#xff0c;不少朋友留言說&#xff1a;“學會了基礎&#xff0c;但遇到‘登錄后才能訪問頁面’‘多…

uniApp開發XR-Frame微信小程序 | 動態加載與刪除模型

在使用xr-frame開發3D小程序時&#xff0c;我們經常需要根據需求去動態加載模型或刪除模型&#xff0c;在官方的說明中&#xff0c;提到了相關方法&#xff0c;但并不太明確&#xff0c;也沒有確切的實例。 我們先來看一下官方給出的說明。 一. Shadow元素 我們需要用代碼動…

把多個 PPT 合并在一起,三步告別復制粘貼

制作部門匯報分冊、項目階段文件等工作需要將多個零散的PPT合并為一份完整文檔。手動復制粘貼不僅效率低下&#xff0c;還容易導致格式錯亂、動畫丟失。本文介紹一種高效方法&#xff0c;三步操作即可將多個PPT文件快速合并為單一文檔。無論是整合匯報材料&#xff0c;還是準備…

安卓旋轉屏幕后如何防止數據丟失-ViewModel入門

Android ViewModel 入門教程 在日常開發中&#xff0c;當 Activity 因為旋轉屏幕或內存回收被銷毀重建時&#xff0c;UI 中的數據也會丟失。 這時候&#xff0c;Android Jetpack 提供的 ViewModel 就能幫我們解決這個問題。 1. 什么是 ViewModel ViewModel 是一種架構組件。它專…

Linux 下的 Vim 使用與網絡安全配置詳解

目錄 引言 一、Vim 編輯器的使用 1. Vim 的模式 2. 常用操作命令 3. 保存與退出 4. 多窗口與 Shell 切換 二、Linux 網絡基礎 1. 網絡分類 2. IP 地址與分類 三、網絡配置與工具 1. ifconfig 2. netstat 3. wget 4. 主機名與 IP 映射 四、Linux 防火墻與安全設置…

Docker 容器傳輸文件的常用方法

Docker 容器傳輸文件的常用方法 在 Docker 日常使用中&#xff0c;經常需要在主機與容器之間傳輸文件&#xff08;如配置文件、代碼包、日志等&#xff09;。以下是四種最常用的實現方式&#xff0c;覆蓋臨時傳輸、持久共享、構建集成等不同場景。 1. 使用 docker cp 命令&…

視頻轉音頻在線工具大比拼,哪家體驗更勝一籌?

最近工作上遇到了個挺有意思的需求&#xff0c;需要從幾個教學視頻里提取出音頻內容&#xff0c;方便做成播客形式&#xff0c;讓學員能隨時隨地學習。一開始&#xff0c;我以為這活兒挺簡單的&#xff0c;不就是把視頻里的聲音單獨弄出來嘛&#xff0c;結果一上手才發現&#…

KafKa02:Kafka配置文件server.properties介紹

一、配置文件位置二、配置文件介紹默認下&#xff1a;9092 是處理消息隊列核心業務&#xff08;客戶端與 broker 交互&#xff09;的端口9093 是集群內部控制器通信的端口# 指定節點角色&#xff0c;這里同時作為 broker&#xff08;消息代理&#xff09;和 controller&#xf…

哈爾濱云前沿服務器租用托管

黑龍江前沿數據&#xff0c;始建于2005年&#xff0c;多年的歷史&#xff0c;專業從事域名注冊&#xff0c;虛擬主機&#xff0c;服務器租用&#xff0c;云主機&#xff0c;網站建設等互聯網服務。電信/聯通/雙線/機房/眾多機房供您選擇&#xff0c;總有一個適合您的服務器&…

Qt開發經驗 --- Qt 修改控件樣式的方式(16)

文章目錄[toc]1 概述2 Qt Style Sheets (QSS)3 使用 QStyle 和 QProxyStyle4 設置 Palette (調色板)5 使用預定義的 QStyle6 直接設置控件屬性7 自定義控件繪制更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發經驗 &#x1f448;1 概述 Qt 提供了多種修改…