• liang's avatar
    init · dad95e78
    liang authored
    dad95e78
handleRoutes.js 3.73 KB
/**
 * @copyright chuzhixin 1204505056@qq.com
 * @description all模式渲染后端返回路由
 * @param constantRoutes
 * @returns {*}
 */
export function filterAllRoutes(constantRoutes) {
  return constantRoutes.filter((route) => {
    if (route.component) {
      if (route.component === "Layout") {
        route.component = (resolve) => require(["@/layouts"], resolve)
      } else if (route.component === "EmptyLayout") {
        route.component = (resolve) =>
          require(["@/layouts/EmptyLayout"], resolve)
      } else {
        let path = "views/" + route.component
        if (
          new RegExp("^/views/.*$").test(route.component) ||
          new RegExp("^views/.*$").test(route.component)
        ) {
          path = route.component
        } else if (new RegExp("^/.*$").test(route.component)) {
          path = "views" + route.component
        } else {
          path = "views/" + route.component
        }
        route.component = (resolve) => require([`@/${path}`], resolve)
      }
    }
    if (route.children && route.children.length) {
      route.children = filterAllRoutes(route.children)
    }
    if (route.children && route.children.length === 0) {
      delete route.children
    }
    return true
  })
}

/**
 * @param list
 * @description 根据父级ID递归获取树状结构
 * @returns {*}
 */
export function translateListToTree(data) {
  const menus = []
  if (data.length > 0) {
    let map = {}
    data.forEach((item) => {
      map[item.id] = item
    })

    data.forEach((item) => {
      let parent = map[item.parentId]
      if (parent) {
        ;(parent.children || (parent.children = [])).push(item)
      } else {
        menus.push(item)
      }
    })
  }
  return menus
}
/**
 * @param menulist
 * @description 菜单格式化
 * @returns {*}
 */
export function routesFormat(menulist) {
  const list = translateListToTree(
    menulist.map((item, index) => {
      return {
        id: item.id,
        parentId: item.parentId,
        name: item.route,
        path: item.path,
        component: item.component,
        meta: {
          title: item.name,
          icon: item.icon || "",
          noKeepAlive: !item.keepAlive,
        },
      }
    })
  )
  const constantRoutes = []
  list.map((item, index) => {
    if (item.component) {
      if (item.component === "EmptyLayout") {
        constantRoutes.push({
          path: item.path,
          component: item.component,
          meta: item.meta,
          children: item.children,
        })
      } else {
        constantRoutes.push({
          path: item.path,
          component: "Layout",
          children: [item].flat(Infinity),
        })
      }
    } else {
      constantRoutes.push({
        path: item.path,
        component: "Layout",
        meta: item.meta,
        children: item.children,
      })
    }
  })
  return filterAllRoutes(constantRoutes)
}

/**
 * @copyright chuzhixin 1204505056@qq.com
 * @description 判断当前路由是否包含权限
 * @param permissions
 * @param route
 * @returns {boolean|*}
 */
function hasPermission(permissions, route) {
  if (route.meta && route.meta.permissions) {
    return permissions.some((role) => route.meta.permissions.includes(role))
  } else {
    return true
  }
}

/**
 * @copyright chuzhixin 1204505056@qq.com
 * @description intelligence模式根据permissions数组拦截路由
 * @param routes
 * @param permissions
 * @returns {[]}
 */
export function filterAsyncRoutes(routes, permissions) {
  const finallyRoutes = []
  routes.forEach((route) => {
    const item = {
      ...route,
    }
    if (hasPermission(permissions, item)) {
      if (item.children) {
        item.children = filterAsyncRoutes(item.children, permissions)
      }
      finallyRoutes.push(item)
    }
  })
  return finallyRoutes
}