首页 > 其他分享 >[Vue] Component authority controls

[Vue] Component authority controls

时间:2024-11-19 15:30:24浏览次数:1  
标签:slot Vue permission Component component controls user props authority

For component level authority controls, we need to find a common partten so that we can extract a common component to handle the permission control in order to avoid directly modfiying component itself.

For example, we have following user authority level:

sys:user:view
sys:user:update
sys:user:delete
sys:user:add

 

And we want current user should have authority sys:user:addin order to show "Add user" button

<template>
  <div class="container">
    <div class="btn-container">
      <Authority permission="sys:user:add">
        <a-button type="primary">新增用户</a-button>
      </Authority>
      <a-button type="primary">查询用户</a-button>
      <a-button type="primary">修改用户</a-button>
      <a-button type="primary" danger>删除用户</a-button>
      <a-button type="primary" danger>禁用用户</a-button>
    </div>
  </div>
</template>

 

For combine multi authorities:

<Authority :permission="['sys:user:view', 'sys:user:update']">
  <a-button type="primary" danger>禁用用户</a-button>
</Authority>

 

Both are just controling show / hide UI component, which is still easy to do.

 

If we don't just want to show/hide component, we want to disable component based on user authority, we need to use template

<Authority>
  <template #default="{ userPermissions }">
    <a-button
      :disabled="!userPermissions.includes('sys:user:add')"
      type="primary"
    >
      新增用户
    </a-button>
  </template>
</Authority>

<!--
<template #default>:

This declares the default slot for the Authority component.
In Vue 3, the shorthand #default is equivalent to v-slot:default.
{ userPermissions }:

The braces ({}) indicate slot props being destructured.
The parent component (Authority) is passing a prop named userPermissions to the slot.
By destructuring it, you can directly access userPermissions without needing slotProps.userPermissions.
-->

 

How to write Authoritycomponent?

<template>
  <slot v-if="showSlot" :userPermissions="permissions"></slot>
</template>

<script setup>
import { computed } from 'vue';
import { useAuth } from './useAuth';

const props = defineProps({
  permission: {
    type: [String, Array],
  },
});

const { permissions } = useAuth();

const showSlot = computed(() => {
  if (!props.permission) {
    // No permissions required, show slot
    return true;
  }
  if (Array.isArray(props.permission)) {
    // Check if all required permissions exist
    return props.permission.every((p) => permissions.value.includes(p));
  } else {
    // Check if single required permission exists
    return permissions.value.includes(props.permission);
  }
});
</script>

 

标签:slot,Vue,permission,Component,component,controls,user,props,authority
From: https://www.cnblogs.com/Answer1215/p/18554969

相关文章

  • 移动端Vue2实现文件图片上传功能
    基于Vue2 +Vant2组件库实现:废话不多说,直接看代码:主要代码:methods:{//上传图片之前的操作beforeRead(file){letarr=file.name.split('.');letfileType='.'+arr[arr.length-1].toLowerCase();con......
  • Vue项目,在less/scss中使用变量
    vue组件中,如何在less/scss中使用变量,以二次封装el-tab样式组件为例<!--*@description封装el-tab样式!--><template><divclass="tab-comp":style="{'--item-max-width':itemMaxWidth,'--tab-comp-height':height,'--tabs-lab......
  • python+vue基于django/flask的连锁超市销售管理系统(超市库存与销售管理平台)java+nodej
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • python+vue基于django/flask的奖学金评定系统(奖学金申请与管理平台)java+nodejs+php-计
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • python+vue基于django/flask的同城篮球赛事场地预约系统java+nodejs+PHP-计算机毕业设
    目录技术栈和环境说明具体实现截图预期达到的目标系统设计详细视频演示技术路线解决的思路性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示研究方法感恩大学老师和同学源码获取技术栈和环境说明本系统以Python开发语言......
  • .NET +Vue 开发的高级报表工具
    前言本文介绍一款基于.NET6开发的高级报表工具。该工具支持多种数据源(如数据库、Excel文件、API服务等),并具备强大的数据处理和可视化功能。通过内置的集合函数和类Excel界面,用户可以轻松设计和生成复杂的报表,满足各类业务需求。项目介绍CellReport是一款专为复杂统计报......
  • 【web】Gin+Go-Micro +Vue+Nodejs+jQuery+ElmentUI 用户模块之登陆功能bug现场调试以
    调试Web应用中的用户登录功能需要一定的技巧和工具支持。在这份指南中,我们将利用Gin、Go-Micro、Vue、Node.js、jQuery和ElementUI,介绍如何调试用户登录功能及其效果演示,涵盖初级、中级和高级用法。初级用法介绍初级阶段以简化的HTML表单和jQuery实现用户登录,并使用Gin框......
  • 将打包后的 React或Vue 与 WebApi 部署在同一站点
    前后端分离的开发中,在部署项目时通常会分开进行部署,而这样又很麻烦,需要配置跨域,域名配置等等有一些情景下,我们需要采用更为方便的方式去部署,可以参考下方方法进行调整准备WebApi项目一个打包好的前端项目React或VUE都可以调整为WebApi项目新增wwwroot文件夹,用于放置前......
  • 【Vue 表单类组件封装与 v-model 简化代码】
    文章目录什么是Vue表单类组件?封装Vue表单类组件步骤1:创建一个表单组件步骤2:使用`v-model`简化数据绑定步骤3:将表单组件封装步骤4:在父组件中使用表单组件什么是Vue表单类组件?Vue表单类组件是一种将表单元素(如输入框、复选框、单选框等)封装成可复用的组件的......
  • 【vue】项目迭代部署后 自动清除浏览器缓存
    前言:vue项目打包部署上线后,因浏览器缓存问题,导致用户访问的依旧是上个迭代批次的旧资源,需要用户手动清除缓存才能更新至最新版本,影响用户体验。解决方法:html根文件添加以下标签<metahttp-equiv="pragma"content="no-cache"><metahttp-equiv="cache-control"con......