app.jsx 4.93 KB
Newer Older
wuhao's avatar
wuhao committed
1 2 3 4 5 6 7 8 9 10 11 12
import Footer from '@/components/Footer';
import RightContent from '@/components/RightContent';
import { SettingDrawer } from '@ant-design/pro-components';
import { history, Link, matchRoutes } from '@umijs/max';
import defaultSettings from '../config/defaultSettings';
import { queryCurrentUser, getMenu } from './services/login';
import TagView from '@/components/TagView';
import SiderMenu from '@/components/SiderMenu';
import * as Ant4Icons from '@ant-design/icons';
import { createElement } from 'react';

const { LinkOutlined } = Ant4Icons;
wuhao's avatar
wuhao committed
13
const isDev = process.env.NODE_ENV === 'development';
wuhao's avatar
wuhao committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
const loginPath = '/user/login';

/**
 * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
 * */
function strToHump(str) {
  let strArr = str.split('-');
  for (let i = 0; i < strArr.length; i++) {
    strArr[i] = strArr[i].charAt(0).toUpperCase() + strArr[i].substr(1);
  }
  let res = strArr.join('');
  return res + 'Outlined';
}

export async function getInitialState() {
TZW's avatar
TZW committed
29
  let token = localStorage.getItem('TOKENES');
wuhao's avatar
wuhao committed
30 31 32 33 34
  const fetchUserInfo = async () => {
    try {
      const msg = await queryCurrentUser();
      return msg.data;
    } catch (error) {
TZW's avatar
1  
TZW committed
35
      // history.push(loginPath);
wuhao's avatar
wuhao committed
36 37 38 39 40 41 42 43 44 45 46
    }
    return undefined;
  }; // 如果是登录页面,不执行
  const getmenuData = async () => {
    try {
      const res = await getMenu();
      return res.data;
    } catch (error) {
      message.error(res.msg);
    }
    return undefined;
wuhao's avatar
wuhao committed
47 48
  }; // 如果是登录页面,不执行

wuhao's avatar
wuhao committed
49 50 51
  if (history.location.pathname !== loginPath && token) {
    const currentUserData = await fetchUserInfo();
    let menuData;
TZW's avatar
TZW committed
52
    if (currentUserData?.data?.username) {
wuhao's avatar
wuhao committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
      menuData = await getmenuData();
    }
    return {
      fetchUserInfo,
      currentUser: currentUserData?.data,
      settings: defaultSettings,
      newMenu: menuData,
      getmenuData,
      collapsed: false,
    };
  }
  return {
    fetchUserInfo,
    settings: defaultSettings,
    getmenuData,
    collapsed: false,
    tagList: [],
  };
}

// ProLayout 支持的api https://procomponents.ant.design/components/layout
export const layout = ({ initialState, setInitialState }) => {
TZW's avatar
TZW committed
75
  let token = localStorage.getItem('TOKENES');
wuhao's avatar
wuhao committed
76 77 78 79 80 81 82 83 84 85
  return {
    disableContentMargin: false,
    waterMarkProps: {
      content: initialState?.currentUser?.name,
    },
    collapsed: initialState.collapsed,
    onCollapse: (cols) => {
      setInitialState((s) => ({ ...s, collapsed: cols }));
    },
    footerRender: () => <Footer />,
wuhao's avatar
wuhao committed
86
    onPageChange: async () => {
wuhao's avatar
wuhao committed
87 88
      const { location } = history;
      // 如果没有登录,重定向到 login
wuhao's avatar
wuhao committed
89
      if (!initialState?.currentUser && location.pathname !== loginPath) {
wuhao's avatar
wuhao committed
90 91 92 93 94 95 96
        let userInfo = await initialState.fetchUserInfo();
        let menuData = await initialState.getmenuData();
        setInitialState((s) => ({
          ...s,
          currentUser: userInfo?.data,
          newMenu: menuData,
        }));
wuhao's avatar
wuhao committed
97
      }
wuhao's avatar
wuhao committed
98 99 100
    },
    links: isDev
      ? [
wuhao's avatar
wuhao committed
101 102 103 104
          <Link key="openapi" to="/umi/plugin/openapi" target="_blank">
            <LinkOutlined />
            <span>OpenAPI 文档</span>
          </Link>,
wuhao's avatar
wuhao committed
105 106 107 108 109 110 111 112 113 114
        ]
      : [],
    //接口获取菜单数据
    menu: {
      // 每当 initialState?.currentUser?.userid 发生修改时重新执行 request
      params: {
        userId: initialState?.currentUser?.id,
      },
      request: (params, defaultMenuData) => {
        let lastArr = initialState?.newMenu?.userHavePermList
wuhao's avatar
wuhao committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
            ? JSON.parse(JSON.stringify(initialState?.newMenu?.userHavePermList))
            : [],
          newArr = [
            {
              path: '/welcome',
              name: '首页',
              icon: 'smile',
              component: './Welcome',
              haveChildren: false,
              key: '000000',
              parentKey: '0',
              routes: [],
              children: null,
              title: null,
            },
          ].concat(lastArr);
wuhao's avatar
wuhao committed
131

wuhao's avatar
wuhao committed
132
        return newArr.map((item, index) => {
wuhao's avatar
wuhao committed
133 134 135 136 137 138 139 140 141 142
          if (item.icon) {
            const icon = strToHump(item.icon),
              ItemIcon = Ant4Icons[icon];
            item.icon = createElement(ItemIcon);
          }
          return item;
        });
      },
      locale: false,
    },
wuhao's avatar
wuhao committed
143 144 145 146 147 148 149
    menuRender: (props, defaultDom) => {
      if (props.isMobile) {
        return defaultDom;
      } else {
        return <SiderMenu {...props} />;
      }
    },
wuhao's avatar
wuhao committed
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
    // 自定义 403 页面
    unAccessible: <div>unAccessible</div>,
    noFound: <div>noFound</div>,
    // 增加一个 loading 的状态
    childrenRender: (children, props) => {
      // if (initialState?.loading) return <PageLoading />;
      return (
        <>
          {initialState?.currentUser && location.pathname !== loginPath ? (
            <TagView home="/welcome">{children}</TagView>
          ) : (
            children
          )}
        </>
      );
    },
    ...initialState?.settings,
    layout: false,
    headerContentRender: () => <RightContent />,
    rightContentRender: () => null,
  };
};