这里要实现一个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>