feat: 重构布局为上侧右结构,集成 antd 全局配置与中文语言

This commit is contained in:
2026-05-15 12:52:00 +08:00
parent edc367898f
commit 5bdd8603a1
6 changed files with 106 additions and 34 deletions

View File

@@ -1,17 +1,86 @@
import { Link, Outlet } from 'react-router';
import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons';
import { Layout, Menu } from 'antd';
import { useState } from 'react';
import { Outlet, useLocation, useNavigate } from 'react-router';
import { routes } from '../routes';
const { Header, Sider, Content } = Layout;
const menuItems = routes
.filter((r) => !r.hideInMenu)
.map((r) => ({
key: r.path,
icon: r.icon,
label: r.label,
}));
const RootLayout = () => {
const navigate = useNavigate();
const location = useLocation();
const [collapsed, setCollapsed] = useState(false);
return (
<>
<nav>
<Link to="/"></Link>
{' | '}
<Link to="/about"></Link>
</nav>
<main>
<Outlet />
</main>
</>
<Layout style={{ height: '100vh' }}>
<Header
style={{
display: 'flex',
alignItems: 'center',
padding: '0 24px',
background: '#fff',
borderBottom: '1px solid #f0f0f0',
}}
>
<span style={{ fontWeight: 'bold', fontSize: 18 }}>TaoTie</span>
</Header>
<Layout style={{ overflow: 'hidden' }}>
<Sider
theme="light"
width={200}
collapsed={collapsed}
style={{ borderRight: '1px solid #f0f0f0', position: 'relative' }}
>
<Menu
mode="inline"
selectedKeys={[location.pathname]}
items={menuItems}
onClick={({ key }) => navigate(key)}
style={{ height: '100%', borderRight: 0, paddingBottom: 48 }}
/>
<div
onClick={() => setCollapsed(!collapsed)}
style={{
position: 'absolute',
bottom: 0,
left: 0,
right: 0,
height: 48,
display: 'flex',
alignItems: 'center',
justifyContent: collapsed ? 'center' : 'flex-end',
padding: collapsed ? 0 : '0 24px',
borderTop: '1px solid #f0f0f0',
cursor: 'pointer',
color: '#666',
background: '#fff',
transition: 'all 0.2s',
userSelect: 'none',
}}
>
{collapsed ? (
<MenuUnfoldOutlined />
) : (
<>
<MenuFoldOutlined style={{ marginRight: 8 }} />
<span style={{ fontSize: 13 }}></span>
</>
)}
</div>
</Sider>
<Content style={{ padding: 0, overflow: 'auto' }}>
<Outlet />
</Content>
</Layout>
</Layout>
);
};