UNPKG

@10yun/open-sdk

Version:

开放平台接入sdk

201 lines (194 loc) 5.67 kB
/** * 路由-菜单 处理 */ 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 };