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

因为这个项目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、主要界面如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建型模式--抽象工厂模式

产品族创建–抽象工厂模式 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题。 但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个“产品族”,…

什么是Vue开发技术

概述 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它设计得非常灵活&#xff0c;可以轻松地被集成到任何项目中。 vue是视图的发音&#xff0c;其目的是帮助开发者易于上手&#xff0c;提供强大的功能构建复杂的应用程序 示例 以下是vue基本的语法概述 声明式渲…

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选

一、目的&#xff1a;在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框&#xff0c;勾选本节点的同时也要同步显示父节点和子节点状态 二、实现 三、环境 VS2022 四、示例 定义如下节点类 public partial class TreeNodeBase<T> : SelectBindable<…

探秘提交任务到线程池后源码的执行流程

探秘提交任务到线程池后源码的执行流程 1、背景2、任务提交2、Worker线程获取任务执行流程3、Worker线程的退出时机1、背景 2、任务提交 线程池任务提交有两种方式,execute()和submit()。首先看一下execute方法的源码。我们发现它接收的入参是一个Runnable类型。我们按照代码…

常见的Redis使用问题及解决方案

目录 1. 缓存穿透 1.1 解决方案 2. 缓存击穿 2.1 解决方案 3. 缓存雪崩 3.1 概念图及问题描述 ​编辑3.2 解决方案 4. 分布式锁 4.1 概念 4.2 基于redis来实现分布式锁 4.3 用idea来操作一遍redis分布式锁 4.4 分布式上锁的情况下&#xff0c;锁释放了服务器b中的锁…

水滴式粉碎机:粉碎干性物料的理想选择

在工业生产中&#xff0c;干性物料的粉碎是一个重要的环节&#xff0c;其对于提升产品质量、优化生产流程和提高生产效率具有显著的影响。近年来&#xff0c;水滴式粉碎机因其粉碎原理和工作性能&#xff0c;逐渐在干性物料粉碎领域崭露头角&#xff0c;成为众多企业的理想选择…

《Java2实用教程》 期末考试整理

作用域 当前类 当前包 子类 其他包 public √ √ √ √ protected √ √ √ default √ √ private √ 三、问答题&#xff08;每小题4分&#xff0c;共8分&#xff09; 1.类与对象的关系 对象&#xff1a;对象是类的一个实例&#xff0c;有状…

JavaScript事件类型和事件处理程序

● 之前我们用过了很多此的点击事件&#xff0c;这次让我们来学习另一种事件类型 mouseenter “mouseenter” 是一个鼠标事件类型&#xff0c;它在鼠标指针进入指定元素时触发。 const h1 document.querySelector(h1); h1.addEventListener(mouseenter, function (e) {aler…

【将xml文件转yolov5训练数据txt标签文件】连classes.txt都可以生成

将xml文件转yolov5训练数据txt标签文件 前言一、代码解析 二、使用方法总结 前言 找遍全网&#xff0c;我觉得写得最详细的就是这个博文⇨将xml文件转yolov5训练数据txt标签文件 虽然我还是没有跑成功。那个正则表达式我不会改QWQ&#xff0c;但是不妨碍我会训练ai。 最终成功…

关于从大平台跳转各个应用,更新应用前端包后,显示的仍是旧的内容,刷新应用页面后方才显示新的内容的问题的排查和解决

我们从绿洲物联平台跳转智能锁应用&#xff0c; 如下&#xff0c;我们可以看到&#xff0c;我们是通过a标签去跳转应用的。但是我们打开控制台的话&#xff0c;因为a标签是另外新开一个页面&#xff0c;我们看不到新页面的html文档的加载情况。 我们可以临时把_blank改成_sel…

WPF 上位机 Modbus 入门必备的信息 C# 开发对接

关于Modbus协议 Modbus协议是MODICON(莫迪康)(现施耐德品牌)在1979年开发的&#xff0c;是全球第一个真正用于现场的总线协议; Modbus协议是应用于电子控制器上的一种通用语言。通过此协议&#xff0c;可以实现控制器相互之间、控制器经由网络和其实设备之间的通 信。 Modbus特…

推荐 3 款小巧的文件压缩、投屏和快速启动软件,请收藏,避免找不到

Maya Maya是一款由博主25H开发的体积小巧、简单易用的快速启动工具。它的操作逻辑和界面设计几乎复刻了Rolan早期版本&#xff0c;功能上与Rolan几乎别无二致。Maya支持多文件拖拽添加启动、快捷键呼出、自动多列显示等功能。此外&#xff0c;Maya还具备lnk文件解析功能。 May…

分类模型:MATLAB判别分析

1. 判别分析简介 判别分析&#xff08;Discriminant Analysis&#xff09; 是一种统计方法&#xff0c;用于在已知分类的样本中构建分类器&#xff0c;并根据特征变量对未知类别的样本进行分类。常见的判别分析方法包括线性判别分析&#xff08;Linear Discriminant Analysis, …

在mybatis 中如何防止 IN里面的参数过多?

代码示例&#xff1a; select xsid from zhxg_gy_ssfp_cwfp where xsid in <foreach collection"list" item"item" open"(" close")" separator" " index"index"> <if test"(index % 999) 998&quo…

【kyuubi k8s】kyuubi发布k8s执行spark sql

背景 依据上一篇kyuubi与spark集成&#xff0c;并发布spark sql到k8s集群&#xff0c;上一篇的将kyuubi和spark环境放在本地某台服务器上的&#xff0c;为了高可用&#xff0c;本篇将其打包镜像&#xff0c;并发布到k8s。 其实就是将本地的kyuubi&#xff0c;spark&#xff0…

Nginx + KeepAlived高可用负载均衡集群

目录 一、Keepealived脑裂现象 1.现象 2.原因 3.解决 4.预防 二、实验部署 1.两台nginx做初始化操作并安装nginx 2.四层反向代理配置 3.配置高可用 4.准备检查nginx运行状态脚本 5.开启keepalived服务并测试 一、Keepealived脑裂现象 1.现象 主服务器和备服务器都同…

记录第一次edusrc挖掘

文章目录 一、前言二、漏洞说明截止目前已修复 一、前言 edusrc平台介绍 我们可以在关于页面看到edusrc的收录规则 现阶段&#xff0c;教育行业漏洞报告平台接收如下类别单位漏洞&#xff1a; 教育部 各省、自治区教育厅、直辖市教委、各级教育局 学校 教育相关软件 可以看到…

拉依达的嵌入式学习和秋招经验

拉依达的嵌入式学习和秋招经验 你好&#xff0c;我是拉依达。目前我已经结束了自己的学生生涯&#xff0c;开启了人生的下一个阶段。 从研二准备秋招开始&#xff0c;我就逐渐将自己的学习笔记陆续整理并到CSDN上发布。起初只是作为自己学习的备份记录&#xff0c;后续得到了越…

突然挣不到钱了?带货主播大降薪,有人收入“腰斩”!时薪低至20元,“不如街头发小广告”

韭菜都想来割韭菜了&#xff0c;从00后到60后都在直播带货&#xff0c;部分业内人士认为不懂行的商家以及海量素人主播的加入&#xff0c;拉低了行业的平均薪酬。 2024年的电商年中大促接近尾声&#xff0c;电商直播市场再次成为广为关注的焦点。然而&#xff0c;与热闹的“618…

Linux系统部署Samba服务,共享文件夹给Windows

Samba服务是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。 Samba服务是连接Linux与Windows的桥梁&#xff0c;它通过实现SMB&#xff08;Server Message Block&#xff09;协议来允许跨平台的文件和打印机共享。该服务不仅支持Linux和…