ElementPlus table上移下移操作、表格嵌套树选择器

news2025/1/25 4:41:02

步骤条圆圈中的数字根据所选样式展示:

 <el-steps
                style="margin-top: 20px; max-width: 700px"
                align-center
                :active="formModel.testData.length + 1"
              >
                <el-step
                  title="Step 1"
                  v-for="(item, index) in formModel.testData"
                >
                  <template v-slot:title>{{ item.label }}</template>
                  <template v-slot:icon>
                    <span v-if="formModel.status == '1'">{{ index + 1 }}</span>
                    <span v-if="formModel.status == '2'">
                      {{ getIndex(index + 1) }}
                    </span>
                    <span v-if="formModel.status == '3'">
                      Step {{ index + 1 }}
                    </span>
                  </template>
                  <template v-slot:description>
                    {{ item.description }}
                  </template>
                </el-step>
                <el-step title="退出导航">
                  <template v-slot:icon>
                    <el-icon><Close /></el-icon>
                  </template>
                </el-step>
              </el-steps>

上移、下移操作方法:

// 上移函数
  let moveUp = (row) => {
    let index = formModel.testData.indexOf(row)
    if (index > 0) {
      let temp = formModel.testData[index - 1]
      formModel.testData[index - 1] = row
      formModel.testData[index] = temp
    }
  }
  // 下移函数
  let moveDown = (row) => {
    let index = formModel.testData.indexOf(row)
    if (index < formModel.testData.length - 1) {
      let temp = formModel.testData[index + 1]
      formModel.testData[index + 1] = row
      formModel.testData[index] = temp
    }
  }
<template>
  <div class="app-container">
    <vue3-pro-table
      ref="proTable"
      :request="getList"
      :columns="tableColumn"
      :search="searchConfig"
    >
      <!-- 工具栏 -->
      <template #toolbar>
        <el-button type="success" @click="handleAdd">新建流程模型</el-button>
      </template>
      <!-- 表格操作栏 -->
      <template #page-operate="{ row }">
        <el-button type="text" @click="handleDetails(row)">查看详情</el-button>
        <el-button type="text" @click="handleUpdate(row)">修改</el-button>
        <el-button type="text" @click="handleDelete(row)">删除</el-button>
      </template>
    </vue3-pro-table>

    <!-- 添加或修改配置对话框 -->
    <el-dialog v-model="open" :title="title" width="1000px" append-to-body>
      <el-form
        ref="formRef"
        :model="formModel"
        :rules="rules"
        label-width="120px"
        :disabled="operation == 'details'"
      >
        <el-card>
          <template #header>
            <span>流程模型名称</span>
          </template>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="流程模型名称" prop="name">
                <el-input
                  v-model="formModel.name"
                  placeholder="请输入流程模型名称"
                />
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="状态码" prop="status">
                <el-select
                  v-model="formModel.status"
                  placeholder="请选择状态码"
                >
                  <el-option
                    v-for="item in statusList"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                  ></el-option>
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="12">
              <el-form-item label="状态节点数量" prop="num">
                <el-input-number
                  v-model="formModel.testData.length"
                  disabled
                  :min="1"
                  :max="10"
                />
              </el-form-item>
            </el-col>
          </el-row>
        </el-card>
        <el-card style="margin-top: 20px">
          <template #header>
            <span>流程节点信息</span>
          </template>
          <div class="table">
            <el-button
              style="float: right; margin-bottom: 15px"
              type="primary"
              size="small"
              @click="handleAddNode"
            >
              添加节点
            </el-button>
            <el-table :data="formModel.testData" style="overflow: auto;">
              <el-table-column
                type="index"
                label="节点序号"
                width="100"
              ></el-table-column>
              <el-table-column label="节点菜单名称">
                <template #default="scope">
                  <el-tree-select
                    ref="treeSelect"
                    node-key="id"
                    value-key="id"
                    v-model="formModel.testData[scope.$index].id"
                    :data="menuList"
                    :props="{
                      label: 'label',
                      value: 'id',
                      children: 'children',
                    }"
                    filterable
                    clearable
                    highlight-current
                    :placeholder="`请选择节点${scope.$index + 1}`"
                    @node-click="handleMenuChange(scope.$index, $event)"
                  ></el-tree-select>
                </template>
              </el-table-column>
              <el-table-column label="页面操作说明">
                <template #default="scope">
                  <el-input
                    v-model="formModel.testData[scope.$index].description"
                    placeholder="请输入页面操作说明"
                  />
                </template>
              </el-table-column>
              <el-table-column label="操作">
                <template #default="scope">
                  <el-button
                    type="text"
                    :disabled="scope.$index === 0"
                    @click="moveUp(scope.row)"
                  >
                    上移一级
                  </el-button>
                  <el-button
                    type="text"
                    :disabled="scope.$index === formModel.testData.length - 1"
                    @click="moveDown(scope.row)"
                  >
                    下移一级
                  </el-button>
                  <el-button type="text" @click="handleFormDel(scope.row)">
                    删除
                  </el-button>
                </template>
              </el-table-column>
            </el-table>
            <el-button
              style="float: left; margin-top: 15px"
              type="text"
              size="small"
              @click="changeModel(openModel)"
            >
              流程模型效果展示
            </el-button>
            <div v-if="openModel" style="margin-top: 10px">
              <el-steps
                style="margin-top: 20px; max-width: 700px"
                align-center
                :active="formModel.testData.length + 1"
              >
                <el-step
                  title="Step 1"
                  v-for="(item, index) in formModel.testData"
                >
                  <template v-slot:title>{{ item.label }}</template>
                  <template v-slot:icon>
                    <span v-if="formModel.status == '1'">{{ index + 1 }}</span>
                    <span v-if="formModel.status == '2'">
                      {{ getIndex(index + 1) }}
                    </span>
                    <span v-if="formModel.status == '3'">
                      Step {{ index + 1 }}
                    </span>
                  </template>
                  <template v-slot:description>
                    {{ item.description }}
                  </template>
                </el-step>
                <el-step title="退出导航">
                  <template v-slot:icon>
                    <el-icon><Close /></el-icon>
                  </template>
                </el-step>
              </el-steps>
            </div>
          </div>
        </el-card>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <div v-if="operation == 'details'" class="dialog-footer">
            <el-button @click="cancel">关 闭</el-button>
          </div>
          <div v-else class="dialog-footer">
            <el-button type="primary" @click="submitForm">确 定</el-button>
            <el-button @click="cancel">取 消</el-button>
          </div>
        </div>
      </template>
    </el-dialog>
  </div>
</template>

<script setup name="ProcessModel">
  import {
    addRole,
    deleteRole,
    getRole,
    getMenuTree as menuTreeselect,
  } from '@/api/system/role'
  import { Close } from '@element-plus/icons-vue'
  import { dict } from '@/utils/dict.js'
  import { takeLabel, queryAll } from '@/utils/tools.js'
  let proTable = $ref(null)
  const { proxy } = getCurrentInstance()
  let menuList = $ref([])
  /** 查询菜单树结构 */
  function getMenuTreeselect() {
    menuTreeselect().then((res) => {
      menuList = res.data
      console.log('🚀 ~ menuTreeselect ~ menuList:', menuList)
    })
  }
  getMenuTreeselect()
  let formModel = $ref({
    name: '',
    status: '',
    num: 1,
    testData: [
      {
        id: '2001',
        label: '产品生命周期管理',
      },
      {
        id: '2011',
        label: '发布任务',
      },
      {
        id: 'E8UxcaK3q5hSKEvUcrzuxY',
        label: '订单管理',
      },
    ],
  })
  let statusList = $ref([
    {
      value: '1',
      label: '1,2,3,4....',
    },
    {
      value: '2',
      label: '一,二,三,四....',
    },
    {
      value: '3',
      label: 'step1,step2,step3,step4....',
    },
  ])
  const data = reactive({
    rules: {
      name: [
        { required: true, message: '流程模型名称不能为空', trigger: 'blur' },
      ],
      status: [
        { required: true, message: '状态码不能为空', trigger: 'change' },
      ],
      num: [
        { required: true, message: '状态节点数量不能为空', trigger: 'change' },
      ],
    },
  })

  const { rules } = toRefs(data)
  let open = $ref(false)
  let ids = $ref([])
  let title = $ref('')
  let searchConfig = {
    fields: [
      {
        label: '流程模型名称',
        name: 'roleName',
        type: 'text',
      },
      {
        label: '修改时间',
        name: 'cpid',
        type: 'daterange',
      },
    ],
  }

  // 表格列配置,大部分属性跟el-table-column配置一样
  let tableColumn = [
    { label: '序号', type: 'index', align: 'center' },
    {
      label: '流程模型名称',
      prop: 'roleName',
      align: 'center',
    },
    {
      label: '流程节点',
      prop: 'roleName',
      align: 'center',
    },
    {
      label: '修改时间',
      prop: 'createTime',
      align: 'center',
    },

    {
      label: '操作',
      fixed: 'right',
      align: 'center',
      width: 240,
      tdSlot: 'page-operate',
    },
  ]
  /** 查询列表 */
  let getList = async (params) => {
    params = {
      ...params,
    }
    let {
      list,
      page: { total },
    } = await getRole(params)
    return {
      list: list || [],
      total: total || 0,
    }
  }
  // 刷新
  let refresh = () => {
    proTable.refresh()
  }
  /** 删除按钮操作 */
  function handleDelete(row) {
    let roleIds
    if (row && row.roleId) {
      roleIds = [row.roleId]
    } else {
      roleIds = ids
    }
    let params = {
      roleIds: roleIds,
    }
    proxy.$modal
      .confirm('是否确认删除角色编号为"' + roleIds.join(',') + '"的数据项?')
      .then(function () {
        return deleteRole(params)
      })
      .then(() => {
        refresh()
        proxy.$modal.msgSuccess('删除成功')
      })
      .catch(() => {})
  }
  /** 重置新增的表单以及其他数据  */
  function reset() {
    formModel.name = ''
    formModel.status = ''
    formModel.num = 1
    formModel.testData = [
      {
        id: '2001',
        label: '产品生命周期管理',
      },
      {
        id: '2011',
        label: '发布任务',
      },
      {
        id: 'E8UxcaK3q5hSKEvUcrzuxY',
        label: '订单管理',
      },
    ]
    proxy.resetForm('formRef')
  }
  let operation = $ref('')
  /** 添加流程模型 */
  function handleAdd() {
    reset()
    open = true
    title = '新建流程模型'
    operation = 'add'
    console.log('🚀 ~ handleAdd ~ formModel:', formModel.testData)
    console.log('🚀 ~ handleAdd ~ menuList:', menuList)
  }

  /** 查看详情按钮操作 */
  function handleDetails(row) {
    reset()
    open = true
    title = '查看角色详情'
    operation = 'details'
    formModel = row
  }
  /** 修改角色 */
  function handleUpdate(row) {
    console.log('🚀 ~ handleUpdate ~ row:', row)
    operation = 'edit'
    reset()
    title = '修改角色'
  }
  /** 提交按钮 */
  function submitForm() {
    proxy.$refs['formRef'].validate((valid) => {
      if (valid) {
        console.log('🚀 ~ submitForm ~ formModel:', formModel)
        if (formModel.roleId != undefined) {
          // let params = {
          // }
          // updateRole(params).then((response) => {
          //   proxy.$modal.msgSuccess('修改成功')
          //   open = false
          //   refresh()
          // })
        } else {
          // let ids = getMenuAllCheckedKeys()
          // let params = {
          // }
          // addRole(params).then((response) => {
          //   proxy.$modal.msgSuccess('新增成功')
          //   open = false
          //   refresh()
          // })
        }
      }
    })
  }
  /** 取消按钮 */
  function cancel() {
    open = false
    reset()
  }
  /** 改变状态节点数量 */
  let handleAddNode = () => {
    formModel.testData.push({
      id: '',
      label: '',
      description: '',
    })
    console.log('🚀 ~ handleAddNode ~ formModel.testData:', formModel.testData)
  }
  // 弹框表格选择菜单
  let handleMenuChange = (index, value) => {
    console.log('🚀 ~ handleMenuChange ~ value:', value)
    formModel.testData[index].id = value.id
    formModel.testData[index].label = value.label
    console.log(
      '🚀 ~ handleMenuChange ~ formModel.testData:',
      formModel.testData
    )
  }
  // 上移函数
  let moveUp = (row) => {
    console.log('🚀 ~ moveUp ~ row:', row)
    let index = formModel.testData.indexOf(row)
    console.log('🚀 ~ moveUp ~ index:', index)
    if (index > 0) {
      let temp = formModel.testData[index - 1]
      formModel.testData[index - 1] = row
      formModel.testData[index] = temp
    }
    console.log('🚀 ~ moveUp ~ formModel.testData:', formModel.testData)
  }
  // 下移函数
  let moveDown = (row) => {
    let index = formModel.testData.indexOf(row)
    if (index < formModel.testData.length - 1) {
      let temp = formModel.testData[index + 1]
      formModel.testData[index + 1] = row
      formModel.testData[index] = temp
    }
  }
  let openModel = $ref(false)
  // 改变模型效果展示
  let changeModel = (status) => {
    openModel = !status
  }
  // 弹框表格删除
  let handleFormDel = (row) => {
    formModel.testData.splice(formModel.testData.indexOf(row), 1)
  }
  let treeSelect = $ref(null)
  // 获取索引
  let getIndex = (num) => {
    if (num == 1) {
      return '一'
    } else if (num == 2) {
      return '二'
    } else if (num == 3) {
      return '三'
    } else if (num == 4) {
      return '四'
    } else if (num == 5) {
      return '五'
    } else if (num == 6) {
      return '六'
    } else if (num == 7) {
      return '七'
    } else if (num == 8) {
      return '八'
    } else if (num == 9) {
      return '九'
    } else if (num == 10) {
      return '十'
    }
  }
</script>
<style lang="scss" scoped>
  :deep(.el-step__icon) {
    position: relative;
    z-index: 1;
    display: inline-flex;
    justify-content: center;
    align-items: center;
    width: 46px;
    height: 46px;
    font-size: 14px;
    box-sizing: border-box;
    background: #fff;
    transition: 0.15s ease-out;
  }
  :deep(.el-step.is-horizontal .el-step__line) {
    // height: 2px;
    // top: 21px;
    // left: 0;
    // right: 0;
  }
</style>

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

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

相关文章

技术应用 | 外语专业如何借助大模型转型升级?

一、选哪一条路&#xff1a;评测大模型、应用大模型、研发大模型 如果把大语言模型当作是“一个人”&#xff0c;那么既可以把这个“人”当作研究对象&#xff0c;研究它几岁了、智商如何了、能做什么、不能做什么、危不危险&#xff0c;也就是“评测大模型”&#xff1b;也可…

django电商易购系统-计算机毕业设计源码61059

目 录 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 电商易购系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 电商易购系统总…

Java设计模式-原型模式-一次性理解透

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. 前言2. 原型模式的主要角色2.1 原型接口或抽象类2.2 具体原型类2.3 客户端2.4 克隆方法 3. 原型模式使用场景3.1 创建对象是昂贵的3.2 对象的变化3.3 动态配置3.…

10-使用sentinel流控

本文介绍sentinel的直接流控的使用。 0、环境 jdk 1.8sentinel 1.8.2springboot 2.4.2 1、sentinel环境搭建 从官方发布的网站上下载: sentinel Jar&#xff0c;下载对应版本。 下载完成后&#xff0c;进入刚才下载的Jar文件所在的目录&#xff0c;执行如下命令&#xff1a…

Qt+OpenCV配置和测试

一、前言 OpenCV作为比较大众化的跨平台计算机视觉开源库&#xff0c;可以运行在多种操作系统上&#xff0c;通过与Qt的结合&#xff0c;能够轻松的是实现一些图像处理和识别的任务&#xff0c;本文在Windows操作系统的基础上具体讲解Qt和OpenCV的配置和环境搭建方法&#xff…

PHP企业员工考勤系统—计算机毕业设计源码17108

摘要 由于数据库和数据仓库技术的快速发展&#xff0c;企业员工考勤系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。员工管理系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的要求发生重大的变化。 …

叉车安装人脸识别管理系统,能带来哪些好处

当今工业生产中&#xff0c;叉车是一种常见的运输工具&#xff0c;广泛应用于各种场景&#xff0c;如工厂、仓库、码头等。然而&#xff0c;由于驾驶员的错误操作或非授权人员的驾驶&#xff0c;叉车在使用过程中可能会发生意外事故&#xff0c;给企业带来不小的损失。 为了提…

LangChain之数据库操作:通过链Chain和代理Agent查询数据库信息

Chain和Agent查询数据库 在LangChain&#xff0c;其提供了SQL Chain链和SQL Agent代理&#xff0c;他们支持基于自然语言提示构建和运行SQL查询&#xff0c;以此来操作数据库&#xff0c;并且与SQLAlchemy支持的任何SQL版本兼容。&#xff08;例如&#xff0c;MySQL&#xff0c…

自闭症儿童注意力分散怎么办?|星启帆自闭症寄宿学校

在自闭症儿童的成长过程中&#xff0c;一个常见且令人担忧的现象是“精神飘移行为”&#xff0c;这种行为表现为孩子沉浸在自己的小世界里&#xff0c;对外界刺激反应迟钝&#xff0c;甚至完全忽视。他们可能会做出一些怪异的动作、表现出刻板行为、自言自语&#xff0c;眼神呆…

Kafka服务端日志详解

文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…

用苹果机连接mac后怎么在电脑上调试苹果手机上页面的元素

问: 用苹果机连接mac后怎么在电脑上调试苹果手机上页面的元素, 使用MAC电脑、iPhone 真机调试 H5页面 回答: 使用MAC电脑、iPhone 真机调试 H5页面 简介 Safari 浏览器设置iPhone 手机设置开始调试 简介 为方便在 H5开发过程中在真实手机调试 H5页面&#xff0c;可进行一下…

Mybatis-springBoot

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射&#xff0c;MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展&#xff0c;使得开发人员能够更高效地编写和管理…

重学我的数据结构

二叉树 1. 遍历 (Traversal) 前序遍历 (Preorder Traversal): 先访问根节点&#xff0c;再访问左子树&#xff0c;最后访问右子树。 void preorderTraversal(Node root) {if (root null) return; System.out.print(root.value " "); preorderTraversal(root.left)…

韦东山瑞士军刀项目之I2C控制ssd 1306 OLED显示屏幕驱动源码分析(硬核)

太硬核了&#xff0c;但即便如此&#xff0c;我也只分析了如何实现ssd 1306的控制命令与显示命令的代码。尽管如此&#xff0c;我也了解了如何实现I2C的字符输出显示。意外收获是知道了ASCII码到底是个什么玩意儿。

python pygame如何实现碰撞检测

前言&#xff1a; 在python中&#xff0c;我们实现两个物品的碰撞检测往往是判断两个物体的x、y坐标是否有重合&#xff0c;根据坐标来进行判断&#xff0c;但是这种判断方式往往不太准确&#xff0c;对于一些透明部分&#xff0c;会出现误判的情况&#xff0c;今天介绍的是一…

古印度的未解之谜——哈拉帕印章文字

关注我们 - 数字罗塞塔计划 - 在之前的文章中&#xff0c;我们知晓了古埃及莎草纸的制作工艺&#xff08;参见《莎草纸——数千年前的信息记录载体》&#xff09;&#xff0c;也了解了由粘土变为陶片可保存数千年的苏美尔泥板书&#xff08;参见《泥板书&#xff1a;两河文明传…

暑期破防实录——捡漏腾讯

序 经历了整整三个月的折磨&#xff0c;暑期实习终于尘埃落定。 其实还没收到 offer 的时候&#xff0c;还会想着到时候录用了该怎么大写特写小作文&#xff0c;但真到了这一天&#xff0c;只剩下一种解脱感&#xff0c;一种摆脱了漫长的焦虑与压抑的淡淡喜悦。 或许就像久病…

Java垃圾收集底层算法实现

垃圾收集底层算法实现 三色标记 在并发标记的过程中&#xff0c;因为标记期间应用线程还在继续跑&#xff0c;对象间的引用可能发生变化&#xff0c;多标和漏标的情况就有可能发生。漏标的问题主要引入了三色标记算法来解决。 三色标记算法是把Gc roots可达性分析遍历对象过…

QT翻金币小游戏

目录 QT翻金币小游戏 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT翻金币小游戏 效果展示…

什么是进程?C语言

进程的概念 进程就是执行中的程序&#xff0c;是系统资源分配的最小单位。 进程的内存分配 进程的作用 宏观上是并行的&#xff0c;微观上是串行的 进程的状态 对于基本的操作系统&#xff1a;有三个状态&#xff1a; 就绪态->执行态-> 阻塞态 在LInux中有四种&am…