vue根据权限动态生成路由

news/2024/6/18 21:43:15 标签: vue.js, 前端, javascript

vue根据权限动态生成路由

javascript">import store from '@/store' // vuex
import router from '@/router' // router
import axios from './request' // axios
// 存放页面信息
const data = [
  // { // 主菜单
  //   path: '/okkk', // 页面路径
  //   name: 'okkk', // 名称
  //   component: () => import('@/views/Index/Index.vue'), // 嵌套的组件
  //   // meta 参数 title标题  icon 图标 id 路由id和权限id对应   hidden 是否隐藏 true 隐藏 seo 排序优先级 parentId 父权限id 主菜单0
  //   meta: { title: '系统管理', icon: '', id: 91300, hidden: false, seo: 0, parentId: 0 },
  //   children: [ // 子菜单
  //   ]
  // },
  {
    path: '/systemManagement',
    name: 'systemManagement',
    component: () => import('@/views/Index/subMenus.vue'),
    // meta 参数 title标题  icon 图标 id 路由id和权限id对应   hidden 是否隐藏 true 隐藏 seo 排序优先级 parentId 父权限id 主菜单0
    meta: { title: '系统管理', icon: '', id: 90000, seo: 0, parentId: 0, menu: '主菜单' }
  },
  {
    path: '/personalSetting',
    name: 'personalSetting',
    component: () => import('@/views/SystemManagement/BasicSetting/PersonalSetting.vue'),
    meta: { title: '个人设置', icon: '', id: 91300, seo: 0, parentId: 90000, menu: '基本设置' }
  }
  }
]

// 权限列表  权限名称:权限id
const auth = {
  // 系统管理
  SYSTEMMODULE: 90000, // 系统管理
  // 个人设置
  SYSTEMMOUULE_PERSONAL_SETTINGS_CHANGEPWD: 91301// 修改密码
}

// 验证是否拥有权限
export function checkAuth(authId) {
  return store.getters.getPermissionList.indexOf(authId) > -1
}

// 生成路由 从服务端请求权限列表
export function generateRoute() {
  return new Promise((resolve, reject) => {
    const routeNames = [] // 存放路由名称
    // 从后端加载权限列表

    axios
      .get('/******(查询权限id列表)', { headers: { closedLoading: true } })
      .then(res => {
        // 查询权限列表 并生成 路由
        queryPermission(res.data).forEach(item => {
          // 根据路由列表添加路由
          router.addRoute(item)
          routeNames.push(item.name)
        })
        // 添加全局匹配 404 路由
        // **********
        // 将路由名称存储到store 删除时使用
        store.commit('setRoutes', routeNames)
        resolve() // 成功
      })
      .catch(error => {
        reject(error) // 失败返回错误信息
      })
  })
}

// 删除路由
export function deleteRoute() {
  store.getters.getRoutes.forEach(route => {
    router.removeRoute(route)
  })
  store.commit('removeRoutes') // 删除storm内的路由列表
  store.commit('removePermissionList') // 删除权限列表
}

// 查询权限   permission 权限列表 子权限
function queryPermission(permission) {
  const routes = querySubPermission(data, permission)
  store.commit('setPermissionList', queryAuth(permission)) // 将权限id列表 天啊及到vuex中
  return routes
}

// 查询子权限 subPermission 子权限对象, permission 权限列表
function querySubPermission(subPermission, permission) {
  const permissionList = [] // 存放拥有的权限
  subPermission.forEach(item => {
    // 便利对象
    if (permission.indexOf(item.meta.id.toString()) > -1) {
      // 判断是否包含该权限
      permissionList.push(item) // 添加到列表
    }
  })
  // 对权限列表进行排序 seo值越大越靠前
  permissionList.sort((x, y) => {
    if (x.meta.seo < y.meta.seo) {
      return 1
    }
    if (x.meta.seo > y.meta.seo) {
      return -1
    }
    return 0
  })
  const list = [] // 存放生产的路由信息
  permissionList.forEach(item => {
    // 便利权限列表
    const route = {
      // 创建路由信息
      name: item.name, // 路由名称
      path: item.path, // 路径
      meta: item.meta, // 路由参数
      component: item.component // 路由框架
    }
    if ('children' in item) {
      // 判断该路由下是否有子路由
      route.children = querySubPermission(item.children, permission) // 查询子路由权限
    }
    const menu = {
      // 创建菜单
      name: item.name, // 路由名称
      path: item.path, // 路径
      meta: item.meta // 路由参数
    }
    // 添加到storm中
    store.commit('pushMenus', menu)
    list.push(route) // 添加到路由列表
  })
  return list
}

// 查询菜单
export function queryMenus(id) {
  const menus = []
  store.getters.getMenus.forEach(menu => {
    // 判断该菜单父菜单id是否和需要查询的菜单id相同 且不为隐藏菜单
    if (menu.meta.parentId === id && (!('hidden' in menu.meta) || !menu.meta.hidden)) {
      menus.push(menu)
    }
  })
  // 对菜单进行排序 seo值越大越靠前
  menus.sort((x, y) => {
    if (x.meta.seo < y.meta.seo) {
      return 1
    }
    if (x.meta.seo > y.meta.seo) {
      return -1
    }
    return 0
  })
  const result = []
  const groupMenu = {}
  menus.forEach(menu => {
    const meta = menu.meta
    const subArray = groupMenu[meta.menu] ? groupMenu[meta.menu] : []
    if (subArray.length === 0) {
      groupMenu[meta.menu] = subArray
      result.push({ title: meta.menu, sub: subArray })
    }
    subArray.push(menu)
  })
  return result
}

// 查询权限 返回拥有的权限id
function queryAuth(permission) {
  const authList = []
  for (const key in auth) {
    // 便利权限列表和后端返回的权限列表进行比对
    if (permission.indexOf(auth[key].toString()) > -1) {
      authList.push(auth[key])
    }
  }
  return authList
}

export default auth


http://www.niftyadmin.cn/n/860387.html

相关文章

团体队列(模拟)

题目: 团体队列题目 思路: 这是一道模拟题,通过map,和两个queue完成,具体细节大家看代码注释,找清楚之间的关系就好。 #include <bits/stdc.h> using namespace std; const int maxt100010;//最多团队数int main() {int t,kcase0;//读入t个团while(scanf("%d"…

丑数-优先队列(详细解答)

题目: 丑数是一些因子只有2,3,5的数。数列1,2,3,4,5,6,8,9,10,12,15……写出了从小到大的前11个丑数&#xff0c;1属于丑数。现在请你编写程序&#xff0c;找出第1500个丑数是什么。 输出&#xff1a;The 1500’th ugly number is <…>.&#xff08;<…>为你找到的…

Unix Is命令(UVa 400)详细解答

题目: 输入正整数n 以及n 个文件名&#xff0c;排序后按列优先的方式左对齐输出。假设最长文件名有M 字符&#xff0c;则最右边有M 字符&#xff0c;其他列都是M2 字符。 题目分析: 有n个文件名,其中最长的文件名有M个字符,一下面输入为例,最长的是Mr._French(共有10个字符),然…

超级楼梯(递推)

题目: 有一楼梯共M级&#xff0c;刚开始时你在第一级&#xff0c;若每次只能跨上一级或二级&#xff0c;要走上第M级&#xff0c;共有多少种走法&#xff1f; 输入: 输入数据首先包含一个整数N&#xff0c;表示测试实例的个数&#xff0c;然后是N行数据&#xff0c;每行包含一…

铺方格(升级版递推)详细解答

题目: 有一个大小是2xN的网格,现在需要用2种规格的骨牌铺满,骨牌的规格分别是2x1和2x2,请计算一共有多少铺设的方法。(从左向右铺) 输入: T组数据,N网格列数 (0<N<50) 输出: 所有方案m Sample Input 1 3 2 Sample Output 1 5 3 解题思路: 这道题和超级楼梯有异曲同工…

LIS最长上升子序列

LIS:从一串数字序列,找出连续递增的子序列,并且要求子序列最长! 举例: 一段序列:1,6,2,3,7,5,9,4,11 最长上升子序列为:1,2,3,7,9,11 那么我们如何通过代码实现呢? 我们需要一个数组f,然后通过f记录每一个数字的最大上升子序列。 初始时每一个f[i]1,因为那怕找不到任意一个子…

LCS最长公共子序列

最长公共子序列:顾名思义从两段序列中选出,其中连续并且相同的子串 举例 a串:1 5 7 9 6 3 b串:1 6 3 2 1 5 最长公共子序列 c串:1 6 3 我们如何实现呢? (假设a串有n个数字,b串有m个数字) 我们需要一个二位数组f,通过这个二维数组存放 f(i,j) f(i,j)含义:表示a串前i个数字,和b串…

01背包问题相关优化大全(二维到一维)

下面是普通版本的01背包代码! int dp[105][1005];for(int i1;i<m;i)for(int jt;j>0;j--){if(j>w[i]){dp[i][j]max(dp[i-1][j-w[i]]v[i],dp[i-1][j]);}else{dp[i][j]dp[i-1][j];}}滚动数组优化二维01背包 我们可以看到dp数组需要很大,至少超过2行! 那么我们想一想可不…