@10yun/open-sdk
Version:
开放平台接入sdk
201 lines (194 loc) • 5.67 kB
JavaScript
/**
* 路由-菜单 处理
*/
function replaceSlashes(str) {
// 去除开头的斜杠
str = str.replace(/^\//, '');
// 将所有斜杠替换为下划线
str = str.replace(/\//g, '_');
return str;
}
/**
* 解析路由菜单单条,确保菜单每条都有`name`值
* @param {*} tempItem
* @param {*} i
* @returns
*/
function parseRouteItem(tempItem, i) {
i = i || 1;
let tempPath = '';
/**
* 如果没有 path
*/
if (!tempItem['path']) {
if (tempItem['component']) {
tempPath = tempItem['component'];
}
} else {
tempPath = tempItem.path;
}
/**
* 如果没有 component 应该删除 path
*/
if (!tempItem['component']) {
tempPath = '';
}
let tempName = '';
if (!tempItem['name']) {
if (tempPath) {
tempName = replaceSlashes(tempPath);
} else {
tempName = 'temp_name_' + i;
}
} else {
tempName = tempItem['name'];
}
tempName = replaceSlashes(tempName);
/**
* 判断是否有子集
*/
if (tempItem.children && tempItem.children.length > 0) {
let tempChildren = tempItem.children;
let children_menu_num = 0; // 子菜单数量
let children_opt_num = 0; // 子操作数量
tempChildren.forEach((item2, index2) => {
item2.isMenu == true && children_menu_num++;
item2.isRbac == true && children_opt_num++;
});
tempItem.children_menu_num = children_menu_num;
tempItem.children_opt_num = children_opt_num;
}
return {
...tempItem,
path: tempPath,
name: tempName
};
}
function parseChildrenAll() {}
function parseChildrenOption() {}
function parseChildrenMenu() {}
function parseRouteTree(originalArr) {
let newArr = [];
originalArr.forEach((tempItem1, index1) => {
tempItem1 = parseRouteItem(tempItem1, index1);
if (tempItem.children) {
tempItem.children = parseRouteTree(tempItem.children);
}
});
}
/**
* 树形数据 向下 递归为一维数组
* @param {*} arr 数据源
* @param {*} childs 子集key
* @return {Array}
*/
function treeToSubFlatten(arr = [], childs = 'children') {
return arr.reduce((flat, item) => {
return flat.concat(item, item[childs] ? treeToSubFlatten(item[childs], childs) : []);
}, []);
}
// https://www.cnblogs.com/jj123/p/12784100.html
// https://segmentfault.com/a/1190000015419713
function _import(file) {
file = file.replace(/\s/g, '');
if (file.substr(0, 1) == '/') file = file.substr(1);
if (file.substr(0, 1) == '/') file = file.substr(1);
return file;
}
/**
* 递归获取,每层级的信息,类似 $route.matched
* @param {Array} routerlist 需要递归的数据
* @param {Array} parentInfo 上级的信息向下传递
* @returns
*/
function parseRouteTreeInfo(routerlist, parentInfo = []) {
routerlist = routerlist || [];
let routerInfo = [];
routerlist.forEach((item1, index1) => {
let isParam = {
isMenu: item1.isMenu || false,
isRbac: item1.isRbac || false,
isWindow: item1.isWindow || false,
isAlone: item1.isAlone || false,
isPage: item1.path ? true : false
};
let item_new = {
path: item1.path || '',
name: item1.name || '',
...isParam,
...item1.meta
};
if (item1.redirect) {
item_new = Object.assign({}, item_new, { redirect: item1.redirect });
}
if (item1.generatemenu == 0) {
item_new = Object.assign({}, item_new, { hidden: true });
}
let treeInfo = [];
treeInfo.push(...parentInfo);
treeInfo.push(item_new);
if (item1.children) {
let tempChildren = item1.children;
item1.children = parseRouteTreeInfo([...tempChildren], treeInfo);
}
item1.treeInfo = treeInfo;
routerInfo.push(item1);
});
return routerInfo;
}
/**
* 根据路由匹配地址
* @param {*} data 路由数据
* @param {*} base 路由前缀
* @param {*} options 粗略的配置项
*/
function routeParseQiankun(baseRoute, menuArr, isFlatten = true) {
// 递归获取,各级信息
menuArr = parseRouteTreeInfo(menuArr);
if (!Array.isArray(menuArr)) return baseRoute;
/** 2级+菜单 ,将菜单数据处理为一维函数 如果有多级菜单*/
let menuRoute = treeToSubFlatten(menuArr, 'children');
// 遍历处理路由
menuRoute.forEach((item, index) => {
// menuArr.forEach((item, index) => {
if (!item['path']) return;
item = parseRouteItem(item, index);
try {
let routerItem = {
path: item.path, // 路由路径名
name: item.name, // 命名路由 用于配合菜单简洁跳转
query: item['query'] || {},
params: item['params'] || {},
props: item['props'] || true,
isMenu: item['isMenu'] || false,
meta: {
title: item['title'] || '',
isMenu: item['isMenu'] || false,
isRbac: item['isRbac'] || false,
isWindow: item['isWindow'] || false,
isAlone: item['isAlone'] || false,
treeInfo: item['treeInfo'] || [],
...item.meta
// purview: item[options.permissions],
}
// component = () =>
};
// 路由映射真实视图路径
if (typeof item.component == 'string') {
routerItem.component_str = _import(item.component);
}
baseRoute.push(routerItem);
// 递归处理子路由
if (!isFlatten && item.children) {
routerItem.children = [];
routeParseQiankun(routerItem.children, item.children);
}
} catch (err) {
console.log('---路由注册问题');
console.log('err--', err);
// item['url'] = '/404'
}
});
return baseRoute;
}
export { parseRouteItem, parseRouteTree, routeParseQiankun };