menu.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import memoizeOne from 'memoize-one';
  2. import isEqual from 'lodash/isEqual';
  3. import { formatMessage } from 'umi/locale';
  4. import Authorized from '@/utils/Authorized';
  5. const { check } = Authorized;
  6. // Conversion router to menu.
  7. function formatter(data, parentAuthority, parentName) {
  8. return data
  9. .map(item => {
  10. if (!item.name || !item.path) {
  11. return null;
  12. }
  13. let locale = 'menu';
  14. if (parentName) {
  15. locale = `${parentName}.${item.name}`;
  16. } else {
  17. locale = `menu.${item.name}`;
  18. }
  19. const result = {
  20. ...item,
  21. name: formatMessage({ id: locale, defaultMessage: item.name }),
  22. locale,
  23. authority: item.authority || parentAuthority,
  24. };
  25. if (item.routes) {
  26. const children = formatter(item.routes, item.authority, locale);
  27. // Reduce memory usage
  28. result.children = children;
  29. }
  30. delete result.routes;
  31. return result;
  32. })
  33. .filter(item => item);
  34. }
  35. const memoizeOneFormatter = memoizeOne(formatter, isEqual);
  36. /**
  37. * get SubMenu or Item
  38. */
  39. const getSubMenu = (item, blackList = []) => {
  40. // doc: add hideChildrenInMenu
  41. if (item.children && !item.hideChildrenInMenu && item.children.some(child => child.name)) {
  42. return {
  43. ...item,
  44. children: filterMenuData(item.children, blackList), // eslint-disable-line
  45. };
  46. }
  47. return item;
  48. };
  49. /**
  50. * filter menuData
  51. */
  52. const filterMenuData = (menuData, blackList = []) => {
  53. if (!menuData) {
  54. return [];
  55. }
  56. return menuData
  57. .filter(item => item.name && !item.hideInMenu)
  58. .map(item => check(item.authority, getSubMenu(item, blackList)))
  59. .filter(item => !blackList.includes(item.path));
  60. };
  61. /**
  62. * 获取面包屑映射
  63. * @param {Object} menuData 菜单配置
  64. */
  65. const getBreadcrumbNameMap = menuData => {
  66. const routerMap = {};
  67. const flattenMenuData = data => {
  68. data.forEach(menuItem => {
  69. if (menuItem.children) {
  70. flattenMenuData(menuItem.children);
  71. }
  72. // Reduce memory usage
  73. routerMap[menuItem.path] = menuItem;
  74. });
  75. };
  76. flattenMenuData(menuData);
  77. return routerMap;
  78. };
  79. const memoizeOneGetBreadcrumbNameMap = memoizeOne(getBreadcrumbNameMap, isEqual);
  80. export default {
  81. namespace: 'menu',
  82. state: {
  83. menuData: [],
  84. breadcrumbNameMap: {},
  85. },
  86. effects: {
  87. * getMenuData({ payload }, { put, select }) {
  88. let { routes, authority } = payload;
  89. let routes_copy = JSON.parse(JSON.stringify(routes));
  90. //根据接口返回数据组装菜单
  91. var tmp_data = JSON.parse(localStorage.getItem('sld_menu_data'));
  92. if(tmp_data&&tmp_data.length!=undefined&&tmp_data.length){
  93. for (var i = 0; i < routes.length; i++) {
  94. var item = tmp_data.filter(item => item.frontPath == routes[i].path);
  95. if (item.length > 0) {
  96. var item_child = item[0];
  97. if (item_child.children != undefined && item_child.children.length > 0) {
  98. for (var j = 0; j < routes[i]['routes'].length; j++) {
  99. var child_item = item_child.children.filter(citem => citem.frontPath == routes[i]['routes'][j].path);
  100. if (child_item.length == 0) {
  101. routes_copy[i]['routes'][j].name = '';
  102. }
  103. }
  104. }
  105. } else {
  106. routes_copy[i].name = '';
  107. }
  108. }
  109. }
  110. const currentSite = yield select(state => state.global.currentSite);
  111. const blackList = currentSite === '1' ? ['/manage_order/ai_business_intelligence'] : ['/manage_neworder/order_manage_list']
  112. const menuData = filterMenuData(memoizeOneFormatter(routes_copy, authority), blackList);
  113. const breadcrumbNameMap = memoizeOneGetBreadcrumbNameMap(menuData);
  114. yield put({
  115. type: 'save',
  116. payload: { menuData, breadcrumbNameMap },
  117. });
  118. },
  119. },
  120. reducers: {
  121. save(state, action) {
  122. return {
  123. ...state,
  124. ...action.payload,
  125. };
  126. },
  127. },
  128. };