按钮级的权限控制

0 阅读2分钟

目的

根据不同的用户来设置,按钮或组件的隐藏、禁用或删除

实现思路

按钮级别权限控制.png

具体代码

定义全局指令

@/directive/permission.js

import { userInfoStore } from "@/stores/user";

export default {
    mounted(el, bind) {
        const use_userInfoStore = userInfoStore();
        const permissionList = use_userInfoStore.permissionList
        if (!permissionList.includes(bind.value)) {
            el.style.display = "none"
        }
    },
    updated(el, bind) {
        const use_userInfoStore = userInfoStore();
        const permissionList = use_userInfoStore.permissionList
        if (!permissionList.includes(bind.value)) {
            el.style.display = "none"
        }
    }
}

注册全局指令

main.js

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'

import Permission from './directives/Permission'

const app = createApp(App)

app.directive("auth",Permission) //注册全局指令
app.use(createPinia())
app.use(router)

app.mount('#app')

用户和权限状态管理

@/store/user.js

import { defineStore } from "pinia";
import { ref, computed } from "vue"
export const userInfoStore = defineStore('user',() => {
    const userInfo = ref(JSON.parse(localStorage.getItem("userInfo")) || {})
    const permissionList = ref(localStorage.getItem("permissionList") || [])
    const token = ref(localStorage.getItem("token")||"")
    //获取用户角色
    const getUserRole = computed(() => {
        return userInfo.role
    })
    //设置用户信息
    function setUserInfo(value) {
        localStorage.setItem("userInfo", JSON.stringify(value))
        userInfo.value = value
    }
    //设置权限列表
    function setPermissionList(value) {
        localStorage.setItem("permissionList", JSON.stringify(value))
        permissionList.value = value
    }
    //设置token
    function setToken(value){
        localStorage.setItem("token",value)
        token.value = value
    }
    //删除用户信息
    function delUserInfo(){
        localStorage.removeItem("userInfo")
        userInfo.value = {}
    }
    //删除权限列表
    function delPermissionList(){
        localStorage.removeItem("permissionList")
        permissionList.value = []
    }
    //删除token
    function delToken(){
        localStorage.removeItem("token")
    }
    return {
        userInfo,
        permissionList,
        getUserRole,
        token,
        setUserInfo,
        setPermissionList,
        setToken,
        delUserInfo,
        delPermissionList,
        delToken
    }
})

登录获取用户信息 根据token获取权限

@/views/login/index.vue

<template>
  <div @click="loginFn">登录</div>
</template>

<script setup>
import { userInfoStore } from "@/stores/user";
import { useRouter } from "vue-router";
const use_userInfoStore = userInfoStore();
const router = useRouter();
function loginFn() {
  //模拟登录成功获取用户信息
  const userInfo = {
    username: "wanwu",
    nickname: "xxxx",
    role: "user",
    token:"xxx"
  };
  /*
  管理员的信息
  {
    username: "wanwu123",
    nickname: "xxxx",
    role: "admin",
    token:"kkk"
  };
  */
  use_userInfoStore.setUserInfo(userInfo);
  use_userInfoStore.setToken(userInfo.token)
  //模拟获取权限列表 根据用户token获取权限列表
  const permissionList = [
    "dashboard:view",
    "dashboard:statistics",
    "user:list",
    "user:view",
    "user:create",
    "user:edit",
    "user:delete",
    "user:roleAssign",
    "article:list",
    "article:view",
    "article:create",
    "article:edit",
    "article:delete",
    "article:publish",
    "article:audit",
    "comment:list",
    "comment:edit",
    "comment:delete",
    "comment:audit",
    "system:settings",
    "system:log",
    "system:backup",
  ];
  /*
  管理员的权限
  [
    "dashboard:view",
    "profile:view",
    "profile:edit",
    "article:list",
    "article:view",
    "article:create",
    "article:editOwn",
    "article:deleteOwn",
    "comment:add",
    "comment:editOwn",
    "comment:deleteOwn",
  ];
  
 */
  use_userInfoStore.setPermissionList(permissionList);
  router.replace("/home");
}
</script>

<style>
</style>

功能展示

@/views/home/index.vue

<template>
  <div>
    <div v-auth="'article:create'">创建文章</div>
    <div v-auth="'user:delete'">删除用户</div>
  </div>
</template>

<script setup>

</script>

<style>

</style>

路由规则

@/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import home from "@/views/home/index.vue"
import login from "@/views/login/index.vue"

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path:"/",
      redirect:"/login"
    },
    {
      path:"/login",
      component:login
    },
    {
      path:"/home",
      component:home
    }
  ],
})

export default router

根组件

App.vue

<template>
  <div></div>
  <router-view></router-view>
</template>

<script>

</script>

<style>

</style>