router.js 6.94 KB
Newer Older
偏右's avatar
偏右 committed
1
import { createElement } from 'react';
ddcat1115's avatar
ddcat1115 committed
2
import dynamic from 'dva/dynamic';
陈帅's avatar
陈帅 committed
3
import pathToRegexp from 'path-to-regexp';
ddcat1115's avatar
ddcat1115 committed
4 5
import { getMenuData } from './menu';

偏右's avatar
偏右 committed
6 7
let routerDataCache;

jim's avatar
jim committed
8
const modelNotExisted = (app, model) =>
偏右's avatar
偏右 committed
9
  // eslint-disable-next-line
PKAQ's avatar
PKAQ committed
10 11
  !app._models.some(({ namespace }) => {
    return namespace === model.substring(model.lastIndexOf('/') + 1);
jim's avatar
jim committed
12
  });
偏右's avatar
偏右 committed
13

ddcat1115's avatar
ddcat1115 committed
14
// wrapper of dynamic
偏右's avatar
偏右 committed
15 16 17 18
const dynamicWrapper = (app, models, component) => {
  // () => require('module')
  // transformed by babel-plugin-dynamic-import-node-sync
  if (component.toString().indexOf('.then(') < 0) {
jim's avatar
jim committed
19
    models.forEach(model => {
偏右's avatar
偏右 committed
20 21 22 23
      if (modelNotExisted(app, model)) {
        // eslint-disable-next-line
        app.model(require(`../models/${model}`).default);
      }
ddcat1115's avatar
ddcat1115 committed
24
    });
jim's avatar
jim committed
25
    return props => {
偏右's avatar
偏右 committed
26 27 28 29 30 31 32 33 34 35 36 37
      if (!routerDataCache) {
        routerDataCache = getRouterData(app);
      }
      return createElement(component().default, {
        ...props,
        routerData: routerDataCache,
      });
    };
  }
  // () => import('module')
  return dynamic({
    app,
jim's avatar
jim committed
38 39
    models: () =>
      models.filter(model => modelNotExisted(app, model)).map(m => import(`../models/${m}.js`)),
偏右's avatar
偏右 committed
40 41 42 43 44
    // add routerData prop
    component: () => {
      if (!routerDataCache) {
        routerDataCache = getRouterData(app);
      }
jim's avatar
jim committed
45
      return component().then(raw => {
偏右's avatar
偏右 committed
46
        const Component = raw.default || raw;
jim's avatar
jim committed
47 48 49 50 51
        return props =>
          createElement(Component, {
            ...props,
            routerData: routerDataCache,
          });
偏右's avatar
偏右 committed
52 53 54 55
      });
    },
  });
};
ddcat1115's avatar
ddcat1115 committed
56 57 58

function getFlatMenuData(menus) {
  let keys = {};
jim's avatar
jim committed
59
  menus.forEach(item => {
ddcat1115's avatar
ddcat1115 committed
60
    if (item.children) {
ddcat1115's avatar
ddcat1115 committed
61
      keys[item.path] = { ...item };
ddcat1115's avatar
ddcat1115 committed
62 63
      keys = { ...keys, ...getFlatMenuData(item.children) };
    } else {
ddcat1115's avatar
ddcat1115 committed
64
      keys[item.path] = { ...item };
ddcat1115's avatar
ddcat1115 committed
65 66 67 68 69
    }
  });
  return keys;
}

jim's avatar
jim committed
70
export const getRouterData = app => {
ddcat1115's avatar
ddcat1115 committed
71
  const routerConfig = {
ddcat1115's avatar
ddcat1115 committed
72 73 74 75 76 77 78 79 80 81
    '/': {
      component: dynamicWrapper(app, ['user', 'login'], () => import('../layouts/BasicLayout')),
    },
    '/dashboard/analysis': {
      component: dynamicWrapper(app, ['chart'], () => import('../routes/Dashboard/Analysis')),
    },
    '/dashboard/monitor': {
      component: dynamicWrapper(app, ['monitor'], () => import('../routes/Dashboard/Monitor')),
    },
    '/dashboard/workplace': {
jim's avatar
jim committed
82 83 84
      component: dynamicWrapper(app, ['project', 'activities', 'chart'], () =>
        import('../routes/Dashboard/Workplace')
      ),
ddcat1115's avatar
ddcat1115 committed
85 86
      // hideInBreadcrumb: true,
      // name: '工作台',
ddcat1115's avatar
ddcat1115 committed
87
      // authority: 'admin',
ddcat1115's avatar
ddcat1115 committed
88 89 90 91 92 93 94
    },
    '/form/basic-form': {
      component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/BasicForm')),
    },
    '/form/step-form': {
      component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm')),
    },
WhatAKitty's avatar
WhatAKitty committed
95
    '/form/step-form/info': {
jim's avatar
jim committed
96
      name: '分步表单(填写转账信息)',
WhatAKitty's avatar
WhatAKitty committed
97 98
      component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step1')),
    },
ddcat1115's avatar
ddcat1115 committed
99
    '/form/step-form/confirm': {
jim's avatar
jim committed
100
      name: '分步表单(确认转账信息)',
ddcat1115's avatar
ddcat1115 committed
101 102 103
      component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step2')),
    },
    '/form/step-form/result': {
jim's avatar
jim committed
104
      name: '分步表单(完成)',
ddcat1115's avatar
ddcat1115 committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
      component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/StepForm/Step3')),
    },
    '/form/advanced-form': {
      component: dynamicWrapper(app, ['form'], () => import('../routes/Forms/AdvancedForm')),
    },
    '/list/table-list': {
      component: dynamicWrapper(app, ['rule'], () => import('../routes/List/TableList')),
    },
    '/list/basic-list': {
      component: dynamicWrapper(app, ['list'], () => import('../routes/List/BasicList')),
    },
    '/list/card-list': {
      component: dynamicWrapper(app, ['list'], () => import('../routes/List/CardList')),
    },
    '/list/search': {
      component: dynamicWrapper(app, ['list'], () => import('../routes/List/List')),
    },
    '/list/search/projects': {
      component: dynamicWrapper(app, ['list'], () => import('../routes/List/Projects')),
    },
    '/list/search/applications': {
      component: dynamicWrapper(app, ['list'], () => import('../routes/List/Applications')),
    },
    '/list/search/articles': {
      component: dynamicWrapper(app, ['list'], () => import('../routes/List/Articles')),
    },
    '/profile/basic': {
      component: dynamicWrapper(app, ['profile'], () => import('../routes/Profile/BasicProfile')),
    },
    '/profile/advanced': {
jim's avatar
jim committed
135 136 137
      component: dynamicWrapper(app, ['profile'], () =>
        import('../routes/Profile/AdvancedProfile')
      ),
ddcat1115's avatar
ddcat1115 committed
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
    },
    '/result/success': {
      component: dynamicWrapper(app, [], () => import('../routes/Result/Success')),
    },
    '/result/fail': {
      component: dynamicWrapper(app, [], () => import('../routes/Result/Error')),
    },
    '/exception/403': {
      component: dynamicWrapper(app, [], () => import('../routes/Exception/403')),
    },
    '/exception/404': {
      component: dynamicWrapper(app, [], () => import('../routes/Exception/404')),
    },
    '/exception/500': {
      component: dynamicWrapper(app, [], () => import('../routes/Exception/500')),
    },
陈帅's avatar
陈帅 committed
154
    '/exception/trigger': {
jim's avatar
jim committed
155 156 157
      component: dynamicWrapper(app, ['error'], () =>
        import('../routes/Exception/triggerException')
      ),
陈帅's avatar
陈帅 committed
158
    },
ddcat1115's avatar
ddcat1115 committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
    '/user': {
      component: dynamicWrapper(app, [], () => import('../layouts/UserLayout')),
    },
    '/user/login': {
      component: dynamicWrapper(app, ['login'], () => import('../routes/User/Login')),
    },
    '/user/register': {
      component: dynamicWrapper(app, ['register'], () => import('../routes/User/Register')),
    },
    '/user/register-result': {
      component: dynamicWrapper(app, [], () => import('../routes/User/RegisterResult')),
    },
    // '/user/:id': {
    //   component: dynamicWrapper(app, [], () => import('../routes/User/SomeComponent')),
    // },
  };
  // Get name from ./menu.js or just set it in the router data.
  const menuData = getFlatMenuData(getMenuData());
陈帅's avatar
陈帅 committed
177 178 179

  // Route configuration data
  // eg. {name,authority ...routerConfig }
ddcat1115's avatar
ddcat1115 committed
180
  const routerData = {};
陈帅's avatar
陈帅 committed
181
  // The route matches the menu
jim's avatar
jim committed
182
  Object.keys(routerConfig).forEach(path => {
陈帅's avatar
陈帅 committed
183 184 185
    // Regular match item name
    // eg.  router /user/:id === /user/chen
    const pathRegexp = pathToRegexp(path);
jim's avatar
jim committed
186
    const menuKey = Object.keys(menuData).find(key => pathRegexp.test(`${key}`));
陈帅's avatar
陈帅 committed
187 188 189 190 191 192 193 194 195 196 197 198 199
    let menuItem = {};
    // If menuKey is not empty
    if (menuKey) {
      menuItem = menuData[menuKey];
    }
    let router = routerConfig[path];
    // If you need to configure complex parameter routing,
    // https://github.com/ant-design/ant-design-pro-site/blob/master/docs/router-and-nav.md#%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E8%B7%AF%E7%94%B1%E8%8F%9C%E5%8D%95
    // eg . /list/:type/user/info/:id
    router = {
      ...router,
      name: router.name || menuItem.name,
      authority: router.authority || menuItem.authority,
200
      hideInBreadcrumb: router.hideInBreadcrumb || menuItem.hideInBreadcrumb,
ddcat1115's avatar
ddcat1115 committed
201
    };
陈帅's avatar
陈帅 committed
202
    routerData[path] = router;
ddcat1115's avatar
ddcat1115 committed
203
  });
ddcat1115's avatar
ddcat1115 committed
204
  return routerData;
ddcat1115's avatar
ddcat1115 committed
205
};