当前位置: 首页 > article >正文

Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程

前言

        上一篇文章我们已经完成了流程的部署功能,那么下一步就是要激活流程了,但是我们要需要明确的指定具体要激活部署后的哪一条流程,所以我们先把已部署的基础信息以及具体定义信息分页查询出来,本文先把基础代码生成以及完成分页查询已部署的基础信息。

一、基础代码生成

        这一步代码自动生成步骤与同专栏中的这一篇文章:Flowable7.x学习笔记(六)Vue3+SpringBoot3实现流程定义保存功能 中的第二步是完全一样的,这边我就只把代码贴出来,如果想要知道具体是怎么生成的请查看这篇文章。

① 实体类

package com.ceair.entity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;import java.io.Serial;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;/*** <p>* 流程部署基础信息表* </p>** @author wangbaohai* @since 2025-04-20*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ACT_RE_DEPLOYMENT")
public class ActReDeployment implements Serializable {@Serialprivate static final long serialVersionUID = 1L;@TableId(value = "ID_", type = IdType.ASSIGN_ID)private String id;@TableField("NAME_")private String name;@TableField("CATEGORY_")private String category;@TableField("KEY_")private String key;@TableField("TENANT_ID_")private String tenantId;@TableField("DEPLOY_TIME_")private LocalDateTime deployTime;@TableField("DERIVED_FROM_")private String derivedFrom;@TableField("DERIVED_FROM_ROOT_")private String derivedFromRoot;@TableField("PARENT_DEPLOYMENT_ID_")private String parentDeploymentId;@TableField("ENGINE_VERSION_")private String engineVersion;}
package com.ceair.entity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;/*** <p>* 流程部署定义信息表* </p>** @author wangbaohai* @since 2025-04-20*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ACT_RE_PROCDEF")
public class ActReProcdef implements Serializable {@Serialprivate static final long serialVersionUID = 1L;@TableId(value = "ID_", type = IdType.ASSIGN_ID)private String id;@TableField("REV_")private Integer rev;@TableField("CATEGORY_")private String category;@TableField("NAME_")private String name;@TableField("KEY_")private String key;@TableField("VERSION_")private Integer version;@TableField("DEPLOYMENT_ID_")private String deploymentId;@TableField("RESOURCE_NAME_")private String resourceName;@TableField("DGRM_RESOURCE_NAME_")private String dgrmResourceName;@TableField("DESCRIPTION_")private String description;@TableField("HAS_START_FORM_KEY_")private Integer hasStartFormKey;@TableField("HAS_GRAPHICAL_NOTATION_")private Integer hasGraphicalNotation;@TableField("SUSPENSION_STATE_")private Integer suspensionState;@TableField("TENANT_ID_")private String tenantId;@TableField("ENGINE_VERSION_")private String engineVersion;@TableField("DERIVED_FROM_")private String derivedFrom;@TableField("DERIVED_FROM_ROOT_")private String derivedFromRoot;@TableField("DERIVED_VERSION_")private Integer derivedVersion;}

② mapper 接口

package com.ceair.mapper;import com.ceair.entity.ActReDeployment;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;/*** <p>* 流程部署定义信息表 Mapper 接口* </p>** @author wangbaohai* @since 2025-04-20*/
@Mapper
public interface ActReDeploymentMapper extends BaseMapper<ActReDeployment> {}
package com.ceair.mapper;import com.ceair.entity.ActReProcdef;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;/*** <p>* 流程部署基础信息表 Mapper 接口* </p>** @author wangbaohai* @since 2025-04-20*/
@Mapper
public interface ActReProcdefMapper extends BaseMapper<ActReProcdef> {}

③ 服务

package com.ceair.service;import com.ceair.entity.ActReDeployment;
import com.baomidou.mybatisplus.extension.service.IService;/*** <p>* 流程部署定义信息表 服务类* </p>** @author wangbaohai* @since 2025-04-20*/
public interface IActReDeploymentService extends IService<ActReDeployment> {}
package com.ceair.service;import com.ceair.entity.ActReProcdef;
import com.baomidou.mybatisplus.extension.service.IService;/*** <p>* 流程部署基础信息表 服务类* </p>** @author wangbaohai* @since 2025-04-20*/
public interface IActReProcdefService extends IService<ActReProcdef> {}

④ 服务实现

package com.ceair.service.impl;import com.ceair.entity.ActReDeployment;
import com.ceair.mapper.ActReDeploymentMapper;
import com.ceair.service.IActReDeploymentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;/*** <p>* 流程部署基础信息表 服务实现类* </p>** @author wangbaohai* @since 2025-04-20*/
@Service
public class ActReDeploymentServiceImpl extends ServiceImpl<ActReDeploymentMapper, ActReDeployment> implements IActReDeploymentService {}
package com.ceair.service.impl;import com.ceair.entity.ActReProcdef;
import com.ceair.mapper.ActReProcdefMapper;
import com.ceair.service.IActReProcdefService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;/*** <p>*  服务实现类* </p>** @author wangbaohai* @since 2025-04-20*/
@Service
public class ActReProcdefServiceImpl extends ServiceImpl<ActReProcdefMapper, ActReProcdef> implements IActReProcdefService {}

⑤ XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ceair.mapper.ActReDeploymentMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.ceair.entity.ActReDeployment"><id column="ID_" property="id" /><result column="NAME_" property="name" /><result column="CATEGORY_" property="category" /><result column="KEY_" property="key" /><result column="TENANT_ID_" property="tenantId" /><result column="DEPLOY_TIME_" property="deployTime" /><result column="DERIVED_FROM_" property="derivedFrom" /><result column="DERIVED_FROM_ROOT_" property="derivedFromRoot" /><result column="PARENT_DEPLOYMENT_ID_" property="parentDeploymentId" /><result column="ENGINE_VERSION_" property="engineVersion" /></resultMap><sql id="Base_Column_List">ID_, NAME_, CATEGORY_, KEY_, TENANT_ID_, DEPLOY_TIME_,DERIVED_FROM_, DERIVED_FROM_ROOT_, PARENT_DEPLOYMENT_ID_, ENGINE_VERSION_</sql></mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ceair.mapper.ActReProcdefMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.ceair.entity.ActReProcdef"><id column="ID_" property="id" /><result column="REV_" property="rev" /><result column="CATEGORY_" property="category" /><result column="NAME_" property="name" /><result column="KEY_" property="key" /><result column="VERSION_" property="version" /><result column="DEPLOYMENT_ID_" property="deploymentId" /><result column="RESOURCE_NAME_" property="resourceName" /><result column="DGRM_RESOURCE_NAME_" property="dgrmResourceName" /><result column="DESCRIPTION_" property="description" /><result column="HAS_START_FORM_KEY_" property="hasStartFormKey" /><result column="HAS_GRAPHICAL_NOTATION_" property="hasGraphicalNotation" /><result column="SUSPENSION_STATE_" property="suspensionState" /><result column="TENANT_ID_" property="tenantId" /><result column="ENGINE_VERSION_" property="engineVersion" /><result column="DERIVED_FROM_" property="derivedFrom" /><result column="DERIVED_FROM_ROOT_" property="derivedFromRoot" /><result column="DERIVED_VERSION_" property="derivedVersion" /></resultMap><sql id="Base_Column_List">ID_, REV_, CATEGORY_, NAME_, KEY_, VERSION_, DEPLOYMENT_ID_,RESOURCE_NAME_, DGRM_RESOURCE_NAME_, DESCRIPTION_, HAS_START_FORM_KEY_,HAS_GRAPHICAL_NOTATION_, SUSPENSION_STATE_, TENANT_ID_,ENGINE_VERSION_, DERIVED_FROM_, DERIVED_FROM_ROOT_, DERIVED_VERSION_</sql></mapper>

二、后端:完成部署信息分页查询功能

① 创建请求参数

package com.ceair.entity.request;import lombok.Data;import java.io.Serial;
import java.io.Serializable;/*** @author wangbaohai* @ClassName QueryActReDeploymentReq* @description: 分页查询流程部署基础信息请求对象* @date 2025年04月20日* @version: 1.0.0*/
@Data
public class QueryActReDeploymentReq implements Serializable {@Serialprivate static final long serialVersionUID = 1L;/*** 页面请求参数-流程Key*/private String processKey;/*** 页面请求对象,用于封装分页查询的相关参数。* 该对象通常包含页码、每页记录数等信息,用于在分页查询时传递给服务层或数据访问层。*/private PageReq pageReq;}

② 创建响应参数VO

package com.ceair.entity.vo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;/*** @author wangbaohai* @ClassName ActReDeploymentVO* @description: 流程部署基础信息VO* @date 2025年04月21日* @version: 1.0.0*/
@Data
public class ActReDeploymentVO implements Serializable {@Serialprivate static final long serialVersionUID = 1L;private String id;private String name;private String category;private String key;private String tenantId;@DateTimeFormat(pattern = "yyyy-MM-dd")@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")private LocalDateTime deployTime;private String derivedFrom;private String derivedFromRoot;private String parentDeploymentId;private String engineVersion;}

③ 创建模型转换工具

package com.ceair.utils;import com.ceair.entity.ActReDeployment;
import com.ceair.entity.vo.ActReDeploymentVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;/*** @author wangbaohai* @ClassName ActReDeploymentStructMapper* @description: 活动部署基础信息结构映射器* @date 2025年04月21日* @version: 1.0.0*/
@Mapper
public interface ActReDeploymentStructMapper {// 映射器的实例,通过Mappers工具类获取ActReDeploymentStructMapper INSTANCE = Mappers.getMapper(ActReDeploymentStructMapper.class);/*** 将ActReDeployment实体转换为VO(view object)对象* @param actReDeployment 不得为空的ActReDeployment实体* @return 转换后的ActReDeploymentVO对象*/default ActReDeploymentVO toVO(ActReDeployment actReDeployment) {if (actReDeployment == null) {throw new IllegalArgumentException("Input parameter 'actReDeployment' cannot be null.");}return mapToVO(actReDeployment);}/*** 实际执行ActReDeployment到ActReDeploymentVO转换的方法* @param actReDeployment ActReDeployment实体* @return 转换后的ActReDeploymentVO对象*/ActReDeploymentVO mapToVO(ActReDeployment actReDeployment);/*** 将ActReDeploymentVO对象转换回ActReDeployment实体* @param actReDeploymentVO 不得为空的ActReDeploymentVO对象* @return 转换后的ActReDeployment实体*/default ActReDeployment toEntity(ActReDeploymentVO actReDeploymentVO) {if (actReDeploymentVO == null) {throw new IllegalArgumentException("Input parameter 'actReDeploymentVO' cannot be null.");}return mapToEntity(actReDeploymentVO);}/*** 实际执行ActReDeploymentVO到ActReDeployment转换的方法* @param actReDeploymentVO ActReDeploymentVO对象* @return 转换后的ActReDeployment实体*/ActReDeployment mapToEntity(ActReDeploymentVO actReDeploymentVO);}

④ 创建服务

/*** 分页查询 ActReDeployment 数据。* <p>* 该方法根据传入的查询条件对象 {@code QueryActReDeploymentReq},返回分页后的 {@code ActReDeployment} 数据。** @param queryActReDeploymentReq 查询条件对象,包含分页信息和筛选条件。*                                例如:分页参数(页码、每页大小)、部署名称、部署时间范围等。*                                如果为 null,则可能返回所有数据或默认分页结果,具体行为由实现决定。* @return 返回一个 {@code Page<ActReDeployment>} 对象,包含查询结果的分页信息。* 结果中包括当前页的数据列表、总记录数、总页数等分页相关信息。*/
Page<ActReDeployment> queryActReDeploymentWithPage(QueryActReDeploymentReq queryActReDeploymentReq);

⑤ 创建服务实现

/*** 查询流程部署基础信息并分页返回结果。** @param queryActReDeploymentReq 查询条件请求对象,包含分页信息和其他查询参数。*                                如果为 null 或其内部的分页信息为 null,则使用默认分页参数。* @return 返回一个分页对象 Page<ActReDeployment>,包含查询到的流程部署基础信息。* 如果查询过程中发生异常,则抛出 BusinessException。*/
@Override
public Page<ActReDeployment> queryActReDeploymentWithPage(QueryActReDeploymentReq queryActReDeploymentReq) {// 初始化分页工具以及参数,默认为第一页,每页10条数据long current = 1;long size = 10;// 检查请求对象及其分页参数是否为空,并根据需要设置分页参数if (queryActReDeploymentReq != null && queryActReDeploymentReq.getPageReq() != null) {current = queryActReDeploymentReq.getPageReq().getCurrent() > 0 ?queryActReDeploymentReq.getPageReq().getCurrent() : current;size = queryActReDeploymentReq.getPageReq().getSize() > 0 ?queryActReDeploymentReq.getPageReq().getSize() : size;}// 初始化分页对象,用于存储分页查询结果Page<ActReDeployment> page = new Page<>(current, size);// 调用 mapper 进行分页查询,捕获可能的异常并记录日志try {return this.baseMapper.queryActReDeploymentWithPage(page, queryActReDeploymentReq);} catch (Exception e) {// 捕获异常并记录日志,避免系统崩溃log.error("查询流流程部署基础信息分页失败,请求参数: {}", queryActReDeploymentReq, e);throw new BusinessException("查询流程部署基础信息分页失败,请稍后重试", e);}
}

⑥ 创建自定义SQL

<sql id="Base_Column_List">
    ID_, NAME_, CATEGORY_, KEY_, TENANT_ID_, DEPLOY_TIME_,
    DERIVED_FROM_, DERIVED_FROM_ROOT_, PARENT_DEPLOYMENT_ID_, ENGINE_VERSION_
</sql>

<select id="queryActReDeploymentWithPage" resultMap="BaseResultMap">
    SELECT <include refid="Base_Column_List" /> FROM ACT_RE_DEPLOYMENT
    <where>
        <if test="queryActReDeploymentReq.processKey != null and queryActReDeploymentReq.processKey != ''">
            AND KEY_ LIKE CONCAT('%', #{queryActReDeploymentReq.processKey}, '%')
        </if>
    </where>
</select>

⑦ 创建接口

/*** 分页查询流程部署基础信息。** @param queryActReDeploymentReq 流程部署基础信息查询请求对象,包含分页和筛选条件等信息,不能为空。* @return 包含流程部署基础信息视图对象列表的分页结果。如果查询或转换失败,则返回错误信息。* <p>* 功能描述:* 1. 调用服务层方法查询流程部署基础信息,并返回分页结果。* 2. 将查询结果中的记录转换为视图对象(VO)列表。* 3. 返回封装的分页结果对象,包含转换后的视图对象列表和总记录数。* 4. 如果查询或转换过程中发生异常,记录错误日志并返回错误信息。*/
@PreAuthorize("hasAnyAuthority('/api/v1/actReDeployment/page')")
@Parameter(name = "queryActReDeploymentReq", description = "流程部署基础信息查询请求对象", required = true)
@Operation(summary = "分页查询流程部署基础信息")
@PostMapping("/page")
public PageResult<List<ActReDeploymentVO>> queryActReDeploymentWithPage(@RequestBody QueryActReDeploymentReq queryActReDeploymentReq) {try {// 调用服务层方法查询流程部署基础信息,并返回分页结果Page<ActReDeployment> page = actReDeploymentService.queryActReDeploymentWithPage(queryActReDeploymentReq);// 将查询结果中的记录转换为视图对象(VO)列表List<ActReDeploymentVO> list =Optional.ofNullable(page.getRecords()).orElse(Collections.emptyList()).parallelStream().map(record -> {try {// 使用映射器将实体对象转换为视图对象return ActReDeploymentStructMapper.INSTANCE.toVO(record);} catch (Exception e) {// 记录转换失败的错误信息log.error("转换流程部署基础信息失败 具体原因为 : {}", e.getMessage());return null;}}).filter(Objects::nonNull).toList();// 返回包含转换后列表和列表大小的PageResult对象return PageResult.success(list, page.getTotal());} catch (Exception e) {// 记录查询失败的错误信息,并返回错误结果log.error("查流程部署基础信息失败 具体原因为 : {}", e.getMessage());return PageResult.error("流程部署基础信息失败:" + e.getMessage());}
}

三、前端:完成分页查询功能

 ① 创建参数

// 分页请求参数
export interface PageReq {current: number // 当前页码,默认值为 1size: number // 每页显示记录数,默认值为 10
}// 分页查询流程部署请求对象
export interface QueryActReDeploymentReq {processKey: string // 页面请求参数-流程KeypageReq: PageReq // 分页请求对象,包含页码、每页记录数等信息
}// 流程部署对象
export interface ActReDeploymentVO {id: string // 主键ID(Java 中 String)name: string // 部署名称category: string // 类别key: string // 流程 KeytenantId: string // 租户 IDdeployTime: string // 部署时间,格式 "yyyy-MM-dd" 或 ISO 字符串derivedFrom: string // 源自(derivedFrom)derivedFromRoot: string // 源自根(derivedFromRoot)parentDeploymentId: string// 父部署 IDengineVersion: string // 引擎版本
}

② 创建接口

import type { QueryActReDeploymentReq } from './actReDeploymentType'
import request from '@/utils/http/request'// 分页查询部署信息
export function pageActReDeployment(data: QueryActReDeploymentReq) {return request.post<any>({url: '/pm-process/api/v1/actReDeployment/page',data,})
}

③ 创建查询界面

<script lang="ts" setup>
import type { ActReDeploymentVO, QueryActReDeploymentReq } from '@/api/actReDeployment/actReDeploymentType'
import { pageActReDeployment } from '@/api/actReDeployment/actReDeploymentApi'
import useLayoutStore from '@/store/modules/setting'
import { ElMessage } from 'element-plus'
import { onMounted, ref } from 'vue'// 使用layout组件小仓库
const layoutStore = useLayoutStore()// 定义响应式数据 processKey 收集查询条件的流程Key
const processKey = ref('')
// 定义响应式数据 currentPage 收集当前页码
const currentPage = ref<number>(1)
// 定义响应式数据 pageSize 收集每页显示的条数
const pageSize = ref<number>(10)
// 定义响应式数据 total 收集总数据条数
const total = ref<number>(0)
// 定义响应式数据 actReDeploymentList 表示流程定义列表
const actReDeploymentList = ref<ActReDeploymentVO[]>([])
// 表格列定义
const tableColumns = [{ label: '#', type: 'index', align: 'center', width: '50px' },{ label: 'ID', prop: 'id', align: 'center' },{ label: '部署名称', prop: 'name', align: 'center' },{ label: '流程Key', prop: 'key', align: 'center' },{ label: '部署时间', prop: 'deployTime', align: 'center' },
]/*** onMounted 生命周期钩子函数** 在组件挂载完成后执行以下操作:* 1. 初始化分页参数和流程名称。* 2. 调用函数获取流程定义的分页数据。** @param {Function} callback - Vue 的 onMounted 钩子函数的回调,无参数和返回值。*/
onMounted(() => {// 初始化分页参数:当前页为第一页,每页显示10条数据currentPage.value = 1pageSize.value = 10// 初始化流程名称为空字符串processKey.value = ''// 调用函数获取流程定义的分页数据getActReDeploymentPageData()
})/*** 获取流程部署分页数据的异步函数。** @function getActReDeploymentPageData* @description 该函数用于组装分页查询参数,调用分页接口获取流程部署数据,并处理成功或失败的结果。*              如果查询成功,更新流程列表;如果失败,捕获异常并显示错误消息。** @returns {Promise<void>} 无返回值,异步操作完成后更新相关状态或显示错误信息。*/
async function getActReDeploymentPageData() {try {// 组装分页查询参数,包含部署Key和分页信息const queryParams: QueryActReDeploymentReq = {processKey: processKey.value,pageReq: {current: currentPage.value,size: pageSize.value,},}// 调用分页接口const result: any = await pageActReDeployment(queryParams)// 判断查询结果是否成功,成功则更新流程列表和总记录数if (result.success && result.code === 200) {actReDeploymentList.value = result.data}}catch (error) {// 捕获异常并提取错误信息let errorMessage = '未知错误'if (error instanceof Error) {errorMessage = error.message}// 显示异常错误消息ElMessage({message: `查询失败: ${errorMessage || '未知错误'}`,type: 'error',})}
}// 重置查询条件
function resetQuery() {layoutStore.refresh = !layoutStore.refresh
}/*** 处理页面数据的函数。* 该函数调用获取流程定义页面数据的方法。** @function handerPageData*/
function handerPageData() {// 调用获取流程定义页面数据的函数getActReDeploymentPageData()
}
</script><template><!-- 查询条件区域 --><el-card style="height: 75px;"><el-form :inline="true" class="form-inline"><el-form-item label="流程Key"><el-inputv-model.trim="processKey"placeholder="请输入流程Key"maxlength="50"show-word-limit/></el-form-item><el-form-item><el-button v-hasButton="`btn.actReDeployment.page`" type="primary" icon="Search" @click="getActReDeploymentPageData">查询</el-button><el-button icon="Refresh" @click="resetQuery">重置</el-button></el-form-item></el-form></el-card><!-- 查询结果列表区域 --><el-card style="margin: 10px 0px;"><el-table style="margin: 10px 0px;" :border="true" :data="actReDeploymentList"><!-- ID 区域 --><el-table-column type="selection" align="center" width="50px" /><!-- 表格数据 区域 --><el-table-columnv-for="(column, index) in tableColumns":key="index":type="column.type":label="column.label":prop="column.prop":align="column.align":width="column.width"/></el-table><!-- 分页器 --><el-paginationv-model:current-page="currentPage"v-model:page-size="pageSize":page-sizes="[10, 20, 30, 40, 50]"layout="prev, pager, next, jumper,->, sizes, total":total="Math.max(total, 0)"@current-change="getActReDeploymentPageData"@size-change="handerPageData"/></el-card>
</template><style scoped>
.form-inline {display: flex;justify-content: space-between;align-items: center;flex-wrap: wrap; /* 适配小屏幕 */
}
</style>

四、配置权限

① 增加菜单

② 增加按钮

③ 分配权限

 五、查询结果展示

六、后记

本篇文章的前后端仓库地址请查询专栏第一篇文章

本文的后端分支是 process-5

本文的前端分支是 process-7

相关文章:

Flowable7.x学习笔记(十)分页查询已部署 BPMN XML 流程

前言 上一篇文章我们已经完成了流程的部署功能&#xff0c;那么下一步就是要激活流程了&#xff0c;但是我们要需要明确的指定具体要激活部署后的哪一条流程&#xff0c;所以我们先把已部署的基础信息以及具体定义信息分页查询出来&#xff0c;本文先把基础代码生成以及完成分页…...

【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(15):NaiveExecutor

CangjieMagic框架&#xff1a;使用华为仓颉编程语言编写&#xff0c;专门用于开发AI Agent&#xff0c;支持鸿蒙、Windows、macOS、Linux等系统。 这篇文章剖析一下 CangjieMagic 框架中的 NaiveExecutor。 1 NaiveExecutor是什么&#xff1f; #mermaid-svg-u9WgSijieH1Pk0xU…...

Office文档图片批量提取工具

Office.Files.Images 是一款专注于从 Word、Excel、PPT 等 Office 文档中批量提取图片的轻量级工具&#xff0c;支持 .docx、.xlsx、.pptx 格式文件。该软件体积仅 ‌343KB‌&#xff0c;无需安装即可运行&#xff0c;通过拖拽操作实现快速解析与导出&#xff0c;尤其适合需批量…...

33-公交车司机管理系统

技术&#xff1a; 基于 B/S 架构 SpringBootMySQLvueelementui 环境&#xff1a; Idea mysql maven jdk1.8 node 用户端功能 1.首页:展示车辆信息及车辆位置和线路信息 2.模块:车辆信息及车辆位置和线路信息 3.公告、论坛 4.在线留言 5.个人中心:修改个人信息 司机端功能…...

PyCharm 初级教程:从安装到第一个 Python 项目

作为 Python 程序员&#xff0c;无论是刚入门还是工作多年&#xff0c;PyCharm 都是一个绕不开的开发工具。它是 JetBrains 出品的一款强大的 Python IDE&#xff0c;有自动补全、调试、虚拟环境支持、代码检查等等功能&#xff0c;体验比命令行 记事本舒服一百倍。 今天这篇…...

文件上传漏洞3

1. 例题:文件上传限制 1&#xff09;上传漏洞靶场介绍 项目名称: upload-labs开发语言: 使用PHP语言编写功能定位: 专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场关卡数量: 目前共21关&#xff0c;每关包含不同上传方式注意事项: 每关没有固定通关方法&#xff0c;不要自限…...

QML FontDialog:使用FontDialog实现字体选择功能

目录 引言相关阅读FontDialog基本介绍字体属性 实例演示项目结构代码实现Main.qmlmain.cpp 代码解析运行效果 总结 引言 在桌面应用程序开发中&#xff0c;字体选择是一个常见的需求。Qt Quick提供了FontDialog组件来实现这一功能。本文将介绍如何在Qt Quick应用程序中使用Fon…...

力扣刷题Day 27:环形链表(141)

1.题目描述 2.思路 创建一个结点集合&#xff0c;遍历链表&#xff0c;如果遇到已经加进集合的结点就说明链表有环。 3.代码&#xff08;Python3&#xff09; class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:node headnode_set set()while node…...

1.1软考系统架构设计师:系统架构的定义与作用 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

超简记忆要点 定义&#xff1a;结构决策 | 抽象概念 | 多视图模型&#xff08;逻辑/物理/动态&#xff09;作用&#xff1a;解耦复杂需求 | 集成扩展 | 指导开发&#xff08;蓝图&#xff09;要素&#xff1a;构件&#xff08;原子/复合&#xff09; | 连接件&#xff08;API/…...

研发效率破局之道阅读总结(3)工程优化

研发效率破局之道阅读总结(3)工程优化 Author: Once Day Date: 2025年4月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

metasploit(2)生成dll木马

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 一、dll文件基本概念 DLL 是一种包含可由多个程序同时使用的代码和数…...

数据结构--并查集-高效处理连通性问题

目录 一、理论基础 &#xff08;1&#xff09;并查集的功能及实现原理 &#xff08;2&#xff09;代码模版 &#xff08;3&#xff09;模拟过程 &#xff08;4&#xff09;应用 二、基础题练习 &#xff08;1&#xff09;寻找存在的路径&#xff08;模版题&#xff09; …...

PLOG安装

Plog可以通过以下命令安装 cd ~ && git clone https://github.com/SergiusTheBest/plog.gitcd plog && mkdir buildcd build && cmake ..make && sudo make installcd ~ && sudo rm -rf ./plog若无法科学上网&#xff0c;可使用git cl…...

LeetCode 热题 100_分割等和子集(89_416_中等_C++)(动态规划)

LeetCode 热题 100_分割等和子集&#xff08;89_416&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;动态规划&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;动态规划&#xff0…...

WPS Office安卓版云文档同步速度与PDF转换体验测评

WPS Office安卓版是很多人常用的移动办公软件。它支持在线编辑、文档同步、格式转换等功能&#xff0c;适合手机和平板用户随时处理文档。我们用它配合谷歌浏览器打开网页文档时&#xff0c;也可以将内容快速保存到云端或转换成PDF格式使用。 先说云文档同步。在打开WPS Office…...

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注册中心2.CAP理论3.常见的注册中心 二.Eureka介绍1.搭建Eureka Server 注册中心2.搭建服务注册3.服务发现 三.负载均衡LoadBalance1.问题引入2.服务端负载均衡3.客户端负载均衡4.Spring Cloud LoadBalancer1).快速上手2)负载均衡策…...

【Linux网络】构建基于UDP的简单聊天室系统

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

【每天一个知识点】大模型的幻觉问题

“大模型的幻觉问题”是指大语言模型&#xff08;如GPT系列、BERT衍生模型等&#xff09;在生成内容时&#xff0c;产生不符合事实或逻辑的虚假信息&#xff0c;即所谓的“幻觉”&#xff08;hallucination&#xff09;。这在诸如问答、摘要、翻译、代码生成等任务中尤其常见。…...

机器学习06-RNN

RNN&#xff08;循环神经网络&#xff09;学习笔记 一、RNN 概述 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类以序列数据为输入&#xff0c;在序列的演进方向进行递归且所有节点&#xff08;循环单元&#xff09;按链式连接的递归神…...

[大模型]什么是function calling?

什么是function calling&#xff1f; 大模型的 ​​Function Calling​​&#xff08;函数调用&#xff09;是一种让大语言模型&#xff08;如 GPT、Claude 等&#xff09;与外部工具、API 或自定义函数交互的机制。 它的核心目的是让模型能够根据用户的需求&#xff0c;​​…...

C语言高频面试题——嵌入式系统中中断服务程序

在嵌入式系统中&#xff0c;中断服务程序&#xff08;ISR&#xff09;的设计需遵循严格的规则以确保系统稳定性和实时性。以下是对这段代码的分析及改进建议&#xff1a; 代码分析 __interrupt double compute_area (double radius) { double area PI * radius * radius; pri…...

Java高频面试之并发编程-05

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;线程有哪些调度方法&#xff1f; 在Java中&#xff0c;线程的调用方法主要包括以下几种方式&#xff0c;每种方式适用于…...

野外价值观:在真实世界的语言模型互动中发现并分析价值观

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

【Linux】47.高级IO(1)

文章目录 1. 高级IO1.1 五种IO模型1.2 高级IO重要概念1.2.1 同步通信 vs 异步通信1.2.2 阻塞 vs 非阻塞 1.3非阻塞IO1.3.1 fcntl1.3.2 实现函数SetNoBlock1.3.3 轮询方式读取标准输入1.3.4 I/O多路转接之select1.3.4.1 初识select&#xff1a;1.3.4.2 select函数原型1.3.4.3 理…...

notepad++技巧:查找和替换:扩展 or 正则表达式

notepad 有很多优点&#xff1a;多标签&#xff0c;代码高亮&#xff0c;我最喜欢的是查找和替换。 除了可以一次性查找所有打开文件&#xff0c;还可以使用 扩展 or 正则表达式。 例如&#xff1a; 去掉空行&#xff1a;正则表达式&#xff1a; ^\s*$\r\n ^ 表示行首。\s*…...

【图像标注技巧】目标检测图像标注技巧

介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能&#xff0c;deep research检测调研报告也可以进行参考。 拉框类的标注&#xff0c;如果你不确定哪种方法好&#xff0c;你可以把所标注区域的都剪切出来&#xff0c;然后站在屏幕一米之外眯…...

MuJoCo中的机器人状态获取

UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…...

pnpm解决幽灵依赖问题

文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗&#xff1f;2. pnpm 解决了幽灵依赖问题吗&#xff1f;3. pnpm 是如何解决的&#xff1f;举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1&#xff1a;初始化项目并安装依赖步骤2&#xf…...

测试第四课---------性能测试工具

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

frp远程穿透配置

文章目录 准备工作服务端配置(toml)客户端配置(toml)访问内网服务使用ini文件配置 frp是一个高性能的反向代理应用&#xff0c;用于将位于内网的服务通过代理暴露到公网。以下是其基本使用步骤&#xff1a; 准备工作 拥有一台具有公网IP的服务器&#xff0c;作为frp的服务端。…...