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 流程
前言 上一篇文章我们已经完成了流程的部署功能,那么下一步就是要激活流程了,但是我们要需要明确的指定具体要激活部署后的哪一条流程,所以我们先把已部署的基础信息以及具体定义信息分页查询出来,本文先把基础代码生成以及完成分页…...
【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人
学习目标 在备考阿里云大模型高级工程师ACP认证时,学习《2.1用大模型构建新人答疑机器人》这部分内容,主要是为了掌握利用大模型技术构建高效答疑机器人的方法,提升在大模型应用开发领域的专业能力。具体目标如下: 掌握大模型API调用:学会通过API调用通义千问大模型,熟悉…...
设计模式深度总结:概念、实现与框架中的应用
【全网最全】23种设计模式思维导图详解 | 含React/Vue/Spring实战案例 导图概述 本文通过高清思维导图系统梳理了23种设计模式,分为创建型、结构型、行为型三大类,并标注了各模式在主流框架(如React、Vue、Spring)中的典型应用场…...
2025 活体识别+人脸认证工具类【阿里云api,需要先申请试用】
(1)获取活体检测的人脸URL地址和Token。 (2)活体检测成功后,使用Token验证人脸检测结果的一致性。 (3)对于检测结果一致的人脸照片,进行姓名、身份证号和照片的认证流程。 一、活…...
【HDFS】verifyEC命令校验EC数据正确性
verifyEC命令是HDFS里用于验证EC文件正确性的一个工具。这是一个非常实用的工具,能帮助我们确定EC的数据内容是否正确,并且如果不正确的话,还有可能会触发reportBadBlock给NN,让NN进行块的重构。 本文先介绍一下verifyEC命令的使用方法,再描述其实现原理细节。 一、命令…...
【PCIE730】基于PCIe总线架构的4路10G光纤通道适配器
板卡简介 PCIE730是一款基于PCI Express总线架构的4路10G光纤通道适配器,板卡具有4通道SFP万兆光纤接口,x8 PCIE主机接口,具有1组64位DDR3 SDRAM作为高速缓存,可以实现4通道光纤网络数据的高速采集、实时记录和宽带回放。 该板卡还…...
蚂蚁全媒体总编刘鑫炜再添新职,出任共工新闻社新媒体研究院院长
2025年4月18日,共工新闻社正式宣布聘任蚂蚁全媒体总编刘鑫炜为新媒体研究院院长。此次任命标志着刘鑫炜在新媒体领域的专业能力与行业贡献再次获得权威机构认可。 刘鑫炜深耕新媒体领域多年,曾担任中国新闻传媒集团新媒体研究院院长、蚂蚁全媒体总编等职…...
C++11——可调用对象
目录 lambda 表达式语法 捕捉列表 function bind 调整参数个数 参数顺序 lambda 表达式语法 lambda表达式本质上是匿名函数对象,该表达式在语法使用层是没有类型的,一般用auto或模板参数定义的对象去接收它的对象(模板参数定义的对象…...
【上位机——MFC】运行时类信息机制
运行时类信息机制的使用 类必须派生自CObject类内必须添加声明宏DECLARE_DYNAMIC(theClass)3.类外必须添加实现宏 IMPLEMENT_DYNAMIC(theClass,baseClass) 具备上述三个条件后,CObject::IsKindOf函数就可以正确判断对象是否属于某个类。 代码示例 #include <…...
数据中的知识产权问题
首席数据官高鹏律师团队编著 数据中的知识产权问题涉及法律、技术和社会多个层面,其复杂性随着数据价值的提升和数字化发展日益凸显。以下是核心要点的梳理和分析: 一、数据本身的知识产权属性 1. 原始数据(Raw Data) 通常不直…...
若依框架免登陆、页面全屏显示、打开新标签页(看板大屏)
1.免登陆:找到项目目录下src/permission.js,在白名单whiteList中添加上你的看板大屏路由地址,这样就不会校验该路由的token(这里我添加的是/mesBoard/mesqualityboard); 要注意的是此时免登陆进来也会报404…...
算法-策略(递归,二叉搜索)
分而治之 一个大问题不断拆成各种小问题,大问题与小问题的方向要一致。 递归函数(递减) 分析时间函数的两种方法:递归树(跟踪树) ,代换法。 例1 例2 这里的代换法注意,不要轻易的把常数加在一起,加在一起后看不出规…...
unity TEngine学习4
上一篇我们学习了UI部分,这一篇我们学习其他部分,按照老规矩还是先打开官方文档 ResourceModule 在官方文档里介绍了当前加载的设置,但是我们是小白看不懂,那就不管他内部怎么实现的,我们主要看下面的代码给的方法&am…...
掌握常见 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理
今天面试还问了除了 get 和 post 方法还有其他请求方法吗,一个都不知道,这里记录下。 🌐 常见 HTTP 请求方法一览 方法作用描述是否幂等是否常用GET获取资源,参数一般拼接在 URL 中✅ 是✅ 常用POST创建资源 / 提交数据ÿ…...
在线查看【免费】 mp3,wav,mp4,flv 等音视频格式文件文件格式网站
可以免费在线查看 .docx/wps/Office/wmf/ psd/ psd/eml/epub/dwg, dxf/ txt/zip, rar/ jpg/mp3 m.gszh.xyz m.gszh.xyz 免费支持以下格式文件在线查看类型 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx, xlam, xla, pages 等 Office 办…...
部署Kimi-VL-A3B-Instruct视频推理
部署Kimi-VL-A3B-Instruct视频推理 契机 ⚙ 最近国内AI公司月之暗面推出了Kimi-VL开源视觉模型。模型参数16.4B,但是推理时候激活参数2.8B。看了huggingface主页的Full comparison,在多项Benchmark的时候都展示出了不俗的实力。由于业务中使用了qwen-v…...
力扣面试经典150题(第二十四题)
问题 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必…...
Electron Demo 的快速编译与启动
前言 本文将带你从零开始,快速搭建并运行一个基于 OpenIMSDK 的 Electron 应用。本项目以 OpenIMSDK 开源版为基础,借助 openim/electron-client-sdk 与 openim/wasm-client-sdk,能够同时构建 Web 端及桌面端(Windows、macOS、Lin…...
Web3核心技术解析:从区块链到C++实践
Web3作为下一代互联网的核心架构,正在通过区块链、智能合约、分布式存储等技术的融合,重塑数字世界的信任与协作模式。本文将从技术原理、应用场景及C实践案例三个维度,深入解析Web3的核心技术体系。 一、Web3的核心技术栈 1. 区块链&#x…...
Elasticsearch中的_source字段讲解
_source 在 Elasticsearch 查询中用于限制返回的字段,类似于 SQL 中的 SELECT 指定列。 代码示例: esSearchResults = es_service.search_documents({"query": {"terms": {"file_id":...
LlamaIndex 生成的本地索引文件和文件夹详解
LlamaIndex 生成的本地索引文件和文件夹详解 LlamaIndex 在生成本地索引时会创建一个 storage 文件夹,并在其中生成多个 JSON 文件。以下是每个文件的详细解释: 1. storage 文件夹结构 1.1 docstore.json 功能:存储文档内容及其相关信息。…...
笔记:react中 父组件怎么获取子组件中的属性或方法
在子组件中我们可以使用下面两个方法去暴露你所要放行的属性或方法👇 1.useImperativeHandle 2.orwardRef 搭配使用例子 import React, { useState, forwardRef, useImperativeHandle } from "react"function Son(props, ref) {const [data] useStat…...
Python+CoppeliaSim+ZMQ remote API控制机器人跳舞
这是一个使用Python和CoppeliaSim(V-REP)控制ASTI人型机器人进行舞蹈动作的演示项目。 项目描述 本项目展示了如何使用Python通过ZeroMQ远程API与CoppeliaSim仿真环境进行交互,控制ASTI人型机器人执行预定义的舞蹈动作序列。项目包含完整的机…...
oracle rac时区问题导致远程查询时间不准
远程工具SQLDev工具和应用出来的时间都要慢12个小时 检查操作系统和硬件时间 # date Fri Apr 18 15:54:11 CST 2025 date -R Fri, 18 Apr 2025 16:06:24 0800 # hwclock -r Fri 18 Apr 2025 04:08:38 PM CST -0.313786 seconds 都是没有问题,时间和时区都是…...
LPO 光模块:下一代数据中心网络的节能高效新选择
一、LPO 光模块的定义与核心原理 LPO(Linear Pluggable Optics,线性可插拔光模块)是光通信领域针对高速率、低功耗需求推出的创新解决方案。其核心突破在于摒弃传统光模块中的 DSP(数字信号处理)芯片,采用线…...
MCP Server Java 开发框架的体验比较(spring ai mcp 和 solon ai mcp)
目前已知的两个 mcp-server java 应用开发框架(ID类的,封装后体验都比较简洁): spring-ai-mcp,支持 java17 或以上solon-ai-mcp,支持 java8 或以上(也支持集成到 springboot2, jfinal, vert.x …...
OpenCV 图形API(45)颜色空间转换-----将图像从 BGR 色彩空间转换为 YUV 色彩空间函数BGR2YUV()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为YUV色彩空间。 该函数将输入图像从BGR色彩空间转换为YUV。B、G和R通道值的常规范围是0到255。 输出图像必须是8位无符…...
C++入门语法
C入门 首先第一点,C中可以混用C语言中的语法。但是C语言是不兼容C的。C主要是为了改进C语言而创建的一门语言,就是有人用C语言用不爽了,改出来个C。 命名空间 c语言中会有如下这样的问题: 那么C为了解决这个问题就整出了一个命名…...
个性化的配置AndroidStudio
Android Studio 提供诸多向导和模板,可用于验证 Java 开发套件 (JDK) 和可用 RAM 等系统要求,以及配置默认设置,例如经过优化的默认 Android 虚拟设备 (AVD) 模拟和更新的系统映像。本文档介绍了可用于自定义 Android Studio 使用方式的其他配…...
Python-24:小R的随机播放顺序
问题描述 小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。 例如,给定歌单 [5, 3, 2, 1,…...
JavaScript — 总结
介绍 JavaScript是一种广泛应用于Web开发的高级脚本语言,主要用于为网页添加交互功能。作为前端开发的三大核心技术之一,它与HTML(结构)和CSS(样式)协同工作,通过操作DOM元素实现动态内容更新、…...
解决 Ubuntu 下 VTune 无法收集 CPU 硬件时间计数数据的问题
解决 Ubuntu 下 VTune 无法收集 CPU 硬件时间计数数据的问题 在 Ubuntu 上使用 Intel VTune Profiler 时遇到无法收集 CPU 硬件性能计数器数据的问题,通常是由于权限和系统配置问题导致的。以下是解决方案: 1. 检查并加载性能监控模块 首先确保 Linux…...
MySQL《事务》
文章目录 前言一、什么是事务?二、事务的ACID特性三、如何使用事务?3.1 查看支持事务的存储引擎3.2 语法3.3 开启一个事务,执行修改后回滚3.4 开启一个事务,执行修改后提交3.5 保存点3.6 自动/手动提交事务 四、事务的隔离性和隔离…...
微服务划分的思考
为什么 微服务不是十全十美的,不是银弹,是什么原因导致必须要做微服务划分,是否有足够的动机支撑,是项目需要,还是领导的想法,公司层面是否有相应的规划。 拆分后的服务谁来维护,研发同学是否愿意参与 为什么,思考清楚了,接下来看还需要考虑怎么做 单体应用的不足…...
介绍XML
XML(Extensible Markup Language,可扩展标记语言)是一种用于存储、传输和交换数据的标记语言,由万维网联盟(W3C)在1998年制定。它通过自定义标签描述数据结构,具有平台无关性、自描述性和结构化…...
从0开始配置spark-local模式
安装Spark的过程就是下载和解压的过程。接下来的操作,我们把它上传到集群中的节点,并解压运行。 1.启动虚拟机 2.通过finalshell连接虚拟机,并上传安装文件到 /opt/software下 3.解压spark安装文件到/opt/module下 tar -zxvf spark-3.3.1-…...
CSS基础-即学即用 -- 笔记1
目录 前言CSS 基础1. 层叠样式表来源理解优先级源码顺序经验法则继承inherit 关键字initial 关键字 2. 相对单位em 和 rem响应式面板视口的相对单位使用vw定义字号使用calc()定义字号自定义属性(即CSS变量) 3. 盒模型调整盒模型 前言 只需一分钟就能学会…...
日志文件太大,如何分卷压缩便于传输
在IT系统维护和开发工作中,日志文件的作用举足轻重,它不仅记录了系统运行过程中的详细信息,还能帮助技术人员诊断问题、追踪事件和分析性能。 然而,随着系统的长期运行,日志文件可能会迅速膨胀,特别是在高…...
【Django】设置让局域网内的人访问
操作步骤 1. 命令行窗口下查询【本机ip】 ipconfig2. Django项目的全局设置【settings.py】中进行如下设置 ALLOWED_HOSTS ["本机ip"]3. 启动Django项目:命令行下执行如下命令 python manage.py runserver 0.0.0.0:80004. 测试效果:浏览器…...
智慧教室电子班牌-智能管理系统源码,后端基于Spring Boot框架,前端使用Vue.js框架进行组件化开发
智慧班牌系统是一种集成了多种功能的电子班牌,包括校园信息发布、综合素质评价、考勤管理、家校互通、教务管理、考场管理和成绩分析等。它为班级和学校提供了一个多层次、多内容的信息发布平台,同时也为教师、家长和学生提供了一个安全、快捷、全面的互…...
[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)
[密码学实战]密评考试训练系统v1.0程序及密评参考题库 引言:密评考试的重要性与挑战 商用密码应用安全性评估(简称"密评") 作为我国密码领域的重要认证体系,已成为信息安全从业者的必备技能。根据国家密码管理局最新数据,截至2024年6月,全国仅有3000余人持有…...
Vue如何获取Dom
在Vue中获取DOM元素可以通过几种方法:1、使用模板引用(ref),2、使用事件绑定,3、使用生命周期钩子。这些方法各有优缺点,适用于不同的场景。本文将详细介绍这些方法的使用方式及其适用场景,帮助…...
AI大模型 —— 国产大模型 —— 华为大模型
有这么一句话,那就是AI大模型分两种,一种是大模型;另一种是华为大模型。 如果从技术角度来分析,华为的技术不论是在软件还是硬件都比国外的大公司差距极大,甚至有些技术评论者认为华为的软硬件技术至少落后2.5代&#…...
LX4-数据手册相关
数据手册相关 一 如何获取数据手册 ST官网:www.st.com 中文社区网: https://www.stmcu.com.cn/Designresource/list/STM32F1/document/datasheet 淘宝的商品详情页 二 如何阅读数据手册 芯片手册 定义:由芯片制造商提供,详细…...
华为VRP系统知识总结及案例试题
目录 🧠 华为VRP系统 优化整合笔记(完整版)一、VRP系统概述📌 什么是VRP(Versatile Routing Platform)?🚀 VRP系统发展历程 二、设备文件系统与存储结构📂 常见文件类型&…...
深度解析云计算:概念、优势与分类全览
以下是对云计算概念、优点和分类更详细的介绍: 一、云计算的概念 云计算是一种通过互联网提供计算服务的模式,它基于虚拟化、分布式计算、网络存储等一系列先进技术,将计算资源进行整合和管理,形成一个庞大的资源池。这些资源包…...
剑指offer经典题目(五)
目录 栈相关 二叉树相关 栈相关 题目一:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。OJ地址 图示如下。 主要思想:我们…...
Coze平台 创建AI智能体的详细步骤指南
一、创建智能体的基础流程 注册与登录 访问Coze官网(www.coze.cn),使用邮箱或手机号注册账号并登录。 创建智能体 在控制台点击左侧“”按钮,选择“创建智能体”,输入名称(如“职场鼓励师”&…...
电商数据自动化采集方案:淘宝商品详情 API 接入与数据处理技巧
在电商行业高速发展的今天,数据已成为企业决策和竞争的核心要素。通过自动化采集淘宝商品详情数据,企业能够实时掌握市场动态、优化商品策略、提升用户体验。本文将详细介绍基于淘宝商品详情 API 的自动化采集方案,涵盖 API 接入流程、数据采…...
高并发内存池项目
高并发内存池项目 一、项目介绍二、什么是内存池2.1池化技术2.2内存池2.3内存池主要解决的问题2.3.1外部碎片2.3.2内部碎片 2.4malloc的了解 三、定长内存池的实现3.1 通过类型模板参数表示定长内存池3.2定长内存池的实现原理 四、高并发内存池的框架设计4.1ThreadCache的实现4…...