123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- import { AvatarDropdown, AvatarName, Question } from '@/components';
- import type { Settings as LayoutSettings } from '@ant-design/pro-components';
- import { SettingDrawer } from '@ant-design/pro-components';
- import type { RequestConfig, RunTimeLayoutConfig } from '@umijs/max';
- import { history, useModel } from '@umijs/max';
- import { message } from 'antd';
- import defaultSettings from '../config/defaultSettings';
- import { scriptUrl } from './global';
- import { errorConfig, ResponseStructure } from './requestErrorConfig';
- import { getMenu } from './services/global';
- import { getUserInfo } from './services/login';
- import { flattenRoutes } from './utils/generateNewLocalMenu';
- const isDev = process.env.NODE_ENV === 'development';
- const loginPath = '/user/login';
- /**
- * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
- * */
- export async function getInitialState(): Promise<{
- settings?: Partial<LayoutSettings>;
- currentUser?: any;
- loading?: boolean;
- menuType?: 'distributor' | 'miniApp';
- navTheme?: '2' | '3';
- token?: any;
- menu?: any;
- }> {
- // 如果不是登录页面,执行
- const { location } = history;
- let menuType = (sessionStorage.getItem('menuType') as 'distributor' | 'miniApp') || 'distributor';
- let navTheme: any = localStorage.getItem('navTheme') || '2'; //主题色 2白 3黑
- if (location.pathname !== loginPath && localStorage.getItem('Admin-Token')) {
- const res = await getUserInfo();
- if (res.data) {
- return {
- token: res.data.token,
- currentUser: res.data.userInfo,
- menuType,
- settings: defaultSettings as Partial<LayoutSettings>,
- navTheme,
- };
- }
- }
- return {
- token: '',
- menuType: 'distributor',
- navTheme,
- settings: defaultSettings as Partial<LayoutSettings>,
- };
- }
- // ProLayout 支持的api https://procomponents.ant.design/components/layout
- export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
- return {
- // 动态管理菜单
- splitMenus: true, //切割菜单
- menu: {
- locale: false, //关闭国际化
- params: {
- //token变化重新获取
- token: initialState?.token,
- },
- request: async () => {
- //需要在routes.tsx中配置一份完整的路由
- let menu = await getMenu(['book']); //线上获取路由
- let flatMenu = flattenRoutes(menu);
- setInitialState({ ...initialState, menu: flatMenu });
- history.push(flatMenu[flatMenu['/'].redirect].redirect); //获取到本地路由后跳转到有权限的页面
- return menu;
- },
- },
- iconfontUrl: scriptUrl,
- actionsRender: () => [<Question key="doc" />],
- avatarProps: {
- src:
- initialState?.currentUser?.avatar ||
- 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
- title: <AvatarName />,
- render: (_, avatarChildren) => {
- return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
- },
- },
- waterMarkProps: {
- content: initialState?.currentUser?.name,
- },
- // footerRender: () => <Footer />,//页脚
- onPageChange: (location: any) => {
- //页面发生变化触发
- hasHandledCode300 = false;
- let obj = initialState?.menu || {};
- if (obj[location.pathname] && obj[location.pathname].redirect) {
- //强制调整到正确的路由地址
- history.push(obj[location.pathname].redirect);
- }
- // // 在小程序页面禁止用户点击回退按钮返回分享页面
- // if (sessionStorage.getItem("menuType") == 'miniApp' && location?.pathname?.match(/^\/distributor/)) {
- // console.log("miniApp", location)
- // history.replace('/miniApp');
- // }
- // // 在分销平台首页禁止用户点击回退按钮返回到小程序页面
- // if (sessionStorage.getItem("menuType") == 'distributor' && location?.pathname?.match(/^\/miniApp/)) {
- // console.log("distributor", location)
- // history.replace('/distributor');
- // }
- // // 如果没有登录,重定向到 login
- if (!localStorage.getItem('Admin-Token') && location?.pathname !== loginPath) {
- history.push(loginPath);
- }
- },
- bgLayoutImgList: [
- {
- 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: initialState?.menuType === 'miniApp' ? [] : [],
- // menuHeaderRender: (logo, title, props) => {
- // if (props?.collapsed) {
- // return false
- // } else if (initialState?.selectApp) {
- // return <Space>
- // <MyIcon type={initialState?.selectApp?.appType === 1 ? "icon-weixin" : "icon-douyinzhanghao"} style={{ fontSize: 30 }} />
- // <strong style={{ fontSize: 18 }}>{initialState?.selectApp?.appName}</strong>
- // </Space>
- // } else {
- // return false
- // }
- // },
- // 自定义 403 页面
- // unAccessible: <div>unAccessible</div>,
- // 增加一个 loading 的状态
- childrenRender: (children: any) => {
- // if (initialState?.loading) return <PageLoading />;
- const { init, state } = useModel('global', (ret) => ({
- init: ret.init,
- state: ret.state,
- }));
- if (!state?.enumList && localStorage.getItem('Admin-Token')) {
- init(); //初始全局
- }
- return (
- <>
- {children}
- {isDev && (
- <SettingDrawer
- disableUrlParams
- enableDarkTheme
- settings={initialState?.settings}
- onSettingChange={(settings) => {
- setInitialState((preInitialState) => ({
- ...preInitialState,
- menuType: preInitialState?.menuType || 'distributor',
- settings,
- token: preInitialState?.token || '',
- // menu: preInitialState?.menu || [],
- }));
- }}
- />
- )}
- </>
- );
- },
- ...initialState?.settings,
- navTheme: initialState?.navTheme === '2' ? 'light' : 'realDark',
- // title:<span style={{fontSize:24,fontFamily:'cursive'}}>{defaultSettings?.title}</span>
- // title:initialState?.selectApp ? defaultSettings?.title + '--'+initialState?.selectApp?.appName : defaultSettings?.title //标题修改
- };
- };
- /**
- * @name request 配置,可以配置错误处理
- * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
- * @doc https://umijs.org/docs/max/request#配置
- */
- let hasHandledCode300 = false;
- export const request: RequestConfig = {
- ...errorConfig,
- // 响应拦截器
- responseInterceptors: [
- (response) => {
- // 拦截响应数据,进行个性化处理
- const { data } = response as unknown as ResponseStructure;
- switch (data.code) {
- case 310:
- if (!hasHandledCode300) {
- hasHandledCode300 = true; // 设置标志位,表示已经处理过
- message.error(data.msg);
- localStorage.removeItem('Admin-Token');
- sessionStorage.removeItem('menuType');
- sessionStorage.removeItem('selectApp');
- history.push(loginPath);
- }
- break;
- // case 500:
- // message.error(data.msg)
- // break
- }
- return response;
- },
- ],
- };
|