首页 > 其他分享 >Vue2-利用自定义指令实现按钮权限控制

Vue2-利用自定义指令实现按钮权限控制

时间:2024-07-13 10:07:35浏览次数:15  
标签:const 自定义 permission js state hasPerm Vue2 按钮 permissions

文件结构

新建directive目录,并在该目录下新增permission目录,在permission目录下新增hasPerm.js和index.js。

文件内容

hasPerm.js

//操作按钮权限控制
import store from "@/store";

export default {
  /**
   * 被绑定元素插入父节点时调用
   * @param {*} el 指令绑定的元素
   * @param {*} binding 指令信息
   * @param {*} vnode 虚拟DOM节点
   */
  inserted(el, binding, vnode) {
    const { value } = binding;
    const all_permission = "*:*:*";
    const permissions = store.getters && store.getters.permissions;

    if (value && value instanceof Array && value.length > 0) {
      const permissionFlag = value;

      const hasPermissions = permissions.some((permission) => {
        return (
          all_permission === permission || permissionFlag.includes(permission)
        );
      });

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

index.js

import hasPerm from './hasPerm'

const install = function(Vue) {
  Vue.directive('hasPerm', hasPerm)
}

if (window.Vue) {
  window['hasPerm'] = hasPerm
  Vue.use(install);
}

export default install

全局注册

main.js

import permission from './directive/permission'
Vue.use(permission)

Vuex部分

store→getter.js

const getters = {
     permissions:state=>state.user.permissions
}
export default getters

store→modules→user.js

import { getInfo } from "@/api/user";
import { getToken } from "@/utils/auth";

const getDefaultState = () => {
  return {
    token: getToken(),
    permissions: [],
  };
};

const user = {
  state: getDefaultState(),
  mutations: {
    SET_PERMISSION: (state, permissions) => {
      state.permissions = permissions;
    },
  },

  actions: {
    //获取当前登录用户信息
    getInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        getInfo(state.token)
          .then((res) => {
            const { data } = res;
            if (!data) {
              return reject("Verification failed, please Login again.");
            }
            const { permissions } = data;
            commit("SET_PERMISSION", permissions);
            resolve(res);
          })
          .catch((error) => {
            reject(error);
          });
      });
    }
};

export default user;

调用

<el-button size="mini" v-hasPerm="['system:role:delete']" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>

标签:const,自定义,permission,js,state,hasPerm,Vue2,按钮,permissions
From: https://www.cnblogs.com/mingcore/p/18299718

相关文章

  • Vue2与Vue3的区别
    Vue2官方已经发布不再维护了,很多公司也开始纷纷使用vue3了。那么vue3和vue2有哪些不同呢?vue3(下面简称v3)又在vue2(下面简称v2)上做了哪些拓展与改进呢?(1)首先最大的区别是数据双向绑定的改进,v2用的是es5的数据劫持Object.definedProperty,这个会一开始就给所有的数据设置了监听,比......
  • 我的MYSQL学习心得, 自定义存储过程和函数
    转载:https://www.cnblogs.com/lyhabc/p/3793524.html我的MYSQL学习心得(一)简单语法我的MYSQL学习心得(二)数据类型宽度我的MYSQL学习心得(三)查看字段长度我的MYSQL学习心得(四)数据类型我的MYSQL学习心得(五)运算符我的MYSQL学习心得(六)函数我的MYSQL学习心得(七)查询我的MYSQ......
  • 自定义ResultMap中的id 和result的区别
    <resultMapid="CashInvoiceMap"type="com.dfire.soa.invoice.bo.Invoice">  <idcolumn="id"property="id"/>  <resultcolumn="order_id"property="orderId"/>  <resultco......
  • keycloak~使用自定义的注册页
    添加FormAction的实现packageorg.keycloak.phone.authentication.forms;importorg.keycloak.Config;importorg.keycloak.authentication.FormAction;importorg.keycloak.authentication.FormActionFactory;importorg.keycloak.authentication.FormContext;importorg.......
  • 自定义类型:结构体
     一、结构体的声明结构体是一些值的集合,这些值称为成员变量。结构的每个成语可以是不同的类型的变量。1.1结构体变量的创建和初始化结构体的初始化为分为按照结构体成员的顺序初始化和按照指定的顺序初始化1.2结构体的特殊声明在声明结构体的时候,可以不完全的声明如......
  • 从0到1开始搭建vue2+element ui 后台管理系统
    一、前期准备(如果已搭建的可以往下看)1.安装node(node-v查询版本号)(下载地址:https://nodejs.org/en/download/)2. 安装淘宝镜像命令: npminstall-gcnpm--registry=https://registry.npmmirror.com  3.安装webpack,以全局的方式安装命令:npminstallwebpack-g4......
  • linux-Rsyslog自定义配置json模板
    配置日志接收模板和转发参考:https://www.cnblogs.com/xwupiaomiao/p/17565418.html自定义模板配置文件在主配置文件中添加(rsyslog.conf)include(file=“/etc/rsyslog.d/*.conf”mode=“optional”)方案一在/etc/rsyslog.d/下创建一个配置文件ct3a1.conf#日志模板......
  • rsyslog配置(服务端、客户端)-UDP-TCP转发-imfile自定义应用程序的日志推送
    ##概念#Syslog服务器可以用作一个网络中的日志监控中心,所有能够通过网络来发送日志的设施(包含了Linux或Windows服务器,路由器,交换机以及其他主机)都可以把日志发送给它。通过设置一个syslog服务器,可以将不同设施/主机发送的日志,过滤和合并到一个独立的位置,这样使得你更容易地查......
  • 【日常记录-Java】自定义进程池
    Author:赵志乾Date:2024-07-12Declaration:AllRightReserved!!!1.简介    服务器上有些进程需要池化管理,使用SpringBoot构建Web服务提供管理api,内部使用自定义的进程池维护已启动的进程;    核心点: 进程池管理的进程都会使用系统的一个端口对外提供服务; ......
  • 演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库
    一、目的:分享一个Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库开源地址:GitHub-HeBianGu/Avalonia-Controls:Avalonia控件库Nuget包地址:NuGetGallery|PackagesmatchingHeBianGu.AvaloniaUI.演示视频地址:【Avalonia-Controls】Avalonia工具组件皮肤库v1.0.0_......