diff --git a/admin-web/src/models/menu.jsx b/admin-web/src/models/menu.js similarity index 59% rename from admin-web/src/models/menu.jsx rename to admin-web/src/models/menu.js index becae1d44..759930e74 100644 --- a/admin-web/src/models/menu.jsx +++ b/admin-web/src/models/menu.js @@ -72,20 +72,87 @@ const filterMenuData = menuData => { .filter(item => item); }; -/** - * 递归构建服务端,配置的菜单 - * @param resultMenuData - */ -const recursionBuildResultMenu = resultMenuData => { - const res = {}; - for (let i = 0; i < resultMenuData.length; i += 1) { - const menuItem = resultMenuData[i]; - // 存在子节点 - res[menuItem.handler] = { - ...menuItem, +// 用于生成uuid +function S4() { + return ((1 + Math.random()) * 0x10000 || 0).toString(16).substring(1); +} +function guid() { + return S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4(); +} + +const findRootMenu = (antDataMenus, rootAntDataMenu, requestDataMenu) => { + let res; + for (let i = 0; i < antDataMenus.length; i += 1) { + const antDataMenu = antDataMenus[i]; + if (antDataMenu.path === requestDataMenu.handler) { + res = rootAntDataMenu; + break; + } + if (antDataMenu.children) { + res = findRootMenu(antDataMenu.children, antDataMenu, requestDataMenu); + break; + } + } + return res; +}; + +const buildTreeMenu = (antMenuData, moveChildrenMenusData, requestDataMenus) => { + return requestDataMenus.map(item => { + if (!item.handler) { + // root 节点 + const uuid = `sms${guid()}`; + const res = { + icon: 'user', + name: item.displayName, + path: uuid, + }; + + // 子节点 + if (item.children) { + // 通过子节点找到对于的父节点,设置 path,没有则是 uuid + const rootMenu = findRootMenu(antMenuData, {}, item.children[0]); + if (rootMenu) { + res.path = rootMenu.path; + } + + // 开始递归构建数据结构 + const childrenMenus = buildTreeMenu(antMenuData, moveChildrenMenusData, item.children); + res.children = childrenMenus; + } + return res; + } + + // moveChildrenMenusData 是一个 map,对比 url 地址是否存在,不存在就给一个 404 的页面 + const handleMapperData = moveChildrenMenusData[item.handler]; + if (handleMapperData) { + return { + ...handleMapperData, + icon: 'user', + name: item.displayName, + path: item.handler, + }; + } + + // 没有就返回404页面 + return moveChildrenMenusData['/exception/404']; + }); +}; + +const moveChildrenMenus = antDataMenus => { + let res = {}; + for (let i = 0; i < antDataMenus.length; i += 1) { + const antDataMenu = antDataMenus[i]; + res[antDataMenu.path] = { + ...res, + ...antDataMenu, }; - if (menuItem.children) { - res[menuItem.handler].children = recursionBuildResultMenu(menuItem.children); + + if (antDataMenu.children) { + const childrenMenus = moveChildrenMenus(antDataMenu.children); + res = { + ...res, + ...childrenMenus, + }; } } return res; @@ -126,21 +193,15 @@ export default { *getMenuData({ payload }, { put, call }) { const { data } = yield call(getAdminMenus); const { routes, authority } = payload; + // authority 已经不适用 const antMenuData = filterMenuData(memoizeOneFormatter(routes, authority)); - let menuData = antMenuData; - const resultMenuData = data; + // const resultMenuData = data; if (data !== 'all') { - // 处理后台数据结构 - const buildResultMenu = recursionBuildResultMenu(resultMenuData); - // 过滤没有权限的菜单 - menuData = antMenuData.filter(item => { - if (buildResultMenu[item.path]) { - return item; - } - return false; - }); + const moveChildrenMenusData = moveChildrenMenus(antMenuData); + const buildTreeMenuData = buildTreeMenu(antMenuData, moveChildrenMenusData, data); + menuData = buildTreeMenuData; } // 生成 menu 和 router mapping