server2008部署网站/app推广全国代理加盟
前言
在前面的两篇文章我们介绍了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&…...

js面试some和every的区别
1.基础使用 some和every 都是数组的一个方法let num [1,2,3,4,5,6] let flag1 num.some((item,index,array)> item > 2)let flag2 num.every((item,index, array)> item > 2)1.some 遍历判断中是符合条件的值 一旦找到则不会继续迭代下去 直接返回 2.every 遍历…...

Vue 中如何嵌入可浮动的第三方网页窗口(附Demo)
目录 前言1. 思路Demo2. 实战Demo 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 思路Demo 以下Demo提供思路参考,需要结合实际自身应用代码 下述URL的链接使用百度替代! 方式 1…...

【大数据技术】词频统计样例(hadoop+mapreduce+yarn)
词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…...

java进阶知识点
java回收机制 浅谈java中的反射 依赖注入的简单理解 通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~ 这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现…...

深度学习系列--02.损失函数
一.定义 损失函数(Loss Function)是机器学习和深度学习中用于衡量模型预测结果与真实标签之间差异的函数,它在模型训练和评估过程中起着至关重要的作用 二.作用 1.指导模型训练 提供优化方向:在训练模型时,我们的目…...

构建一个数据分析Agent:提升分析效率的实践
在上一篇文章中,我们讨论了如何构建一个智能客服Agent。今天,我想分享另一个实际项目:如何构建一个数据分析Agent。这个项目源于我们一个金融客户的真实需求 - 提升数据分析效率,加快决策速度。 从分析师的痛点说起 记得和分析师团队交流时的场景: 小张ÿ…...

在K8S中,如何把某个worker节点设置为不可调度?
在Kubernetes中,如果你想要把一个worker节点设置为不可调度,意味着你不想让Kubernetes调度器在这个节点上调度新的Pod。这通常用于维护或升级节点,或者当节点遇到硬件故障或性能问题时,要将某个worker节点设置为不可调度。 方法1…...

硬件电路基础
目录 1. 电学基础 1.1 原子 1.2 电压 1.3 电流 1.电流方向: 正极->负极,正电荷定向移动方向为电流方向,与电子定向移动方向相反。 2.电荷(这里表示负电荷)运动方向: 与电流方向相反 1.4 测电压的时候 2. 地线…...

5 前端系统开发:Vue2、Vue3框架(上):Vue入门式开发和Ajax技术
文章目录 前言一、Vue框架(简化DOM操作的一个前端框架):基础入门1 Vue基本概念2 快速入门:创建Vue实例,初始化渲染(1)创建一个入门Vue实例(2)插值表达式:{{表…...

阿里 Java 岗个人面经分享(技术三面 + 技术 HR 面):Java 基础 +Spring+JVM+ 并发编程 + 算法 + 缓存
技术一面 20 分钟 1、自我介绍 说了很多遍了,很流畅捡重点介绍完。 2、问我数据结构算法好不好 挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了) 3、找到单链表的三等分点,如果单链表是有环的…...

vue2-给data动态添加属性
vue2-给data动态添加属性 1. 问题的来源 在VUe2中(VUE3中使用了proxy,及时动态添加也能实现响应式),如果我们动态给data添加一个属性,会发现视图没有同步更新举个例子我们通过v-for遍历data中的一个属性list…...

Linux 文件和目录
Linux 文件和目录 文章目录 Linux 文件和目录Linux 目录Linux 目录配置的依据 --FHS目录树文件属性文件的分类一般权限 UGO特殊权限 suid\sgid\sticky隐藏属性 ATTR文件访问控制列表 ACL文件相关的命令权限的修改 chmod chown chgrp umaskchmodchgrpumask相关文档 /etc/profile…...

【大数据技术】本机DataGrip远程连接虚拟机MySQL/Hive
本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…...

Leetcode 3440. Reschedule Meetings for Maximum Free Time II
Leetcode 3440. Reschedule Meetings for Maximum Free Time II 1. 解题思路2. 代码实现 题目链接:3440. Reschedule Meetings for Maximum Free Time II 1. 解题思路 这一题某种意义上来说甚至是上一题Leetcode 3439的简化版本(关于这一题的解答可以…...

专门记录台式电脑常见问题
1、蓝屏死机,检查内存硬盘和cpu 2、拆内存条,用橡皮擦金手指 3、放主板静电,扣主板电池 4、系统时间不正确,主板电池没电 5、开机键坏了 6、电脑主机的风扇转,正常通电运行,但显示器没信号。看键盘的num键&…...

[操作系统] 进程终止
在计算机操作系统中,进程(Process)是程序在运行中的实例,而进程的生命周期始于创建,终于终止。进程终止不仅仅意味着程序执行结束,还涉及资源的回收、状态的传递、以及可能的错误处理。在 Linux 和 Unix 系…...

[x86 ubuntu22.04]进入S4失败
目录 1 问题描述 2 解决过程 2.1 查看内核日志 2.2 新建一个交换分区 2.3 指定交换分区的位置 1 问题描述 CPU:G6900E OS:ubuntu22.04 Kernel:6.8.0-49-generic 使用“echo disk > /sys/power/state”命令进入 S4,但是无法…...

12.外观模式(Facade Pattern)
定义 外观模式(Facade Pattern) 是一种结构型设计模式,它通过为复杂的子系统提供一个统一的接口,使得子系统的使用更加简化。外观模式通常隐藏了复杂的内部子系统,使得客户端可以通过一个简单的接口与这些子系统进行交…...

ES6 入门教程:箭头函数、解构赋值及其他新特性详解
ES6 入门教程:箭头函数、解构赋值及其他新特性详解 ES6 入门教程:箭头函数、解构赋值及其他新特性详解引言什么是 ES6?箭头函数(Arrow Functions)1. 基本语法2. 常见特点(1)没有自己的 this 上下…...

win编译openssl
一、perl执行脚本 1、安装perl脚本 perl安装 2、配置perl脚本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、编译openssl 1、使用vs工具编译nmake 如果使用命令行nmake编译会提示“无法打开包括文件: “limits.h”“ 等错误信息 所以…...

51单片机看门狗系统
在 STC89C52 单片机中,看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定,但是它在头文件中并未给出,因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…...

探索 paraphrase-MiniLM-L6-v2 模型在自然语言处理中的应用
在自然语言处理(NLP)领域,将文本数据转换为机器学习模型可以处理的格式是至关重要的。近年来,sentence-transformers 库因其在文本嵌入方面的卓越表现而受到广泛关注。本文将深入探讨 paraphrase-MiniLM-L6-v2 模型,这…...

2025最新软件测试面试大全(附答案+文档)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决? 首先,将问题提交到缺陷管理库里…...

Java语法进阶
目录: Object类、常用APICollection、泛型List、Set、数据结构、CollectionsMap与斗地主案例异常、线程线程、同步等待与唤醒案例、线程池、Lambda表达式File类、递归字节流、字符流缓冲流、转换流、序列化流、Files网络编程 十二、函数式接口Stream流、方法引用 一…...

UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK
UNI-MOL: A UNIVERSAL 3D MOLECULAR REPRESENTATION LEARNING FRAMEWORK Neurips23 推荐指数:#paper/⭐⭐⭐#(工作量不小) 动机 在大多数分子表征学习方法中,分子被视为 1D 顺序标记或2D 拓扑图,这限制了它们为下游任务整合…...

笔记day7
文章目录 1 分页功能实现2 分页器的展示需要哪些数据(条件)?3 自定义分页器4 分页器存在问题5 分页器动态展示6 开发某一个商品的详情页面 1 分页功能实现 为什么很多项目采用分页功能,比如电商平台同时展示的数据有很多…...

106,【6】 buuctf web [SUCTF 2019]CheckIn
进入靶场 文件上传 老规矩,桌面有啥传啥 过滤了<? 寻找不含<?的一句话木马 文件名 123(2).php.jpg 文件内容 GIF89a? <script language"php">eval($_GET[123]);</script> 123即密码,可凭借个人喜好更换 再上传一个文…...

基于Ubuntu2404搭建Zabbix7.2
Zabbix 搭建zabbix zabbix7.2已推出:官网 增加的新功能如下: 1.使用新的热门商品小部件全面概览指标 数据概览小部件已转换为热门项目小部件使用项目模式可以实现细粒度的项目选择利用条形图、指标和迷你图来可视化您的数据定义价值阈值以动态地可视化…...

OPENGLPG第九版学习 - 着色器基础
文章目录 2.1 着色器与OpenGL2.2 0penGL的可编程管线2.3 OpenGL着色语言GLSL概述2.3.1 使用GLSL构建着色器变量的声明变量的作用域变量的初始化构造函数 、 类型转换聚合类型访问向量和矩阵中的元素结构体数组多维数组 2.3.2 存储限制符const 存储限制符in 存储限制符out 存储限…...