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

Vue中权限控制的方案

文章目录

    • 源码:
    • 一、页面级
      • 1.1、路由守卫
      • 1.2、动态路由
    • 二、按钮级别
      • 2.1、通过v-if来判断
      • 2.2、通过组件包裹的方式来判断
      • 2.3、通过自定义指令的方式
    • 三、接口级别

源码:

https://gitee.com/liu-qiang-yyds/sysPermission

一、页面级

1.1、路由守卫

	前端可以通过路由守卫来判断用户是否对某一个页面有权限,
	从而阻止用户进入页面。

1.2、动态路由

	根据用户的权限返回对应拥有权限的路由表,然后去循环注册路由。

二、按钮级别

2.1、通过v-if来判断

通过最简单的办法v-if条件判断

2.2、通过组件包裹的方式来判断

包裹组件

<template>
    <slot v-if="hasPermission"></slot>
</template>

<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue';
import eventBus from '../eventBus'; 
// 定义props
const props = defineProps({
    permission: {
        type: String,
        required: true,
    },
});
// 用户权限列表
const userPermissions = ref(['sys:user:add','sys:user:edit','sys:user:del']);
// 监听事件
const handleUserChanged = (permissions) => {
    userPermissions.value = permissions;
    // console.log(userPermissions.value);

};
// 组件挂载时注册事件监听
onMounted(() => {
    eventBus.on('user-changed', handleUserChanged);
});

// 组件卸载时移除事件监听
onUnmounted(() => {
    eventBus.off('user-changed', handleUserChanged);
});
// 计算属性:判断是否有权限
const hasPermission = computed(() => userPermissions.value.includes(props.permission));


</script>

使用

 	<Permission :permission="'sys:user:add'">
      <el-button type="primary">添加</el-button>
    </Permission>
    <Permission :permission="'sys:user:edit'">
      <el-button type="success">修改</el-button>
    </Permission>
    <Permission :permission="'sys:user:del'">
      <el-button type="danger">删除</el-button>
    </Permission>

2.3、通过自定义指令的方式

自定义组件

import { usePermissionStore } from '../store/permissionStore';
export default{
        
        created(el, binding, vnode, prevNode) {
            // 在绑定元素的attribute或事件监听器被应用之前调用

        },
        mounted(el, binding, vnode, prevNode) {
            const permissionStore = usePermissionStore();
            const {permissions} = permissionStore
            console.log(permissions,'123');
            
            // 在绑定元素的父组件被挂载后调用
           if(!permissions.includes(binding.value)){
             el.parentNode.removeChild(el);
           }

        },
        updated(el, binding, vnode, prevNode) {
            // 在包含组件的VNode及其子组件的VNode更新后调用
        }
    }


使用

<el-button v-auth="'sys:user:add'" type="primary">添加</el-button>
      <el-button v-auth="'sys:user:edit'"  type="success">修改</el-button>
      <el-button v-auth="'sys:user:del'"  type="danger">删除</el-button>

三、接口级别

	后端可以写一个接口白名单,白名单的接口对应着权限的级别,
	前端用户的级别小于这个接口的级别,就通过中间件返回给前
	端一个权限不足的信息
http://www.dtcms.com/a/112796.html

相关文章:

  • Ruoyi-vue plus 5.2.2 flowble设计流程点击开始流程图错误
  • 多功能指示牌的主要功能有哪些?
  • 蓝桥云客--插入数字
  • JVM虚拟机篇(一)深入理解JVM:组成部分、运行流程及程序计数器详解
  • JVM虚拟机篇(三):JVM运行时数据区与方法区详解
  • C++——this关键字
  • 基于SpringBoot + Vue3的仓库(WMS)/进销存/ERP管理系统
  • 【双维畅聊】网页版聊天室测试报告
  • TC3xx芯片的UCB介绍
  • Photoshop 快捷键指南
  • springboot457-库存管理系统(源码+数据库+纯前后端分离+部署讲解等)
  • 谷歌开源单个 GPU 可运行的Gemma 3 模型,27B 超越 671B 参数的 DeepSeek
  • 在js中数组相关用法讲解
  • Git for Windows 历史版本下载教程
  • 单词排序(信息学奥赛一本通-1185)
  • 架构思维:查询分离 - 表数据量大查询缓慢的优化方案
  • 2025大唐杯仿真1——车联网
  • mysql 8.0.27-docker
  • 第二章 react redux的学习,多个reducer
  • 什么是DHCP服务,在生活中的应用是什么?
  • 使用QAction编辑器添加QAction到ui里
  • 【数字电路】第一章 数制和码制
  • Kotlin 集合函数:map 和 first 的使用场景
  • 自定义组件触发饿了么表单校验
  • LaTeX、KaTeX、Markdown 的用法
  • 15.2linux设备树下的platform驱动编写(程序)_csdn
  • 与 AI 共舞:解锁自我提升的无限可能
  • 如何通过优化HMI设计大幅提升产品竞争力?
  • 配置网络编辑器
  • 【Rust学习】Rust环境搭建和Rust基础语法