ソースを参照

add 增加demo模块 树表演示案例(包含数据权限)

疯狂的狮子li 3 年 前
コミット
a02aeb468e

+ 39 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeAddBo.java

@@ -0,0 +1,39 @@
+package com.ruoyi.demo.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+import javax.validation.constraints.*;
+
+
+
+/**
+ * 测试树表添加对象 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@Data
+@ApiModel("测试树表添加对象")
+public class TestTreeAddBo {
+
+    /** 父id */
+    @ApiModelProperty("父id")
+    private Long parentId;
+
+    /** 部门id */
+    @ApiModelProperty("部门id")
+    private Long deptId;
+
+    /** 用户id */
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    /** 树节点名 */
+    @ApiModelProperty("树节点名")
+    @NotBlank(message = "树节点名不能为空")
+    private String treeName;
+
+}

+ 47 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeEditBo.java

@@ -0,0 +1,47 @@
+package com.ruoyi.demo.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import java.util.Date;
+import javax.validation.constraints.*;
+
+
+/**
+ * 测试树表编辑对象 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@Data
+@ApiModel("测试树表编辑对象")
+public class TestTreeEditBo {
+
+
+    /** 主键 */
+    @ApiModelProperty("主键")
+    private Long id;
+
+
+    /** 父id */
+    @ApiModelProperty("父id")
+    private Long parentId;
+
+
+    /** 部门id */
+    @ApiModelProperty("部门id")
+    private Long deptId;
+
+
+    /** 用户id */
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+
+    /** 树节点名 */
+    @ApiModelProperty("树节点名")
+    @NotBlank(message = "树节点名不能为空")
+    private String treeName;
+
+}

+ 42 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeQueryBo.java

@@ -0,0 +1,42 @@
+package com.ruoyi.demo.bo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 测试树表分页查询对象 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("测试树表分页查询对象")
+public class TestTreeQueryBo extends BaseEntity {
+
+	/** 分页大小 */
+	@ApiModelProperty("分页大小")
+	private Integer pageSize;
+	/** 当前页数 */
+	@ApiModelProperty("当前页数")
+	private Integer pageNum;
+	/** 排序列 */
+	@ApiModelProperty("排序列")
+	private String orderByColumn;
+	/** 排序的方向desc或者asc */
+	@ApiModelProperty(value = "排序的方向", example = "asc,desc")
+	private String isAsc;
+
+
+	/** 树节点名 */
+	@ApiModelProperty("树节点名")
+	private String treeName;
+
+}

+ 107 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java

@@ -0,0 +1,107 @@
+package com.ruoyi.demo.controller;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.demo.bo.TestTreeAddBo;
+import com.ruoyi.demo.bo.TestTreeEditBo;
+import com.ruoyi.demo.bo.TestTreeQueryBo;
+import com.ruoyi.demo.service.ITestTreeService;
+import com.ruoyi.demo.vo.TestTreeVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 测试树表Controller
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@Api(value = "测试树表控制器", tags = {"测试树表管理"})
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/demo/tree")
+public class TestTreeController extends BaseController {
+
+    private final ITestTreeService iTestTreeService;
+
+    /**
+     * 查询测试树表列表
+     */
+    @ApiOperation("查询测试树表列表")
+    @PreAuthorize("@ss.hasPermi('demo:tree:list')")
+    @GetMapping("/list")
+    public AjaxResult<List<TestTreeVo>> list(@Validated TestTreeQueryBo bo) {
+        return AjaxResult.success(iTestTreeService.queryList(bo));
+    }
+
+    /**
+     * 导出测试树表列表
+     */
+    @ApiOperation("导出测试树表列表")
+    @PreAuthorize("@ss.hasPermi('demo:tree:export')")
+    @Log(title = "测试树表", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult<TestTreeVo> export(@Validated TestTreeQueryBo bo) {
+        List<TestTreeVo> list = iTestTreeService.queryList(bo);
+        ExcelUtil<TestTreeVo> util = new ExcelUtil<TestTreeVo>(TestTreeVo.class);
+        return util.exportExcel(list, "测试树表");
+    }
+
+    /**
+     * 获取测试树表详细信息
+     */
+    @ApiOperation("获取测试树表详细信息")
+    @PreAuthorize("@ss.hasPermi('demo:tree:query')")
+    @GetMapping("/{id}")
+    public AjaxResult<TestTreeVo> getInfo(@NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return AjaxResult.success(iTestTreeService.queryById(id));
+    }
+
+    /**
+     * 新增测试树表
+     */
+    @ApiOperation("新增测试树表")
+    @PreAuthorize("@ss.hasPermi('demo:tree:add')")
+    @Log(title = "测试树表", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public AjaxResult<Void> add(@Validated @RequestBody TestTreeAddBo bo) {
+        return toAjax(iTestTreeService.insertByAddBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 修改测试树表
+     */
+    @ApiOperation("修改测试树表")
+    @PreAuthorize("@ss.hasPermi('demo:tree:edit')")
+    @Log(title = "测试树表", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public AjaxResult<Void> edit(@Validated @RequestBody TestTreeEditBo bo) {
+        return toAjax(iTestTreeService.updateByEditBo(bo) ? 1 : 0);
+    }
+
+    /**
+     * 删除测试树表
+     */
+    @ApiOperation("删除测试树表")
+    @PreAuthorize("@ss.hasPermi('demo:tree:remove')")
+    @Log(title = "测试树表" , businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
+                                       @PathVariable Long[] ids) {
+        return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true) ? 1 : 0);
+    }
+}

+ 67 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java

@@ -0,0 +1,67 @@
+package com.ruoyi.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+import com.ruoyi.common.annotation.Excel;
+
+/**
+ * 测试树表对象 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("test_tree")
+public class TestTree implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+
+    /** 主键 */
+    @TableId(value = "id")
+    private Long id;
+
+    /** 父id */
+    private Long parentId;
+
+    /** 部门id */
+    private Long deptId;
+
+    /** 用户id */
+    private Long userId;
+
+    /** 树节点名 */
+    private String treeName;
+
+    /** 版本 */
+    @Version
+    private Long version;
+
+    /** 创建时间 */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 创建人 */
+    @TableField(fill = FieldFill.INSERT)
+    private String createBy;
+
+    /** 更新时间 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+    /** 更新人 */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private String updateBy;
+
+    /** 删除标志 */
+    @TableLogic
+    private Long delFlag;
+
+}

+ 14 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java

@@ -0,0 +1,14 @@
+package com.ruoyi.demo.mapper;
+
+import com.ruoyi.demo.domain.TestTree;
+import com.ruoyi.common.core.page.BaseMapperPlus;
+
+/**
+ * 测试树表Mapper接口
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+public interface TestTreeMapper extends BaseMapperPlus<TestTree> {
+
+}

+ 52 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java

@@ -0,0 +1,52 @@
+package com.ruoyi.demo.service;
+
+import com.ruoyi.common.core.page.IServicePlus;
+import com.ruoyi.demo.bo.TestTreeAddBo;
+import com.ruoyi.demo.bo.TestTreeEditBo;
+import com.ruoyi.demo.bo.TestTreeQueryBo;
+import com.ruoyi.demo.domain.TestTree;
+import com.ruoyi.demo.vo.TestTreeVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 测试树表Service接口
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+public interface ITestTreeService extends IServicePlus<TestTree> {
+	/**
+	 * 查询单个
+	 * @return
+	 */
+	TestTreeVo queryById(Long id);
+
+	/**
+	 * 查询列表
+	 */
+	List<TestTreeVo> queryList(TestTreeQueryBo bo);
+
+	/**
+	 * 根据新增业务对象插入测试树表
+	 * @param bo 测试树表新增业务对象
+	 * @return
+	 */
+	Boolean insertByAddBo(TestTreeAddBo bo);
+
+	/**
+	 * 根据编辑业务对象修改测试树表
+	 * @param bo 测试树表编辑业务对象
+	 * @return
+	 */
+	Boolean updateByEditBo(TestTreeEditBo bo);
+
+	/**
+	 * 校验并删除数据
+	 * @param ids 主键集合
+	 * @param isValid 是否校验,true-删除前校验,false-不校验
+	 * @return
+	 */
+	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 84 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java

@@ -0,0 +1,84 @@
+package com.ruoyi.demo.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.annotation.DataScope;
+import com.ruoyi.demo.bo.TestTreeAddBo;
+import com.ruoyi.demo.bo.TestTreeEditBo;
+import com.ruoyi.demo.bo.TestTreeQueryBo;
+import com.ruoyi.demo.domain.TestTree;
+import com.ruoyi.demo.mapper.TestTreeMapper;
+import com.ruoyi.demo.service.ITestTreeService;
+import com.ruoyi.demo.vo.TestTreeVo;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 测试树表Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@Service
+public class TestTreeServiceImpl extends ServiceImpl<TestTreeMapper, TestTree> implements ITestTreeService {
+
+	@Override
+	public TestTreeVo queryById(Long id) {
+		return getVoById(id, TestTreeVo.class);
+	}
+
+	@DataScope(isUser = true)
+	@Override
+	public List<TestTreeVo> queryList(TestTreeQueryBo bo) {
+		return listVo(buildQueryWrapper(bo), TestTreeVo.class);
+	}
+
+	private LambdaQueryWrapper<TestTree> buildQueryWrapper(TestTreeQueryBo bo) {
+		Map<String, Object> params = bo.getParams();
+		Object dataScope = params.get("dataScope");
+		LambdaQueryWrapper<TestTree> lqw = Wrappers.lambdaQuery();
+		lqw.like(StrUtil.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName());
+		lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
+			TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
+		lqw.apply(dataScope != null && StrUtil.isNotBlank(dataScope.toString()),
+			dataScope != null ? dataScope.toString() : null);
+		return lqw;
+	}
+
+	@Override
+	public Boolean insertByAddBo(TestTreeAddBo bo) {
+		TestTree add = BeanUtil.toBean(bo, TestTree.class);
+		validEntityBeforeSave(add);
+		return save(add);
+	}
+
+	@Override
+	public Boolean updateByEditBo(TestTreeEditBo bo) {
+		TestTree update = BeanUtil.toBean(bo, TestTree.class);
+		validEntityBeforeSave(update);
+		return updateById(update);
+	}
+
+	/**
+	 * 保存前的数据校验
+	 *
+	 * @param entity 实体类数据
+	 */
+	private void validEntityBeforeSave(TestTree entity) {
+		//TODO 做一些数据校验,如唯一约束
+	}
+
+	@Override
+	public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+		if (isValid) {
+			//TODO 做一些业务上的校验,判断是否需要校验
+		}
+		return removeByIds(ids);
+	}
+}

+ 55 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestTreeVo.java

@@ -0,0 +1,55 @@
+package com.ruoyi.demo.vo;
+
+import com.ruoyi.common.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 测试树表视图对象 test_tree
+ *
+ * @author Lion Li
+ * @date 2021-05-30
+ */
+@Data
+@ApiModel("测试树表视图对象")
+public class TestTreeVo {
+
+	private static final long serialVersionUID = 1L;
+
+	/** 主键 */
+	@ApiModelProperty("主键")
+	private Long id;
+
+	/** 父id */
+	@Excel(name = "父id")
+	@ApiModelProperty("父id")
+	private Long parentId;
+
+	/** 部门id */
+	@Excel(name = "部门id")
+	@ApiModelProperty("部门id")
+	private Long deptId;
+
+	/** 用户id */
+	@Excel(name = "用户id")
+	@ApiModelProperty("用户id")
+	private Long userId;
+
+	/** 树节点名 */
+	@Excel(name = "树节点名")
+	@ApiModelProperty("树节点名")
+	private String treeName;
+
+	/** 创建时间 */
+	@Excel(name = "创建时间" , width = 30, dateFormat = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty("创建时间")
+	private Date createTime;
+
+
+}

+ 22 - 0
ruoyi-demo/src/main/resources/mapper/demo/TestTreeMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.demo.mapper.TestTreeMapper">
+
+    <resultMap type="com.ruoyi.demo.domain.TestTree" id="TestTreeResult">
+        <result property="id" column="id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="treeName" column="tree_name"/>
+        <result property="version" column="version"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="delFlag" column="del_flag"/>
+    </resultMap>
+
+
+</mapper>

+ 53 - 0
ruoyi-ui/src/api/demo/tree.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询测试树表列表
+export function listTree(query) {
+  return request({
+    url: '/demo/tree/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询测试树表详细
+export function getTree(id) {
+  return request({
+    url: '/demo/tree/' + id,
+    method: 'get'
+  })
+}
+
+// 新增测试树表
+export function addTree(data) {
+  return request({
+    url: '/demo/tree',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改测试树表
+export function updateTree(data) {
+  return request({
+    url: '/demo/tree',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除测试树表
+export function delTree(id) {
+  return request({
+    url: '/demo/tree/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出测试树表
+export function exportTree(query) {
+  return request({
+    url: '/demo/tree/export',
+    method: 'get',
+    params: query
+  })
+}

+ 282 - 0
ruoyi-ui/src/views/demo/tree/index.vue

@@ -0,0 +1,282 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="树节点名" prop="treeName">
+        <el-input
+          v-model="queryParams.treeName"
+          placeholder="请输入树节点名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间">
+        <el-date-picker
+          v-model="daterangeCreateTime"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['demo:tree:add']"
+        >新增</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table
+      v-loading="loading"
+      :data="treeList"
+      row-key="id"
+      default-expand-all
+      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+    >
+      <el-table-column label="父id" prop="parentId" />
+      <el-table-column label="部门id" align="center" prop="deptId" />
+      <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="树节点名" align="center" prop="treeName" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['demo:tree:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-plus"
+            @click="handleAdd(scope.row)"
+            v-hasPermi="['demo:tree:add']"
+          >新增</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['demo:tree:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 添加或修改测试树表对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="父id" prop="parentId">
+          <treeselect v-model="form.parentId" :options="treeOptions" :normalizer="normalizer" placeholder="请选择父id" />
+        </el-form-item>
+        <el-form-item label="部门id" prop="deptId">
+          <el-input v-model="form.deptId" placeholder="请输入部门id" />
+        </el-form-item>
+        <el-form-item label="用户id" prop="userId">
+          <el-input v-model="form.userId" placeholder="请输入用户id" />
+        </el-form-item>
+        <el-form-item label="树节点名" prop="treeName">
+          <el-input v-model="form.treeName" placeholder="请输入树节点名" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listTree, getTree, delTree, addTree, updateTree, exportTree } from "@/api/demo/tree";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "Tree",
+  components: {
+    Treeselect
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 测试树表表格数据
+      treeList: [],
+      // 测试树表树选项
+      treeOptions: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 创建时间时间范围
+      daterangeCreateTime: [],
+      // 查询参数
+      queryParams: {
+        treeName: null,
+        createTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        treeName: [
+          { required: true, message: "树节点名不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询测试树表列表 */
+    getList() {
+      this.loading = true;
+      this.queryParams.params = {};
+      if (null != this.daterangeCreateTime && '' != this.daterangeCreateTime) {
+        this.queryParams.params["beginCreateTime"] = this.daterangeCreateTime[0];
+        this.queryParams.params["endCreateTime"] = this.daterangeCreateTime[1];
+      }
+      listTree(this.queryParams).then(response => {
+        this.treeList = this.handleTree(response.data, "id", "parentId");
+        this.loading = false;
+      });
+    },
+    /** 转换测试树表数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.treeName,
+        children: node.children
+      };
+    },
+    /** 查询测试树表下拉树结构 */
+    getTreeselect() {
+      listTree().then(response => {
+        this.treeOptions = [];
+        const data = { id: 0, treeName: '顶级节点', children: [] };
+        data.children = this.handleTree(response.data, "id", "parentId");
+        this.treeOptions.push(data);
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        parentId: null,
+        deptId: null,
+        userId: null,
+        treeName: null,
+        version: null,
+        createTime: null,
+        createBy: null,
+        updateTime: null,
+        updateBy: null,
+        delFlag: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.daterangeCreateTime = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      this.getTreeselect();
+      if (row != null && row.id) {
+        this.form.parentId = row.id;
+      } else {
+        this.form.parentId = 0;
+      }
+      this.open = true;
+      this.title = "添加测试树表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      this.getTreeselect();
+      if (row != null) {
+        this.form.parentId = row.id;
+      }
+      getTree(row.id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改测试树表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateTree(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addTree(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      this.$confirm('是否确认删除测试树表编号为"' + row.id + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delTree(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      })
+    }
+  }
+};
+</script>