基于Vue的树形菜单权限分配图

基于Vue的树形菜单权限分配
组件-vue

在这里插入图片描述

<template>
  <el-row class="prems-setting">
    <el-col :span="24" class="prems-area">
      <el-row>
        <el-col :span="10" class="card-prems-tree">
          <div class="div-title">待分配权限</div>
          <el-tree
                  :data="leftData"
                  ref="leftTree"
                  :props="leftDefaultProps"
                  node-key="menuId"
                  show-checkbox
                  :filter-node-method="leftFilterNode"
                  :default-checked-keys="defCheckedKeys"
                  :default-expanded-keys="defaultExpandedKeys"
                  class="role-tree"
          >
          </el-tree>
        </el-col>
        <el-col :span="4" class="setting-btn-area">
          <el-button class="circleBtn"  @click="addPrems"><i class="el-icon-arrow-right"></i></el-button>
          <el-button class="circleBtn" @click="removePrems" style="margin-top:20px"><i class="el-icon-arrow-left"></i></el-button>
        </el-col>
        <el-col :span="10" class="card-prems-tree">
          <div class="div-title">已分配权限</div>
          <div>
            <el-tree
                    :data="rightData"
                    ref="rightTree"
                    :props="rightDefaultProps"
                    show-checkbox
                    node-key="menuId"
                    :filter-node-method="rightFilterNode"
                    :default-expanded-keys="defaultExpandedKeys"
                    class="role-tree"
            >
            </el-tree>
          </div>
        </el-col>
      </el-row>
    </el-col>
    <el-col :span="24" class="bottom-btn">
      <el-button @click="handleCancel">取 消</el-button>
      <el-button type="primary" :loading="saveBtnLoading" @click="handleSave">保 存</el-button>
    </el-col>
  </el-row>
</template>

<script>
  import ajax from './../../../pub/utils/ajaxUtil.js';
  import {showMessage} from '../../../pub/utils/promptUtil';
  import {getTreeData,getmenuList,submitUrl} from './config/baseUrl'
  export default{
    props:{
      roleData:Array,
      model:Object
    },
    data() {
      return {
        leftData:null,
        leftDefaultProps:{
          label:'label',
          children:'childMenus'
        },
        defaultExpandedKeys:[],
        checkedData:[],
        rightData:null,
        rightDefaultProps:{
          label:'label',
          children:'childMenus'
        },
        parentFuncName:'智慧管理平台',
        filterText:'',
        defaultCheckedKeys:[],
        defCheckedKeys:[],
        isEdit:false,
        selectTreeData0:[],
        saveBtnLoading:false,
      }
    },
    created:function () {
      this.getPremsByOsId();
    },
    watch: {
      filterText: {
        immediate: true,
        handler: function (v, oldv) {
          if(this.$refs.rightTree){
            this.$refs.rightTree.filter(v);
          }
        }
      },
      defaultCheckedKeys: {
        immediate: true,
        handler: function (v, oldv) {
          this.defCheckedKeys = v;
          this.setLeftCheckedKeys(v);
        }
      }
    },
    methods:{
      /**
       * 根据系统ID获取权限树
       *
       */
      getPremsByOsId:function () {
        var _self = this;
        var treeData1=[]
        ajax.getJson(getTreeData, {},(res)=> {
          if (res.success) {
            //这是后台返回的数组结构  this.fromData=res.dataList
            // this.fromData=res.dataList
            //自己写一个数据结构
            this.fromData = [
              {
               dr: 0,
               label: "项目管理",
               level: null,
               menuId: "dafa521094644ec7a9c7fa882696351b",
               menuOder: 1,
               menuType: "sunsea",
               parentId: "",
               url: "/sunSea",
                childMenus:[
                  {
                    childMenus: [],
                    disable: 1,
                    dr: 0,
                    label: "大区档案",
                    level: null,
                    menuId: "ad6dd4eff5a14735b27ab4e15a4d30b0",
                    menuOder: 1,
                    menuType: "sunsea",
                    parentId: "dafa521094644ec7a9c7fa882696351b",
                    path: null,
                    style: null,
                    ts: 1578479397000,
                    url: "/areaConfig",
                  },
                  {
                    childMenus: [],
                    disable: 1,
                    dr: 0,
                    label: "项目档案",
                    level: null,
                    menuId: "a8ee0ec251d34affa647496acca98428",
                    menuOder: 2,
                    menuType: "sunsea",
                    parentId: "dafa521094644ec7a9c7fa882696351b",
                    url: "projectInfo",
                  }
                ]
              },{
              disable: 1,
              dr: 0,
              label: "系统管理",
              level: null,
              menuId: "b8bf0135-9318-4e35-a3ea-4c8f2bd807ff",
              menuOder: 50,
              menuType: "sunsea",
              parentId: null,
              path: "0",
              url: "/sunSea",
              childMenus:[
                {
                  childMenus: [],
                  disable: 1,
                  dr: 0,
                  label: "用户管理",
                  level: null,
                  menuId: "39216b30b6234d66a4405ba7275d9beb",
                  menuOder: 1,
                  menuType: "sunsea",
                  parentId: "b8bf0135-9318-4e35-a3ea-4c8f2bd807ff",
                  url: "/userManage",
                },
                {
                  childMenus: [],
                  disable: 1,
                  dr: 0,
                  label: "角色管理",
                  level: null,
                  menuId: "8d1c9229-4f00-4ef9-9c38-bc460bf716a8",
                  menuOder: 3,
                  menuType: "sunsea",
                  parentId: "b8bf0135-9318-4e35-a3ea-4c8f2bd807ff",
                  path: "",
                  style: null,
                  ts: 1578479397000,
                  url: "/roleManage",
                },{
                childMenus: [],
                disable: 1,
                dr: 0,
                label: "自定义档案",
                level: null,
                menuId: "e83938a83a5948e3a6a530d4c4e671e5",
                menuOder: 11,
                menuType: "sunsea",
                parentId: "b8bf0135-9318-4e35-a3ea-4c8f2bd807ff",
                url: "/userDefined",
                }
                ]
              }
            ]
            treeData1 = [{
              menuId:'all',
              label:_self.parentFuncName,
              childMenus:this.fromData
            }];
            treeData1.forEach(function(item,index){
              if(index == 0){
                _self.defaultExpandedKeys = [item.menuId];
              }
            });
            _self.leftData = treeData1;
            _self.getFunctionsByRoleId();
          } else {
            this.$alert(res.msg, "信息操作", {
              confirmButtonText: "确定"
            })
          }
        })
      },
      /**
       * 查询功能权限
       */
      getFunctionsByRoleId:function () {
        var _self = this;
        ajax.getJson(getmenuList, {},(res)=> {
          if (res.success) {
            var backData=[]
            // backData=res.dataList  //这是后台返回的选中的节点menuId
           backData=['e83938a83a5948e3a6a530d4c4e671e5','a8ee0ec251d34affa647496acca98428']  //自己先模拟写一下
            if(backData){
              var functionList = backData.length>0?backData:[];
              /**新增状态 来回切换系统时,带出原来选择的数据 begin**/
              if(functionList.length == 0){
                if(_self.checkedData.length>0){
                  _self.rightData = _self.leftData;
                  _self.$nextTick(function () {
                    _self.$refs.rightTree.filter(_self.checkedData);
                  });
                }
                return;
              }
              /**新增状态 来回切换系统时,带出原来选择的数据 end**/
              _self.rightData = _self.leftData;
              var funcIds = [];
              functionList.forEach(function (item) {
                funcIds.push(item.menuId);
              });
              _self.defaultCheckedKeys = funcIds;
              _self.setLeftCheckedKeys(funcIds);
              _self.checkedData = functionList;
              if(functionList && functionList.length>0){
                _self.isEdit = true;
              }
              _self.$nextTick(function () {
                _self.$refs.rightTree.filter(_self.checkedData);
              });
            }else{
              _self.$nextTick(function () {
                _self.$refs.rightTree.filter(_self.selectTreeData0);
              });
            }
          } else {
            this.$alert(res.msg, "信息操作", {
              confirmButtonText: "确定"
            })
          }
        })
      },
      rightFilterNode:function (value, data) {
        if (!value) return true;
        for(var i= 0;i<value.length;i++){
          if(data.menuId == value[i].menuId){
            return true;
          }
        }
      },
      leftFilterNode:function (value, data) {
        if (!value) return true;
        for(var i= 0;i<value.length;i++){
          if(value[i].menuId == data.menuId){
            return false;
          }else{
            return true;
          }
        }
      },
      /**
       * 获取已选择节点
       */
      getLeftCheckedNodes:function(){
        return this.$refs.leftTree.getCheckedNodes();

      },
      /**
       * 设置选择节点
       * @params checkedData
       */
      setLeftCheckedKeys:function (checkedData) {
        if(this.$refs.leftTree){
          this.$refs.leftTree.setCheckedKeys(checkedData);
        }
      },
      setLeftCheckedNodes:function (checkedData) {
        if(this.$refs.leftTree){
          this.$refs.leftTree.setCheckedNodes(checkedData);
        }
      },
      /**
       * 设置
       *
       */
      addPrems:function(){
        var _self = this;
        if(!_self.rightData || _self.rightData.length == 0){
          _self.rightData = _self.leftData;
        }
        var selectedData = this.getLeftCheckedNodes();
        _self.selectTreeData0 = selectedData;
        _self.checkedData = selectedData;
        console.log(_self.checkedData)
        _self.$nextTick(function () {
          _self.$refs.rightTree.filter(selectedData);
        });
      },
      /**
       * 取消
       */
      removePrems:function(){
        var _self = this;
        var selectedData = [];
        var treeName = 'rightTree';
        selectedData = _self.getRightCheckedNodes(treeName);
        var checkedData = _self.checkedData;
        if(JSON.stringify(_self.checkedData) == '{}'){
          return;
        }
        var treeData = [];
        checkedData.forEach(function(item,index){
          for(var i=0;i<selectedData.length;i++){
            if(item.menuId == selectedData[i].menuId){
              return;
            }
          }
          treeData.push(item);
        });
        if(treeData.length>0){
          var leftCheckedKeys = [];
          for(var i=0;i<treeData.length;i++){
            leftCheckedKeys.push(treeData[i].menuId);
          }
          _self.defaultCheckedKeys = leftCheckedKeys;
          _self.$refs[treeName].filter(treeData);
          _self.checkedData = treeData;
        }else{
          _self.rightData = [];
          _self.defaultCheckedKeys = [];
          _self.checkedData = treeData;
          _self.$refs[treeName].filter(treeData);
        }
      },
      /**
       * 获取已选择节点
       */
      getRightCheckedNodes:function(treeName){
        return this.$refs[treeName].getCheckedNodes();

      },
      //确定
      handleSave:function(){
        var _self = this;
        var functionIds = [];
        _self.checkedData.forEach(function(item){
          functionIds.push(item.menuId);
        });
        if(!_self.isEdit) {
          if (functionIds.length == 0) {
            showMessage('提示', '您未选择功能权限', 'warning');
            return;
          }
        }
        var params = {
          isEdit:_self.isEdit,
        };
        if(functionIds.length >0){
          params.functionIds = functionIds.join(',')
        }
        _self.saveBtnLoading = true;
        
        ajax.postJson(submitUrl,params, {},(data)=> {
          if(data && data.result == 200){
                      _self.saveBtnLoading = false;
                      showMessage('成功','分配操作权限成功!','success');
                      _self.handleCancel();
                      _self.$emit('refresh');
                    }else{
                      _self.saveBtnLoading = false;
                      showMessage('失败',data.message?data.message:'分配操作权限失败!','error');
                    }
        })
      },
      //取消
      handleCancel:function(){
        this.$emit('closeDialog');
      },
    }
  }
</script>
<style scoped>
  .role-tree{
    height: 300px;
    overflow-y: scroll;
  }
  .div-title{
    height: 40px;
    line-height: 40px;
    background: #f5f7fa;
    margin: 0;
    padding-left: 15px;
    border: 1px solid #EBEEF5;
    border-bottom: none;
  }
    .setting-btn-area {
    height:340px;
    display: flex;
    justify-content: center;
    flex-direction: column;
  }
  .setting-btn-area .circleBtn{
    width:40px;
    height:40px;
    border-radius: 50%;
    display: flex;
    justify-content: center;
    margin: 0 auto;
    color: #FFF;
    background-color: #409EFF;
    border:1px solid #409EFF;
  }
  .bottom-btn{
    text-align:center;
    margin:20px 0;
  }
</style>

引用组件
<template>
   <treeSetting></treeSetting>
</template>
<script>
import  treeSetting from '../../../pub/components/treeSetting.vue'

  export default {
      components: {treeSetting}
  }
</script>

粗浅的写了一下,那块需要进一步优化,欢迎指出,共同进步
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【资源说明】 1、基于spring-boot+vuejs+element-ui的新闻发布管理系统源码+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于spring-boot+vuejs+element-ui的新闻发布管理系统源码+项目说明.zip <h1 style="text-align: center">EL-NEWS新闻发布管理系统</h1> <div style="text-align: center"> 项目简介 一个基于 Spring Boot 、 Spring Boot Jpa、 JWT、Spring Security、Redis、Vue、eladmin的新闻发布管理系统 **初始账号密码:** `admin / 123456` #### 主要特性 - 使用最新技术栈,社区资源丰富。 - 高效率开发,代码生成器可一键生成前后端代码 - 支持数据字典,可方便地对一些状态进行管理 - 支持接口限流,避免恶意请求导致服务层压力过大 - 支持接口级别的功能权限与数据权限,可自定义操作 - 自定义权限注解与匿名接口注解,可快速对接口拦截与放行 - 对一些常用地前端组件封装:表格数据请求、数据字典等 - 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断 - 支持在线用户管理与服务器性能监控,支持限制单用户登录 - 支持运维管理,可方便地对远程服务器的应用进行部署与管理 #### 系统功能 - 用户管理:提供用户的相关配置,新增用户后,默认密码为123456 - 角色管理:对权限菜单进行分配,可根据部门设置角色的数据权限 - 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单 - 部门管理:可配置系统组织架构,树形表格展示 - 岗位管理:配置各个部门的职位 - 字典管理:可维护常用一些固定的数据,如:状态,性别等 - 系统日志:记录用户操作日志与异常日志,方便开发人员定位排错 - SQL监控:采用druid 监控数据库访问性能,默认用户名admin,密码123456 - 定时任务:整合Quartz做定时任务,加入任务日志,任务运行情况一目了然 - 代码生成:高灵活度生成前后端代码,减少大量重复的工作任务 - 邮件工具:配合富文本,发送html格式的邮件 - 七牛云存储:可同步七牛云存储的数据到系统,无需登录七牛云直接操作云数据 - 支付宝支付:整合了支付宝支付并且提供了测试账号,可自行测试 - 服务监控:监控服务器的负载情况 - 运维管理:一键部署你的应用 - 新闻管理:发布新闻、评论、标签、类型管理 #### 演示 <table> <tr> <td><img src="https://blog-me-001.oss-cn-beijing.aliyuncs.com/%E6%88%AA%E5%B1%8F2022-05-08%2014.54.37.png"/></td> <td><img src="https://blog-me-001.oss-cn-beijing.aliyuncs.com/%E6%88%AA%E5%B1%8F2022-05-08%2014.53.56.png"/></td> </tr> </table>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值