router.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import React from 'react';
  2. import dynamic from 'dva/dynamic';
  3. import { getMenuData } from './menu';
  4. // wrapper of dynamic
  5. const dynamicWrapper = (app, models, component) => dynamic({
  6. app,
  7. // eslint-disable-next-line no-underscore-dangle
  8. models: () => models.filter(m => !app._models.some(({ namespace }) => namespace === m)).map(m => import(`../models/${m}.js`)),
  9. // add routerData prop
  10. component: () => {
  11. const routerData = getRouterData(app);
  12. return component().then((raw) => {
  13. const Component = raw.default || raw;
  14. return props => <Component {...props} routerData={routerData} />;
  15. });
  16. },
  17. });
  18. function getFlatMenuData(menus) {
  19. let keys = {};
  20. menus.forEach((item) => {
  21. if (item.children) {
  22. keys[item.path] = { ...item };
  23. keys = { ...keys, ...getFlatMenuData(item.children) };
  24. } else {
  25. keys[item.path] = { ...item };
  26. }
  27. });
  28. return keys;
  29. }
  30. export const getRouterData = (app) => {
  31. const routerConfig = {
  32. '/': {
  33. component: dynamicWrapper(app, ['user', 'login'], () => import('../layouts/BasicLayout')),
  34. },
  35. '/dashboard/analysis': {
  36. component: dynamicWrapper(app, ['chart'], () => import('../routes/Dashboard/Analysis')),
  37. },
  38. '/dashboard/monitor': {
  39. component: dynamicWrapper(app, ['monitor'], () => import('../routes/Dashboard/Monitor')),
  40. },
  41. '/dashboard/workplace': {
  42. component: dynamicWrapper(app, ['project', 'activities', 'chart'], () => import('../routes/Dashboard/Workplace')),
  43. // hideInBreadcrumb: true,
  44. // name: '工作台',
  45. // authority: 'admin',
  46. },
  47. '/form/basic-form': {
  48. component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/BasicForm')),
  49. },
  50. '/form/step-form': {
  51. component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm')),
  52. },
  53. '/form/step-form/info': {
  54. component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step1')),
  55. },
  56. '/form/step-form/confirm': {
  57. component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step2')),
  58. },
  59. '/form/step-form/result': {
  60. component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step3')),
  61. },
  62. '/form/advanced-form': {
  63. component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/AdvancedForm')),
  64. },
  65. '/list/table-list': {
  66. component: dynamicWrapper(app, ['rule'], () => import('../routes/List/TableList')),
  67. },
  68. '/list/basic-list': {
  69. component: dynamicWrapper(app, ['list'], () => import('../routes/List/BasicList')),
  70. },
  71. '/list/card-list': {
  72. component: dynamicWrapper(app, ['list'], () => import('../routes/List/CardList')),
  73. },
  74. '/list/search': {
  75. component: dynamicWrapper(app, ['list'], () => import('../routes/List/List')),
  76. },
  77. '/list/search/projects': {
  78. component: dynamicWrapper(app, ['list'], () => import('../routes/List/Projects')),
  79. },
  80. '/list/search/applications': {
  81. component: dynamicWrapper(app, ['list'], () => import('../routes/List/Applications')),
  82. },
  83. '/list/search/articles': {
  84. component: dynamicWrapper(app, ['list'], () => import('../routes/List/Articles')),
  85. },
  86. '/profile/basic': {
  87. component: dynamicWrapper(app, ['profile'], () => import('../routes/Profile/BasicProfile')),
  88. },
  89. '/profile/advanced': {
  90. component: dynamicWrapper(app, ['profile'], () => import('../routes/Profile/AdvancedProfile')),
  91. },
  92. '/result/success': {
  93. component: dynamicWrapper(app, [], () => import('../routes/Result/Success')),
  94. },
  95. '/result/fail': {
  96. component: dynamicWrapper(app, [], () => import('../routes/Result/Error')),
  97. },
  98. '/exception/403': {
  99. component: dynamicWrapper(app, [], () => import('../routes/Exception/403')),
  100. },
  101. '/exception/404': {
  102. component: dynamicWrapper(app, [], () => import('../routes/Exception/404')),
  103. },
  104. '/exception/500': {
  105. component: dynamicWrapper(app, [], () => import('../routes/Exception/500')),
  106. },
  107. '/exception/trigger': {
  108. component: dynamicWrapper(app, ['error'], () => import('../routes/Exception/triggerException')),
  109. },
  110. '/user': {
  111. component: dynamicWrapper(app, [], () => import('../layouts/UserLayout')),
  112. },
  113. '/user/login': {
  114. component: dynamicWrapper(app, ['login'], () => import('../routes/User/Login')),
  115. },
  116. '/user/register': {
  117. component: dynamicWrapper(app, ['register'], () => import('../routes/User/Register')),
  118. },
  119. '/user/register-result': {
  120. component: dynamicWrapper(app, [], () => import('../routes/User/RegisterResult')),
  121. },
  122. // '/user/:id': {
  123. // component: dynamicWrapper(app, [], () => import('../routes/User/SomeComponent')),
  124. // },
  125. };
  126. // Get name from ./menu.js or just set it in the router data.
  127. const menuData = getFlatMenuData(getMenuData());
  128. const routerData = {};
  129. Object.keys(routerConfig).forEach((item) => {
  130. const menuItem = menuData[item.replace(/^\//, '')] || {};
  131. routerData[item] = {
  132. ...routerConfig[item],
  133. name: routerConfig[item].name || menuItem.name,
  134. authority: routerConfig[item].authority || menuItem.authority,
  135. };
  136. });
  137. return routerData;
  138. };