Newer
Older
securityFront / src / store / modules / permission.js
TAN YUE on 21 Dec 2020 5 KB 20201221 首页跳转功能
/**
 * 权限管理
 */
import { asyncRouterMap, constantRouterMap } from '@/router'
import { getMenus } from '@/api/login'

/**
 * 通过meta.permission判断是否与当前用户权限匹配, 该方法暂时废弃,old
 * @param roles
 * @param route
 */
// function hasPermission(menus, route) {
//   if (route.meta && route.meta.permission) {
//     return menus.some(menu => { // 遍历menus,查找route.meta.permission是否有匹配的menu
//       route.meta.permission.includes(menu.url)
//     })
//   } else {
//     return true
//   }
// }
/**
 * 判断路由是否在菜单列表里,在则返回菜单对象,否则返回undefined
 * @param menus 菜单列表(用户拥有权限的菜单列表)
 * @param route 路由
 * @returns menu_res 匹配成功的菜单对象
 */
function getMenu(menus, route) {
  let menu_res
  if (route.meta && route.meta.permission) {
    menu_res = menus.find(menu => { // 遍历menus,查找route.meta.permission是否有匹配的menu
      return route.meta.permission.includes(menu.url)
    })
  }
  return menu_res
}

/**
 * 递归过滤异步路由表,返回符合用户权限的路由表
 * @param routes asyncRouterMap 动态路由表
 * @param menus 用户可看到的菜单项
 */
function filterAsyncRouter(routes, menus) {
  const res = []
  // 遍历每一个路由,判断是否有权限
  routes.forEach(route => {
    const tmp = { ...route }
    console.log(tmp)

    const menu = getMenu(menus, tmp)
    if (menu) { // 如果有权限,添加该路由,并根据url的icon更新图标
      tmp.meta.icon = menu.icon // 给route更新icon
      tmp.meta.title = menu.name // 给route更新名称
      if (tmp.children) {
        tmp.children = filterAsyncRouter(tmp.children, menus)
        console.log(tmp.path + '->' + tmp.children[0].path)
        tmp.redirect = tmp.children[0].path
      }
      res.push(tmp)
    } else {
      if (!tmp.meta) {
        res.push(tmp)
      }
    }
  })
  return res
}

function filterRedirect(routes) {
  console.log('filterRedirect')
  const sysroutes = routes.filter(route => route.meta.isSys)
  const menuroutes = routes.filter(route => !route.meta.isSys)
  for (const sys of sysroutes) {
    const firstmenu = menuroutes.find(route => route.meta.sys === sys.path)
    console.log(sys.path + ':' + firstmenu.path)
    sys.redirect = firstmenu.path
  }
  return [...sysroutes, ...menuroutes]
}
const permission = {
  state: {
    routers: constantRouterMap,
    addRouters: [],
    systems: [], // 子系统
    menus: [], // 菜单
    btns: [] // 按钮
  },
  mutations: {
    SET_ROUTERS: (state, routers) => {
      state.addRouters = routers
      state.routers = constantRouterMap.concat(routers)
    },
    SET_SYSTEMS: (state, systems) => {
      state.systems = Array.from(systems)
    },
    SET_MENUS: (state, menus) => {
      state.menus = Array.from(menus)
    },
    SET_BTNS: (state, btns) => {
      state.btns = Array.from(btns)
    }
  },
  actions: {
    // 获取用户子系统权限
    GetSystems({ commit, state }) {
      return new Promise((resolve, reject) => {
        const params = {
          resourceType: '02'
        }
        getMenus(params).then(response => { // 处理返回值
          const data = response.data
          const systems = [] // 子系统
          if (data.menus && data.menus.length > 0) {
            commit('SET_SYSTEMS', data.menus)
            for (const menu of data.menus) { // 遍历菜单,获取所有的权限项
              const menu_tmp = {}
              menu_tmp.id = menu.id
              menu_tmp.url = menu.url
              menu_tmp.icon = menu.icon
              menu_tmp.name = menu.name
              systems.push(menu_tmp)
            }
          }
          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    },
    // 获取用户权限
    GetMenus({ commit, state }, currentSystem) {
      // console.log('in store.permission.js:GetMenus:')
      console.log('获取' + currentSystem.name + '的菜单')
      return new Promise((resolve, reject) => {
        // const params = {
        //   parentCode: currentSystem.code
        // }
        getMenus().then(response => { // 处理返回值
          const data = response.data
          const menus = [] // 仅菜单
          const btns = [] // 非菜单
          if (data.menus && data.menus.length > 0) {
            const allmenus = [...data.menus]
            commit('SET_MENUS', allmenus)
            for (const menu of allmenus) { // 遍历菜单,获取所有的权限项
              if (menu.resourceType === '02' || menu.resourceType === '03') { // 将是菜单的放入menus
                const menu_tmp = {}
                menu_tmp.url = menu.url
                menu_tmp.icon = menu.icon
                menu_tmp.name = menu.name
                menus.push(menu_tmp)
              }
              const btn_tmp = {}
              btn_tmp.url = menu.url
              btn_tmp.name = menu.name
              btn_tmp.icon = menu.icon
              btns.push(btn_tmp)
            }
          }
          // 过滤路由表
          let accessedRouters = filterAsyncRouter(asyncRouterMap, menus)
          accessedRouters = filterRedirect(accessedRouters)
          commit('SET_BTNS', btns)
          commit('SET_ROUTERS', accessedRouters)
          resolve(response)
        }).catch(error => {
          reject(error)
        })
      })
    }
  }
}

export default permission