SpringBoot整合Flowable【08】- 前后端如何交互

引子

在第02篇中,我通過 Flowable-UI 繪制了一個簡單的績效流程,并在后續章節中基于這個流程演示了 Flowable 的各種API調用。然而,在實際業務場景中,如果要求前端將用戶繪制的流程文件發送給后端再進行解析處理,這種方式顯得繁瑣且不夠優雅。那么,有沒有更簡便的方法,讓前端通過常規的參數傳遞方式就能實現流程創建呢?

答案是肯定的。Flowable 提供了強大的 BpmnModel API,它允許我們以編程方式動態構建流程定義,無需依賴XML文件。

什么是 BpmnModel ?

BpmnModelFlowable 提供的一個核心類,它允許開發者以編程方式構建完整的 BPMN 2.0 流程模型。與通過 Flowable-UI 設計流程并導出XML文件的方式不同,BpmnModel 讓我們可以直接在代碼中定義流程的各個元素。

所以,我們可以通過 BpmnModel 對象來動態創建流程定義,前端只需通過接口傳遞必要的流程參數即可,無需傳遞完整的 XML 文件。這里需要明確區分兩個概念:一是后端如何接收參數并構建流程模型,二是前端如何提供流程設計的交互界面。對于后者,可以基于 bpmn.js 開發自定義設計器,也可以采用現有的開源方案,這些選項在第01篇中已有詳細介紹。

代碼編寫

接下來,我將完全拋棄 Flowable UI 可視化建模方式,轉而通過純代碼方式使用 BpmnModel 對象構建先前設計的績效流程。讓我們深入編碼環節,一步步實現這一轉換。

一、構建傳參對象

1.流程定義實體

流程定義是創建流程的傳參對象,包含流程的基本信息和節點結構。

import lombok.Data;
import java.io.Serializable;/*** 流程定義.*/
@Data
public class ProcessDef implements Serializable {/*** 流程定義id.*/private String processDefKey;/*** 流程定義名稱.*/private String processName;/*** 流程定義描述.*/private String description;/*** 創建人id.*/private Long creatorId;/*** 流程定義節點.*/private ProcessNode processNode;}

2. 流程節點實體

流程節點定義了流程中的各個環節,包括節點類型、表單屬性以及子節點關系等。

import lombok.Data;
import java.io.Serializable;
import java.util.List;/*** 流程節點.*/
@Data
public class ProcessNode implements Serializable {/*** 節點名稱.*/private String name;/*** 節點類型.*/private NodeCategory category;/*** 是否啟用 0否 1是.*/private Integer enable;/*** 辦理人屬性.*/private AssigneeProps assigneeProps;/*** 表單列表.*/private List<FormProp> formProps;/*** 子節點.*/private ProcessNode children;}

3. 相關枚舉和屬性類

為了更好地定義流程節點的各種屬性,我們最好還是定義相關枚舉和輔助類。(Ps:在實際開發中,個人建議如果類型比較多的情況下,盡量使用枚舉,避免魔法字段。)

節點類型枚舉
/*** 節點類型.*/
public enum NodeCategory {/*** 自評.*/SELF_EVALUATION,/*** 上級評.*/LEADER_EVALUATION,/*** 隔級評.*/AUDIT,/*** 績效確認.*/CONFIRMATION;
}
辦理人屬性
import java.io.Serializable;
import lombok.Data;/*** 辦理人Props.*/
@Data
public class AssigneeProps implements Serializable {/*** 辦理人類型.*/private AssigneeType assigneeType;/*** 候選辦理人類型.*/private AssigneeType candidateType;
}
辦理人類型枚舉
/*** 辦理人類型.*/
public enum AssigneeType {/*** 節點處理人類型, 用戶本人,直接上級,上級部門管理員,隔級上級,隔級部門管理員.*/USER_ASSESSED, LEADER, DEPT_MANAGER, SUPERIOR_LEADER, SUPERIOR_DEPT_MANAGER
}
表單屬性
import java.io.Serializable;
import lombok.Data;/*** FormProps 表單屬性.*/
@Data
public class FormProp implements Serializable {/*** id.*/private String id;/*** 屬性名稱.*/private String name;/*** 屬性變量.*/private String variable;/*** 變量類型.*/private String type;/*** 值.*/private String value;/*** 表單配置.*/private FormConfig config;public FormConfig getConfig() {return config;}
}
表單配置
import java.io.Serializable;
import lombok.Data;/*** FormConfig 表單配置.*/
@Data
public class FormConfig implements Serializable {/*** 分組名稱.*/private String group;/*** 分組權重.*/private Double weight;/*** 分類:評分SCORE、評語COMMENT.*/private FormCategory category;}
表單類別枚舉
/*** 表單類別.*/
public enum FormCategory {/*** 評分.*/SCORE,/*** 評語.*/COMMENT;
}

二、創建控制器

import com.pitayafruit.base.BaseResponse;
import com.pitayafruit.rest.vo.ProcessDef;
import com.pitayafruit.service.ProcessDefService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 流程Controller.*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/process-def/v1")
public class ProcessDefControllerV1 {private final ProcessDefService processDefService;/*** 創建流程模型并部署.** @param processDef 流程定義* @return 流程key*/@PostMappingpublic ResponseEntity<Object> createProcessDef(@RequestBody ProcessDef processDef) {//1,創建并部署流程模型String processDefKey = processDefService.createProcessDefApi(processDef);//2.返回流程模型keyreturn new ResponseEntity<>(new BaseResponse<>(processDefKey), HttpStatus.OK);}}

三、實現服務層主方法

這個負責將前端傳遞的數據結構轉換為 Flowable 的 BpmnModel 模型,并進行部署。

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.pitayafruit.rest.vo.AssigneeProps;
import com.pitayafruit.rest.vo.ProcessDef;
import com.pitayafruit.rest.vo.ProcessNode;
import com.pitayafruit.service.ProcessDefService;
import com.pitayafruit.utils.UUIDUtil;
import lombok.RequiredArgsConstructor;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.validation.ValidationError;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;/*** 流程定義ServiceImpl.*/
@Service
@RequiredArgsConstructor
public class ProcessDefServiceImpl implements ProcessDefService {private final RepositoryService repositoryService;/*** 創建流程模型并部署.** @param processDef 流程定義* @return 流程key*/@Overridepublic String createProcessDefApi(ProcessDef processDef) {//1.設置流程定義KeyprocessDef.setProcessDefKey("processDef" + UUIDUtil.getUUID());//2.設置流程定義創建人idprocessDef.setCreatorId(1L);//3.設置流程定義名稱processDef.setProcessName("績效流程");//4.創建流程模型BpmnModel bpmnModel = toBpmn(processDef);//5.部署流程模型repositoryService.createDeployment()//5-1.流程定義key.key(processDef.getProcessDefKey())//5-2.流程定義名稱.name(processDef.getProcessName())//5-3.添加流程模型.addBpmnModel(processDef.getProcessDefKey() + ".bpmn", bpmnModel)//5-4.部署.deploy();//6.返回流程定義keyreturn processDef.getProcessDefKey();}

四、流程模型轉換方法

類型轉換涉及到的邏輯比較多,所以把這個方法單獨抽取出來。首先創建一個流程對象,設置流程的基本屬性,添加開始事件,然后通過調用 buildTask 方法遞歸構建流程中的各個節點,最后生成并驗證 BpmnModel。

/*** 將流程定義轉換為BpmnModel.** @param processDef 流程定義* @return Bpmn模型*/
private BpmnModel toBpmn(ProcessDef processDef) {//1.創建流程//1-1.聲明流程對象Process process = new Process();//1-2.設置流程idprocess.setId(processDef.getProcessDefKey());//1-3.設置流程名稱process.setName(processDef.getProcessName());//2.創建開始事件//2-1.聲明開始事件對象StartEvent startEvent = new StartEvent();//2-2.設置開始事件idstartEvent.setId("startEvent" + UUIDUtil.getUUID());//2-3.設置開始事件名稱startEvent.setName("開始");//2-4.將開始事件添加到流程中process.addFlowElement(startEvent);//創建用戶節點ProcessNode processNode = processDef.getProcessNode();buildTask(startEvent, processNode, process);//創建流程模型BpmnModel bpmnModel = new BpmnModel();bpmnModel.addProcess(process);// 驗證BPMN模型List<ValidationError> validationErrors = repositoryService.validateProcess(bpmnModel);if (ObjectUtil.isNotEmpty(validationErrors)) {//打印失敗日志validationErrors.forEach(validationError -> System.out.println(validationError.toString()));throw new IllegalArgumentException("驗證失敗");}return bpmnModel;
}

五、任務節點構建方法

這個方法負責創建用戶任務節點。根據傳入的流程節點數據,創建一個用戶任務對象,設置其屬性,添加自定義屬性和任務監聽器,然后將任務添加到流程中,并構建與前一個節點的連線。如果當前節點未啟用,則直接處理下一個節點。

/*** 創建用戶任務節點.** @param parentTask  父節點* @param processNode 流程節點* @param process     流程定義*/
private void buildTask(FlowNode parentTask, ProcessNode processNode, Process process) {//如果節點啟用,處理當前節點if (ObjectUtil.isNotNull(processNode.getEnable()) && processNode.getEnable() == 1) {UserTask userTask = new UserTask();userTask.setId("userTask" + UUIDUtil.getUUID());userTask.setName(processNode.getName());//設置節點類型userTask.setCategory(processNode.getCategory().toString());List<CustomProperty> customProperties = new ArrayList<>();//辦理人屬性AssigneeProps assigneeProps = processNode.getAssigneeProps();//設置辦理人類型customProperties.add(buildCustomProperty("assigneeType", assigneeProps.getAssigneeType().toString()));//設置候選辦理人類型if (ObjectUtil.isNotNull(assigneeProps.getCandidateType())) {customProperties.add(buildCustomProperty("candidateType", assigneeProps.getCandidateType().toString()));}//綁定表單userTask.setFormProperties(buildFormProperty(processNode));//表單列表添加到節點擴展屬性customProperties.add(buildCustomProperty("formProps", JSON.toJSONString(processNode.getFormProps())));//設置自定義屬性,包括辦理人類型和表單分組和權重配置userTask.setCustomProperties(customProperties);//監聽器列表List<FlowableListener> taskListeners = new ArrayList<>();//任務創建時添加監聽器,用于動態指定任務的辦理人和設置變量taskListeners.add(buildTaskListener(TaskListener.EVENTNAME_CREATE, "taskCreateListener"));//任務完成后添加監聽器,用于計算分數和保存表單//如果是手動填寫流程,添加手動填寫的監聽器taskListeners.add(buildTaskListener(TaskListener.EVENTNAME_COMPLETE, "taskCompleteListener"));//設置任務監聽器userTask.setTaskListeners(taskListeners);// 將用戶任務節點添加到流程定義process.addFlowElement(userTask);//添加流程連線process.addFlowElement(new SequenceFlow(parentTask.getId(), userTask.getId()));//解析下一個節點,參數為當前任務,當前流程節點,流程定義,流程類型buildChildren(userTask, processNode, process);} else {//當前節點關閉的情況下,直接解析下一個節點,參數為父任務,當前流程節點,流程定義,流程類型buildChildren(parentTask, processNode, process);}
}

六、子節點處理方法

這個方法用于處理流程節點的子節點。它檢查當前節點是否有子節點,如果有則遞歸調用 buildTask 方法構建子節點,如果沒有則創建結束事件,表示流程的結束。

/*** 解析子節點.** @param parentTask  下一個節點的父任務* @param processNode 流程節點* @param process     流程定義*/
private void buildChildren(FlowNode parentTask, ProcessNode processNode, Process process) {ProcessNode childrenNode = processNode.getChildren();if (ObjectUtil.isNotNull(childrenNode)) {//創建子節點buildTask(parentTask, childrenNode, process);} else {//創建結束事件EndEvent endEvent = new EndEvent();endEvent.setId("endEvent" + UUIDUtil.getUUID());endEvent.setName("結束");process.addFlowElement(endEvent);//添加流程連線process.addFlowElement(new SequenceFlow(parentTask.getId(), endEvent.getId()));}
}

七、任務監聽器創建方法

這個方法用于創建任務監聽器。在Flowable中,任務監聽器可以在任務的不同生命周期階段觸發特定邏輯,例如在任務創建時動態分配任務辦理人,或在任務完成時處理表單數據。這里使用了委托表達式方式,將監聽器的實現委托給Spring容器中的Bean。

/*** 創建任務監聽器,用于動態分配任務的辦理人.** @param event    事件* @param beanName 類名* @return 任務監聽器*/
private FlowableListener buildTaskListener(String event, String beanName) {FlowableListener flowableListener = new FlowableListener();flowableListener.setEvent(event);flowableListener.setImplementationType("delegateExpression");flowableListener.setImplementation("${" + beanName + "}");return flowableListener;
}

八、表單屬性創建方法

這個方法用于創建表單屬性。它遍歷流程節點中的表單屬性列表,為每個表單屬性創建一個Flowable的FormProperty對象,設置其ID、名稱、變量名等屬性,并將原始表單屬性的ID和變量名更新為實際使用的值,以便在后續處理中使用。

/*** 創建表單屬性.** @param processNode 流程節點*/
private List<FormProperty> buildFormProperty(ProcessNode processNode) {List<FormProperty> formProperties = new ArrayList<>();if (ObjectUtil.isNull(processNode.getFormProps())) {return formProperties;}processNode.getFormProps().forEach(prop -> {//新建表單屬性對象FormProperty formProperty = new FormProperty();//設置表單屬性idString id = "formProperty" + UUIDUtil.getUUID();formProperty.setId(id);//設置表單名稱formProperty.setName(prop.getName());//設置表單變量名為表單idformProperty.setVariable(id);//設置表單變量類型formProperty.setType(prop.getType());//設置表單是否必填formProperty.setRequired(true);formProperties.add(formProperty);//設置表單屬性idprop.setId(id);prop.setVariable(id);});return formProperties;
}

九、自定義屬性創建方法

這個方法用于創建自定義屬性。在 Flowable 中,自定義屬性可以用于存儲不屬于標準BPMN規范但業務上需要的信息,通常用來傳遞我們的業務數據。

/*** 創建自定義屬性.** @param key  鍵* @param value 值* @return 自定義屬性*/
private CustomProperty buildCustomProperty(String key, String value) {CustomProperty customProperty = new CustomProperty();//自定義屬性名稱customProperty.setName(key);//自定義屬性值customProperty.setSimpleValue(value);return customProperty;
}

接口測試

我把請求轉換成了curl命令,方便直接在命令行中測試。創建的這個流程與前面篇章中介紹的結構一致,包含三個核心節點:員工自評、上級評價和隔級評價,每個節點都包含分數、評語等表單項,并且每個節點都設置了不同的權重。

為什么要加權重?這是因為在實際業務場景中,不同評價環節的重要性往往不同。

curl -X POST 'http://localhost:8080/api/process-def/v1' \
-H 'Content-Type: application/json' \
-d '{"processName": "通過bpmn model創建的績效流程","description": "用于員工季度績效評估","processNode": {"name": "員工自評","category": "SELF_EVALUATION","enable": 1,"assigneeProps": {"assigneeType": "USER_ASSESSED"},"formProps": [{"name": "自評分數","type": "string","value": "0","config": {"group": "績效評分","weight": 0.3,"category": "SCORE"}},{"name": "自我評價","type": "string","config": {"group": "評語","weight": 0.3,"category": "COMMENT"}}],"children": {"name": "上級評價","category": "LEADER_EVALUATION","enable": 1,"assigneeProps": {"assigneeType": "LEADER"},"formProps": [{"name": "上級評分","type": "string","value": "0","config": {"group": "績效評分","weight": 0.5,"category": "SCORE"}},{"name": "上級評語","type": "string","config": {"group": "評語","weight": 0.5,"category": "COMMENT"}}],"children": {"name": "隔級評價","category": "AUDIT","enable": 1,"assigneeProps": {"assigneeType": "SUPERIOR_LEADER"},"formProps": [{"name": "隔級評分","type": "string","value": "0","config": {"group": "績效評分","weight": 0.2,"category": "SCORE"}},{"name": "隔級評語","type": "string","config": {"group": "評語","weight": 0.2,"category": "COMMENT"}}],"children": null}}}
}'

按照接口的定義,部署成功后會返回流程模型key。
在這里插入圖片描述

同時查看部署表和流程運行表,可以看到這個流程已經啟動了。

在這里插入圖片描述
在這里插入圖片描述

小結

通過本章的實踐,我們可以明顯看到利用 BpmnModel API 構建流程雖然靈活強大,但即使是構建一個相對簡單的線性流程,也需要編寫大量代碼來處理各種細節。這種方法的復雜性在面對更復雜的流程結構(如并行網關、排他網關或子流程等)時會進一步增加。

因此,在實際項目中,我建議大家可以花點時間封裝,比如可以將創建開始事件、任務節點、結束事件、網關等常見元素的代碼封裝成獨立方法。通過這些封裝,在寫業務的時候就能像搭積木一樣輕松組合各種流程元素,提高開發效率和代碼可維護性。

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

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

相關文章

2025 Java面試大全技術文章大綱

2025 Java面試大全技術文章大綱 基礎篇 Java核心語法 數據類型與包裝類自動裝箱與拆箱原理String、StringBuffer、StringBuilder區別final關鍵字作用場景 面向對象特性 多態的實現機制抽象類與接口的異同設計模式&#xff1a;單例的七種寫法泛型擦除與橋接方法 進階篇 J…

Python aiohttp 全面指南:異步HTTP客戶端/服務器框架

邊寫代碼零食不停口 盼盼麥香雞味塊 、卡樂比&#xff08;Calbee&#xff09;薯條三兄弟 獨立小包、好時kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 邊寫代碼邊貼面膜 事業美麗兩不誤 DR. YS 野森博士【AOUFSE/澳芙雪特證】377專研美白淡斑面膜組合 優惠劵 別光顧寫…

歸并排序:高效穩定的分治算法

歸并排序 歸并排序采用分治策略實現穩定排序&#xff0c;其核心思想是將序列遞歸分解后進行有序合并。 def merge_sort(arr):if len(arr) < 1:return arrmid len(arr) // 2left merge_sort(arr[:mid])right merge_sort(arr[mid:])result []i j 0while i < len(le…

go語言基礎|slice入門

slice slice介紹 slice中文叫切片&#xff0c;是go官方提供的一個可變數組&#xff0c;是一個輕量級的數據結構&#xff0c;功能上和c的vector&#xff0c;Java的ArrayList差不多。 slice和數組是有一些區別的&#xff0c;是為了彌補數組的一些不足而誕生的數據結構。最大的…

網絡攻防技術九:網絡監聽技術

文章目錄 一、網絡監聽概述二、網絡流量劫持三、數據采集與解析四、網絡監聽檢測與防范1、檢測實施監聽主機2、防范網絡通信被監聽 一、網絡監聽概述 主要解決問題&#xff1a;網絡流量劫持、在監聽點上采集并分析網絡數據。主要涉及網卡數據采集、協議分析技術。 二、網絡流量…

Cat.1與Cat.4區別及應用場景

Cat.1 和 Cat.4 都是 LTE&#xff08;4G&#xff09;網絡中的終端設備類別&#xff0c;主要區別在于 數據傳輸速率、復雜度和功耗&#xff0c;這直接影響了它們的應用場景和成本。 以下是它們的主要區別&#xff1a; 數據傳輸速率 (核心區別)&#xff1a; Cat.1 (Category 1)&…

【后端高階面經:架構篇】51、搜索引擎架構與排序算法:面試關鍵知識點全解析

一、搜索引擎核心基石&#xff1a;倒排索引技術深度解析 &#xff08;一&#xff09;倒排索引的本質與構建流程 倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎實現快速檢索的核心數據結構&#xff0c;與傳統數據庫的正向索引&#xff08;文檔→關鍵詞&#xff0…

深度學習入門:從零搭建你的第一個神經網絡

深度學習入門&#xff1a;從零搭建你的第一個神經網絡 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 深度學習入門&#xff1a;從零搭建你的第一個神經網絡摘要引言第一章&#xff1a;神經網絡基礎原理1.1 神經元…

Hadoop 3.x 偽分布式 8088端口無法訪問問題處理

【Hadoop】YARN ResourceManager 啟動后 8088 端口無法訪問問題排查與解決(偽分布式啟動Hadoop) 在配置和啟動 Hadoop YARN 模塊時&#xff0c;發現雖然 ResourceManager 正常啟動&#xff0c;JPS 進程中也顯示無誤&#xff0c;但通過瀏覽器訪問 http://主機IP:8088 時卻無法打…

docker B站學習

鏡像是一個只讀的模板&#xff0c;用來創建容器 容器是docker的運行實例&#xff0c;提供了獨立可移植的環境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目錄掛載 尚硅谷doc…

鴻蒙OSUniApp微服務架構實踐:從設計到鴻蒙部署#三方框架 #Uniapp

UniApp微服務架構實踐&#xff1a;從設計到鴻蒙部署 引言 在最近的一個大型跨平臺項目中&#xff0c;我們面臨著一個有趣的挑戰&#xff1a;如何在UniApp框架下構建一個可擴展的微服務架構&#xff0c;并確保其在包括鴻蒙在內的多個操作系統上流暢運行。本文將分享我們的實踐…

Freemarker快速入門

Freemarker概述 FreeMarker 是一款 模板引擎&#xff1a; 即一種基于模板和要改變的數據&#xff0c; 并用來生成輸出文本(HTML網頁&#xff0c;電子郵件&#xff0c;配置文件&#xff0c;源代碼等)的通用工具。 它不是面向最終用戶的&#xff0c;而是一個Java類庫&#xff0c…

操作系統:生態思政

操作系統&#xff1a;生態思政 操作系統&#xff08;OS&#xff09;作為數字世界的基石&#xff0c;其意義遠超單純的技術平臺。它構建了一個包含開發者、用戶、硬件廠商在內的復雜生態系統&#xff0c;其設計理念、運行規則與生態治理模式&#xff0c;無不深刻映射著特定的價…

二進制安全-OpenWrt-uBus

1 需求 需求&#xff1a;ubus list 需求&#xff1a;ubus -v list 需求&#xff1a;ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …

Rust 學習筆記:自定義構建和發布配置

Rust 學習筆記&#xff1a;自定義構建和發布配置 Rust 學習筆記&#xff1a;自定義構建和發布配置發布配置文件自定義 profile 的選項 Rust 學習筆記&#xff1a;自定義構建和發布配置 發布配置文件 在 Rust 中&#xff0c;發布配置文件是預定義的和可定制的概要文件&#xf…

優化 Transformer 模型:基于知識蒸餾、量化技術及 ONNX

Transformer 模型非常強大&#xff0c;但往往太大太慢&#xff0c;不適合實時應用。為了解決這個問題&#xff0c;我們來看看三種關鍵的優化技術&#xff1a;知識蒸餾、量化和ONNX 圖優化。這些技術可以顯著減少推理時間和內存使用。 為了說明每種技術的利弊&#xff0c;我們以…

Vue3中Axios的使用-附完整代碼

前言 首先介紹一下什么是axios Axios 是一個基于 promise 網絡請求庫&#xff0c;作用于node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。在服務端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests 官方網站…

@Pushgateway自定義腳本推送數據

文章目錄 Pushgateway 自定義腳本推送數據1. 目的2. 適用范圍3. 前提條件4. 操作流程4.1 確定指標類型和格式4.2 編寫推送腳本方法一:使用 curl 命令行推送方法二:使用 Python 腳本推送方法三:使用 Python 客戶端庫推送4.3 設置定時任務4.4 驗證數據5. 高級配置5.1 使用基本…

Git 使用規范指南

Learn Git Branching 1Git 基礎使用流程 1.1初始化與克隆 # 初始化本地倉庫 git init# 克隆遠程倉庫 git clone <repo_url> 一般拉取代碼&#xff0c;直接在文件夾界面打開bash&#xff0c;git clone就行了 1.2日常開發流程 1拉取最新代碼 git pull origin <branc…

設計模式——備忘錄設計模式(行為型)

摘要 備忘錄設計模式是一種行為型設計模式&#xff0c;用于在不破壞封裝性的前提下&#xff0c;捕獲對象的內部狀態并在需要時恢復。它包含三個關鍵角色&#xff1a;原發器&#xff08;Originator&#xff09;、備忘錄&#xff08;Memento&#xff09;和負責人&#xff08;Car…