element plus tree_vue.js

 根据角色不同类别改变树的选择和禁用,下面我将所有代码复制过来,如果有变量确实自行补充

html 

<template>
  <div class="manageRole">
    <div class="manageRole-header">
      <el-input
        v-model="searchValue"
        @change="getRoleList()"
        clearable
        placeholder="搜索"
        size="mini"
        suffix-icon="el-icon-search"
      ></el-input>
      <span>角色:</span>
      <el-select v-model="jsValue" clearable size="mini" placeholder="请选择">
        <el-option
          v-for="(item, index) in roleList"
          :key="index"
          :label="item.name"
          :value="item.name"
        >
        </el-option>
      </el-select>
      <span>权限:</span>
      <el-select v-model="qxValue" clearable size="mini" placeholder="请选择">
        <el-option
          v-for="(item, index) in functionList"
          :key="index"
          :label="item.name"
          :value="item.name"
        >
        </el-option>
      </el-select>
      <el-button @click="getChange()" size="mini" class="button-self-style" style="float: right"
        >新增</el-button
      >
    </div>
    <el-table :data="roleList" style="width: 100%" stripe>
      <el-table-column type="index" label="序号" width="100" align="center" show-overflow-tooltip>
      </el-table-column>
      <el-table-column
        prop="name"
        label="角色名称"
        align="center"
        show-overflow-tooltip
      ></el-table-column>
      <el-table-column label="角色类别" align="center" show-overflow-tooltip>
        <template slot-scope="scope">
          <span>{{
            scope.row.type == 1 ? '应急局' : scope.row.type == 2 ? '行业部门' : '乡镇街道'
          }}</span>
        </template>
      </el-table-column>
      <el-table-column
        prop="permodel"
        label="权限模块"
        align="center"
        show-overflow-tooltip
      ></el-table-column>
      <el-table-column prop="description" label="角色说明" align="center" show-overflow-tooltip>
      </el-table-column>
      <el-table-column prop="created_at" label="创建时间" align="center" show-overflow-tooltip>
      </el-table-column>
      <el-table-column prop="created_user" label="创建者" align="center" show-overflow-tooltip>
      </el-table-column>
      <el-table-column label="操作" align="center" show-overflow-tooltip>
        <template slot-scope="scope">
          <a style="cursor: pointer; color: #2dfdfc" @click="getChange(scope.row)">
            <i class="el-icon-edit"></i>编辑</a
          >
          <a style="cursor: pointer; margin-left: 20px" @click="deleteUser(scope.row)">
            <i class="el-icon-delete"></i>删除</a
          >
        </template>
      </el-table-column>
    </el-table>
    <el-pagination
      @size-change="sizeChange"
      @current-change="currentChange"
      :page-size="page.pageSize"
      :total="page.total"
      :current-page="1"
      :page-sizes="[24, 48, 72, 96]"
      style="float: right; margin-top: 10px"
      background
      layout=" prev, pager, next,sizes,jumper"
    >
    </el-pagination>

    <el-dialog
      class="allDialogStyle"
      :visible.sync="dialogChange"
      center
      width="430px"
      :show-close="false"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      :before-close="handleClose"
    >
      <span class="dialog-footer" style="position: absolute; right: 10px"> </span>
      <el-tabs v-model="activeName">
        <el-tab-pane :label="ifCreate ? '新增用户信息' : '修改用户信息'" name="first">
          <!-- <p></p> -->
          <div style="width: 100%; margin-top: 10px">
            <span style="color: red">*</span>
            <span style="color: #fff">角色名称:</span>
            <el-input v-model="tempData.name" clearable size="mini"></el-input>
          </div>
          <div style="width: 100%">
            <span style="color: red">*</span>
            <span style="color: #fff">角色类别:</span>
            <el-radio-group v-model="jsRadio" @change="jsChange">
              <el-radio label="1">应急局</el-radio>
              <el-radio label="2">行业部门</el-radio>
              <el-radio label="3">乡镇街道</el-radio>
            </el-radio-group>
          </div>
          <div style="width: 100%">
            <span style="color: red">*</span>
            <span style="color: #fff">权限模块:</span>
            <div
              style="
                border: 1px solid rgba(15, 189, 205, 0.42);
                padding: 5px;
                width: 100%;
                margin: 10px 0;
                display: flex;
                justify-content: space-between;
              "
            >
              <el-tree
                :data="treeData"
                show-checkbox
                node-key="id"
                :props="{
                  children: 'children',
                  label: 'name'
                }"
                ref="Tree"
                check-on-click-node
                :check-strictly="true"
                :expand-on-click-node="false"
                @check-change="handleCheckChange"
                @node-click="nodeClick"
                style="max-height: 500px; overflow-y: auto; width: 100%"
              >
                <span
                  slot-scope="{ data }"
                  :style="{
                    color: !data.disabled ? '#fff' : '#6e7f95'
                  }"
                >
                  {{ data.name }}
                </span>
              </el-tree>
            </div>
          </div>
          <div style="width: 100%">
            <span style="color: #fff">角色说明:</span>
            <el-input
              type="textarea"
              v-model="tempData.description"
              clearable
              size="mini"
            ></el-input>
          </div>
        </el-tab-pane>
      </el-tabs>
      <span slot="footer" class="dialog-footer">
        <el-button size="mini" class="button-self-style" @click="handleClose">取 消</el-button>
        <el-button
          size="mini"
          class="button-self-style"
          type="primary"
          @click="changeUser(false), handleClose"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
  data() {
    return {
      activeName: 'first',
      page: {
        total: 0,
        pageNum: 0,
        pageSize: 24
      }, // 分页
      jsValue: '',
      searchValue: '',
      qxValue: '',
      roleList: [],
      tempData: {},
      dialogChange: false,
      ifCreate: false,
      treeData: [],
      functionList: [],
      defaultCheck: [],
      permids: [], // 编辑选中的id
      jsRadio: '1' // 默认角色
    }
  },
  props: {},
  components: {},
  computed: {
    ...mapGetters({
      userInfo: 'getUserInfo'
    }),
    onChange(val) {
      const { jsValue, qxValue } = this // 同时监听多个属性
      return { jsValue, qxValue }
    }
  },
  watch: {
    onChange(val) {
      this.getRoleList()
    }
  },
  mounted() {
    this.getRoleList()
    this.getFunctionList()
  },
  methods: {
    // 获取登录和编辑用户权限
    getRoleList() {
      let json = []
      this.roleList = []
      if (this.searchValue) {
        this.page.pageNum = 0 // 筛选后从第一页开始
        json.push({ field: 'name', operator: 'EQ', value: this.searchValue })
      }
      if (this.qxValue) {
        this.page.pageNum = 0 // 筛选后从第一页开始
        json.push({ field: 'permodel', operator: 'FQ', value: this.qxValue })
      }
      if (this.jsValue) {
        this.page.pageNum = 0 // 筛选后从第一页开始
        json.push({ field: 'name', operator: 'EQ', value: this.jsValue })
      }
      let params = {
        pageNo: this.page.pageNum,
        pageSize: this.page.pageSize,
        simcode: this.userInfo.simcode,
        keyword: JSON.stringify(json)
      }
      this.$store.dispatch('getRoleList', params).then((res) => {
        if (res.data.code === 1) {
          this.roleList = res.data.data
        } else {
          this.$message.error(res.data.msg)
        }
      })
    },
    getChange(val) {
      this.dialogChange = true
      this.defaultCheck = []
      this.permids = []
      this.tempData = {
        code: (val && val.code) || this.userInfo.simcode,
        created_at: (val && val.created_at) || this.formatTime(),
        created_user: (val && val.created_user) || this.userInfo.xzq_name,
        description: (val && val.description) || '', // 角色描述
        gjjsfyx: (val && val.gjjsfyx) || 0,
        issystem: (val && val.issystem) || '0', // 是否预置
        name: (val && val.name) || '',
        permodel: (val && val.permodel && val.permodel.split(',')) || [], // 模块
        shengsfyx: (val && val.shengsfyx) || 0,
        shisfyx: (val && val.shisfyx) || 1,
        xsfyx: (val && val.xsfyx) || 1,
        id: (val && val.id) || '',
        type: (val && val.type) || this.jsRadio // 默认角色
      }
      // debugger
      this.$nextTick(() => {
        if (val) {
          this.ifCreate = false // 编辑用户
          this.jsRadio = this.tempData.type + ''
          if (this.tempData.permodel && this.tempData.permodel.length > 0) {
            for (let index = 0; index < this.tempData.permodel.length; index++) {
              let item = this.tempData.permodel[index]
              this.treeData = this.getDgData(this.functionList, item, this.jsRadio, 1)
            }
          } else {
            this.treeData = this.getDgData(this.functionList, null, this.jsRadio, 1)
          }
        } else {
          this.ifCreate = true // 新建
          this.treeData = this.getDgData(this.functionList, null, this.jsRadio, 1)
        }
        console.log(this.treeData)
        this.$refs.Tree.setCheckedKeys(this.defaultCheck) // 获取已经设置的资源后渲染
      })
    }, // 获取选中数据
    getDgData(data, item, js, ifChildrenDis = 1) {
      let pushData = (value) => {
        if (this.ifCreate) {
          this.tempData.permodel.push(value.name)
          this.defaultCheck.push(value.id) //
          this.permids.push({ id: value.id, pid: value.pid })
        } else if (value.name == item) {
          // debugger
          this.defaultCheck.push(value.id) // 编辑默认选中
          this.permids.push({ id: value.id, pid: value.pid })
        }
      }
      for (let index = 0; index < data.length; index++) {
        data[index].disabled = false
        const ele = data[index]
        // 创建根据默认的角色选中对应权限 ..
        // [管理员(权限全部默认打钩)\行业部门(驾驶舱,平台资源,数据管理)\乡镇街道(驾驶舱\平台资源),没有打钩的权限置灰],选择逐级递增,
        // ifChildrenDis   :1全选  2 禁用  3 不管
        // debugger
        if (js == '1') {
          pushData(ele)
        } else if (js == '2') {
          if (ele.pid == '0') {
            // 遍历最外层
            if (['1', '2', '5'].includes(ele.id)) {
              pushData(ele)
              ifChildrenDis = 1
            }
            // else if (ele.id == '5') {
            //   ifChildrenDis = 3 // 行业部门的数据管理不管,让用户自己选
            // }
            else {
              ifChildrenDis = 2
              ele.disabled = true // 除了默认选中的都禁用
            }
          } else {
            // 子级 的判断根据父级传参
            if (ifChildrenDis == 1) {
              pushData(ele) // 子级选择
            } else if (ifChildrenDis == 2) {
              ele.disabled = true // 子级禁用
            } // 3子级不管
          }
        } else if (js == '3') {
          if (ele.pid == '0') {
            // 遍历最外层
            if (['1', '2'].includes(ele.id)) {
              pushData(ele)
            } else {
              ifChildrenDis = 2
              ele.disabled = true // 除了默认选中的都禁用
            }
          } else {
            // 子级 的判断根据父级传参
            if (ifChildrenDis == 1) {
              pushData(ele) // 子级选择
            } else if (ifChildrenDis == 2) {
              ele.disabled = true // 子级禁用
            } // 3子级不管
          }
        }

        if (ele.children) {
          this.getDgData(ele.children, item, js, ifChildrenDis)
        }
      }
      return data
    }, // 递归获取
    jsChange(val) {
      // debugger
      this.$nextTick(() => {
        this.tempData.type = val
        this.defaultCheck = []
        this.permids = []
        this.treeData = []
        if (this.ifCreate) {
          this.tempData.permodel = []
        }
        this.ifCreate = true // 切换类别改为创建模式
        this.treeData = JSON.parse(JSON.stringify(this.getDgData(this.functionList, null, val, 1))) // 重新更新整个视图
        this.$refs.Tree.setCheckedKeys(this.defaultCheck) // 获取已经设置的资源后渲染
        // console.log(this.defaultCheck)
      })
    }, // 编辑新建默认角色
    changeUser() {
      if (this.tempData.name == '' || this.tempData.permodel.length == 0) {
        this.$message.error('请填写完全必选项!')
        return
      }
      console.log(this.tempData)
      // debugger
      this.$store
        .dispatch('addOrUpdateRole', { role: this.tempData, permids: this.permids })
        .then((res) => {
          if (res.data.code === 1) {
            this.$message.success(res.data.msg)
            this.getRoleList()
          } else {
            this.$message.error(res.data.msg)
          }
        })
        .catch((err) => {
          this.$message.error(err.data.msg)
        })
      this.dialogChange = false
    }, // 编辑用户信息
    deleteUser(val) {
      if (val.issystem == 1) {
        this.$message.error('系统预置角色不能删除')
        return
      }
      this.$confirm('是否删除该用户', '确认删除', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
        showClose: false,
        customClass: 'self-confirm-box allDialogStyle',
        cancelButtonClass: 'button-self-style el-button--mini',
        confirmButtonClass: 'button-self-style el-button--mini'
      })
        .then(() => {
          this.$store.dispatch('DeleteRole', { role_id: val.id }).then((res) => {
            if (res.data.code === 1) {
              this.getRoleList()
            } else if (res.data.msg == '当前角色存在用户绑定关系,是否仍要删除?') {
              this.$confirm(res.data.msg, '确认删除', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning',
                showClose: false,
                customClass: 'self-confirm-box allDialogStyle',
                cancelButtonClass: 'button-self-style el-button--mini',
                confirmButtonClass: 'button-self-style el-button--mini'
              })
                .then(() => {
                  this.$store.dispatch('DeleteRole', { role_id: val.id, sfrysc: 1 }).then((res) => {
                    if (res.data.code === 1) {
                      this.getRoleList()
                    } else {
                      this.$message.error(res.data.msg)
                    }
                  })
                })
                .catch(() => {
                  this.$message.info('已取消')
                })
            } else {
              this.$message.error(res.data.msg)
            }
          })
        })
        .catch(() => {
          this.$message.info('已取消')
        })
    }, // 删除用户
    getFunctionList() {
      this.functionList = []
      this.$store.dispatch('getFunctionList', {}).then((res) => {
        if (res.data.code == 1) {
          this.functionList = res.data.data.filter((ele) => {
            return { id: ele.id, name: ele.name }
          })
        }
      })
    }, // 权限书
    handleCheckChange(data, checked, indeterminate) {
      let arr = this.$refs.Tree.getCheckedNodes()
      this.tempData.permodel = []
      this.permids = []
      this.defaultCheck = []
      arr.forEach((item) => {
        this.defaultCheck.push(item.id) // 编辑默认选中
        this.tempData.permodel.push(item.name)
        this.permids.push({ id: item.id, pid: item.pid })
      })
      // console.log(arr, 'chenck')
      // console.log(this.permids)
      // console.log(this.tempData.permodel)
      // console.log(this.defaultCheck)
    }, // 多选
    handleClose() {
      this.dialogChange = false
      this.jsRadio = '1'
      this.tempData = {}
      this.permids = []
      this.defaultCheck = []
    }, // 关闭弹窗
    // 分页数据
    currentChange(val) {
      this.page.pageNum = val - 1
      this.getRoleList()
    },
    sizeChange(val) {
      this.page.pageSize = val
      this.getRoleList()
    },
    nodeClick(data, node) {
      // 这个方法是勾选父级子级也默认勾选 取消子级不影响父级
      // debugger
      this.childNodesChange(node)
      // 这个方法是勾选子级默认把父级也勾选上
      this.parentNodesChange(node)
      // this.$refs.Tree.getCheckedNodes() 这个方法是官网自带的 若节点可被选择(即    show-checkbox 为 true),则返回目前被选中的节点所组成的数组
      let arr = this.$refs.Tree.getCheckedNodes()
      // debugger
      this.tempData.permodel = []
      this.permids = []
      this.defaultCheck = []
      arr.forEach((item) => {
        this.defaultCheck.push(item.id) // 编辑默认选中
        this.tempData.permodel.push(item.name)
        this.permids.push({ id: item.id, pid: item.pid })
      })
      console.log(arr, 'node')
      // this.$message.info(`当前已选择--${this.tempData.permodel}`)
      // console.log(this.defaultCheck, 'defaultCheck')
    },
    childNodesChange(node) {
      let len = node.childNodes.length
      if (len > 0) {
        for (let i = 0; i < len; i++) {
          if (!node.checked) {
            node.childNodes[i].checked = false
          } else {
            node.childNodes[i].checked = true
          }
          this.childNodesChange(node.childNodes[i])
        }
      }
    },
    parentNodesChange(node) {
      if (node.parent) {
        for (let key in node) {
          if (key == 'parent') {
            node[key].checked = true
            this.parentNodesChange(node[key])
          }
        }
      }
    }
  }
}
</script>
<style lang="scss" scoped>
.manageRole {
  width: 100%;
  height: 100%;
  overflow: hidden;
  .manageRole-header {
    width: 100%;
    padding: 10px 0;
    color: #fff;
    font-size: 14px;
    /deep/ .el-input {
      width: 200px;
    }
    > span {
      margin-left: 20px;
    }
  }
  /deep/ .el-table {
    border-radius: 5px;
    border: none;
    .el-table__body-wrapper {
      overflow-y: auto;
      overflow-x: hidden;
      height: calc(100vh - 280px);
    }
  }
  .allDialogStyle {
    overflow: hidden;
    /deep/ .el-tree {
      color: #fff;
      background: none;
      .el-tree-node.is-current > .el-tree-node__content {
        background: rgba(221, 221, 221, 0.4);
      }
      .el-tree-node .el-tree-node__content .is-leaf {
        background: none !important;
      }
      .el-tree-node .el-tree-node__content:hover {
        background: rgba(221, 221, 221, 0.4);
      }
    }
  }
}
</style>