blob: 1aa6f8d1ca0838dd0804732c98399a243412d5f5 [file] [log] [blame]
import React from "react";
import { Layout, Menu, Avatar, Dropdown } from "antd";
import {
UserOutlined,
LogoutOutlined,
HomeOutlined,
AppstoreOutlined,
SettingOutlined,
CommentOutlined,
CloudDownloadOutlined,
UploadOutlined,
} from "@ant-design/icons";
import { useNavigate, Link, useLocation } from "react-router-dom";
import { useAuth } from "../features/auth/contexts/AuthContext";
const { Header, Content, Footer } = Layout;
// 路径与菜单key的映射
const pathToMenuKey = {
"/": "1",
"/forum": "2",
"/pt": "3",
"/torrents": "4",
"/upload": "5",
"/tools": "6",
"/admin": "7",
"/profile": "profile",
};
const MainLayout = ({ children }) => {
const { user, logout, hasRole } = useAuth();
const location = useLocation();
// 根据当前路径获取对应的菜单key
const getSelectedKey = () => {
const path = location.pathname;
return pathToMenuKey[path] || "1"; // 默认选中首页
};
const handleLogout = async () => {
await logout(); // logout 函数内已有消息提示和导航逻辑
};
// 用户菜单项
const userMenuItems = [
{
key: "profile",
icon: <UserOutlined />,
label: <Link to="/profile">个人资料</Link>,
},
{
type: "divider",
},
{
key: "logout",
icon: <LogoutOutlined />,
label: "退出登录",
onClick: handleLogout,
},
];
// 主导航菜单项
const menuItems = [
{
key: "1",
icon: <HomeOutlined />,
label: <Link to="/">首页</Link>,
},
{
key: "2",
icon: <CommentOutlined />,
label: <Link to="/forum">论坛</Link>,
},
{
key: "3",
icon: <CloudDownloadOutlined />,
label: <Link to="/pt">PT</Link>,
},
{
key: "4",
icon: <AppstoreOutlined />,
label: <Link to="/torrents">种子列表</Link>,
},
{
key: "5",
icon: <UploadOutlined />,
label: <Link to="/upload">发布种子</Link>,
}
];
// 如果用户是管理员,添加管理面板菜单项
if (hasRole("admin")) {
menuItems.push({
key: "7",
icon: <SettingOutlined />,
label: <Link to="/admin">管理面板</Link>,
});
}
return (
<Layout className="min-h-screen">
<Header className="flex items-center justify-between px-6">
<div className="text-white text-xl font-bold">PT网站</div>
<Menu
theme="dark"
mode="horizontal"
selectedKeys={[getSelectedKey()]}
className="flex-1 justify-center"
style={{ maxWidth: "800px" }}
overflowedIndicator={null}
items={menuItems}
/>
<div>
<Dropdown menu={{ items: userMenuItems }} placement="bottomRight">
<span className="flex items-center cursor-pointer text-white">
<Avatar src={user?.avatar} icon={<UserOutlined />} />
<span className="ml-2">{user?.username || "用户"}</span>
{/* <span className="ml-1 text-xs opacity-80">
({user?.role || "游客"})
</span> */}
</span>
</Dropdown>
</div>
</Header>
<Content className="p-6">
<div className="bg-white p-6 min-h-[280px] rounded">{children}</div>
</Content>
<Footer style={{ textAlign: "center" }}>
PT网站 ©{new Date().getFullYear()} Created by G12-Team
</Footer>
</Layout>
);
};
export default MainLayout;