123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- import React, { useMemo, useEffect, Suspense } from "react";
- import { App, Layout } from "antd";
- import { useSelector } from "react-redux";
- import { Route, Routes, useNavigate, Navigate } from "react-router-dom";
- import { Content } from "antd/es/layout/layout";
- import { hasToken, getTokenInfo, DageLoading } from "@dage/pc-components";
- import store from "@/store";
- import { LayoutMenu, LayoutHeader } from "./components";
- import { RootState } from "@/store";
- import LogoImage from "@/assets/images/logo.png";
- import { DEFAULT_ADMIN_MENU, DEFAULT_MENU, DageRouteItem } from "@/router";
- import "./index.scss";
- const NotFound = React.lazy(() => import("@/components/NotFound"));
- export default function CustomLayout() {
- const navigate = useNavigate();
- const baseStore = useSelector<RootState, RootState["base"]>(
- (state) => state.base
- );
- const menuList = useMemo<DageRouteItem[]>(() => {
- return baseStore.userInfo?.user.isAdmin
- ? [...DEFAULT_MENU, ...DEFAULT_ADMIN_MENU]
- : [...DEFAULT_MENU];
- }, [baseStore.userInfo]);
- useEffect(() => {
- if (!hasToken()) {
- navigate("/login", {
- replace: true,
- });
- } else {
- store.dispatch({ type: "setUserInfo", payload: getTokenInfo() });
- }
- }, [navigate]);
- return (
- <App>
- <Layout hasSider className="layout">
- {/* 菜单 */}
- <Layout.Sider
- width={220}
- style={{
- position: "fixed",
- top: 0,
- left: 0,
- bottom: 0,
- background: "#242424",
- }}
- >
- <div className="logo">
- <img draggable="false" alt="logo" src={LogoImage} />
- </div>
- <LayoutMenu
- className="layout-menu"
- theme="dark"
- inlineIndent={20}
- menuData={menuList}
- />
- </Layout.Sider>
- <Layout style={{ marginLeft: 220 }}>
- {/* 头部 */}
- <LayoutHeader menuData={menuList} />
- {/* 主体 */}
- <Content
- style={{
- margin: "15px",
- overflow: "initial",
- position: "relative",
- background: "#ffffff",
- padding: 20,
- borderRadius: 4,
- }}
- >
- <Suspense fallback={<DageLoading />}>
- {menuList.length && (
- <Routes>
- <Route
- path="/"
- element={
- <Navigate to={menuList[0].redirect || menuList[0].path} />
- }
- />
- {renderRoutes(menuList).map((menu) =>
- menu.redirect ? (
- <Route
- key={menu.path}
- path={menu.path}
- element={<Navigate replace to={menu.redirect} />}
- />
- ) : (
- <Route
- key={menu.path}
- path={menu.path}
- Component={menu.Component}
- />
- )
- )}
- <Route path="*" Component={NotFound} />
- </Routes>
- )}
- </Suspense>
- </Content>
- </Layout>
- </Layout>
- </App>
- );
- }
- function renderRoutes(routes: DageRouteItem[]) {
- function deep(v: DageRouteItem[]) {
- const stack: DageRouteItem[] = [];
- v.forEach((item) => {
- const { children = [], ...rest } = item;
- stack.push(rest);
- if (!!children.length) {
- stack.push(...deep(children));
- }
- });
- return stack;
- }
- return deep(routes);
- }
|