|
@@ -1,141 +1,149 @@
|
|
-import Footer from '@/components/Footer';
|
|
|
|
-import { Question, SelectLang } from '@/components/RightContent';
|
|
|
|
-import { LinkOutlined } from '@ant-design/icons';
|
|
|
|
-import type { Settings as LayoutSettings } from '@ant-design/pro-components';
|
|
|
|
-import { SettingDrawer } from '@ant-design/pro-components';
|
|
|
|
-import type { RunTimeLayoutConfig } from '@umijs/max';
|
|
|
|
-import { history, Link } from '@umijs/max';
|
|
|
|
-import defaultSettings from '../config/defaultSettings';
|
|
|
|
-import { errorConfig } from './requestErrorConfig';
|
|
|
|
-import { currentUser as queryCurrentUser } from './services/ant-design-pro/api';
|
|
|
|
-import React from 'react';
|
|
|
|
-import { AvatarDropdown, AvatarName } from './components/RightContent/AvatarDropdown';
|
|
|
|
-const isDev = process.env.NODE_ENV === 'development';
|
|
|
|
-const loginPath = '/user/login';
|
|
|
|
-// 不显示页脚页面配置
|
|
|
|
-const doNotFooter = ['/opus'];
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
|
|
|
|
- * */
|
|
|
|
-export async function getInitialState(): Promise<{
|
|
|
|
- settings?: Partial<LayoutSettings>;
|
|
|
|
- currentUser?: API.CurrentUser;
|
|
|
|
- loading?: boolean;
|
|
|
|
- fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
|
|
|
|
-}> {
|
|
|
|
- const fetchUserInfo = async () => {
|
|
|
|
- try {
|
|
|
|
- const msg = await queryCurrentUser({
|
|
|
|
- skipErrorHandler: true,
|
|
|
|
- });
|
|
|
|
- return msg.data;
|
|
|
|
- } catch (error) {
|
|
|
|
- history.push(loginPath);
|
|
|
|
- }
|
|
|
|
- return undefined;
|
|
|
|
- };
|
|
|
|
- // 如果不是登录页面,执行
|
|
|
|
- const { location } = history;
|
|
|
|
- if (location.pathname !== loginPath) {
|
|
|
|
- const currentUser = await fetchUserInfo();
|
|
|
|
- return {
|
|
|
|
- fetchUserInfo,
|
|
|
|
- currentUser: {
|
|
|
|
- avatar: `https://xsgames.co/randomusers/avatar.php?g=pixel&key=${Math.floor(Math.random() * 10)}`,
|
|
|
|
- ...currentUser
|
|
|
|
- },
|
|
|
|
- settings: defaultSettings as Partial<LayoutSettings>,
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- return {
|
|
|
|
- fetchUserInfo,
|
|
|
|
- settings: defaultSettings as Partial<LayoutSettings>,
|
|
|
|
- };
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// ProLayout 支持的api https://procomponents.ant.design/components/layout
|
|
|
|
-export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
|
|
|
|
- return {
|
|
|
|
- actionsRender: () => [<Question key="doc" />], // <SelectLang key="SelectLang" />
|
|
|
|
- avatarProps: {
|
|
|
|
- src: initialState?.currentUser?.avatar || `https://xsgames.co/randomusers/avatar.php?g=pixel&key=${Math.floor(Math.random() * 20)}`,
|
|
|
|
- title: <AvatarName />,
|
|
|
|
- render: (_, avatarChildren) => {
|
|
|
|
- return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
- waterMarkProps: {
|
|
|
|
- content: initialState?.currentUser?.mobile,
|
|
|
|
- },
|
|
|
|
- footerRender: () => !doNotFooter.includes(location.pathname) ? <Footer /> : null,
|
|
|
|
- onPageChange: () => {
|
|
|
|
- const { location } = history;
|
|
|
|
- // 如果没有登录,重定向到 login
|
|
|
|
- if (!initialState?.currentUser && location.pathname !== loginPath) {
|
|
|
|
- history.push(loginPath);
|
|
|
|
- }
|
|
|
|
- },
|
|
|
|
- layoutBgImgList: [
|
|
|
|
- {
|
|
|
|
- src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
|
|
|
|
- left: 85,
|
|
|
|
- bottom: 100,
|
|
|
|
- height: '303px',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
|
|
|
|
- bottom: -68,
|
|
|
|
- right: -45,
|
|
|
|
- height: '303px',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
|
|
|
|
- bottom: 0,
|
|
|
|
- left: 0,
|
|
|
|
- width: '331px',
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
- links: isDev
|
|
|
|
- ? [
|
|
|
|
- <Link key="openapi" to="http://47.97.38.17:9988/swagger-ui.html#/" target="_blank">
|
|
|
|
- <LinkOutlined />
|
|
|
|
- <span>OpenAPI 文档</span>
|
|
|
|
- </Link>,
|
|
|
|
- ]
|
|
|
|
- : [],
|
|
|
|
- menuHeaderRender: undefined,
|
|
|
|
- // 自定义 403 页面
|
|
|
|
- // unAccessible: <div>unAccessible</div>,
|
|
|
|
- // 增加一个 loading 的状态
|
|
|
|
- childrenRender: (children) => {
|
|
|
|
- // if (initialState?.loading) return <PageLoading />;
|
|
|
|
- return (
|
|
|
|
- <>
|
|
|
|
- {children}
|
|
|
|
- <SettingDrawer
|
|
|
|
- disableUrlParams
|
|
|
|
- enableDarkTheme
|
|
|
|
- settings={initialState?.settings}
|
|
|
|
- onSettingChange={(settings) => {
|
|
|
|
- setInitialState((preInitialState) => ({
|
|
|
|
- ...preInitialState,
|
|
|
|
- settings,
|
|
|
|
- }));
|
|
|
|
- }}
|
|
|
|
- />
|
|
|
|
- </>
|
|
|
|
- );
|
|
|
|
- },
|
|
|
|
- ...initialState?.settings,
|
|
|
|
- };
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * @name request 配置,可以配置错误处理
|
|
|
|
- * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
|
|
|
|
- * @doc https://umijs.org/docs/max/request#配置
|
|
|
|
- */
|
|
|
|
-export const request = {
|
|
|
|
- ...errorConfig
|
|
|
|
-};
|
|
|
|
|
|
+import Footer from '@/components/Footer';
|
|
|
|
+import { Question } from '@/components/RightContent';
|
|
|
|
+import { LinkOutlined } from '@ant-design/icons';
|
|
|
|
+import type { Settings as LayoutSettings } from '@ant-design/pro-components';
|
|
|
|
+import { PageLoading, SettingDrawer } from '@ant-design/pro-components';
|
|
|
|
+import type { RunTimeLayoutConfig } from '@umijs/max';
|
|
|
|
+import { history } from '@umijs/max';
|
|
|
|
+import { Button } from 'antd';
|
|
|
|
+import defaultSettings from '../config/defaultSettings';
|
|
|
|
+import { AvatarDropdown, AvatarName } from './components/RightContent/AvatarDropdown';
|
|
|
|
+import { errorConfig } from './requestErrorConfig';
|
|
|
|
+import { currentUser as queryCurrentUser } from './services/ant-design-pro/api';
|
|
|
|
+const isDev = process.env.NODE_ENV === 'development';
|
|
|
|
+const loginPath = '/user/login';
|
|
|
|
+// 不显示页脚页面配置
|
|
|
|
+const doNotFooter = ['/opus'];
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
|
|
|
|
+ * */
|
|
|
|
+export async function getInitialState(): Promise<{
|
|
|
|
+ settings?: Partial<LayoutSettings>;
|
|
|
|
+ currentUser?: API.CurrentUser;
|
|
|
|
+ loading?: boolean;
|
|
|
|
+ fetchUserInfo?: () => Promise<API.CurrentUser | undefined>;
|
|
|
|
+}> {
|
|
|
|
+ const fetchUserInfo = async () => {
|
|
|
|
+ try {
|
|
|
|
+ const msg = await queryCurrentUser({
|
|
|
|
+ skipErrorHandler: true,
|
|
|
|
+ });
|
|
|
|
+ return msg.data;
|
|
|
|
+ } catch (error) {
|
|
|
|
+ history.push(loginPath);
|
|
|
|
+ }
|
|
|
|
+ return undefined;
|
|
|
|
+ };
|
|
|
|
+ // 判断是否有token,执行
|
|
|
|
+ if (localStorage.getItem('Admin-Token')) {
|
|
|
|
+ const currentUser = await fetchUserInfo();
|
|
|
|
+ return {
|
|
|
|
+ fetchUserInfo,
|
|
|
|
+ currentUser: {
|
|
|
|
+ avatar: `https://xsgames.co/randomusers/avatar.php?g=pixel&key=${Math.floor(
|
|
|
|
+ Math.random() * 10,
|
|
|
|
+ )}`,
|
|
|
|
+ ...currentUser,
|
|
|
|
+ },
|
|
|
|
+ settings: defaultSettings as Partial<LayoutSettings>,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+ return {
|
|
|
|
+ fetchUserInfo,
|
|
|
|
+ settings: defaultSettings as Partial<LayoutSettings>,
|
|
|
|
+ };
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// ProLayout 支持的api https://procomponents.ant.design/components/layout
|
|
|
|
+export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
|
|
|
|
+ return {
|
|
|
|
+ actionsRender: () => [<Question key="doc" />], // <SelectLang key="SelectLang" />
|
|
|
|
+ avatarProps: {
|
|
|
|
+ src:
|
|
|
|
+ initialState?.currentUser?.avatar ||
|
|
|
|
+ `https://xsgames.co/randomusers/avatar.php?g=pixel&key=${Math.floor(Math.random() * 20)}`,
|
|
|
|
+ title: <AvatarName />,
|
|
|
|
+ render: (_, avatarChildren) => {
|
|
|
|
+ return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ waterMarkProps: {
|
|
|
|
+ content: initialState?.currentUser?.mobile,
|
|
|
|
+ },
|
|
|
|
+ footerRender: () => (!doNotFooter.includes(location.pathname) ? <Footer /> : null),
|
|
|
|
+ onPageChange: () => {
|
|
|
|
+ const { location } = history;
|
|
|
|
+ // 如果没有登录,重定向到 login
|
|
|
|
+ if (!initialState?.currentUser && location.pathname !== loginPath) {
|
|
|
|
+ history.push(loginPath);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ layoutBgImgList: [
|
|
|
|
+ {
|
|
|
|
+ src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
|
|
|
|
+ left: 85,
|
|
|
|
+ bottom: 100,
|
|
|
|
+ height: '303px',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
|
|
|
|
+ bottom: -68,
|
|
|
|
+ right: -45,
|
|
|
|
+ height: '303px',
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
|
|
|
|
+ bottom: 0,
|
|
|
|
+ left: 0,
|
|
|
|
+ width: '331px',
|
|
|
|
+ },
|
|
|
|
+ ],
|
|
|
|
+ links: isDev
|
|
|
|
+ ? [
|
|
|
|
+ <Button
|
|
|
|
+ type="link"
|
|
|
|
+ key="openApi"
|
|
|
|
+ href="http://47.97.38.17:9988/swagger-ui.html#/"
|
|
|
|
+ target="_blank"
|
|
|
|
+ >
|
|
|
|
+ <LinkOutlined />
|
|
|
|
+ <span>OpenAPI 文档</span>
|
|
|
|
+ </Button>,
|
|
|
|
+ ]
|
|
|
|
+ : [],
|
|
|
|
+ menuHeaderRender: undefined,
|
|
|
|
+ // 自定义 403 页面
|
|
|
|
+ // unAccessible: <div>unAccessible</div>,
|
|
|
|
+ // 增加一个 loading 的状态
|
|
|
|
+ childrenRender: (children) => {
|
|
|
|
+ if (initialState?.loading) return <PageLoading />;
|
|
|
|
+ return (
|
|
|
|
+ <>
|
|
|
|
+ {children}
|
|
|
|
+ <SettingDrawer
|
|
|
|
+ disableUrlParams
|
|
|
|
+ enableDarkTheme
|
|
|
|
+ settings={initialState?.settings}
|
|
|
|
+ onSettingChange={(settings) => {
|
|
|
|
+ setInitialState((preInitialState) => ({
|
|
|
|
+ ...preInitialState,
|
|
|
|
+ settings,
|
|
|
|
+ }));
|
|
|
|
+ }}
|
|
|
|
+ />
|
|
|
|
+ </>
|
|
|
|
+ );
|
|
|
|
+ },
|
|
|
|
+ ...initialState?.settings,
|
|
|
|
+ };
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @name request 配置,可以配置错误处理
|
|
|
|
+ * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
|
|
|
|
+ * @doc https://umijs.org/docs/max/request#配置
|
|
|
|
+ */
|
|
|
|
+export const request = {
|
|
|
|
+ ...errorConfig,
|
|
|
|
+};
|