text: /*
   * @Author: Lance Ma
   * @Date: 2020-5-22 12:47:49
   * @LastEditTime: 2020-5-22 11:48:13
   * @LastEditors: Please set LastEditors
   * @Description: In User Settings Edit
   * @FilePath: .\store\modules\permission.js
   */
  import { asyncRouterMap, constantRouterMap } from '@/config/router.config'
  
  /**
   * 过滤账户是否拥有某一个权限，并将菜单从加载列表移除
   *
   * @param permission
   * @param route
   * @returns {boolean}
   */
  function hasPermission (permission, route) {
    if (route.meta && route.meta.permission) {
      let flag = false
      for (let i = 0, len = permission.length; i < len; i++) {
        flag = route.meta.permission.includes(permission[i])
        if (flag) {
          return true
        }
      }
      return false
    }
    return true
  }
  
  /**
   * 单账户多角色时，使用该方法可过滤角色不存在的菜单
   *
   * @param roles
   * @param route
   * @returns {*}
   */
  // eslint-disable-next-line
  function hasRole(roles, route) {
    if (route.meta && route.meta.roles) {
      return route.meta.roles.includes(roles.id)
    } else {
      return true
    }
  }
  
  function filterAsyncRouter (routerMap, roles) {
    const accessedRouters = routerMap.filter(route => {
      if (hasPermission(roles.permissionList, route)) {
        if (route.children && route.children.length) {
          route.children = filterAsyncRouter(route.children, roles)
        }
        return true
      }
      return false
    })
    return accessedRouters
  }
  
  const permission = {
    state: {
      routers: constantRouterMap,
      addRouters: []
    },
    mutations: {
      SET_ROUTERS: (state, routers) => {
        state.addRouters = routers
        state.routers = constantRouterMap.concat(routers)
      }
    },
    actions: {
      GenerateRoutes ({ commit }, data) {
        return new Promise(resolve => {
          const { roles } = data
          const accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
          commit('SET_ROUTERS', accessedRouters)
          resolve()
        })
      }
    }
  }
  
  export default permission
  