| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- import type { Settings as LayoutSettings } from '@ant-design/pro-layout';
- import { PageLoading } from '@ant-design/pro-layout';
- import { notification } from 'antd';
- import type { RequestConfig, RunTimeLayoutConfig } from 'umi';
- import { history, Link } from 'umi';
- import RightContent from '@/components/RightContent';
- import Footer from '@/components/Footer';
- import { BookOutlined, LinkOutlined } from '@ant-design/icons';
- import Service from '@/pages/user/Login/service';
- import { service as SystemConfigService } from '@/pages/system/Config';
- import Token from '@/utils/token';
- import type { RequestOptionsInit } from 'umi-request';
- import ReconnectingWebSocket from 'reconnecting-websocket';
- import SystemConst from '@/utils/const';
- import { service as MenuService } from '@/pages/system/Menu';
- import getRoutes, { extraRouteArr, getMenus, handleRoutes, saveMenusCache } from '@/utils/menu';
- import { AIcon } from '@/components';
- import React from 'react';
- const isDev = process.env.NODE_ENV === 'development';
- const loginPath = '/user/login';
- const bindPath = '/account/center/bind';
- let extraRoutes: any[] = [];
- /** 获取用户信息比较慢的时候会展示一个 loading */
- export const initialStateConfig = {
- loading: <PageLoading />,
- };
- /**
- * @see https://umijs.org/zh-CN/plugins/plugin-initial-state
- * */
- export async function getInitialState(): Promise<{
- settings?: Partial<LayoutSettings>;
- currentUser?: UserInfo;
- fetchUserInfo?: () => Promise<UserInfo | undefined>;
- }> {
- const fetchUserInfo = async () => {
- try {
- const user = await Service.queryCurrent();
- return user.result;
- } catch (error) {
- history.push(loginPath);
- }
- return undefined;
- };
- const getSettings = async () => {
- try {
- const res = await Service.settingDetail(['basis']);
- return res.result;
- } catch (error) {
- history.push(loginPath);
- }
- return undefined;
- };
- // 如果是登录页面,不执行
- if (history.location.pathname !== loginPath && history.location.pathname !== bindPath) {
- const currentUser = await fetchUserInfo();
- const settings = await getSettings();
- return {
- fetchUserInfo,
- currentUser,
- settings: settings?.[0].properties,
- };
- }
- // 链接websocket
- const url = `${document.location.protocol.replace('http', 'ws')}//${document.location.host}/${
- SystemConst.API_BASE
- }/messaging/${Token.get()}?:X_Access_Token=${Token.get()}`;
- const ws = new ReconnectingWebSocket(url);
- // ws.send('sss');
- ws.onerror = () => {
- console.log('链接错误。ws');
- };
- return {
- fetchUserInfo,
- settings: {},
- };
- }
- /**
- * 异常处理程序
- 200: '服务器成功返回请求的数据。',
- 201: '新建或修改数据成功。',
- 202: '一个请求已经进入后台排队(异步任务)。',
- 204: '删除数据成功。',
- 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
- 401: '用户没有权限(令牌、用户名、密码错误)。',
- 403: '用户得到授权,但是访问是被禁止的。',
- 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
- 405: '请求方法不被允许。',
- 406: '请求的格式不可得。',
- 410: '请求的资源被永久删除,且不会再得到的。',
- 422: '当创建一个对象时,发生一个验证错误。',
- 500: '服务器发生错误,请检查服务器。',
- 502: '网关错误。',
- 503: '服务不可用,服务器暂时过载或维护。',
- 504: '网关超时。',
- //-----English
- 200: The server successfully returned the requested data. ',
- 201: New or modified data is successful. ',
- 202: A request has entered the background queue (asynchronous task). ',
- 204: Data deleted successfully. ',
- 400: 'There was an error in the request sent, and the server did not create or modify data. ',
- 401: The user does not have permission (token, username, password error). ',
- 403: The user is authorized, but access is forbidden. ',
- 404: The request sent was for a record that did not exist. ',
- 405: The request method is not allowed. ',
- 406: The requested format is not available. ',
- 410':
- 'The requested resource is permanently deleted and will no longer be available. ',
- 422: When creating an object, a validation error occurred. ',
- 500: An error occurred on the server, please check the server. ',
- 502: Gateway error. ',
- 503: The service is unavailable. ',
- 504: The gateway timed out. ',
- * @see https://beta-pro.ant.design/docs/request-cn
- */
- /**
- * Token 拦截器
- * @param url
- * @param options
- */
- const filterUrl = [
- '/authorize/captcha/config',
- '/authorize/login',
- '/sso/bind-code/',
- '/sso/providers',
- ];
- const requestInterceptor = (url: string, options: RequestOptionsInit) => {
- // const {params} = options;
- let authHeader = {};
- if (!filterUrl.some((fUrl) => url.includes(fUrl))) {
- authHeader = { 'X-Access-Token': Token.get() || '' };
- }
- return {
- url: `${url}`,
- options: {
- ...options,
- // 格式化成后台需要的查询参数
- // params: encodeQueryParam(params),
- interceptors: true,
- headers: authHeader,
- },
- };
- };
- export const request: RequestConfig = {
- errorHandler: (error: any) => {
- const { response } = error;
- if (response.status === 401) {
- history.push('/user/login');
- return;
- }
- if (response.status === 400 || response.status === 500) {
- // 添加clone() 避免后续其它地方用response.text()时报错
- response
- .clone()
- .text()
- .then((resp: string) => {
- if (resp) {
- notification.error({
- key: 'error',
- message: JSON.parse(resp).message || '服务器内部错误!',
- });
- } else {
- response
- .clone()
- .json()
- .then((res: any) => {
- notification.error({
- key: 'error',
- message: `请求错误:${res.message}`,
- });
- })
- .catch(() => {
- notification.error({
- key: 'error',
- message: '系统错误',
- });
- });
- }
- });
- return response;
- }
- if (!response) {
- notification.error({
- description: '您的网络发生异常,无法连接服务器',
- message: '网络异常',
- });
- }
- return response;
- },
- requestInterceptors: [requestInterceptor],
- };
- const MenuItemIcon = (
- menuItemProps: any,
- defaultDom: React.ReactNode,
- props: any,
- ): React.ReactNode => {
- if (defaultDom) {
- // @ts-ignore
- const menuItem = React.cloneElement(defaultDom, {
- // @ts-ignore
- children: [<AIcon type={menuItemProps.icon as string} />, defaultDom.props.children[1]],
- ...props,
- });
- return menuItem;
- }
- return defaultDom;
- };
- // ProLayout 支持的api https://procomponents.ant.design/components/layout
- export const layout: RunTimeLayoutConfig = ({ initialState }) => {
- // console.log({ ...initialState });
- return {
- navTheme: 'light',
- headerTheme: 'light',
- rightContentRender: () => <RightContent />,
- disableContentMargin: false,
- waterMarkProps: {
- // content: initialState?.currentUser?.name,
- },
- footerRender: () => <Footer />,
- onPageChange: () => {
- const { location } = history;
- // 如果没有登录,重定向到 login
- if (
- !initialState?.currentUser &&
- location.pathname !== loginPath &&
- location.pathname !== bindPath
- ) {
- history.push(loginPath);
- }
- },
- menuDataRender: () => {
- return getMenus(extraRoutes);
- },
- subMenuItemRender: MenuItemIcon,
- menuItemRender: (menuItemProps, defaultDom) => {
- return MenuItemIcon(menuItemProps, defaultDom, {
- onClick: () => {
- history.push(menuItemProps.path!);
- },
- });
- },
- links: isDev
- ? [
- <Link key={1} to="/umi/plugin/openapi" target="_blank">
- <LinkOutlined />
- <span>OpenAPI 文档</span>
- </Link>,
- <Link key={2} to="/~docs">
- <BookOutlined />
- <span>业务组件文档</span>
- </Link>,
- ]
- : [],
- menuHeaderRender: undefined,
- // 自定义 403 页面
- // unAccessible: <div>unAccessible</div>,
- ...initialState?.settings,
- // title: '',
- // logo:''
- };
- };
- export function patchRoutes(routes: any) {
- if (extraRoutes && extraRoutes.length) {
- const basePath = routes.routes.find((_route: any) => _route.path === '/')!;
- const _routes = getRoutes(extraRoutes);
- const baseRedirect = {
- path: '/',
- routes: [
- ..._routes,
- {
- path: '/',
- redirect: _routes[0].path,
- },
- ],
- };
- basePath.routes = [...basePath.routes, baseRedirect];
- console.log(basePath.routes);
- }
- }
- export function render(oldRender: any) {
- if (history.location.pathname !== loginPath && history.location.pathname !== bindPath) {
- SystemConfigService.getAMapKey().then((res) => {
- if (res && res.status === 200 && res.result) {
- localStorage.setItem(SystemConst.AMAP_KEY, res.result.apiKey);
- }
- });
- MenuService.queryOwnThree({ paging: false }).then((res) => {
- if (res && res.status === 200) {
- if (isDev) {
- res.result.push({
- code: 'demo',
- id: 'demo',
- name: '例子',
- url: '/demo',
- });
- }
- extraRoutes = handleRoutes([...res.result, ...extraRouteArr]);
- saveMenusCache(extraRoutes);
- }
- oldRender();
- });
- } else {
- oldRender();
- }
- }
|