import * as React from 'react'
import { Spin, Menu } from 'antd'
import { Route, Link, Redirect } from 'react-router-dom'
import { authStore } from '@/models'
import config, { IRouteItem, permsConfig } from './config'
import AuthorizedRoute from './AuthorizedRoute'
import { FirstRouteIndex } from '@/shared/common/constants'
const SubMenu = Menu.SubMenu
type menuDefaultType = {
defaultOpenKeys: string[]
defaultSelectedKeys: string[]
}
let menuDefaultKeys = {
defaultOpenKeys: [],
defaultSelectedKeys: [],
}
// 获取路由
export function getMenuByPath() {
const pathname = window.window.location.pathname.split('/')[FirstRouteIndex]
const curMenu = config.filter(item => {
const curPath = item.path.substring(1)
return curPath === pathname
})
return curMenu[0]
}
export const BundleCompo = function(Compo) {
return class extends React.PureComponent {
displayName = 'bundle-compo'
render() {
return (
}
>
)
}
}
}
// 根据路由信息获取菜单
export const getRoutesMenu = (routers = config) => {
return routers.map((item: IRouteItem) => {
const { noAuth } = item
const authorized = !noAuth && checkPermissionByPath(item.path)
if (authorized) {
const iconName = `icon-${item.icon}`
if (!item.hideSubMenu && item.childRoute && item.childRoute.length > 0) {
return (
{item.title}
}
>
{getRoutesMenu(item.childRoute)}
)
}
return (
!item.hideMenu && (
{item.icon && }
{item.title}
)
)
}
})
}
export const getMenuDefaultKeyByPath = (routes = config): menuDefaultType => {
let idStr = ''
let pIdStr = ''
const curPath =
'/' +
window.location.pathname
.split('/')
.slice(4)
.join('/')
if (curPath === '/') {
const pIdStr = config[0].id.toString()
const idStr = config[0].childRoute.length ? config[0].childRoute[0].id.toString : config[0].id.toString()
menuDefaultKeys = {
defaultOpenKeys: [pIdStr],
defaultSelectedKeys: [pIdStr, idStr],
}
} else {
const path_pattern = curPath.replace(/\//g, '\\/').replace(/[0-9]+/g, ':[a-z]+')
const path_regex = new RegExp(path_pattern)
routes.forEach(item => {
if (item.hideSubMenu) {
idStr = item.id.toString()
pIdStr = idStr.substring(0, 3)
if (curPath.includes(item.path)) {
menuDefaultKeys = {
defaultOpenKeys: [pIdStr],
defaultSelectedKeys: [pIdStr, idStr],
}
}
} else {
if (item.childRoute && item.childRoute.length) {
getMenuDefaultKeyByPath(item.childRoute)
}
if (path_regex.test(item.path)) {
if (item.hideMenu) {
const selectedSubMenu = routes.find(item => !item.hideMenu)
idStr = selectedSubMenu.id.toString()
} else {
idStr = item.id.toString()
}
pIdStr = idStr.substring(0, 3)
menuDefaultKeys = {
defaultOpenKeys: [pIdStr],
defaultSelectedKeys: [pIdStr, idStr],
}
}
}
})
}
return menuDefaultKeys
}
/**
* 获取路由结构
*/
// export const renderRouter = (configs: RouteItem[]) => {
// let routes = [];
// configs.forEach((item: RouteItem) => {
// const { path, title, component, exact = true, noAuth, children = [], ...rest } = item;
// const routPath = BASE_PATH + path;
// let route = null;
// if (noAuth) {
// route = ;
// } else {
// route = ;
// }
// route && routes.push(route);
// //遍历子路由
// if (children && children.length) {
// const subRoutes = renderRouter(children);
// routes = routes.concat(subRoutes);
// }
// });
// return routes;
// };
/**
* 获取路由结构(没有权限控制)
*/
export const renderRouter = (configs: IRouteItem[]) => {
let routes = []
configs.forEach((item: IRouteItem) => {
const { path, component, childRoute = [], redirect } = item
const route = (
{redirect ? : null}
)
route && routes.push(route)
//遍历子路由
if (childRoute && childRoute.length) {
const subRoutes = renderRouter(childRoute)
routes = routes.concat(subRoutes)
}
})
return routes
}
/**
* 获取路由结构(有权限控制)
*/
export const getAuthorizedRoutes = (configs: IRouteItem[]) => {
let routes = []
configs.forEach((item: IRouteItem) => {
const { path, noAuth = false, childRoute, redirect, ...rest } = item
const route = noAuth ? (
{redirect ? : null}
) : (
)
route && routes.push(route)
//遍历子路由
if (childRoute && childRoute.length) {
const subRoutes = getAuthorizedRoutes(childRoute)
routes = routes.concat(subRoutes)
}
})
return routes
}
export const getBreadcrumbRoutes = () => {
const menu = getMenuByPath()
const routes = []
const _getRoutes = (menu: IRouteItem) => {
const { path, title, childRoute } = menu
routes.push({
path,
name: title,
})
if (childRoute && childRoute.length) {
childRoute.forEach(item => {
_getRoutes(item)
})
}
}
_getRoutes(menu)
return routes
}
// 根据当前登录用户的scope获取所有具有权限的路由
export const getPermRoutes = () => {
let permissionRoutes = []
authStore.permissions.forEach((scope: string) => {
const name = scope.substr(scope.indexOf('_') + 1)
permissionRoutes = permissionRoutes.concat(permsConfig[name])
})
permissionRoutes = Array.from(new Set(permissionRoutes))
return permissionRoutes
}
// 根据当前路由检查是否有权限
export const checkPermissionByPath = (path: string) => {
const permissionRoutes = getPermRoutes()
const hasPermission = permissionRoutes.some(route => {
if (!route) return false
const pathArr = path.split('/')
const escapePath = path.replace(/\//g, '\\/')
const lastStr = pathArr[pathArr.length - 1]
let matchStr = ''
// kcid 匹配
if (~lastStr.indexOf('-')) {
matchStr = escapePath.replace(lastStr, ':[a-z]+')
} else {
matchStr = escapePath.replace(/\d+/, ':[a-z]+')
}
const regex = new RegExp(matchStr)
return regex.test(route)
})
return !!hasPermission
}