当前位置: 首页 > news >正文

按钮权限控制

搜索关键字:

自定义指令传参| +"自定义指令"+"dataset"|自定义指令dataset| +"Vue"+"directives"|vue按钮权限实现

1、完整代码:

<template>

    <div>

        <el-breadcrumb separator-class="el-icon-arrow-right">

            <el-breadcrumb-item>报表管理</el-breadcrumb-item>

            <el-breadcrumb-item>折线图</el-breadcrumb-item>

        </el-breadcrumb>

        <el-card>

            <el-row type="flex" justify="center" style="margin-top:20px">

                <el-col :push="12" :span="12">

                    <el-button type="primary" v-btnOp = "{name:'BtnAdd',loadOps:ops}">新增</el-button>

                    <el-button type="success" v-btnOp = "{name:'BtnExp',loadOps:ops}">导出</el-button>

                    <el-button type="info" v-btnOp = "{name:'BtnPrint',loadOps:ops}">打印</el-button>

                    <el-button type="warning" v-btnOp = "{name:'BtnShare',loadOps:ops}">分享</el-button>

                </el-col>

            </el-row>

        </el-card>

    </div>

</template>

<script>

export default {

    data() {

        return {

            // 用户ID

            userpx: '',

            // 页面ID

            pageID: '',

            // 操作权限加载标志

            loaded: false,

            // 操作权限

            ops: []

        }

    },

    created() {

        this.getUserIDPageID();

    },

    methods: {

        // 获取登录用户ID+页面ID

        getUserIDPageID() {

            this.pageID = this.$route.query.id;

            console.log("页面ID",this.pageID);

            if(sessionStorage.getItem("user") !== null) {

                let user = JSON.parse(sessionStorage.getItem("user"));

                this.userpx = user.id;

                console.log("用户ID",this.userpx);

            }

        },

        // 加载操作权限

        loadAssignedOps() {

            this.$axios.get("/api/operation/assignedops",{

                params: {

                    userpx: this.userpx,

                    pageID: this.pageID

                }

            })

            .then( res => {

                console.log("获取操作权限返回数据:",res.data);

                this.ops = res.data.data;

                console.log("看一下操作数组ops:",this.ops);

                console.log("包括BtnShare:",this.ops.includes("BtnShare"));

            })

            .catch( function(error) {

                console.log(error);

            });

        }

    },

    watch: {

        userpx: function(data) {

            if(this.loaded) {

                return;

            }            

            console.log("userpx有值了:,在看一下this.pageID",data,this.pageID);

            if(this.pageID ) {

                this.loaded = true;

                this.$nextTick( () => {

                    this.loadAssignedOps();

                })                

            }

        },

        pageID: function(data) {

            if(this.loaded) {

                return;

            }

            console.log("pageID有值了:,再看一下this.userpx",data,this.userpx);

            if(this.userpx) {

                this.loaded = true;

                this.$nextTick( () => {

                    this.loadAssignedOps();                    

                })                

            }

        }

    },

    directives: {

        "btnOp": {

            componentUpdated: function(el,binding,vnode) {

                console.log("改进之后binding.value.name",binding.value.name);

                console.log("改进之后binding.value.loadOps",binding.value.loadOps)

                let ops = binding.value.loadOps;

                console.log("看一下Ops是否包括按钮值:",ops.includes(binding.value.name),binding.value.name);

                if( ops != null && !ops.includes(binding.value.name)) {

                    el.parentNode.removeChild(el);

                }

            }

        }

    }

}

</script>

<style lang="scss" scoped>

.el-breadcrumb {

    margin-bottom: 15px;

    font-size: 12px;

}

.el-card {

    box-shadow: 0 1px 1px rgba(0,0,0,0.15);

}

</style>

2、后台接口"/api/operation/assignedops"

返回实际数据:

[

    "BtnShare",

    "BtnExp",

    "BtnPrint"

]

3、判断页面按钮是否在返回值里面

<el-button type="success" v-btnOp = "{name:'BtnExp',loadOps:ops}">导出</el-button>

4、效果图:

 

相关文章:

按钮权限控制

搜索关键字&#xff1a; 自定义指令传参| "自定义指令""dataset"|自定义指令dataset| "Vue""directives"|vue按钮权限实现 1、完整代码&#xff1a; <template> <div> <el-breadcrumb separator-class"el-icon…...

【脚本式设置环境变量】

在linux系统中&#xff0c;如果我打开一个软件需要如下操作&#xff0c;那将会是一件很麻烦的事情 cd dir #软件的文件路径 conda deactivate conda activate chatgpt python main.py【首先写一个chatgpt.sh脚本内容如下】 #!/bin/bash cd dir conda run -n chatgpt python m…...

软件开发bug问题跟踪与管理

一、Redmine 项目管理和缺陷跟踪工具 官网&#xff1a;https://www.redmine.org/ Redmine 是一个开源的、基于 Web 的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示&#xff0c;同时它又支持多项目管理。Redmine 是一个自由开源软件解决方案&#xff0c;…...

springboot+mp完成简单案例

目录 1.框架搭建 2.前端搭建 3.后端编写 需求&#xff1a;完成简单的连表条件查询以及添加即可 1.框架搭建 1.创建springboot项目 2.相关依赖 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…...

cuml机器学习GPU库 sklearn升级版AutoDL使用

CUML库 最近在做机器学习任务的时候发现我自己的数据集太大&#xff0c;直接用sklearn 跑起来时间很长&#xff0c;然后问GPT得知了有CUML库&#xff0c;后来去研究了一下&#xff0c;发现这个库只支持linux系统&#xff0c;从官网直接获取下载命令基本上也实现不了最后&#…...

C语言练习题Day1

从今天开始分享C语言的练习题&#xff0c;每天都分享&#xff0c;差不多持续16天&#xff0c;看完对C语言的理解可能更进一步&#xff0c;让我们开始今天的分享吧&#xff01; 题目一 执行下面的代码&#xff0c;输出结果是&#xff08;&#xff09; int x5,y7; void swap()…...

使用kubeadm安装和设置Kubernetes(k8s)

用kubeadm方式搭建K8S集群 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署&#xff1a; # 创建一个 Master 节点 kubeadm init# 将一个 Node 节点加入到当前集群中 kubeadm join <Master节点的IP和端口…...

Docker安装延迟队列插件

下载插件地址&#xff1a;https://www.rabbitmq.com/community-plugins.html 插件上传服务器 选择跟我们rabbitmq版本一致或者小于的插件即可。版本可在web管理首页查看。 将下载的插件上传到Linux系统上&#xff0c;使用 docker 命令将插件复制到容器内部 plugins目录下 do…...

推荐前 6 名 JavaScript 和 HTML5 游戏引擎

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 事实是&#xff0c;自从引入JavaScript WebGL API以来&#xff0c;现代浏览器具有直观的功能&#xff0c;使它们能够渲染更复杂和复杂的2D和3D图形&#xff0c;而无需依赖第三方插件。 你可以用纯粹的JavaScript开…...

【Django】 Task5 DefaultRouter路由组件和自定义函数

文章目录 【Django】 Task5 DefaultRouter路由组件和自定义函数1.路由组件1.1路由组件介绍1.2SimpleRouter1.3DefaultRouter1.4DefaultRouter示例1.5查看访问服务接口url 2.自定义函数 【Django】 Task5 DefaultRouter路由组件和自定义函数 Task5 主要了解了DefaultRouter路由…...

Git拉取分支、基于主分支创建新的开发分支、合并开发分支到主分支、回退上一次的merge操作

系列文章目录 第1章 Git拉取分支、基于主分支创建新的开发分支、合并开发分支到主分支、回退上一次的merge操作 文章目录 系列文章目录一、拉取分支二、如何从master分支创建一个dev分支三、如何将dev分支合并到master分支四、如何回退上一次的merge 一、拉取分支 项目文件夹…...

SpringBoot实现定时任务操作及cron在线生成器

spring根据定时任务的特征&#xff0c;将定时任务的开发简化到了极致。怎么说呢&#xff1f;要做定时任务总要告诉容器有这功能吧&#xff0c;然后定时执行什么任务直接告诉对应的bean什么时间执行就行了&#xff0c;就这么简单&#xff0c;一起来看怎么做 步骤①&#xff1a;…...

数据结构(Java实现)-栈和队列

栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 先进后出 栈的使用 栈的模拟实现 上述的主要代码 public class MyStack {private int[] elem;private int usedSize;public MyStack() {this.elem new int[5];}Overridepublic …...

毕业季如何做好IT技术面试

在IT技术面试过程中&#xff0c;面试者需要展示多个方面的能力和素质&#xff0c;以确保其能够成功地适应公司的文化和环境&#xff0c;并为公司的发展做出贡献。本文将详细介绍IT技术面试的各个方面&#xff0c;并给出建议和指导。 简历和求职信 简历和求职信是面试官了解面…...

springcloud3 GateWay章节-Nacos+gateway(跨域,filter过滤等5

一 常用工具类 1.1 结构 1.2 跨域 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowe…...

Nodejs+Typescript+Eslint+Prettier+Husky项目构建

NodejsTypescriptEslintPrettierHusky项目构建 准备工作初始化项目Eslint安装和配置Prettier安装和配置在Eslint中使用Prettier插件Husky安装和配置修改tsconfig.json启用表示src目录 修改package.json设置vscode调试 仓库地址 准备工作 确保已经安装了git以及Node.js和npm&a…...

轻松正确使用代理IP

Hey&#xff0c;亲爱的程序员小伙伴们&#xff01;在进行爬虫时&#xff0c;你是否曾使用过别人的代理IP&#xff1f;是否因此慌乱&#xff0c;担心涉及违法问题&#xff1f;不要惊慌&#xff01;今天我将和你一起揭开法律迷雾&#xff0c;为你的爬虫之路保驾护航。快跟上我的节…...

SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

在上一篇文章&#xff0c;讲了服务的注册和发现。在微服务架构中&#xff0c;业务都会被拆分成一个独立的服务&#xff0c;服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式&#xff0c;一种是ribbonrestTemplate&#xff0c;另一种是feign。在这一篇文章…...

lintcode 961 · 设计日志存储系统预【系统设计题 中等】

题目链接&#xff0c;描述 https://www.lintcode.com/problem/961 您将获得多个日志&#xff0c;每个日志都包含唯一的 ID 和时间戳。 时间戳是一个具有以下格式的字符串&#xff1a;Year:Month:Day:Hour:Minute:Second&#xff0c;例如2017:01:01:23:59:59。 所有域都是零填…...

windows下Qt、MinGW、libmodbus源码方式的移植与使用

windows下Qt、MinGW、libmodbus源码方式的移植与使用 1、前言 libmodbus官网&#xff1a;https://libmodbus.org/ github下载&#xff1a;https://github.com/stephane/libmodbus 截止2023年8月26日时&#xff0c;libmodbus最新版本为3.1.10&#xff0c;本篇博客基于此版本进…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...