import React, {Suspense, useEffect, useState} from 'react'; import {Breadcrumb, Dropdown, Layout, Menu, Popconfirm} from "antd"; import {BugTwoTone, DesktopOutlined, DownOutlined, LogoutOutlined} from "@ant-design/icons"; import {Link, Outlet, useLocation, useNavigate} from "react-router-dom"; import {getCurrentUser, isAdmin} from "../service/permission"; import LogoWithName from "../images/logo-with-name.png"; import Logo from "../images/logo.png"; import FooterComponent from "./FooterComponent"; import accountApi from "../api/account"; import {routers} from "./router"; import Landing from "../components/Landing"; import {setTitle} from "../hook/title"; const {Sider, Header} = Layout; const breadcrumbMatchMap = { '/asset/': '资产详情', '/user/': '用户详情', '/role/': '角色详情', '/user-group/': '用户组详情', '/login-policy/': '登录策略详情', '/command-filter/': '命令过滤器详情', '/strategy/': '授权策略详情', }; const breadcrumbNameMap = {}; routers.forEach(r => { if (r.children) { r.children.forEach(c => { breadcrumbNameMap['/' + c.key] = c.label; }) } else { breadcrumbNameMap['/' + r.key] = r.label; } }); const ManagerLayout = () => { const location = useLocation(); const navigate = useNavigate(); let currentUser = getCurrentUser(); let userMenus = currentUser['menus'] || []; let menus = routers.filter(router => userMenus.includes(router.key)).map(router => { if (router.children) { router.children = router.children.filter(r => userMenus.includes(r.key)); } return router; }); let [collapsed, setCollapsed] = useState(false); let _current = location.pathname.split('/')[1]; let [current, setCurrent] = useState(_current); let [logo, setLogo] = useState(LogoWithName); let [logoWidth, setLogoWidth] = useState(140); let [openKeys, setOpenKeys] = useState(JSON.parse(sessionStorage.getItem('openKeys'))); useEffect(() => { setCurrent(_current); setTitle(breadcrumbNameMap['/' + _current]); }, [_current]); const pathSnippets = location.pathname.split('/').filter(i => i); const extraBreadcrumbItems = pathSnippets.map((_, index) => { const url = `/${pathSnippets.slice(0, index + 1).join('/')}`; let label = breadcrumbNameMap[url]; if (!label) { for (let k in breadcrumbMatchMap) { if (url.includes(k)) { label = breadcrumbMatchMap[k]; break; } } } return ( {label} ); }); const breadcrumbItems = [ 首页 , ].concat(extraBreadcrumbItems); const onCollapse = () => { let _collapsed = !collapsed; if (_collapsed) { setLogo(Logo); setLogoWidth(46); setCollapsed(_collapsed); } else { setLogo(LogoWithName); setLogoWidth(140); setCollapsed(false); } }; const subMenuChange = (openKeys) => { setOpenKeys(openKeys); sessionStorage.setItem('openKeys', JSON.stringify(openKeys)); } const menu = ( 我的资产 DEBUG { await accountApi.logout(); navigate('/login'); }} okText="确定" cancelText="取消" placement="left" > 退出登录 ); if (!isAdmin()) { window.location.href = "#/my-asset"; return; } return (
logo
{ navigate(e.key); setCurrent(e.key); }} selectedKeys={[current]} onOpenChange={subMenuChange} defaultOpenKeys={openKeys} theme="dark" mode="inline" defaultSelectedKeys={['']} items={menus} >
{breadcrumbItems}
{getCurrentUser()['nickname']}  
}>
); } export default ManagerLayout;