npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@bwrong/auth-tool

v3.0.7

Published

一款适用于Vue3的权限控制工具,可以实现菜单、按钮等资源权限控制

Downloads

42

Readme

Auth-Tool

npm npm NPM GitHub stars

一款适用于Vue3的权限控制工具,可以实现菜单、按钮等资源权限控制,可以满足管理系统中灵活的权限控制需求。

提供如下功能:

  • 根据后端设置的权限集过滤出有权限的路由,用作动态路由,以实现页面(路由)的权限控制。
  • 根据权限标识,将对应路由的path 添加到菜单的url字段,即可用于渲染导航菜单,当然如果菜单数据本身具有url,则优先使用菜单自身的url。
  • 内置权限指令和权限组件,可实现页面元素,如按钮、tab等元素的权限控制。
  • 还内置了一些方法,可以自己实现更加复杂的需求。

注意:V3版本属于重构,V2版本不能直接升级,且V3版本仅支持Vue3,不再兼容Vue2

使用方法

安装

npm install -S @BWrong/auth-tool

initAuth(options)权限数据处理

import { initAuth } from '@BWrong/auth-tool';
const { routes, menus } = initAuth({ routes, permissions, authKey: 'permission' });
// 返回数据说明
//- routes: 过滤了没权限的路由,可用于动态注册路由
//- menus:注入了路由path的权限集数据(菜单),可用于渲染菜单

options:

  • routes:动态路由配置表,数据格式如下:
export default [
  {
    path: '/system',
    name: 'system',
    redirect: '/system/department', // 如果不设置redirect,则使用children中的第一个(有权限的)
    meta: {
      permission: 'system'
    },
    children: [
      {
        path: '/system/role', // 路径暂时仅支持完整格式
        name: 'role',
        component: () => import('@/views/system/Role.vue'),
        meta: {
          permission: 'system/role'
        }
      },
      {
        path: '/system/menu',
        name: 'menu',
        component: () => import('@/views/system/Menu.vue'),
        meta: {
          permission: 'system/menu'
        }
      }
    ]
  },
  {
    path: '/user',
    name: 'user',
    component: () => import('@/views/User.vue'),
    meta: {
      permission: 'user'
    }
  }
];
  • permissions:权限映射表。
[
  {
    "id": 1,
    "permission": "system", // 权限标识,因为该数据为后端返回,所以权限标识的key,不同项目可能会不一样,所以提供下面authKey的参数用来配置key名
    "name": "系统管理",
    "type": 0,
    "parentId": 0
  },
  {
    "id": 2,
    "permission": "system/role",
    "name": "角色管理",
    "type": 0,
    "parentId": 1
  },

  {
    "id": 3,
    "permission": "system/menu",
    "name": "菜单管理",
    "type": 0,
    "parentId": 1
  },
  {
    "id": 4,
    "permission": "user",
    "name": "用户管理",
    "type": 0,
    "parentId": 0
  },
  // ....
]

注意: 要求传入的permissions为一维数组格式,如果使用数据是树形数组,则需要使用内置的convertTreeToArray进行处理后,再传入initAuth

[
    {
        "id": 1,
        "permission": "system",
        "title": "系统管理",
        "type": 0,
        "priority": 0,
        "icon": "icon-setting",
        "parentId": 0,
        "url": "/system",
        "children": [
            {
                "id": 2,
                "permission": "system/config",
                "title": "系统配置",
                "type": 0,
                "priority": 0,
                "icon": "icon-setting",
                "parentId": 1,
                "url": "/system/config",
                "children": []
            },
            {
                "id": 3,
                "permission": "system/menu",
                "title": "菜单管理",
                "type": 0,
                "priority": 0,
                "icon": "icon-appstore-o",
                "parentId": 1,
                "url": "/system/menu",
                "children": []
            },
            // ...
        ]
    },
    {
        "id": 9,
        "permission": "system",
        "title": "系统管理2",
        "type": 0,
        "priority": 0,
        "icon": "icon-setting",
        "parentId": 0,
        "url": "/system",
        "children": [
            // ...
        ]
    }
]
import { convertTreeToArray } from '@BWrong/auto-tool';
permissions = convertTreeToArray(permissions)
  • authKey:权限集中用于标识权限的字段名,默认为permission,仅用于控制权限集,和路由中的meta.permission没关系,路由的这个不可修改,必须为permission。之所以权限集中可修改,是因为该数据来自后台,不可控。

  • checkAuth(route, authMap): 权限过滤方法,一般不需要修改。 返回true通过校验,返回false则会忽略该项。默认为:

/**
 * 清洗方法,权限标识不存在或者存在且匹配,则返回true
 * @param {*} route 检测的路由对象
 * @param {*} permissionMap 权限标识表, object, key配置的authKey的值
 */
const checkAuth: CheckAuth = (route, permissionMap) => (route.meta?.permission ? !!permissionMap[route.meta.permission] : true);
  • mergeMeta(routeMeta, authMeta): 定义route.meta数据的合并策略,一般不需要修改。 返回合并后的数据,返回的数据会覆盖route.meta
/**
 * route.meta数据合并策略
 * @param {*} routeMeta 路由meta数据
 * @param {*} authMeta 路由对应权限菜单数据
 */
const mergeMeta: MergeMeta = (routeMeta, authMeta) => Object.assign(routeMeta, authMeta);

控制页面资源权限

使用前需要先注册:

import { authPlugin } from '@BWrong/auto-tool';
const app = createApp(App);
app.use(authPlugin)
  • v-auth指令
<!-- 单个值 -->
<a-button v-auth="'user:edit'">按钮</a-button>
<!-- 多个值数组,可通过参数配置对比策略,默认是every, 必须都满足才有权限 -->
<a-button v-auth="['user:edit','user:add']">按钮</a-button>
<a-button v-auth:every="['user:edit','user:add']">按钮</a-button>
<!-- some, 满足其一即有权限 -->
<a-button v-auth:some="['user:add','user:add']">按钮</a-button>
  • 组件Auth
<Auth value="user:edit">
  <!-- 需要控制权限的元素 -->
  <button>按钮</button>
</Auth>
<Auth :value="['user:edit','user:add']" model="every">
  <!-- 需要控制权限的元素 -->
  <button>按钮</button>
</Auth>
<Auth :value="['user:edit','user:add']" model="some">
  <!-- 需要控制权限的元素 -->
  <button>按钮</button>
</Auth>

其他API

以下方法只有在initAuth后调用才会有数据。

权限信息
  • getPermissionKeys():获取权限集keys

  • setPermissionKeys(permissionKeys: string[]): 设置权限集keys

  • addPermissionKeys(keys: string[]):添加权限集keys

  • removePermissionKeys(keys: string[]):移除权限集keys

  • hasPermission( permission: string | string[], model: typeof permission extends string ? never : 'every' | 'some' = 'every' ):判断是否有权限

  • getPermissionsData:获取权限集数据

  • getPermissionsTree(options: ITreeData):获取权限集树形数据

interface ITreeData {
  pid?: number | string;
  children?: string;
  pidName?: string;
  idName?: string;
}
  • clearAuth():清除权限数据