基于jeecgboot-vue3的Flowable流程-所有任务

news2024/11/26 14:34:21
因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。

       这个部分主要讲所有任务的功能

1、主要列表界面如下:

<template>
  <div class="p-2">
    <!--查询区域-->
    <div class="jeecg-basic-table-form-container">
      <a-form ref="formRef" @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
        <a-row :gutter="24">
          <a-col :lg="6">
            <a-form-item name="procDefName">
              <template #label><span title="流程名称">流程名称</span></template>
              <a-input placeholder="目前仅支持精确查询,请输入流程名称" v-model:value="queryParam.procDefName"></a-input>
            </a-form-item>
          </a-col>
          <a-col :lg="6">
            <a-form-item name="createTime">
              <template #label><span title="开始日期">开始日期</span></template>
              <a-date-picker valueFormat="YYYY-MM-DD" placeholder="请选择开始日期" v-model:value="queryParam.createTime" />
            </a-form-item>
          </a-col>
          <template v-if="toggleSearchStatus">
            <a-col :lg="6">
              <a-form-item name="createBy">
                <template #label><span title="创建人员">创建人员</span></template>
                <a-input placeholder="请输入创建人员" v-model:value="queryParam.createBy"></a-input>
              </a-form-item>
            </a-col>
          </template>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
              <a-col :lg="6">
                <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
                <a-button type="primary" preIcon="ant-design:reload-outlined" @click="searchReset" style="margin-left: 8px">重置</a-button>
                <a @click="toggleSearchStatus = !toggleSearchStatus" style="margin-left: 8px">
                  {{ toggleSearchStatus ? '收起' : '展开' }}
                  <Icon :icon="toggleSearchStatus ? 'ant-design:up-outlined' : 'ant-design:down-outlined'" />
                </a>
              </a-col>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>
    <!--引用表格-->
    <BasicTable @register="registerTable" :rowSelection="rowSelection">
      <!--插槽:table标题-->
      <template #tableTitle>
        <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
        <a-button  type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
        <a-dropdown v-if="selectedRowKeys.length > 0">
          <template #overlay>
            <a-menu>
              <a-menu-item key="1" @click="batchHandleDelete">
                <Icon icon="ant-design:delete-outlined"></Icon>
                删除
              </a-menu-item>
            </a-menu>
          </template>
          <a-button>批量操作
            <Icon icon="mdi:chevron-down"></Icon>
          </a-button>
        </a-dropdown>
        <!-- 高级查询 -->
        <super-query :config="superQueryConfig" @search="handleSuperQuery" />
      </template>
      <!--操作栏-->
      <template #action="{ record }">
        <TableAction :dropDownActions="getDropDownAction(record)"/>
      </template>
      <template #bodyCell="{ column, record, index, text }">
        <label v-if="column.key === 'rowIndex'">{{index+1}}</label>
        <a-tag color="blue" v-if="column.key === 'procDefVersion'">V{{ record.procDefVersion }}</a-tag>
        <a-tag color="blue" v-if="column.key === 'finishTime' && record.finishTime == null" >进行中</a-tag>
        <a-tag color="green" v-if="column.key === 'finishTime' &&  record.finishTime != null">已完成</a-tag>
        <label v-if="column.key === 'assigneeName' && record.assigneeName">{{record.assigneeName}} <el-tag type="info" size="small">{{record.deptName}}</el-tag></label>
        <label v-if="column.key === 'assigneeName' && record.candidate">{{record.candidate}}</label>
      </template>
    </BasicTable>
    <!-- 发起流程 -->
    <a-modal @cancel="open = false" :title="title" v-model:open="open" width="60%" append-to-body>
      <el-form :model="queryProcessParams" ref="queryProcessForm" :inline="true" v-show="showSearch" label-width="68px">
        <el-form-item label="名称" prop="name">
          <el-input
            v-model="queryProcessParams.name"
            placeholder="请输入名称"
            clearable
            size="small"
            @keyup.enter.native="handleProcessQuery"
          />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" icon="Search" size="small" @click="handleProcessQuery">搜索</el-button>
          <el-button icon="Refresh" size="small" @click="resetProcessQuery">重置</el-button>
        </el-form-item>
      </el-form>
      <el-table v-loading="processLoading" fit :data="definitionList" border >
        <el-table-column label="流程名称" align="center" prop="name" />
        <el-table-column label="流程版本" align="center">
          <template #default="scope">
            <el-tag size="large" >V{{ scope.row.version }}</el-tag>
          </template>
        </el-table-column>
        <el-table-column label="流程分类" align="center" prop="category" />
        <el-table-column label="表单名称" align="center" prop="formName" />
        <el-table-column label="操作" align="center" width="300" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-button
              size="small"
              type="text"
              icon="el-icon-edit-outline"
    
              v-if="(scope.row.formId != null && (scope.row.appType == 'OA' || scope.row.appType == 'ONLINE'))"
              @click="handleStartProcess(scope.row)"
            >发起流程</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="processTotal > 0"
        :total="processTotal"
        v-model:page="queryProcessParams.pageNum"
        v-model:limit="queryProcessParams.pageSize"
        @pagination="queryDefinition"
      />
    </a-modal>
    
    <!-- 委派 转办 选择人员 -->
    <a-modal
      title="选择委派或转办人员" width="900px"  :maskClosable="false"
      :confirmLoading="confirmLoading"
      v-model:open="delegateassign"
      :footer="null"
      @cancel="closeNode"
    >   
      <a-form  v-if="delegateassign">
        <a-form-item class="ant-form-item-bottom" :label-col="labelCol" :wrapper-col="wrapperCol"  label="请选择委派或转办人员" v-show="true">
          <a-checkbox-group @change="spryType" v-model="spryTypes" >
              <!-- 1用户 5 部门负责人 4发起人的部门负责人-->
          
            <a-checkbox value="1"> 直接选择人员 </a-checkbox>
            <a-checkbox value="5"> 部门负责人 </a-checkbox>
            <a-checkbox value="4">
              发起人的部门负责人
              <a-tooltip placement="topLeft" title="自动获取发起人所在部门的负责人,即其上级领导。(如果其本身就是部门负责人,则指向发起人自己。)">
                <a-icon type="exclamation-circle" />
              </a-tooltip>
            </a-checkbox>
      
          </a-checkbox-group>
        </a-form-item>
        <!--            1用户  4发起人的部门负责人-->
       
        <a-form-item class="ant-form-item-bottom" :label-col="labelCol" :wrapper-col="wrapperCol" label="选择人员" v-if="spryTypes.indexOf('1')>-1" >
          <!--  通过部门选择用户控件 -->
          <j-select-user-by-dept v-model="spry.userIds" :multi="false"></j-select-user-by-dept>
        </a-form-item>
        
        <a-form-item class="ant-form-item-bottom" :label-col="labelCol" :wrapper-col="wrapperCol" label="选择部门负责人" v-if="spryTypes.indexOf('5')>-1" >
          <j-select-dept v-model="spry.departmentManageIds" :multi="false"></j-select-dept>
        </a-form-item>
        <!--btn-->
        <a-form-item class="a-form-item-submit" :wrapper-col="{ span: 12, offset: 10 }">
          <a-button @click="sprySubmit" type="primary" html-type="submit" :disabled="userNode.type==0||userNode.type==2||confirmLoading">
            提交
          </a-button>
      
          <a-button @click="closeNode" style="margin-left: 50px">
            关闭
          </a-button>
        </a-form-item>
      </a-form>
    </a-modal>  
  </div>
</template>

<script lang="ts" name="myProcess" setup>
  import { ref, reactive } from 'vue';
  import { useRouter, useRoute } from 'vue-router';
  import 'element-plus/dist/index.css'
  import 'element-plus/theme-chalk/display.css'
  import { Search, Refresh } from '@element-plus/icons-vue'
  import Pagination  from '/@/components/Pagination/index.vue'
  import { BasicTable, useTable, TableAction } from '/@/components/Table';
  import { useListPage } from '/@/hooks/system/useListPage';
  import { columns, superQuerySchema } from './AllProcess.data';
  import { getExportUrl } from './AllProcess.api'
  import { allProcessList, delDeployment, stopProcess } from "@/views/flowable/api/process"
  import { delegateTask,assignTask } from "@/views/flowable/api/todo";  
  import { listDefinition } from "@/views/flowable/api/definition";
  import { downloadFile } from '/@/utils/common/renderUtils';
  import { useUserStore } from '/@/store/modules/user';
  import { useMessage } from '/@/hooks/web/useMessage';
  import JSelectUserByDept from '/@/components/Form/src/jeecg/components/JSelectUserByDept.vue';
  import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue';

  const formRef = ref();
  const queryParam = reactive<any>({});
  const toggleSearchStatus = ref<boolean>(false);
  const registerModal = ref();
  const userStore = useUserStore();
  const { createMessage, createConfirm } = useMessage();
  // 获取路由器对象 href跳转用到
  const router = useRouter();
  const route = useRoute();
  //注册table数据
  const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
    tableProps: {
      title: 'AllProcess',
      api: allProcessList,
      columns,
      canResize:false,
      useSearchForm: false,
      actionColumn: {
        width: 120,
        fixed: 'right',
      },
      beforeFetch: (params) => {
        return Object.assign(params, queryParam);
      },
    },
    exportConfig: {
      name: "myProcess",
      url: getExportUrl,
      params: queryParam,
    },
  });
  const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
  const labelCol = reactive({
    xs:24,
    sm:4,
    xl:6,
    xxl:4
  });
  const wrapperCol = reactive({
    xs: 24,
    sm: 20,
  });

  // 高级查询配置
  const superQueryConfig = reactive(superQuerySchema);
  
  //新建流程相关参数
  const processTotal = ref(0)
  const processLoading = ref(true)
  const title = ref('')
  const open = ref(false)
  const definitionList = ref<any>([])
  const queryProcessForm = ref(null)
  // 显示搜索条件
  const showSearch = ref(true)
  //流程查询参数
  const queryProcessParams = reactive<any> ({
    pageNum: 1,
    pageSize: 10,
    name: null,
    category: null,
    key: null,
    tenantId: null,
    deployTime: null,
    derivedFrom: null,
    derivedFromRoot: null,
    parentDeploymentId: null,
    engineVersion: null
  })
  
  //委派与转办选择用户界面
  const delegateassign = ref(false)
  const confirmLoading = ref(false)
  const current = ref(0)
  const userNode = ref<any>({})
  const spryTypes = ref<any>([])
  const spry = reactive({
    //选中的用户
    userIds: '',
    departmentManageIds: '',
    chooseSponsor: false,
    chooseDepHeader: false,
  })
  //传入处理委派或转办参数
  const assignee  = ref('');
  const taskId = ref('');
  const dataId = ref('');
  const type = ref('');
  const category = ref('');

  /**
   * 高级查询事件
   */
  function handleSuperQuery(params) {
    Object.keys(params).map((k) => {
      queryParam[k] = params[k];
    });
    searchQuery();
  }

  /**
   * 新增事件
   */
  function handleAdd() {
    open.value = true;
    title.value = "发起流程";
    queryDefinition();
  }

  /** 发起流程申请 */
  const handleStartProcess = (row) => {
    if(row.appType == 'OA') {
       /**  发起oa流程申请 */
       router.push({ path: '/flowable/task/record/index',
         query: {
           deployId: row.deploymentId,
           procDefId:row.id,
           category: row.category,
           finished: true
           }
       })
    }
    else if(row.appType == 'ONLINE'){
      //查询对于online表单数据进行选择流程提交申请
      router.push({ path: '/flowable/model/onlinetablelist',
        query: {
          deployId: row.deploymentId,
          procDefId:row.id,
          onlineId: row.formId,
          category: row.category,
          finished: true
          }
      })
    }  
    else {
      
    }
  }
  
  /** 搜索按钮操作 */
  function handleProcessQuery() {
    queryProcessParams.pageNum = 1;
    queryDefinition();
  }
  /** 重置按钮操作 */
  function resetProcessQuery() {
    queryProcessForm.value.resetFields();
    handleProcessQuery();
  }
  
  function queryDefinition() {
    processLoading.value = true;
    listDefinition(queryProcessParams).then(response => {
      console.log("listDefinition response",response)
      definitionList.value = response.result.records;
      processTotal.value = response.result.total;
      processLoading.value = false;
    });
  }
   
  /**
   * 详情
   */
  function handleDetail(record: Recordable) {
    console.log("handleDetail record",record)
    router.push({ path: '/flowable/task/record/index',
      query: {
        procInsId: record.procInsId,
        deployId: record.deployId,
        taskId: record.taskId,
        businessKey: record.businessKey,
        category: record.category,
        appType: record.appType,
        finished: false
    }})
  }
  
  function spryType(types){
    spryTypes.value = types;
    
    /*  1用户 4发起人的部门负责人 5部门负责人*/
    if (spryTypes.value.indexOf('1')==-1) spry.userIds = '';
    if (spryTypes.value.indexOf('5')==-1) spry.departmentManageIds = '';
    //是否选中发起人的部门领导
    spry.chooseDepHeader = spryTypes.value.indexOf('4')>-1 ;
  
    console.log("spry",spry)
  }
  const sprySubmit = () => {
   if (spryTypes.value.length==0){
     createMessage.error("必须选择委托或转办人员!");
     return;
   }
   if (spry.userIds == ''){
     createMessage.error("必须选择委托或转办人员!");
     return;
   }
    delegateassign.value = false;      
    assignee.value = spry.userIds;
    console.log("assign=",assign.value);
    if(type.value == "1") { //委派
      handleDelegate();
    }
    else if(type.value == "2") { //转办
      handleAssign();
    }
    else {
      createMessage.error("不认识的类型,未知的错误!");
    }
  }
  
  //弹出选择委派或转办人员界面selType: 1-委派 2-转办
  function SelectUser(record: Recordable,selType: string){
    console.log("SelectUser selType",selType);
    taskId.value = record.taskId;
    dataId.value = record.businessKey;
    type.value = selType;
    category.value = record.category;
    delegateassign.value = true ;
  }
  
  //委派流程
  function handleDelegate(record: Recordable) 
  {
    const params = {
      taskId: taskId.value,
      assignee: assignee.value,
      dataId: dataId.value,
      category: category.value,
    }
    delegateTask(params).then( res => {
      createMessage.success(res.message);
      reload();
    });
  }
  
  //转办流程
  function handleAssign(record: Recordable) 
  {
    const params = {
      taskId: taskId.value,
      assignee: assignee.value,
      dataId: dataId.value,
      category: category.value,
    }
    assignTask(params).then( res => {
      createMessage.success(res.message);
      reload();
    });
  }  
  
  /**
   * 取消流程申请
   */
  function handleCancel(record: Recordable) 
  {
    const params = {
      instanceId: record.procInsId
    }
    stopProcess(params).then( res => {
      createMessage.success(res.message);
      reload();
    });
  }
   
  /**
   * 删除事件
   */
  async function handleDelete(record) {
    //await deleteOne({ id: record.id }, handleSuccess);
    const ids = record.procInsId;
    const dataid = record.businessKey;
    delDeployment(ids,dataid).then((res) => {
      if (res.success) {
        createMessage.success("删除成功");
        reload();
      } else {
        createMessage.warning(res.message)
      }
    })
    
  }
   
  /**
   * 批量删除事件
   */
  async function batchHandleDelete() {
    await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
  }
   
  /**
   * 成功回调
   */
  function handleSuccess() {
    (selectedRowKeys.value = []) && reload();
  }
   
  /**
   * 下拉操作栏
   */
  function getDropDownAction(record) {
    return [
      {
        label: '详情',
        onClick: handleDetail.bind(null, record),
      },{
        label: '委派',
        onClick: SelectUser.bind(null,record, '1'),
      },{
        label: '转办',
        onClick: SelectUser.bind(null,record, '2'),
      },{
        label: '取消申请',
        onClick: handleCancel.bind(null, record),
      }, {
        label: '删除',
        popConfirm: {
          title: '是否确认删除',
          confirm: handleDelete.bind(null, record),
          placement: 'topLeft',
        }
      }
    ]
  }

  /**
   * 查询
   */
  function searchQuery() {
    reload();
  }
  
  /**
   * 重置
   */
  function searchReset() {
    formRef.value.resetFields();
    selectedRowKeys.value = [];
    //刷新数据
    reload();
  }

</script>

<style lang="less" scoped>
  .ant-form-item-bottom {
    margin-bottom: 60px; /* 调整表单项之间的间距 */
  }
  .a-form-item-submit { //调整提交按钮与底部的距离
    position: relative ;
    bottom: 30px; /* 距离底部的高度 */
  }
  .jeecg-basic-table-form-container {
    padding: 0;
    .table-page-search-submitButtons {
      display: block;
      margin-bottom: 24px;
      white-space: nowrap;
    }
    .query-group-cust{
      min-width: 100px !important;
    }
    .query-group-split-cust{
      width: 30px;
      display: inline-block;
      text-align: center
    }
  }
</style>

上面包含了委派与转办的界面与方法

2、主要界面如下:

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

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

相关文章

纯css星空动画

让大家实现一个这样的星空动画效果,大家会怎么做? js,不! 其实使用css就能写 我也不藏着掖着,源码直接放下面了 <script setup></script><template><div class"box"><div v-for"i in 5" :key"i" :class"layer…

函数递归

哈喽啊各位&#xff0c;真是&#xff0c;好久好久好久不见。这段时间实在是太过忙碌了昂&#xff0c;还望诸君见谅&#xff0c;接下来时间会松很多&#xff0c;咱们也会恢复正常更新速度啦 小希在这里祝诸君&#xff1a;期末不挂科&#xff0c;四六级都过&#xff01;功不唐捐…

玩转Word域代码,再也不担心引用多个文献时的排版

文章目录 序列域代码星号和井号多个参考文献交叉引用 在Word中&#xff0c;域代码是一种特殊的文本&#xff0c;可在文档中插入动态内容&#xff0c;而无需手动输入。熟练掌握域代码的基本原理&#xff0c;可以在Word排版时事半功倍。 序列域代码 【CtlF9】会显式出花括号&am…

【一】【QT开发应用】QT开发环境配置,安装QT应用

下载QT软件 点击网址链接&#xff0c;QT下载网址 下载vsaddin插件 点击网址链接&#xff0c;QT下载网址 根据自己的vs版本下载对应的文件. 安装QT 用命令行打开安装程序 找到直接路径, D:\Software\QT\qt-unified-windows-x86-4.3.0-1-online.exe 利用WindowsPowe…

tyflow线相关教程二

线条生长一 生长静脉二 绳索动画三 两个球线连接四 扫帚五

PFA可溶性聚四氟乙烯晶圆盒培养皿一体成型

PFA可溶性聚四氟乙烯晶圆盒培养皿一体成型 PFA培养皿由一个盖子和一个底组成&#xff0c;独特的加工技术&#xff0c;底部圆弧好&#xff0c;经过磨光处理&#xff0c;表面平滑不挂水&#xff0c;无划痕。多用于实验室接种、划线、培养细菌、分离细菌等&#xff0c;尤其是成膜…

RPC框架知识学习

RPC框架介绍 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架是一种允许程序调用位于另一台计算机上的程序的技术。这种调用看起来就像是调用本地程序一样&#xff0c;但实际上是通过网络进行的。RPC框架使得分布式系统的开发变得更加简单&…

简单几步把完整的Windows塞进U盘,小白都能看懂

前言 小白之前写过相似的文章&#xff0c;但教程是通过WinPE操作实现的。 把Windows系统装进U盘&#xff0c;从此到哪都有属于你自己的电脑系统 有些小伙伴反馈教程写得很复杂&#xff0c;简直生涩难懂。 为啥要写得这么复杂呢&#xff1f;小白是想让小伙伴们多了解一些不同…

【尚庭公寓SpringBoot + Vue 项目实战】用户管理(十五)

【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】用户管理&#xff08;十五&#xff09;1、业务介绍2、接口实现2.1、根据条件分页查询用户列表2.2、根据ID更新用户状态 1、业务介绍 用户管理共包含两…

++++++局部变量、全局变量及变量的存储类别++++====+++指针+++

局部变量、全局变量及变量的存储类别 局部变量与全局变量的基本概念 局部变量&#xff1a;在函数内部定义的变量称为局部变量&#xff0c;也称为内部变量。它们只在定义它们的函数内部有效&#xff0c;即只有在这个函数被调用时&#xff0c;局部变量才会被分配内存空间&#x…

从根源解决问题:构建体系化BOM管理机制与解决方案

BOM&#xff08;物料清单&#xff09;是设计与生产间的纽带&#xff0c;其准确及时对企业的竞争力至关重要。然而&#xff0c;维护BOM数据时&#xff0c;常遇到录入错误、信息孤岛及跨部门沟通障碍等难题&#xff0c;直接影响生产效率和成本。为此&#xff0c;道合顺将探讨确保…

「布道师系列文章」宝兰德徐清康解析 Kafka 和 AutoMQ 的监控

作者&#xff5c;北京宝兰德公司解决方案总监徐清康 01 前言 当我们使用一个软件的时候&#xff0c;经常都会问这个软件怎么监控、监控他的哪些指标&#xff1f;Kafka 的监控挺长时间都是一个老大难的问题&#xff0c;社区在监控方面一直没有投入太大的精力。如果要实现一…

MTANet: 多任务注意力网络,用于自动医学图像分割和分类| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 MTANet: Multi-Task Attention Network for Automatic Medical Image Segmentation and Classification MTANet: 多任务注意力网络&#xff0c;用于自动医学图像分割和分类 01 文献速递介绍 医学图像分割和分类是当前临床实践中的两个关键步骤&#xff0c;其准…

BRAVE:扩展视觉编码能力,推动视觉-语言模型发展

视觉-语言模型&#xff08;VLMs&#xff09;在理解和生成涉及视觉与文本的任务上取得了显著进展&#xff0c;它们在理解和生成结合视觉与文本信息的任务中扮演着重要角色。然而&#xff0c;这些模型的性能往往受限于其视觉编码器的能力。例如&#xff0c;现有的一些模型可能对某…

苹果Mac电脑遭恶意软件攻击 Mac第三方恶意软件删除不了

苹果Mac电脑一直以来都以安全性和稳定性著称&#xff0c;许多用户认为Mac电脑不会受到恶意软件的侵害&#xff0c;但事实上&#xff0c;Mac电脑也不是绝对安全的&#xff0c;近年来&#xff0c;有越来越多的恶意软件针对Mac电脑进行攻击&#xff0c;甚至有些恶意软件可以绕过苹…

MSPM0L1306——定时器

相关配置&#xff1a; #include "ti_msp_dl_config.h"int main(void) {SYSCFG_DL_init();//清除定时器中断标志NVIC_ClearPendingIRQ(TIMER_0_INST_INT_IRQN);//使能定时器中断NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);while (1) { } }//定时器…

Thinkpad系列产品进入Bios并设置U盘启动

Thinkpad系列产品&#xff0c;进入Bios并设置U盘启动&#xff0c;常用于以下场景&#xff1a; 1. 安装操作系统。 通过U盘启动盘&#xff0c;用户可以在电脑无法从硬盘启动或需要重装系统时&#xff0c;将操作系统安装到电脑中。这种方法简单且有效&#xff0c;节省了时间并方便…

Redis-数据结构-跳表详解

Redis概述 Redis-数据结构-跳表详解 跳表&#xff08;Skip List&#xff09;是一种基于并联的链表结构&#xff0c;用于在有序元素序列中快速查找元素的数据结构。 Redis 中广泛使用跳表来实现有序集合&#xff08;Sorted Set&#xff09;这一数据结构。 1.跳表的基本概念和…

1832javaERP管理系统之实践教学管理Myeclipse开发mysql数据库servlet结构java编程计算机网页项目

一、源码特点 java erp管理系统之实践教学管理是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了servlet设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Mye…

早期发现,健康生活!第三届ZAODX世界肿瘤早筛大会圆满落幕!

2024年6月15日-16日&#xff0c;第三届ZAODX世界肿瘤早筛大会在雄安新区盛大开幕&#xff01;本次会议由河北雄安新区管理委员会公共服务局指导&#xff0c;第三届ZAODX世界肿瘤早筛大会组委会和早筛网主办&#xff0c;粤港澳大湾区精准医学研究院&#xff08;广州&#xff09;…