BasicLayout.jsx 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**
  2. * Ant Design Pro v4 use `@ant-design/pro-layout` to handle Layout.
  3. * You can view component api by:
  4. * https://github.com/ant-design/ant-design-pro-layout
  5. */
  6. import ProLayout, { DefaultFooter } from '@ant-design/pro-layout';
  7. import React, { useEffect, useMemo } from 'react';
  8. import { Link } from 'umi';
  9. import { connect } from 'dva';
  10. import { Icon, Result, Button } from 'antd';
  11. import { formatMessage } from 'umi-plugin-react/locale';
  12. import Authorized from '@/utils/Authorized';
  13. import RightContent from '@/components/GlobalHeader/RightContent';
  14. import { isAntDesignPro, getAuthorityFromRouter } from '@/utils/utils';
  15. import logo from '../assets/logo.svg';
  16. const noMatch = (
  17. <Result
  18. status={403}
  19. title="403"
  20. subTitle="Sorry, you are not authorized to access this page."
  21. extra={
  22. <Button type="primary">
  23. <Link to="/user/login">Go Login</Link>
  24. </Button>
  25. }
  26. />
  27. );
  28. /** Use Authorized check all menu item */
  29. const menuDataRender = (menuRoles) => (menuList) =>
  30. menuList.map((item) => {
  31. const needAuth = !!item.menuCode;
  32. const authority =
  33. (menuRoles.filter((x) => x.menuCode === item.menuCode)[0] || {}).roles || [];
  34. const localItem = { ...item, children: item.children ? menuDataRender(menuRoles)(item.children) : [] };
  35. return Authorized.check(needAuth ? authority : undefined, localItem, null);
  36. });
  37. const footerRender = () => {
  38. const copyright = `${(new Date()).getFullYear()} 云致科技`
  39. return (
  40. <DefaultFooter
  41. copyright={copyright}
  42. links={[
  43. // {
  44. // key: 'Ant Design Pro',
  45. // title: 'Ant Design Pro',
  46. // href: 'https://pro.ant.design',
  47. // blankTarget: true,
  48. // },
  49. ]}
  50. />
  51. );
  52. };
  53. const BasicLayout = (props) => {
  54. const {
  55. // user,
  56. menus,
  57. dispatch,
  58. children,
  59. settings,
  60. location = {
  61. pathname: '/',
  62. },
  63. } = props;
  64. const handleMenuCollapse = (payload) => {
  65. if (dispatch) {
  66. dispatch({
  67. type: 'global/changeLayoutCollapsed',
  68. payload,
  69. });
  70. }
  71. }; // get children authority
  72. const authorized = useMemo(() => {
  73. const routeItem = getAuthorityFromRouter(props.route.routes, location.pathname || '/')
  74. if (!routeItem || !routeItem.menuCode) {
  75. return {
  76. authority: undefined,
  77. };
  78. }
  79. const authority = (menus.filter((x) => x.menuCode === routeItem.menuCode)[0] || {}).roles;
  80. return {
  81. authority: authority && authority.length ? authority : ['any-string-for-no-right'],
  82. };
  83. })
  84. return (
  85. <ProLayout
  86. logo={logo}
  87. menuHeaderRender={(logoDom, titleDom) => (
  88. <Link to="/">
  89. {logoDom}
  90. {titleDom}
  91. </Link>
  92. )}
  93. onCollapse={handleMenuCollapse}
  94. menuItemRender={(menuItemProps, defaultDom) => {
  95. if (menuItemProps.isUrl || menuItemProps.children || !menuItemProps.path) {
  96. return defaultDom;
  97. }
  98. return <Link to={menuItemProps.path}>{defaultDom}</Link>;
  99. }}
  100. breadcrumbRender={(routers = []) => [
  101. {
  102. path: '/',
  103. breadcrumbName: formatMessage({
  104. id: 'menu.home',
  105. defaultMessage: 'Home',
  106. }),
  107. },
  108. ...routers,
  109. ]}
  110. itemRender={(route, params, routes, paths) => {
  111. const first = routes.indexOf(route) === 0;
  112. return first ? (
  113. <Link to={paths.join('/')}>{route.breadcrumbName}</Link>
  114. ) : (
  115. <span>{route.breadcrumbName}</span>
  116. );
  117. }}
  118. footerRender={footerRender}
  119. menuDataRender={menuDataRender(menus)}
  120. formatMessage={formatMessage}
  121. rightContentRender={() => <RightContent />}
  122. {...props}
  123. {...settings}
  124. >
  125. <Authorized authority={authorized.authority} noMatch={noMatch}>
  126. {children}
  127. </Authorized>
  128. </ProLayout>
  129. );
  130. };
  131. export default connect(({ global, settings, user }) => ({
  132. collapsed: global.collapsed,
  133. settings,
  134. user: user.currentUser,
  135. menus: user.menuList,
  136. }))(BasicLayout);