Skip to content

权限

初始化权限

当登录成功或刷新页面后,会请求userInfoApi接口获取权限,相关代码在@/store/modules/user.ts中。

// 初始化
 init: async function (tokenValue?: string) {
  const token = tokenValue ?? cookies.get(config.tokenName);
  if (token) {
    this.token = token;
    const res = await userInfoApi(true, !tokenValue)();
    this.user = res.info;
    initDynamicViewsModules();
    this.rules = res.btnRules;
    this.menus = listToTree(
      res.menus.map((item) => ({
        id: item.id,
        path: item.path,
        parentId: item.parentId,
        component: transitionComponent(item.component),
        meta: {
          // 标题设置该路由在侧边栏和面包屑中展示的名字
          title: item.title,
          // 对应权限 多个之间为或的关系
          rule: [item.rule],
          // 是否是固定的tag
          affix: statusToBoolean(item.affix),
          // 图标
          icon: item.icon,
          // 外链
          isLink: statusToBoolean(item.isLink),
          // 如果设置为true,则不会被 <keep-alive> 缓存
          noCache: !statusToBoolean(item.cache),
          // 在菜单中隐藏
          hideMenu: statusToBoolean(item.hideMenu),
          // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式
          // 只有一个时,会将那个子路由当做根路由显示在侧边栏
          // 若你想不管路由下面的 children 声明的个数都显示你的根路由
          // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
          alwaysShow: statusToBoolean(item.alwaysShow),
          // 是否需要面包屑 false不展示在面包屑,ture一直展示在面包屑,undefined当只有一个子元素面包屑时跳过展示
          breadcrumb: statusToBoolean(item.breadcrumb),
        },
      })),
    );
    await useRouteStore().initRoutes(); //初始化路由
  } else {
    this.token = '';
  }
},

路由权限校验

初始化完权限后,注册有权限的路由,过滤规则参考路由权限

按钮权限校验

权限校验函数为permission(rules?: string | string[]),当入参为数组时,匹配成功数组中的任意一个权限则返回true。

通过v-if指令和permission函数配合进行按钮权限校验(未进行封装指令的原因是,指令方式对服务端渲染不友好,建议使用v-if判断)。

  • 通过全局函数$permission()校验权限
    <el-button v-if="$permission('edit')">{{ $t('编辑') }}</el-button>
  • 引入 permission()函数校验
<template>
  <div class="permission">
    <el-button v-if="permission('show')">{{ $t('查看') }}</el-button>
  </div>
</template>
<script setup lang="ts" name="permission">
import { permission } from '@/utils/permission';
</script>

超管权限

当初始化权限时拿到的rules数组包含'*'时,代表具有所有权限,权限permission函数会必定返回true