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

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

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

相關文章

【論文閱讀23】-地下水預測-TCN-LSTM-Attention(2024-11)

這篇論文主要圍繞利用深度學習模型檢測地下水位異常以識別地震前兆展開。 [1] Chen X, Yang L, Liao X, et al. Groundwater level prediction and earthquake precursor anomaly analysis based on TCN-LSTM-attention network[J]. IEEE Access, 2024, 12: 176696-176718. 期刊…

electron從安裝到啟動再到打包全教程

目錄 介紹 安裝 修改npm包配置 執行安裝命令 源代碼 運行 打包 先安裝git, 安裝打包工具 導入打包工具 執行打包命令 總結 介紹 electron確實好用,但安裝是真的要耗費半條命。每次安裝都會遇到各種問題,然后解決了之后。后面就不需要安裝了,但有時候比如電腦重裝…

【Rust 精進之路之第4篇-數據基石·上】標量類型:整數、浮點數、布爾與字符的精妙之處

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 作者&#xff1a; 碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;構成萬物的“原子”——標量類型 在上一篇文章【變量觀】中&#xff0c;我們深入探討了 Rust 如何通過 let、mut、const…

消息中間件RabbitMQ:簡要介紹及其Windows安裝流程

一、簡要介紹 定義&#xff1a;RabbitMQ 是一個開源消息中間件&#xff0c;用于實現消息隊列和異步通信。 場景&#xff1a;適用于分布式系統、異步任務處理、消息解耦、負載均衡等場景。 比喻&#xff1a;RabbitMQ 就像是快遞公司&#xff0c;負責在不同系統間安全快速地傳遞…

Docker概念詳解

文章目錄 一、Docker&#xff1a;容器化應用的基石1.1 環境1.2 Docker 是什么1.3 Docker鏡像1.3.1 基礎鏡像(Base Image)1.3.2 Dockerfile1.3.3 容器鏡像&#xff08;Container Image&#xff09; 1.4 Registry1.5 容器1.6 Docker VS 虛擬機 二、Docker 的架構原理2.1 C/S軟件架…

linux查看及修改用戶過期時間

修改用戶有效期 密碼到期時間 sudo chage -E 2025-12-31 username sudo chage -M 180 username sudo chage -d $(date %F) username 查詢用戶密碼到期時間 for user in $(cat /etc/passwd |cut -d: -f1); do echo $user; chage -l $user | grep "Password expires"; …

CGAL 計算直線之間的距離(3D)

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里的計算思路很簡單: 1、首先將兩個三維直線均平移至過原點處,這里兩條直線可以構成一個平面normal。 2、如果兩個直線平行,那么兩條直線之間的距離就轉換為直線上一點到另一直線的距離。 3、如果兩個直線不平行,則可…

<項目代碼>YOLO小船識別<目標檢測>

項目代碼下載鏈接 YOLOv8是一種單階段&#xff08;one-stage&#xff09;檢測算法&#xff0c;它將目標檢測問題轉化為一個回歸問題&#xff0c;能夠在一次前向傳播過程中同時完成目標的分類和定位任務。相較于兩階段檢測算法&#xff08;如Faster R-CNN&#xff09;&#xff0…

基于RK3588+FPGA+AI YOLO全國產化的無人船目標檢測系統(二)平臺設計

基于項目需求確定國產 AI 平臺的總體架構設計&#xff0c;完成硬件單元的選擇和搭建以及開發工具鏈的配置工作。 4.1 國產 AI 平臺總體架構 本文設計了一套靈活高效的國產 AI 平臺總體架構&#xff0c;設計方法是在嵌入式平 臺上使用串行總線&#xff08; Peripheral Co…

Typescript中的泛型約束extends keyof

概要 本文主要分享Typescript中泛型約束的使用方法。在開發過程中&#xff0c;通過使用該方法&#xff0c;可以在編譯階段&#xff0c;幫助我們查找到一些潛在的空值引用錯誤。 代碼和實現 我們預先定義了IUser接口&#xff0c;接口包括了id&#xff0c;姓名&#xff0c;性別…

C++ 2025 展望:現代編程需求與新興技術驅動下的變革

C 作為一門成熟的語言&#xff0c;在多個領域&#xff08;嵌入式系統、高性能計算、圖形渲染、游戲開發等&#xff09;依舊占據重要地位。在 2024 年&#xff0c;C 開發繼續在許多傳統領域保持強勁的勢頭&#xff0c;同時也面臨著新的挑戰與發展方向。展望 2025 年&#xff0c;…

包管理工具有哪些?主流軟件分享

常見的包管理工具主要有&#xff1a;npm、Yarn、pnpm、Composer、Maven、pip、Conda 等&#xff0c;其中 npm 是目前全球使用最廣泛的JavaScript包管理工具&#xff0c;以豐富的生態、便捷的使用體驗以及強大的社區支持聞名。npm具備依賴管理、版本控制、腳本執行等強大功能&am…

2025年世界職業院校技能大賽實施方案(意見稿)

為貫徹落實《教育強國建設規劃綱要&#xff08;2024—2035年&#xff09;》&#xff0c;進一步提升世界職業院校技能大賽&#xff08;以下簡稱“大賽”&#xff09;內涵質量&#xff0c;發揮大賽引領作用&#xff0c;提升高技能人才培養質量&#xff0c;服務現代職業教育體系建…

Redis 慢查詢分析與優化

Redis 慢查詢分析與優化 參考書籍 &#xff1a; https://weread.qq.com/web/reader/d5432be0813ab98b6g0133f5kd8232f00235d82c8d161fb2 以下從配置參數、耗時細分、分析工具、優化策略四個維度深入解析 Redis 慢查詢問題&#xff0c;結合實戰調優建議&#xff0c;幫助開發者…

AI之pdf解析:Tesseract、PaddleOCR、RapidPaddle(可能為 RapidOCR)和 plumberpdf 的對比分析及使用建議

目錄標題 Tesseract、PaddleOCR、RapidPaddle&#xff08;可能為 RapidOCR&#xff09;和 plumberpdf 的對比分析1. Tesseract類型: 開源 OCR 引擎特點:缺點:適用場景: 2. PaddleOCR (推薦)類型:特點:缺點:適用場景: 復雜版式文檔、多語言混合文本、需要高精度識別的場景&#…

算法 | 成長優化算法(Growth Optimizer,GO)原理,公式,應用,算法改進研究綜述,matlab代碼

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 成長優化算法 一、算法原理二、核心公式三、應用領域四、算法改進研究五…

網絡原理(TCP協議—協議格式,性質(上),狀態)

目錄 1.TCP協議段格式。 2.TCP協議傳輸時候的性質。 2.1確認應答。 2.2超時重傳。 2.3連接管理。 2.3.1 三次握手。 2.3.2四次揮手。 3.TCP常見的狀態。 1.TCP協議段格式。 TCP協議段是由首部和數據兩部分構成的。首部包含了TCP通信所需要的各種控制信息&#xff0c;而…

XAML 標記擴展

# XAML 標記擴展詳解 標記擴展(Markup Extensions)是XAML中一種特殊的語法結構&#xff0c;允許在XAML屬性中嵌入動態值或引用&#xff0c;而不是簡單的靜態值。它們使用花括號{}作為標識&#xff0c;是XAML強大功能的核心組成部分。 ## 基本語法結構 所有標記擴展都遵循以下…

DeepSeek+Cursor+Devbox+Sealos項目實戰

黑馬程序員DeepSeekCursorDevboxSealos帶你零代碼搞定實戰項目開發部署視頻教程&#xff0c;基于AI完成項目的設計、開發、測試、聯調、部署全流程 原視頻地址視頻選的項目非常基礎&#xff0c;基本就是過了個web開發流程&#xff0c;但我在實際跟著操作時&#xff0c;ai依然會…

Ethan獨立開發產品日報 | 2025-04-20

1. Checklist GG 基于人工智能的清單管理工具 checklist.gg是一個基于人工智能的清單管理工具&#xff0c;旨在幫助組織確保每次都能正確完成任務。 關鍵詞&#xff1a;AI驅動, 檢查清單, 管理工具, 任務管理, 效率提升, 組織管理, 工作流程, 自動化工具, 清單管理, 協作工具…