index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * Created by 叶子 on 2017/8/13.
  3. */
  4. import React, { Component } from 'react';
  5. import { Redirect, Route, Switch } from 'react-router-dom';
  6. import DocumentTitle from 'react-document-title';
  7. import Components from '../components';
  8. import AllPages from '../pages';
  9. import routesConfig from './config';
  10. import queryString from 'query-string';
  11. let AllComponents = { ...Components, ...AllPages };
  12. export default class CRouter extends Component {
  13. requireAuth = (permission, component) => {
  14. const { auth } = this.props;
  15. const { permissions } = auth.data;
  16. // const { auth } = store.getState().httpData;
  17. if (!permissions || !permissions.includes(permission)) return <Redirect to={'404'}/>;
  18. return component;
  19. };
  20. requireLogin = (component, permission) => {
  21. const { auth } = this.props;
  22. const { permissions } = auth.data;
  23. if (process.env.NODE_ENV === 'production' && !permissions) {
  24. // 线上环境判断是否登录
  25. return <Redirect to={'/login'}/>;
  26. }
  27. return permission ? this.requireAuth(permission, component) : component;
  28. };
  29. render() {
  30. return (
  31. <Switch>
  32. {Object.keys(routesConfig).map(key =>
  33. routesConfig[key].map(r => {
  34. const route = r => {
  35. const Component = AllComponents[r.component];
  36. return (
  37. <Route
  38. key={r.route || r.key}
  39. exact
  40. path={r.route || r.key}
  41. render={props => {
  42. const reg = /\?\S*/g;
  43. // 匹配?及其以后字符串
  44. const queryParams = window.location.hash.match(reg);
  45. // 去除?的参数
  46. const { params } = props.match;
  47. Object.keys(params).forEach(key => {
  48. params[key] =
  49. params[key] && params[key].replace(reg, '');
  50. });
  51. props.match.params = { ...params };
  52. const merge = {
  53. ...props,
  54. query: queryParams
  55. ? queryString.parse(queryParams[0])
  56. : {},
  57. };
  58. // 重新包装组件
  59. const wrappedComponent = (
  60. <DocumentTitle title={r.title}>
  61. <Component {...merge} />
  62. </DocumentTitle>
  63. );
  64. return r.login
  65. ? wrappedComponent
  66. : this.requireLogin(wrappedComponent, r.auth);
  67. }}
  68. />
  69. );
  70. };
  71. return r.component ? route(r) : r.subs.map(r => route(r));
  72. }),
  73. )}
  74. <Route render={() => <Redirect to="/404"/>}/>
  75. </Switch>
  76. );
  77. }
  78. }