app.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import Footer from '@/components/Footer';
  2. import { Question, SelectLang } from '@/components/RightContent';
  3. import { LinkOutlined } from '@ant-design/icons';
  4. import type { Settings as LayoutSettings } from '@ant-design/pro-components';
  5. import { SettingDrawer } from '@ant-design/pro-components';
  6. import type { RunTimeLayoutConfig } from '@umijs/max';
  7. import { history, Link } from '@umijs/max';
  8. import defaultSettings from '../config/defaultSettings';
  9. import { errorConfig } from './requestErrorConfig';
  10. import { currentUser as queryCurrentUser } from './services/ant-design-pro/api';
  11. import React from 'react';
  12. import { AvatarDropdown, AvatarName } from './components/RightContent/AvatarDropdown';
  13. import { Button, Result, notification } from 'antd';
  14. const isDev = process.env.NODE_ENV === 'development';
  15. const loginPath = '/user/login';
  16. /**
  17. * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
  18. * */
  19. export async function getInitialState(): Promise<{
  20. settings?: Partial<LayoutSettings>;
  21. currentUser?: API.CurrentUser;
  22. loading?: boolean;
  23. fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
  24. }> {
  25. const fetchUserInfo = async () => {
  26. try {
  27. const msg = await queryCurrentUser({
  28. skipErrorHandler: true,
  29. });
  30. return msg.data;
  31. } catch (error) {
  32. history.push(loginPath);
  33. }
  34. return undefined;
  35. };
  36. // 如果不是登录页面,执行
  37. const { location } = history;
  38. if (location.pathname !== loginPath) {
  39. const currentUser = await fetchUserInfo();
  40. return {
  41. fetchUserInfo,
  42. currentUser,
  43. settings: defaultSettings as Partial<LayoutSettings>,
  44. };
  45. }
  46. return {
  47. fetchUserInfo,
  48. settings: defaultSettings as Partial<LayoutSettings>,
  49. };
  50. }
  51. // ProLayout 支持的api https://procomponents.ant.design/components/layout
  52. export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
  53. return {
  54. actionsRender: () => [<Question key="doc" />], // <SelectLang key="SelectLang" />
  55. avatarProps: {
  56. src: 'https://xsgames.co/randomusers/avatar.php?g=pixel&key=${i}',
  57. title: <AvatarName />,
  58. render: (_, avatarChildren) => {
  59. return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
  60. },
  61. },
  62. waterMarkProps: {
  63. content: initialState?.currentUser?.mobile,
  64. },
  65. footerRender: () => <Footer />,
  66. onPageChange: () => {
  67. const { location } = history;
  68. // 如果没有登录,重定向到 login
  69. if (!initialState?.currentUser && location.pathname !== loginPath) {
  70. history.push(loginPath);
  71. }
  72. },
  73. layoutBgImgList: [
  74. {
  75. src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
  76. left: 85,
  77. bottom: 100,
  78. height: '303px',
  79. },
  80. {
  81. src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
  82. bottom: -68,
  83. right: -45,
  84. height: '303px',
  85. },
  86. {
  87. src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
  88. bottom: 0,
  89. left: 0,
  90. width: '331px',
  91. },
  92. ],
  93. links: isDev
  94. ? [
  95. <Link key="openapi" to="http://47.97.38.17:9988/swagger-ui.html#/" target="_blank">
  96. <LinkOutlined />
  97. <span>OpenAPI 文档</span>
  98. </Link>,
  99. ]
  100. : [],
  101. menuHeaderRender: undefined,
  102. // 自定义 403 页面
  103. // unAccessible: <div>unAccessible</div>,
  104. // 增加一个 loading 的状态
  105. childrenRender: (children) => {
  106. // if (initialState?.loading) return <PageLoading />;
  107. return (
  108. <>
  109. {children}
  110. <SettingDrawer
  111. disableUrlParams
  112. enableDarkTheme
  113. settings={initialState?.settings}
  114. onSettingChange={(settings) => {
  115. setInitialState((preInitialState) => ({
  116. ...preInitialState,
  117. settings,
  118. }));
  119. }}
  120. />
  121. </>
  122. );
  123. },
  124. ...initialState?.settings,
  125. };
  126. };
  127. /**
  128. * @name request 配置,可以配置错误处理
  129. * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
  130. * @doc https://umijs.org/docs/max/request#配置
  131. */
  132. export const request = {
  133. ...errorConfig
  134. };