app.tsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import { Footer, Question, AvatarDropdown, AvatarName } from '@/components';
  2. // import { HomeOutlined, LinkOutlined } from '@ant-design/icons';
  3. import type { Settings as LayoutSettings } from '@ant-design/pro-components';
  4. import { SettingDrawer } from '@ant-design/pro-components';
  5. import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max';
  6. import { history } from '@umijs/max';
  7. import defaultSettings from '../config/defaultSettings';
  8. import { errorConfig, ResponseStructure } from './requestErrorConfig';
  9. import React from 'react';
  10. import { getUserInfo } from './services/login';
  11. import { message, Space } from 'antd';
  12. import { MyIcon, scriptUrl } from './global';
  13. const isDev = process.env.NODE_ENV === 'development';
  14. const loginPath = '/user/login';
  15. /**
  16. * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
  17. * */
  18. export async function getInitialState(): Promise<{
  19. settings?: Partial<LayoutSettings>;
  20. currentUser?: any;
  21. loading?: boolean;
  22. menuType: "distributor" | "miniApp",
  23. navTheme?: "2" | "3",
  24. selectApp?: { appId: string, id: string, appName: string } | null,
  25. token: any,
  26. }> {
  27. // 如果不是登录页面,执行
  28. const { location } = history;
  29. let selectApp = sessionStorage.getItem("selectApp");
  30. let menuType = sessionStorage.getItem("menuType") as ("distributor" | "miniApp") || 'distributor';
  31. let navTheme: any = localStorage.getItem("navTheme") || '2';//主题色 2白 3黑
  32. if (location.pathname !== loginPath) {
  33. const res = await getUserInfo();
  34. // console.log(res)
  35. if (res.data) {
  36. return {
  37. token: res.data.token,
  38. currentUser: res.data.userInfo,
  39. menuType,
  40. settings: defaultSettings as Partial<LayoutSettings>,
  41. navTheme,
  42. selectApp: selectApp ? JSON.parse(selectApp) : null
  43. };
  44. }
  45. }
  46. return {
  47. token: "",
  48. menuType: "distributor",
  49. navTheme,
  50. settings: defaultSettings as Partial<LayoutSettings>,
  51. };
  52. }
  53. // ProLayout 支持的api https://procomponents.ant.design/components/layout
  54. export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
  55. return {
  56. // 动态管理菜单
  57. // menu: {
  58. // // 每当 initialState?.currentUser?.userid 发生修改时重新执行 request
  59. // params: {
  60. // userId: initialState?.menuType,
  61. // },
  62. // request: async (params, defaultMenuData) => {
  63. // // initialState.currentUser 中包含了所有用户信息
  64. // // const menuData =
  65. // console.log(defaultMenuData,initialState)
  66. // return defaultMenuData;
  67. // },
  68. // },
  69. iconfontUrl: scriptUrl,
  70. actionsRender: () => [<Question key="doc" />],
  71. avatarProps: {
  72. src: initialState?.currentUser?.avatar || "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png",
  73. title: <AvatarName />,
  74. render: (_, avatarChildren) => {
  75. return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
  76. },
  77. },
  78. waterMarkProps: {
  79. content: initialState?.currentUser?.name,
  80. },
  81. // footerRender: () => <Footer />,
  82. onPageChange: () => {
  83. hasHandledCode300 = false
  84. const { location } = history;
  85. // 如果没有登录,重定向到 login
  86. if (!localStorage.getItem("Token") && location.pathname !== loginPath) {
  87. history.push(loginPath);
  88. }
  89. },
  90. bgLayoutImgList: [
  91. {
  92. src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
  93. left: 85,
  94. bottom: 100,
  95. height: '303px',
  96. },
  97. {
  98. src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
  99. bottom: -68,
  100. right: -45,
  101. height: '303px',
  102. },
  103. {
  104. src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
  105. bottom: 0,
  106. left: 0,
  107. width: '331px',
  108. },
  109. ],
  110. // links: initialState?.menuType === 'miniApp' ? [] : [],
  111. menuHeaderRender: (logo, title, props) => {
  112. if (props?.collapsed) {
  113. return false
  114. } else if (initialState?.selectApp) {
  115. return <Space>
  116. <MyIcon type='icon-xiaochengxu' style={{ fontSize: 30 }} />
  117. <strong style={{ fontSize: 20 }}>{initialState?.selectApp?.appName}</strong>
  118. </Space>
  119. } else {
  120. return false
  121. }
  122. },
  123. // 自定义 403 页面
  124. // unAccessible: <div>unAccessible</div>,
  125. // 增加一个 loading 的状态
  126. childrenRender: (children) => {
  127. // if (initialState?.loading) return <PageLoading />;
  128. return (
  129. <>
  130. {children}
  131. {isDev && (
  132. <SettingDrawer
  133. disableUrlParams
  134. enableDarkTheme
  135. settings={initialState?.settings}
  136. onSettingChange={(settings) => {
  137. setInitialState((preInitialState) => ({
  138. ...preInitialState,
  139. menuType: preInitialState?.menuType || "distributor",
  140. settings,
  141. token: preInitialState?.token || "",
  142. }));
  143. }}
  144. />
  145. )}
  146. </>
  147. );
  148. },
  149. ...initialState?.settings,
  150. navTheme: initialState?.navTheme === '2' ? "light" : "realDark"
  151. // title:initialState?.selectApp ? defaultSettings?.title + '--'+initialState?.selectApp?.appName : defaultSettings?.title //标题修改
  152. };
  153. };
  154. /**
  155. * @name request 配置,可以配置错误处理
  156. * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
  157. * @doc https://umijs.org/docs/max/request#配置
  158. */
  159. let hasHandledCode300 = false;
  160. export const request: RequestConfig = {
  161. ...errorConfig,
  162. // 响应拦截器
  163. responseInterceptors: [
  164. (response) => {
  165. // 拦截响应数据,进行个性化处理
  166. const { data } = response as unknown as ResponseStructure;
  167. switch (data.code) {
  168. case 300:
  169. if (!hasHandledCode300) {
  170. hasHandledCode300 = true; // 设置标志位,表示已经处理过
  171. message.error(data.msg);
  172. localStorage.removeItem("Token");
  173. sessionStorage.removeItem("menuType");
  174. sessionStorage.removeItem("selectApp");
  175. history.push(loginPath)
  176. }
  177. break;
  178. case 500:
  179. message.error(data.msg)
  180. break
  181. }
  182. return response;
  183. },
  184. ],
  185. };