SpringBoot2.x简单集成Flowable

环境和版本

window10
java1.8
mysql8
flowable6
springboot 2.7.6

配置

使用IDEA创建一个SpringBoot项目

<?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><groupId>com.example</groupId><artifactId>flowable-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>flowable-demo</name><description>flowable-demo</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.7.6</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.4.1</version><exclusions><!--        这里要排除mybatis,否则会覆盖mybatis-plus引入的mybatis版本        --><exclusion><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--    mybatis-plus    --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--    mybatis-plus generator    --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.flowable.demo.FlowableDemoApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

application.yml中配置

mybatis-plus:global-config:db-config:logic-delete-field: deletedlogic-delete-value: 1logic-not-delete-value: 0configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplspring:datasource:url: jdbc:mysql://localhost:3306/flowable_demo?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&allowMultiQueries=true&nullCatalogMeansCurrent=truedriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: qk123type: com.zaxxer.hikari.HikariDataSourcehikari:minimum-idle: 5maximum-pool-size: 15auto-commit: trueidle-timeout: 30000pool-name: DatebookHikariCPmax-lifetime: 1800000connection-timeout: 30000connection-test-query: SELECT 1# jackson 配置jackson:date-format: yyyy-MM-dd HH:mm:sslocale: zhtime-zone: GMT+8#server.servlet.context-path=/
# swagger2使用,不配置这个项目报错 Failed to start bean ‘documentationPluginsBootstrapper‘
flowable:# 第一次改为true,创建完数据库表结构后,改为falsedatabase-schema-update: trueasync-executor-activate: false
server:port: 11000
# 设置flowable日志级别
logging:level:org.flowable: debug
#spring.mvc.pathmatch.matching-strategy=ant-path-matcher

再创建一个数据库
在这里插入图片描述
然后运行
在这里插入图片描述
数据库中会自动生成表结构
在这里插入图片描述

表结构位置

在这里插入图片描述

常用的类

flowable的autoconfig包已经自动配置好了需要的类
在这里插入图片描述
在这里插入图片描述
直接@Resource就可以使用
在这里插入图片描述

使用

部署一个简单流程

import com.example.flowable.demo.controller.vo.DefinitionRequest;
import com.example.flowable.demo.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil;
import org.flowable.engine.repository.DeploymentBuilder;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ModelQuery;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.List;@Slf4j
@RestController
@RequestMapping("/modeler")
public class ModelerController {@Resourceprivate RepositoryService repositoryService;/*** 部署流程* @param definitionRequest* @return*/@PutMapping("/deploy")public R deployModeler(@RequestBody DefinitionRequest definitionRequest) {String xmlDefinition = definitionRequest.getXmlDefinition();DeploymentBuilder deployment = repositoryService.createDeployment();byte[] bytes = xmlDefinition.getBytes(StandardCharsets.UTF_8);int i = RandomUtils.nextInt();String key = "demo_flow_" + i;String name = "示例流程";String category = "hello_" + i;// 流程定义的名称,必须是特定的结尾,否则不会解析String resourceName = "demo_flow_name_" + i + "." + ResourceNameUtil.BPMN_RESOURCE_SUFFIXES[0];String id = deployment.addBytes(resourceName, bytes).key(key).category(category).name(name).deploy().getId();log.info("部署后id为:{}", id);Model model = repositoryService.newModel();model.setDeploymentId(id);model.setCategory("model_" + category);model.setKey("model_key_" + i);model.setName("model_name_" + i);model.setVersion(1);repositoryService.saveModel(model);log.info("模型保存后id:{}", model.getId());// 设置模型可编辑资源repositoryService.addModelEditorSource(model.getId(), bytes);return R.success(id);}/*** 查看流程模型列表* @return*/@GetMapping("/list")public R list() {ModelQuery modelQuery = repositoryService.createModelQuery();List<Model> list = modelQuery.list();return R.success();}}

用postman发送一个请求

{"xmlDefinition": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<definitions xmlns=\"http://www.omg.org/spec/BPMN/20100524/MODEL\"\n             xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n             xmlns:bpmndi=\"http://www.omg.org/spec/BPMN/20100524/DI\"\n             xmlns:omgdc=\"http://www.omg.org/spec/DD/20100524/DC\"\n             xmlns:omgdi=\"http://www.omg.org/spec/DD/20100524/DI\"\n             xmlns:flowable=\"http://flowable.org/bpmn\"\n             typeLanguage=\"http://www.w3.org/2001/XMLSchema\"\n             expressionLanguage=\"http://www.w3.org/1999/XPath\"\n             targetNamespace=\"http://www.flowable.org/processdef\">\n\n    <process id=\"holidayRequest\" name=\"Holiday Request\" isExecutable=\"true\">\n\n        <startEvent id=\"startEvent\"/>\n        <sequenceFlow sourceRef=\"startEvent\" targetRef=\"approveTask\"/>\n\n        <userTask id=\"approveTask\" name=\"Approve or reject request\"/>\n        <sequenceFlow sourceRef=\"approveTask\" targetRef=\"decision\"/>\n\n        <exclusiveGateway id=\"decision\"/>\n        <sequenceFlow sourceRef=\"decision\" targetRef=\"externalSystemCall\">\n            <conditionExpression xsi:type=\"tFormalExpression\">\n                <![CDATA[\n    ${approved}    ]]>\n            </conditionExpression>\n        </sequenceFlow>\n        <sequenceFlow  sourceRef=\"decision\" targetRef=\"sendRejectionMail\">\n            <conditionExpression xsi:type=\"tFormalExpression\">\n                <![CDATA[\n    ${approved}    ]]>\n            </conditionExpression>\n        </sequenceFlow>\n\n        <serviceTask id=\"externalSystemCall\" name=\"Enter holidays in external system\"\n                     flowable:class=\"org.flowable.CallExternalSystemDelegate\"/>\n        <sequenceFlow sourceRef=\"externalSystemCall\" targetRef=\"holidayApprovedTask\"/>\n\n        <userTask id=\"holidayApprovedTask\" name=\"Holiday approved\"/>\n        <sequenceFlow sourceRef=\"holidayApprovedTask\" targetRef=\"approveEnd\"/>\n\n        <serviceTask id=\"sendRejectionMail\" name=\"Send out rejection email\"\n                     flowable:class=\"org.flowable.SendRejectionMail\"/>\n        <sequenceFlow sourceRef=\"sendRejectionMail\" targetRef=\"rejectEnd\"/>\n\n        <endEvent id=\"approveEnd\"/>\n\n        <endEvent id=\"rejectEnd\"/>\n    </process>\n\n</definitions>"
}

在这里插入图片描述
在数据库中会出现对应的数据

在这里插入图片描述
接着发起流程

import com.example.flowable.demo.controller.vo.DefinitionRequest;
import com.example.flowable.demo.controller.vo.ProcessDefinitionResp;
import com.example.flowable.demo.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.flowable.engine.runtime.ProcessInstance;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
@RestController
@RequestMapping("/process")
public class ProcessController {@Resourceprivate RuntimeService runtimeService;@Resourceprivate RepositoryService repositoryService;/*** 查看流程定义列表* @return*/@GetMapping("/list")public R list() {ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();List<ProcessDefinition> list = processDefinitionQuery.list();log.info("得到流程定义数量:{}", list.size());// ProcessDefinition无法序列化,需要自己转List<ProcessDefinitionResp> respList = new ArrayList<>();for (ProcessDefinition processDefinition : list) {respList.add(ProcessDefinitionResp.copy(processDefinition));}return R.success(respList);}/*** 启动流程* @param definitionRequest* @return*/@PutMapping("/create")public R create(@RequestBody DefinitionRequest definitionRequest) {String deploymentId = definitionRequest.getDeploymentId();ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();ProcessDefinition processDefinition = processDefinitionQuery.deploymentId(deploymentId).singleResult();Map<String, Object> variables = new HashMap<>();variables.put("employee","张三") ;// 谁申请请假variables.put("nrOfHolidays",3); // 请几天假variables.put("description","工作累了,想出去玩玩"); // 请假的原因ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("holidayRequest", variables);String id = holidayRequest.getId();log.info("启动的流程实例id:{}, 流程定义id:{}", id, processDefinition.getId());return R.success(id);}
}

查看任务

import com.example.flowable.demo.controller.vo.TaskResp;
import com.example.flowable.demo.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;@Slf4j
@RestController
@RequestMapping("/task")
public class TaskController {@Resourceprivate TaskService taskService;/*** 查看所有待办任务* @return*/@GetMapping("/list")public R list() {TaskQuery taskQuery = taskService.createTaskQuery();List<Task> list = taskQuery.list();List<TaskResp> list1 = new ArrayList<>();for (Task task : list) {list1.add(TaskResp.copy(task));}return R.success(list1);}
}

其他类

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;import java.io.Serializable;@Getter
@Setter
@Accessors(chain = true)
public class R implements Serializable {private int code;private String message;private Object data;public static R gen(int code, String message, Object data) {return new R().setCode(code).setMessage(message).setData(data);}public static R success() {return R.success(null);}public static R success(Object data) {return R.success("请求成功", data);}public static R success(String message, Object data) {return R.gen(0, message, data);}public static R fail() {return R.fail(null);}public static R fail(Object data) {return R.fail("请求失败", data);}public static R fail(String message, Object data) {return R.gen(-1, message, data);}
}
import lombok.Getter;
import lombok.Setter;/*** 流程定义请求*/
@Getter
@Setter
public class DefinitionRequest {// 流程xml定义,部署流程用private String xmlDefinition;// 部署id,创建流程用private String deploymentId;
}
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.flowable.engine.repository.ProcessDefinition;import java.io.Serializable;/*** 流程定义*/
@Getter
@Setter
@Accessors(chain = true)
public class ProcessDefinitionResp implements Serializable {String id;String category;String name;String key;String description;int version;String resourceName;String deploymentId;String diagramResourceName;boolean hasStartFormKey;boolean hasGraphicalNotation;boolean suspended;String tenantId;String derivedFrom;String derivedFromRoot;int derivedVersion;String engineVersion;public static ProcessDefinitionResp copy(ProcessDefinition processDefinition) {ProcessDefinitionResp definitionResp = new ProcessDefinitionResp();definitionResp.setId(processDefinition.getId());definitionResp.setCategory(processDefinition.getCategory());definitionResp.setName(processDefinition.getName());definitionResp.setKey(processDefinition.getKey());definitionResp.setDescription(processDefinition.getDescription());definitionResp.setVersion(processDefinition.getVersion());definitionResp.setResourceName(processDefinition.getResourceName());definitionResp.setDeploymentId(processDefinition.getDeploymentId());definitionResp.setDiagramResourceName(processDefinition.getDiagramResourceName());definitionResp.setHasStartFormKey(processDefinition.hasStartFormKey());definitionResp.setHasGraphicalNotation(processDefinition.hasGraphicalNotation());definitionResp.setSuspended(processDefinition.isSuspended());definitionResp.setTenantId(processDefinition.getTenantId());definitionResp.setDerivedFrom(processDefinition.getDerivedFrom());definitionResp.setDerivedFromRoot(processDefinition.getDerivedFromRoot());definitionResp.setDerivedVersion(processDefinition.getDerivedVersion());definitionResp.setEngineVersion(processDefinition.getEngineVersion());return definitionResp;}
}

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.flowable.task.api.Task;import java.io.Serializable;
import java.util.*;/*** 任务*/
@Getter
@Setter
@Accessors(chain = true)
public class TaskResp implements Serializable {String id;String name;String description;int priority;String owner;String assignee;String processInstanceId;String executionId;String taskDefinitionId;String processDefinitionId;String scopeId;String subScopeId;String scopeType;String scopeDefinitionId;Date createTime;String taskDefinitionKey;Date dueDate;String category;String parentTaskId;String tenantId;String formKey;Map<String, Object> taskLocalVariables;Map<String, Object> processVariables;List<IdentityLinkInfoResp> identityLinks;Date claimTime;public static TaskResp copy(Task task) {TaskResp taskResp = new TaskResp();taskResp.setId(task.getId());taskResp.setName(task.getName());taskResp.setDescription(task.getDescription());taskResp.setPriority(task.getPriority());taskResp.setOwner(task.getOwner());taskResp.setAssignee(task.getAssignee());taskResp.setProcessInstanceId(task.getProcessInstanceId());taskResp.setExecutionId(task.getExecutionId());taskResp.setTaskDefinitionId(task.getTaskDefinitionId());taskResp.setProcessDefinitionId(task.getProcessDefinitionId());taskResp.setScopeId(task.getScopeId());taskResp.setSubScopeId(task.getSubScopeId());taskResp.setScopeType(task.getScopeType());taskResp.setScopeDefinitionId(task.getScopeDefinitionId());taskResp.setCreateTime(task.getCreateTime());taskResp.setTaskDefinitionKey(task.getTaskDefinitionKey());taskResp.setDueDate(task.getDueDate());taskResp.setCategory(task.getCategory());taskResp.setParentTaskId(task.getParentTaskId());taskResp.setTenantId(task.getTenantId());taskResp.setFormKey(task.getFormKey());taskResp.setTaskLocalVariables(task.getTaskLocalVariables());taskResp.setProcessVariables(task.getProcessVariables());
//        List<? extends IdentityLinkInfo> identityLinks1 = task.getIdentityLinks();taskResp.setIdentityLinks(new ArrayList<>());
//        if (Objects.nonNull(identityLinks1) && !identityLinks1.isEmpty()) {
//            for (IdentityLinkInfo identityLinkInfo : identityLinks1) {
//                taskResp.getIdentityLinks().add(IdentityLinkInfoResp.copy(identityLinkInfo));
//            }
//        }taskResp.setClaimTime(task.getClaimTime());return taskResp;}
}

Flowable基本的模块

Modeler 模型
Process 流程
Task 任务

模型部署后,就是流程定义。
从流程定义创建流程实例。
流程实例中有多个任务,任务有很多种类。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程开户身份证识别OCR技术:革新传统流程,实现高效身份验证

远程开户是指通过互联网或其他远程通信方式&#xff0c;不需要亲自前往银行、证券公司或其他金融机构的实体营业网点&#xff0c;即可完成开立账户和办理相关服务的过程。 相比传统柜台开户方式&#xff0c;远程开户具有更高的便利性和灵活性。它使得用户可以随时随地通过网络…

基于PHP的创意设计分享系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

【故障诊断】用于轴承故障诊断的候选故障频率优化克改进包络频谱研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

微信小程序完整项目实战(前端+后端)

基于微信小程序的在线商城点单系统 前言&#xff1a;闲来无事&#xff0c;想以后自己开一个小超市或者小吃店&#xff0c;能够支持线上下单&#xff0c;既方便客户也方便自己。系统采用Java语言作为后端实现与小程序的交互&#xff0c;给用来学习或者想自己开个小店的朋友当个参…

在亚马逊云科技Amazon SageMaker上进行Stable Diffusion模型训练和推理

Stable Diffusion Quick Kit是一个基于亚马逊云科技Amazon SageMaker进行Stable Diffusion模型快速部署的工具包&#xff0c;包括了一组示例代码、服务部署脚本、前端UI&#xff0c;可以帮助可以快速部署一套Stable Diffusion的原型服务。 本文将介绍如何在SageMaker Training …

服务器中了mkp勒索病毒怎么处理,mkp勒索病毒解密,数据恢复

10月份以来&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业的服务器数据库被加密&#xff0c;严重影响了企业工作&#xff0c;通过这一波mkp勒索病毒的攻击&#xff0c;云天数据恢复工程师为大家总结了…

【AI视野·今日Sound 声学论文速览 第二十六期】Mon, 16 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 16 Oct 2023 Totally 7 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Low-latency Speech Enhancement via Speech Token Generation Authors Huaying Xue, Xiulian Peng, Yan Lu现有的基于深度学习的语音增强…

中文编程开发语言工具开发的实际软件案例:称重管理系统软件

中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件 中文编程开发语言工具开发的实际软件案例&#xff1a;称重管理系统软件&#xff0c;软件可以安装在电脑上&#xff0c;也可以安装在收银机上&#xff0c;支持触摸和鼠标点&#xff0c;想学编程可以关注系统…

【web前端】web前端设计入门到实战第一弹——html基础精华

前端 一&#xff1a;图片属性二&#xff1a;音频标签三&#xff1a; 视频标签四&#xff1a;链接标签五&#xff1a;列表标签5.1.无序列表5.2.有序列表3.自定义列表 六&#xff1a;表格6.1合并单元格 七&#xff1a;input标签八&#xff1a;select系列九&#xff1a; 文本域标签…

《软件方法》2023版第1章(10)应用UML的建模工作流-大图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 1.4 应用UML的建模工作流 1.4.1 概念 我用类图表示建模工作流相关概念如图1-16。 图1-16 建模工作流相关概念 图1-16左侧灰色部分定义了“游戏规则”&#xff0c;右侧则是在“游戏规…

Canvas绘图学习笔记:画笔的路径与状态

beginPath beginPath表示开始一个路径&#xff0c;我们在上一章画弧的时候用到过好多次&#xff0c;他的API非常简单&#xff1a; context.beginPath(); 开始路径有2层意思&#xff0c;一个就是本次绘制的起点是新的&#xff08;不再是上次结束的点了&#xff09;&#xff0…

强大的下载管理器:Progressive Downloader for Mac

Progressive Downloader for Mac是一种强大的下载管理器&#xff0c;它可以帮助用户更快速、更稳定地下载文件。相比于其他下载工具&#xff0c;PD下载管理器具有很多独特的功能和优势&#xff0c;本文将对其进行详细推广。 在数字化时代&#xff0c;下载已成为我们日常工作中必…

pdf压缩文件怎么压缩最小?

pdf压缩文件怎么压缩最小&#xff1f;我们很多项目介绍或是学术的报告都是采用的这个pdf格式&#xff0c;那么我们在存储或是需要进行分享的时候&#xff0c;可能就会因为文件过大而导致无法打开或是发送了。那么就需要将其进行压缩。PDF文件压缩方法很多&#xff0c;pdf压缩文…

web前端面试-- http的各个版本的区别(HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP/3.0)

本人是一个web前端开发工程师&#xff0c;主要是vue框架&#xff0c;整理了一些面试题&#xff0c;今后也会一直更新&#xff0c;有好题目的同学欢迎评论区分享 ;-&#xff09; web面试题专栏&#xff1a;点击此处 http的各个版本的区别 HTTP&#xff08;超文本传输协议&…

el-input: 把不符合正则校验的值动态清空,只保留符合的值

<el-input v-model"form.profit" placeholder"请输入授权专利新增利润" input"handleInput" clearable />/*** 不符合正则校验,清空*/const handleInput () > {if (form.value.profit) {if (!/^\d*\.?\d*$/.test(form.value.profit))…

Elasticsearch7.9.3保姆级安装教程

Linux版本Elasticsearch版本(待安装)Kibana版本(待安装)CentOS 77.9.37.9.3 一、下载地址 1、官网下载 打开地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff0c;按如图所示选择对应版本即可 2、采用wget下载 为了不必要的麻烦&#xff0c;建…

【vscode编辑器插件】前端 php unity自用插件分享

文章目录 一篇一句前言前端vuegitphpunity后端其他待续完结 一篇一句 “思考是最困难的工作&#xff0c;这也许是为什么很少有人这样做。” - 亨利福特&#xff08;Henry Ford&#xff09; 前言 无论是什么语言&#xff0c;我都会选择使用vscode进行开发&#xff0c;我愿称v…

麒麟kylinOS 2303制作自定义免交互安装镜像

原文链接&#xff1a;麒麟kylinOS 2303制作自定义免交互安装镜像 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇麒麟kylinOS 2303制作自定义免交互ISO安装镜像的文章&#xff0c;内容相对来说比较简单&#xff0c;测试安装了一个360浏览器软件&#xff0c;后续复杂…

openstack 云主机 linux报 login incorrect

还未输入密码就提示login incorrect 不给输密码位置 完全不给输密码的机会 关机进入单用户 检查登录安全记录 vi /var/log/secure 发现 /usr/lib64/security/pam_unix.so 报错 将正常的机器提取/usr/lib64/security/pam_unix.so 比对MD5一致&#xff0c; 另外判断 libtir…