element实现角色管理页面

用的element,Tree 树形控件来实现的

<template>
  <div class="p-t-20">
    <div class="table-bg">
      <Title title="角色名称">
        <span>{{role.roleName}}</span>
      </Title>

      <div class="menu-list">
        <el-tree ref="tree" :data="data" :props="props" node-key="menuId" show-checkbox check-on-click-node :expand-on-click-node="false"></el-tree>
      </div>
    </div>

    <GlobalFootButtons>
      <el-button @click="$router.go(-1)">取 消</el-button>
      <el-button class="m-l-20" type="primary" @click="saveClick()">保存</el-button>
    </GlobalFootButtons>
  </div>
</template>

<script>
import { getMenusByRoleId, postUpdateRoleDetail, postQueryRoleById } from '@/axios/systemManage'
export default {
  data () {
    return {
      user: null,
      role: null,
      data: [],
      props: {
        label: 'menuName',
        children: 'children'
      },
      postCreateRoleData: {} // 新增、编辑角色表单
    }
  },
  created () {
    this.user = JSON.parse(window.localStorage.getItem('userInfo'))
    this.role = JSON.parse(window.localStorage.getItem('roleItem'))
    this.getMenuTreeList()
  },
  methods: {
    // 获取列表数据
    async getMenuTreeList () {
      const res = await getMenusByRoleId(this.user.roleId)
      if (res.code === 200) {
        // 处理名称中带括号的内容
        res.data.map(item => {
          item.menuName = item.menuName.split('(')[0]
          item.children.map(i => {
            i.menuName = i.menuName.split('(')[0]
          })
        })
        this.data = res.data
        this.getQueryRoleById()
      }
    },
    // 回显勾选的数据
    async getQueryRoleById () {
      const roleItem = JSON.parse(localStorage.getItem('roleItem'))
      const res = await postQueryRoleById({ roleId: roleItem.roleId })
      if (res.code === 200) {
        this.postCreateRoleData = res.data
        this.$nextTick(() => {
          const tree = this.$refs.tree

          // 选中树
          if (res.data.menuIds && res.data.menuIds.length > 0) {
            tree.setCheckedKeys(res.data.menuIds)
          }

          // 设置展开所有行
          const nodesMap = tree.store.nodesMap
          const keys = Object.keys(nodesMap)
          keys.forEach(key => {
            nodesMap[key].expanded = true
          })
        })
      }
    },
    // 保存
    async saveClick () {
      this.postCreateRoleData.role = JSON.parse(localStorage.getItem('roleItem'))
      this.postCreateRoleData.operationStatus = 1 // 编辑权限时固定传1 角色基本信息传0
      const halfCheckKeys = this.$refs.tree.getHalfCheckedKeys()
      const checkKeys = this.$refs.tree.getCheckedKeys()
      this.postCreateRoleData.menuIds = halfCheckKeys.concat(checkKeys)
      const res = await postUpdateRoleDetail(this.postCreateRoleData)
      if (res.code === 200) {
        this.$message.success('保存成功!')
        this.$router.go(-1)
      }
    }
  }
}
</script>

<style lang="less" scoped>
.table-bg {
  min-height: 88vh;
  padding: 20px;
  margin-bottom: 100px;
  ::v-deep .title {
    font-size: 16px;
    font-weight: bold;
    color: #333;
    span {
      font-size: 14px;
      font-weight: normal;
    }
  }

  .menu-list {
    ::v-deep .el-tree {
      border-top: 1px solid #ebeef5;
      border-left: 1px solid #ebeef5;
      border-right: 1px solid #ebeef5;
      .el-tree-node__expand-icon {
        display: none !important;
      }
      .el-tree-node {
        &.is-expanded,
        &.is-current,
        &.is-focusable {
          background-color: transparent !important;
        }
        .el-tree-node__content {
          background-color: transparent !important;
          &:hover {
            background-color: transparent !important;
          }
        }
      }
      > .el-tree-node {
        display: flex;
        align-items: center;
        border-bottom: 1px solid #ebeef5;
        position: relative;
        > .el-tree-node__content {
          width: 300px;
          height: 100%;
          padding-left: 20px !important;
        }
        .el-tree-node__children {
          position: relative;
          &::after {
            content: ' ';
            display: block;
            width: 1px;
            height: 100%;
            border-left: 1px solid #ebeef5;
            position: absolute;
            left: 0px;
            top: 0px;
          }
          .el-tree-node {
            width: 350px;
            padding: 10px 0px;
          }
        }
      }
    }
  }
}
</style>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不会•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值