按钮权限布局(设置 element中 tree 树的排列)

news2024/11/24 13:26:40

页面中使用

 <el-button
              type="text"
              @click="edit(slotProps.date)"
              v-btn-key="['client:clue:update']"
              >编辑</el-button
            >
            <el-button
              type="text"
              @click="del(slotProps.date)"
              v-btn-key="['client:clue:delete']"
              >删除</el-button
            >
            <el-button
              type="text"
              @click="details(slotProps.date)"
              v-btn-key="['client:clue:detail']"
              >详情</el-button
            >
import Vue from 'vue';
// 检测是否有权限
// 使用Vue.directive声明自定义指令btn-key
export const buttonPermissions = Vue.directive('btn-key', {
  inserted(el, binding, vnode) {
    const { value } = binding
    const all_permission = "*:*:*";
    const permissions = JSON.parse(localStorage.getItem("btnlist"))


    if (value && value instanceof Array && value.length > 0) {
      const permissionFlag = value
      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permissionFlag.includes(permission)
      })

      console.log(hasPermissions, 123)


      if (!hasPermissions) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
  }
})


以上js文档需要在main.js中进行布局
import {} from ‘./assets/js/hasPermi’

设置相关权限

设置权限需要设置 tree 树,以下为 element 中 tree 树的布局

<template>
  <div class="box">
    <div class="card" style="padding: 10px; margin-bottom: 10px">
      <el-button type="primary" class="btn_color_1" size="small" @click="change"
        >绑定</el-button
      >
    </div>
    <el-card>
      <el-tree
        default-expand-all
        ref="tree"
        :check-strictly="true"
        @check="handleCheck"
        :data="routeList"
        show-checkbox
        node-key="id"
        :props="defaultProps"
        :render-content="renderContent"
        @node-expand="handleExpand"
        :default-checked-keys="selected"
      >
      </el-tree>
    </el-card>
  </div>
</template>
<script>
import { RolePermissions, RolesUserdetach } from "@/api/limits/index";

export default {
  data() {
    return {
      defaultProps: {
        children: "children",
        label: "name",
      },
      routeList: [],
      selected: [],
    };
  },
  mounted() {
    this.getRolePermissions(this.$route.params.user_id);
  },
  computed: {},
  methods: {
    // 渲染权限组
    getRolePermissions(id) {
      RolePermissions({
        user_id: id,
      })
        .then((res) => {
          if (res.status == 1) {
            this.routeList = res.data.menu_list;
            this.selected = res.data.selected;
            this.$nextTick(() => {
              this.changeCss();
            });
          } else {
            this.$message.warning(res.msg || "请求数据失败");
          }
        })
        .catch((err) => {
          console.log(err);
        });
    },

    change() {
      RolesUserdetach({
        user_id: this.$route.params.user_id,
        ids: this.selected,
      })
        .then((res) => {
          if (res.status == 1) {
            this.$router.go(-1);
          } else {
            this.$message.warning(res.msg || "请求数据失败");
          }
        })
        .catch((err) => {
          console.log(err);
        });
    },
    // 内容区渲染后执行 判断底层 赋 class
    handleExpand() {
      // 节点被展开时触发的事件
      // 因为该函数执行在renderContent函数之前,所以得加this.$nextTick()
      this.$nextTick(() => {
        this.changeCss();
      });
    },
    renderContent(h, { node, data, store }) {
      // 树节点的内容区的渲染 Function
      let classname = "";
      // 由于项目中有三级菜单也有四级级菜单,就要在此做出判断
      if (node.level === 4) {
        classname = "foo";
      }
      if (node.level === 3 && node.childNodes.length === 0) {
        classname = "foo";
      }
      return h(
        "p",
        {
          class: classname,
        },
        node.label
      );
    },
    changeCss() {
      //将子节点横向排列方法
      var levelName = document.getElementsByClassName("foo"); // levelname是上面的最底层节点的名字
      for (var i = 0; i < levelName.length; i++) {
        // cssFloat 兼容 ie6-8  styleFloat 兼容ie9及标准浏览器
        levelName[i].parentNode.style.cssFloat = "left"; // 最底层的节点,包括多选框和名字都让他左浮动
        levelName[i].parentNode.style.styleFloat = "left";
        levelName[i].parentNode.onmouseover = function () {
          this.style.backgroundColor = "#fff";
        };
      }
    },

    //  =======================
    handleCheck(data, { checkedKeys }) {
      if (checkedKeys.includes(data.id)) {
        // 选中
        let node = this.$refs.tree.getNode(data.id); // getNode(node-key)
        this.selectChildren(data, true); // 选中子节点
        this.parentNodesChange(node); // 选中父节点
      } else {
        this.selectChildren(data, false); // 取消子节点
      }
      this.selected = this.$refs.tree.getCheckedKeys();
    },
    selectChildren(data, checked) {
      data &&
        data.children &&
        data.children.map((item) => {
          this.$refs.tree.setChecked(item.id, checked);
          if (data.children) {
            this.selectChildren(item, checked);
          }
        });
    },
    // 父级递归
    parentNodesChange(node) {
      // console.log(node);
      if (node.parent) {
        for (let key in node) {
          if (key == "id") {
            // console.log(node[key]);
            this.$refs.tree.setChecked(node, true);
          }
        }
        if (node.parent && node.id !== 0) {
          this.parentNodesChange(node.parent);
        }
      }
    },
  },
};
</script>
<style scoped lang="less">
.box {
  padding: 15px;
}
// 树样式
/deep/ .el-tree-node.is-expanded > .el-tree-node__children {
  padding-left: 18px;
}
.el-tree {
  ::v-deep .el-tree-node {
    position: relative;
    padding-left: 16px; // 缩进量
  }
  ::v-deep .el-tree-node__children {
    padding-left: 16px; // 缩进量
  }
  // 竖线
  ::v-deep .el-tree-node::before {
    content: "";
    height: 100%;
    width: 1px;
    position: absolute;
    left: -3px;
    top: -26px;
    border-width: 1px;
    border-left: 1px dashed #ccc;
  }
  // 当前层最后⼀个节点的竖线⾼度固定
  ::v-deep .el-tree-node:last-child::before {
    height: 38px; // 可以⾃⼰调节到合适数值
  }
  // 去掉最顶层的虚线,放最下⾯样式才不会被上⾯的覆盖了
  & > ::v-deep .el-tree-node::after {
    border-top: none;
  }
  & > ::v-deep .el-tree-node::before {
    border-left: none;
  }
  // 展开关闭的icon
  ::v-deep .el-tree-node__expand-icon {
    font-size: 16px;
    // 叶⼦节点(⽆⼦节点)
    ::v-deep &.is-leaf {
      color: transparent;
      // display: none; // 也可以去掉
    }
  }
}
</style>

效果展示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想读2023级中外合作办学硕士,人大女王金融硕士国际班或许是你最后的机会了

已经进入6月下旬&#xff0c;大部分院校中外合作办学在职研究生的招生已经截止&#xff0c;部分同学还在犹豫纠结中&#xff0c;各大高校的名额就已经都满了。想要读2023级还有可能吗&#xff1f;中国人民大学与加拿大女王大学金融硕士国际班还能给你一次机会。 虽然我们无法确…

【2023 阿里云云计算工程师 ACP 认证练习题库】03、ECS 知识点题库(下)

目录 单选题 1 2 3 答案与解析 4 ​5 6 ​答案与解析 7 8 答案与解析 9 ​答案与解析 10 ​答案与解析 11 12 13 14 15 16 答案与解析 17 18 19 20 21 22 23 24 25 ​答案与解析 26 27 28 29 ​答案与解析 …

校园外卖平台怎么做

校园外卖小程序是一款基于智能手机的移动应用&#xff0c;提供订餐、支付、配送等服务。它能为顾客提供丰富的美食选择&#xff0c;为商家提供进一步发展业务的机会&#xff0c;同时骑手也有机会赚取额外的收入。 一、 用户端功能介绍 1. 地图定位&#xff1a;用户可以利用小…

渐进式学习:如何用R和GO富集可视化捕捉生命的关键信号?

一、引言 生命科学中的数据分析和可视化是一个具有挑战性的领域。随着技术和理论的不断发展&#xff0c;研究人员需要处理越来越复杂和庞大的数据集&#xff0c;以研究生物体在不同尺度上的结构和功能&#xff0c;探索不同生物过程和疾病的机制。在这个领域&#xff0c;GO&…

【MySQL】一文带你了解数据过滤

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…

华为云“企业快成长大数据与微服务技术创新论坛”成功举办

6月16日&#xff0c;由华为云、msup、厦门火炬大学堂、厦门市行业软件协会联合主办的“企业快成长大数据与微服务技术创新论坛”在厦门成功举办。本次活动汇聚了华为云、珍爱网等知名企业的CTO和技术专家&#xff0c;通过技术案例解析了大数据平台构建、微服务演进等内容&#…

K8S证书过期解决办法之替换证书

目录 1 证书过期的情况 2 Kubernetes环境介绍 3 替换证书步骤 3.1 在master上查看各证书的过期时间 3.2 查看master&#xff08;192.168.0.190&#xff09;上kubelet证书列表 3.3 查看master&#xff08;192.168.0.190&#xff09;上kubelet证书的过期时间 3.4 查看nod…

在openSUSE-Leap-15.5-DVD-x86_64的gnome下使用远程桌面tigervnc

在openSUSE-Leap-15.5-DVD-x86_64的gnome下使用远程桌面tigervnc 在openSUSE-Leap-15.5-DVD-x86_64的tigervnc-1.12.0软件设计有变动了&#xff0c;变为一开机就启动远程桌面服务&#xff0c;没有vncserver取而代之是Xvnc&#xff0c;也在自己之前写的一篇博文的基础上作了修改…

vue跨域实现:proxy配置

一、什么是跨域 要了解跨域&#xff0c;首先得知道浏览器的同源策略。 同源策略&#xff1a;是由Netscape提出的一个安全策略&#xff0c;能够阻挡恶意文档&#xff0c;保护本地数据。它能限制一个源的文档或脚本对另一个源的交互&#xff0c;使得其它源的文档或脚本&#xf…

来看一个RuoYi-Cloud-Plus的Bug_今天突然发现的---RuoYi-Cloud-Plus-master工作笔记0002

用的时候可以注意一些,今天发现一个问题: 是关于角色管理这里的,如果你用的不是超级管理员登录,超级管理员他这里指定了ID是1, 如果你用其他,也是管理员账号,比如用超级管理员创建了一个管理员的角色,并且分配了,角色管理给这个管理员,那么,这个时候,你在给这个分配了角色管理…

CSAPP - LinkLab实验(阶段1-5)

LinkLab实验&#xff08;阶段1-5&#xff09; 官网&#xff1a;http://csapp.cs.cmu.edu/3e/labs.html 实验内容 每个实验阶段&#xff08;共5个&#xff09;考察ELF文件组成与程序链接过程的不同方面知识 阶段1&#xff1a;全局变量 <-> 数据节 阶段2&#xff1a;强符…

丝滑!软件开发根本不需要会编码(看我10分钟应用上线)

目录 一、前言 二、低代码基础功能及搭建 设计组件丰富 连接数据源 工作流设计 三、低代码和敏捷开发如何协同工作&#xff1f; 一、前言 众所周知&#xff0c;开发一个大型的企业级系统&#xff0c;公司往往需要大量的人力做支持后盾&#xff0c;如需要需求分析师、数据库管理…

使用chatgpt过funcaptcha验证码1个人学习记录

funcaptcha 验证码1 记录 funcaptch 有好几种验证码 验证码1 验证码2 验证码3 … 好多好多 今日记录验证码一完成记录&#xff1a; 这种验证码貌似每几天就换动物了 现在发现如下几种 如何解决&#xff1f; 训练模型计算目标位置 下面是我训练的模型计算的结果&…

LeetCode912排序数组(快速排序机及其优化详解)

LeetCode912排序数组&#xff08;快速排序及其优化详解&#xff09; 文章目录 LeetCode912排序数组&#xff08;快速排序及其优化详解&#xff09;Abstract基本快速排序快速排序思路总结以及优化优化思路针对渐进有序数组针对相同元素较多的数组 Code参考文献 Abstract 我首先…

【Python 下载,Anaconda下载,环境变量配置,两个python不同版本使用环境变量配置切换】

我再下载Anaconda之前&#xff0c;自己安装了一个Python3.11.配置环境变量之后&#xff0c;查看python版本&#xff1a; 下载好Anaconda3之后&#xff0c;将环境变量提到之前的前面&#xff0c;再使用CMD,查看就是Anaconda自带的Python版本&#xff0c;该版本有就有很多的第三方…

大模型与人类的未来 | 基于认知神经科学的大模型论坛精彩回顾

导读 6 月 10 日&#xff0c;智源大会“基于认知神经科学的大模型论坛”召开&#xff0c;本次论坛邀请到了认知神经、脑科学领域非常有建树的专家&#xff0c;深度讨论大模型的能力与局限性&#xff0c;包括对未来人工智能发展方向的讨论。论坛主席是清华大学脑与智能实验室首席…

全网最牛最全Postman接口测试: postman设置接口关联,postman实现参数化

postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用postman获取上一个接口指定的返回值…

2023年5月青少年机器人技术等级考试理论综合试卷(五级)

青少年机器人技术等级考试理论综合试卷&#xff08;五级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 30 一、 单选题(共 20 题&#xff0c; 每题 4 分&#xff0c; 共 80 分) 1.ESP32 for Arduino&#xff0c; 下列程序的运行结果是&#xff1f; &#xff08; &#x…

GAMES101笔记 Lecture05 光栅化1(Triangles)

目录 Perspective Projection(透视投影)Canonical Cube to Screen(从标准立方体到屏幕)What is a screen(什么是屏幕)? Rasterization: Drawing to Raster Displays(如何在光栅设备上画东西)Triangles - Fundamental Shape Primitives(三角形-基本形状的基元)Why triangles?&…

node从头到尾实现简单编译器

介绍 本文用node实现了一个简单的编译器mccompiler&#xff0c;主要用于学习&#xff0c;笔者能力和精力有限&#xff0c;如有不当&#xff0c;还请指出 原文地址&#xff1a;原文地址 项目地址&#xff1a;项目地址 本文涉及&#xff1a;编译器的词法分析&#xff0c;抽象语义…