element-ui tree组件实现在线增删改

news2024/9/23 23:35:10

这里要实现一个tree 增删改

<!--oracle巡检项-->
<template>
  <div class="oracle_instanceType">
    <el-row type="flex" align="middle" justify="space-between">
      <i
        class="el-icon-s-fold iBox"
        @click="handleFolder(false)"
        v-if="folderOpen"
      ></i>
      <i
        class="el-icon-s-unfold iBox"
        v-if="!folderOpen"
        @click="handleFolder(true)"
      ></i>
      <pageHeader title="Oracle巡检项" style="flex: 1">
        <template v-slot:right>
          <el-button type="primary" @click="setInspectionTypeFn"
            >定义巡检项</el-button
          >
        </template>
      </pageHeader>
    </el-row>
    <div class="mainContent">
      <div class="leftBox" id="leftContainer" v-if="folderOpen">
        <el-container>
          <div style="width: 100%">
            <p class="treeName">
              <span>巡检项分类</span>
            </p>
            <el-aside
              class="aside-left"
              style="
                width: 100%;
                margin-top: 10px;
                height: calc(100vh - 86px);
                position: relative;
              "
              :class="folderOpen ? 'openStyle' : 'folderStyle'"
            >
              <el-tree
                ref="typeTree"
                :data="folderData"
                node-key="id"
                default-expand-all
                :expand-on-click-node="false"
              >
                <span class="custom-tree-node" slot-scope="{ node, data }">
                  <span>{{ data.name }}</span>
                  <span>
                    <i
                      class="el-icon-edit-outline icon-size"
                      @click="() => edit(data)"
                    ></i>
                    <i
                      class="el-icon-circle-plus icon-size"
                      @click="() => append(data)"
                    ></i>
                    <i
                      v-if="data.parentId !== '0'"
                      class="el-icon-remove icon-size"
                      @click="() => remove(node, data)"
                    ></i>
                  </span>
                </span>
              </el-tree>
            </el-aside>
          </div>
          <el-main> </el-main>
        </el-container>
        <div class="resize" title="缩放侧边栏" @mousedown="dragTree">⋮</div>
      </div>
      <div class="rightBox" id="rightContainer">
        <div class="ts-middle-part">
          <el-row type="flex">
            <el-col :span="24">
              <div class="flexBox">
                <div class="doneButtonDiv">
                  <el-button type="primary" @click="setInspectionType"
                    >巡检项归类</el-button
                  >
                </div>
                <div class="searchDiv">
                  <enumSearch
                    :theItems="'vm'"
                    :serviceType="'vmware'"
                    :theUrl="'/v1/vmware/api/search_items'"
                    @searchContdition="searchContdition"
                    @toSearch="toSearch"
                  ></enumSearch>
                </div>
                <div class="defButtonDiv">
                  <el-tooltip
                    class="item"
                    effect="dark"
                    content="自定义列表项"
                    placement="top"
                  >
                    <span
                      class="el-icon-s-tools defBtn"
                      @click="defHeadList"
                    ></span>
                  </el-tooltip>
                </div>
              </div>
            </el-col>
          </el-row>
        </div>
        <div class="ts-body-part">
          <el-table
            ref="multipleTable"
            :data="dataList"
            v-loading="loading"
            border
          >
            <template slot="empty">
              <empty-in-table
                v-if="dataList.length < 1 && !loading"
              ></empty-in-table>
            </template>
            <el-table-column
              v-for="(item, index) in tableHeader"
              :key="item.key + index"
              :label="item.label"
              :prop="item.key"
              :min-width="item.minWidth"
              :fixed="index == 0"
              :sortable="item.sortable"
              show-overflow-tooltip
            >
              <!-- 自定义内容 -->
              <template slot-scope="scope">
                <!-- 名称列 -->
                <div v-if="item.key == 'app_name'" class="nameAndIcon">
                  <!-- 文字跳转部分 -->
                  <el-button
                    class="button"
                    @click="showDetails(scope.row)"
                    type="text"
                    >{{ scope.row.app_name }}
                  </el-button>
                </div>
                <!-- 关联能力模板,资源分类 -->
                <div v-else-if="item.key == 'model' || item.key == 'source'">
                  <p v-for="(a, index) in scope.row[item.key]" :key="index">
                    {{ a }}
                  </p>
                </div>
                <!-- 其他简单文字列 -->
                <div v-else class="online">
                  <span>{{ scope.row[item.key] }}</span>
                </div>
              </template>
            </el-table-column>
            <el-table-column
              label="操作"
              align="center"
              width="130"
              fixed="right"
            >
              <template slot-scope="scope">
                <el-button
                  type="text"
                  v-permission="'inspection_resourceManage_host_editHostBtn'"
                  >编辑</el-button
                >
                <el-button
                  type="text"
                  v-permission="'inspection_resourceManage_host_deleteHostBtn'"
                  >删除</el-button
                >
              </template>
            </el-table-column>
          </el-table>
          <pagination
            :paginationData="pagination"
            @handleCurrentChange="handleCurrentChange"
            @handleSizeChange="handleSizeChange"
          ></pagination>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { tableHeader } from "./utils/index.js";
import { getSession, setSession } from "@/commons/js/searchFresh.js";
import DefHeadList from "@/components/customColumns.vue";
import setInspectionType from "./components/setInspectionType.vue";
import * as requestMethod from "@/api/inspection/inspectionType/index.js";

let id = 1000;
export default {
  name: "oracleManage",
  components: {
    DefHeadList,
    setInspectionType,
  },
  data() {
    return {
      folderOpen: true,
      addOracleInstanceDrawerVisible: false,
      excelImportVisible: false,
      defaultProps: {
        children: "children",
        label: "name",
      },
      defaultSearch: null,
      loading: false,
      dataList: [],
      // 左侧树数据
      folderData: [
        {
          id: 0,
          label: "全部",
          children: [
            {
              id: 1,
              label: "一级 1",
              children: [
                {
                  id: 4,
                  label: "二级 1-1",
                  children: [
                    {
                      id: 9,
                      label: "三级 1-1-1",
                    },
                    {
                      id: 10,
                      label: "三级 1-1-2",
                    },
                  ],
                },
              ],
            },
            {
              id: 2,
              label: "一级 2",
              children: [
                {
                  id: 5,
                  label: "二级 2-1",
                },
                {
                  id: 6,
                  label: "二级 2-2",
                },
              ],
            },
            {
              id: 3,
              label: "一级 3",
              children: [
                {
                  id: 7,
                  label: "二级 3-1",
                },
                {
                  id: 8,
                  label: "二级 3-2",
                },
              ],
            },
          ],
        },      
],
      parentId: null,
      organizationId: null,
      editLabel: "",
      pagination: {
        current_page: 1, // 当前位于哪页
        per_page: 10, //每页显示多少条
        total_count: 0,
        total_page: 1, //总页码
      },
      currentNodeKey: "",
      //自定义列
      tableHeader: JSON.parse(JSON.stringify(tableHeader)), // 初始化表头本地配置
      tableHeaderRpa: [],
      headVisible: false,
      headData: {},
      // 定义巡检项
      setDialog: false,
    };
  },
  mounted() {
    this.dataList = [
      {
        id: 1,
        app_name: "测试巡检项001",
        status: "正常",
        ex_system_id: "资源分类A",
        catalog_app_name: "Windows命令",
        app_architecture: "80能力",
        dept_belong: "判定结果成功",
        bus_name: "秦小藏",
        bus_time: "2023-08-15 13:25:34",
        editor_name: "研发",
        editDate: "2023-08-18 13:25:34",
      },
    ];
    // 获取巡检项分类树
    this.getLeftTree();
  },
  methods: {
    getLeftTree() {
      requestMethod.getCategoryTree("get").then((res) => {
        if (res.status) {
          console.log("getLeftTree", res.data);
          this.folderData = res.data;
        }
      });
    },
    // 详情跳转
    showDetails(row) {
      this.$router.push({
        path: "/inspection/inspectionTask/inspectionTypeDetails",
        query: { id: row.id },
      });
    },
    closeDialog() {
      this.addOracleInstanceDrawerVisible = false;
      this.excelImportVisible = false;
    },
    //控制左侧菜单展开折叠
    handleFolder(is_open) {
      if (is_open) {
        this.folderOpen = true;
      } else {
        this.folderOpen = false;
      }
    },
    // 左侧树新增,
    append(data) {
      console.log("nodeData", data);
      this.organizationId = data.id;
      // console.log("全部树的菜单信息", this.folderData);
      this.$prompt("请输入名称", "添加巡检项分类", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        inputPattern:
          /^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z])(([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[-_a-zA-Z0-9]){0,31})$/,
        inputErrorMessage:
          "支持以中文或英文开头,由中文、英文、数字及特殊字符_-组成,1-32位",
      })
        .then(({ value }) => {
          // 请求接口保存, 需要参数
          /**      
           {
            "description": "string",
            "name": "string",
            "parentId": "string",
            "sort": 0
          }
          */
          // 本地测试
          // let newChild = { id: id++, label: value, children: [] };
          // if (!data.children) {
          //   this.$set(data, "children", []);
          // }
          // data.children.push(newChild);
          // 走在线接口参数:name, parentId, sort, description
          let sortNumber = data.children.length;
          this.appendType(value, data.id, sortNumber);
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "取消添加",
          });
        });
    },
    appendType(name, id, sortNumber, description = "") {
      let vo = {
        name: name,
        parentId: id,
        sort: sortNumber,
        description: description,
      };
      requestMethod.addCategoryTree("post", vo).then((res) => {
        if (res.status) {
          // 重新渲染树
          this.getLeftTree();
        }
      });
    },
    // 左侧树编辑
    edit(data) {
      console.log("nodeData", data);
      // console.log("全部树的菜单信息", this.folderData);
      this.$prompt("请输入名称", "添加巡检项分类", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        inputPattern:
          /^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z])(([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[-_a-zA-Z0-9]){0,31})$/,
        inputErrorMessage:
          "支持以中文或英文开头,由中文、英文、数字及特殊字符_-组成,1-32位",
        inputValue: data.name,
      })
        .then(({ value }) => {
          // 参数:name, parentId, sort, description
          this.editType(
            value,
            data.parentId,
            data.id,
            data.sort,
            data.description
          );
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "取消输入",
          });
        });
    },
    editType(name, parentId, selfId, sortNumber, description) {
      let parm = {
        name: name,
        parentId: parentId,
        selfId: id,
        sort: sortNumber,
        description: description,
      };
      requestMethod.editCategoryTree("put", parm).then((res) => {
        if (res.status) {
          // 重新渲染树
          this.getLeftTree();
        }
      });
    },
    // 左侧树删除
    remove(node, data) {
      const parent = node.parent;
      const children = parent.data.children || parent.data;
      const index = children.findIndex((d) => d.id === data.id);
      children.splice(index, 1);
    },
    mousedown() {},
    getDataList() {},
    handleSortChange() {},
    clickNode() {},
    toSearch(val) {
      this.getDataList(
        getSession("searchFresh").keyword,
        getSession("searchFresh").pageNo,
        getSession("searchFresh").pageSize,
        true
      );
    },
    searchContdition() {},
    // 上下分页
    handleCurrentChange(val) {
      this.getDataList(
        getSession("searchFresh").keyword,
        val,
        getSession("searchFresh").pageSize,
        true
      );
    },
    // 每页显示多少条
    handleSizeChange(val) {
      this.getDataList(
        getSession("searchFresh").keyword,
        getSession("searchFresh").pageNo,
        val,
        true
      );
    },

    addOracleInstance() {
      this.addOracleInstanceDrawerVisible = true;
    },
    setInspectionType() {
      this.excelImportVisible = true;
    },
    // 拖动
    dragTree(e) {
      let leftViewContainer = document.getElementById("leftContainer");
      let rightViewContainer = document.getElementById("rightContainer");
      //得到点击时该容器的宽高:
      let leftViewContainerWidth = leftViewContainer.offsetWidth;
      let startX = e.clientX;
      let startY = e.clientY;
      document.onmousemove = function (e) {
        e.preventDefault();
        //得到鼠标拖动的宽高距离:取绝对值
        let distX = Math.abs(e.clientX - startX);
        //往右方拖动:
        if (e.clientX > startX) {
          leftViewContainer.style.width = leftViewContainerWidth + distX + "px";
          rightViewContainer.style.width =
            leftViewContainerWidth - distX + "px";
        }
        //往左方拖动:
        if (e.clientX < startX && e.clientY > startY) {
          leftViewContainer.style.width = leftViewContainerWidth - distX + "px";
          rightViewContainer.style.width =
            leftViewContainerWidth + distX + "px";
        }
        if (parseInt(leftViewContainer.style.width) >= 600) {
          leftViewContainer.style.width = 600 + "px";
        }
        if (parseInt(leftViewContainer.style.width) <= 20) {
          leftViewContainer.style.width = 20 + "px";
        }
      };
      document.onmouseup = function () {
        document.onmousemove = null;
      };
    },
  },
};
</script>
<style src="./index.less"  lang='less' scoped>
</style>

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

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

相关文章

班级成绩管理利器

在现代教育管理中&#xff0c;一款方便快捷的班级查询工具是老师们的必备利器。易查分就是这样一款工具&#xff0c;能够帮助老师和学生轻松地管理和查询成绩。传统的纸质成绩单已经被易查分的电子成绩单所取代&#xff0c;这种方式带来了方便快捷等多种优势&#xff0c;为学生…

笔记1.2 计算机网络结构

网络边缘 主机、网络应用 接入网络&#xff0c;物理介质 有线或无线通信链路 网络核心&#xff08;核心网络&#xff09;&#xff1a; 互联的路由器&#xff08;或分组转发设备&#xff09; 网络之网络 一、网络边缘 主机&#xff08;端系统&#xff09;&#xff1a; 位…

PHP通过pem文件校验签名异常

问题描述&#xff1a; 在对接第三方支付过程中&#xff0c;支付成功异步回调时&#xff0c;校验签名&#xff0c;一直无法通过。 但是在支付成功时有一个同步返回也需要校验签名&#xff0c;用的是同样的校验方法&#xff0c;都没有问题。 当把回调时传递的参数放在postman中&a…

Windows自带的远程桌面连接教程

文章目录 1.鼠标右键“我的电脑”-“属性”2.在左侧找到“远程设置”-在远程桌面设置处勾选“允许远连接到此计算机”3.关闭防火墙&#xff0c;根据使用的网络选择关闭对应的防火墙4.远程连接按WINR,输入mstsc&#xff0c;回车进入到远程桌面连接页面 1.鼠标右键“我的电脑”-“…

2023/9/15 -- C++/QT

作业&#xff1a; 1> 将工程文件进行注释 2> 03login_box.pro: QT core gui #core核心库 gui图形开发库greaterThan(QT_MAJOR_VERSION, 4): QT widgets #4.0版本以上自动包含widgets库CONFIG c11 #支持C11版本# The following define makes your compiler em…

Elasticsearch 8.10 中引入查询规则 - query rules

作者&#xff1a;Kathleen DeRusso 我们很高兴宣布 Elasticsearch 8.10 中的查询规则&#xff01; 查询规则&#xff08;query rules&#xff09;允许你根据正在搜索的查询词或根据作为搜索查询的一部分提供的上下文信息来更改查询。 什么是查询规则&#xff1f; 查询规则&…

Linux MyFile

在之前&#xff0c;我们应该都多少接触过了C语言的文件管理&#xff0c;fopen&#xff0c;fclose&#xff0c;fputs....等函数的用法&#xff0c;也分析了系统层面上C语言是如何实现文件管理的。 回顾 上一个文章&#xff0c;我们讲解了十分重要的知识&#xff0c;在文件被打…

组合拳SSRF+redis未授权访问

目录 一、SSRF 二、redis未授权访问 三、组合利用 1.写入Webshell 2.反弹shell 一、SSRF 一台web服务器对其他服务器发起请求&#xff0c;以加载其他服务器的web内容或数据 但因请求参数没有进行严格过滤&#xff0c;攻击者可能会通过SSRF漏洞来访问敏感数据、执行未经授…

Deformable Convolution 可变形卷积

论文&#xff1a;https://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf 代码&#xff1a;https://github.com/4uiiurz1/pytorch-deform-conv-v2/blob/master/deform_conv_v2.py 参考博文&#xff1a;可变形卷…

【哈希加密算法】MD5和SHA-1基本介绍和使用!

一、哈希算法 哈希算法&#xff0c;根据碰撞概率&#xff0c;输出的长度越长&#xff0c;就越难产生碰撞&#xff0c;也就越安全。 常用的哈希算法如下&#xff1a; &#xff08;1&#xff09;哈希算法的用途 数据加密&#xff1a;哈希算法可以将原始数据转换成不可逆的加密字…

第二章:25+ Python 数据操作教程(第二十一节PIP连接错误:SSL 证书验证失败解决办法)

在公司网络中安装 python 包时最常见的问题是 SSL 证书验证失败。有时公司会屏蔽网络中的某些网站&#xff0c;因此员工无法访问这些网站。每当他们尝试访问这些网站时&#xff0c;都会显示“由于公司政策&#xff0c;访问被拒绝”。它会导致到达主要 python 网站时出现连接错误…

(面试经典刷题)挑战一周刷完150道-Python版本-第3天(40个题)-I(前10个题)

一、长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 可以是暴…

数据结构与算法(C语言版)P1---算法效率

算法的效率&#xff1a;算法的时间复杂度和空间复杂度 【本节目标】 1.算法效率2.时间复杂度3.空间复杂度4.常见时间复杂度以及复杂oj练习 1、算法效率 1.1、如何衡量一个算法是的好坏 如何衡量一个算法的好坏呢&#xff1f;比如斐波那契数列&#xff1a; long long Fib(…

面试官:我们深入聊聊Java虚拟机吧

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 前言面试Java虚拟机内存模型垃圾收集器…

2023年CRM系统成功落地的5个标准

企业做CRM选型时都在思考投入产出比&#xff0c;花费上万元、甚至几十万元和几个月的时间购买和实施CRM&#xff0c;能否为公司带来降本增效的变革&#xff1f;CRM上线后&#xff0c;需要多长时间才能真切地看到效果&#xff1f;评估CRM的使用效果&#xff0c;需要每个企业制定…

【C++STL基础入门】queue基础使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么二、queue的基础使用2.1 queue的构造函数2.2 queue的属性函数 总结 前言 C标准模板库&#xff08;STL&#xff09;提供了一系列强大的容器和算法…

vi/vim编辑器

vi和vim区别 vi 和 vim 是常见的文本编辑器&#xff0c;以下是它们之间的区别&#xff1a; 功能和特性&#xff1a; vi 是最早的版本&#xff0c;是在早期Unix系统中广泛使用的编辑器。vi 相对较简单&#xff0c;功能主要集中在基本的文本编辑操作上&#xff0c;如插入、删除、…

MyBatis: 配置文件解析流程

XmlConfigurationBuilder类来解析配置文件。 调用了build方法&#xff0c;其代码如下&#xff1a; 其中通过parse方法返回一个Configuration对象&#xff0c;在传递给build方法。 parse方法代码如下&#xff1a; 其中调用了parseConfiguration方法&#xff0c; 可以看到其中…

hive 静态分区与动态分区(笔记)

目录 前言&#xff1a; 静态分区&#xff1a; 1.创建分区 2.删除分区 3.在分区中插入数据 4.查看分区表数据 动态分区 &#xff1a; 2.查看v表源数据 3.以emp_name为动态字段数据抽取到employee表 总结 前言&#xff1a; Hive中的分区就是把一张大表的数据按照业务需要…

华为云云耀云服务器L实例评测|华为云上安装监控服务Prometheus三件套安装

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上试用监控服务Prometheus一、监控服务Prometheus三件套介绍二、华为云主机准备三、Prometheus安装四、Grafana安装五、alertmanager安装六、三个服务的启停管理1. Prometheus、Alertmanager 和 Grafana 启动顺序2. 使用…