267 lines
6.4 KiB
TypeScript
267 lines
6.4 KiB
TypeScript
'use client';
|
|
|
|
import { useState, useEffect } from 'react';
|
|
import { useRouter, usePathname } from 'next/navigation';
|
|
import { LeftSidebar } from './components/LeftSidebar';
|
|
import { MainContent } from './components/MainContent';
|
|
import { cn } from '@/lib/utils';
|
|
|
|
// 菜单项数据结构定义
|
|
interface NavItem {
|
|
title: string;
|
|
url: string;
|
|
icon: string;
|
|
items?: {
|
|
title: string;
|
|
url: string;
|
|
isActive?: boolean;
|
|
}[];
|
|
}
|
|
|
|
interface SideBarData {
|
|
navMain: NavItem[];
|
|
}
|
|
|
|
|
|
interface SideBarOldProps {
|
|
children: React.ReactNode;
|
|
activePath?: string;
|
|
onNavigate?: (path: string) => void;
|
|
data?: SideBarData;
|
|
}
|
|
|
|
const defaultSideBarData: SideBarData = {
|
|
navMain: [
|
|
{
|
|
title: "租户管理",
|
|
url: "/central-config/tenant",
|
|
icon: "🏢",
|
|
items: [
|
|
{
|
|
title: "企业审核",
|
|
url: "/central-config/tenant/enterprise-audit",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "审核历史",
|
|
url: "/central-config/tenant/audit-history",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "企业信息",
|
|
url: "/central-config/tenant/enterprise-info",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "用户管理",
|
|
url: "/central-config/tenant/user-management",
|
|
isActive: false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
title: "用户管理",
|
|
url: "/central-config/user",
|
|
icon: "👥",
|
|
items: [
|
|
{
|
|
title: "员工管理",
|
|
url: "/central-config/user/employee",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "角色管理",
|
|
url: "/central-config/user/role",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "菜单管理",
|
|
url: "/central-config/user/menu",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "权限配置管理",
|
|
url: "/central-config/user/permission",
|
|
isActive: false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
title: "系统参数",
|
|
url: "/central-config/system",
|
|
icon: "🔧",
|
|
items: [
|
|
{
|
|
title: "系统设置",
|
|
url: "/central-config/system/settings",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "分类字典",
|
|
url: "/central-config/system/category",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "数据字典",
|
|
url: "/central-config/system/dictionary",
|
|
isActive: false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
title: "系统监控",
|
|
url: "/central-config/monitor",
|
|
icon: "📈",
|
|
items: [
|
|
{
|
|
title: "登录日志",
|
|
url: "/central-config/monitor/login-log",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "操作日志",
|
|
url: "/central-config/monitor/operation-log",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "性能监控",
|
|
url: "/central-config/monitor/performance",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "网络日志",
|
|
url: "/central-config/monitor/network-log",
|
|
isActive: false
|
|
}
|
|
]
|
|
},
|
|
{
|
|
title: "消息中心",
|
|
url: "/central-config/message",
|
|
icon: "📨",
|
|
items: [
|
|
{
|
|
title: "消息发送",
|
|
url: "/central-config/message/send",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "消息模版",
|
|
url: "/central-config/message/template",
|
|
isActive: false
|
|
},
|
|
{
|
|
title: "消息日志",
|
|
url: "/central-config/message/log",
|
|
isActive: false
|
|
}
|
|
]
|
|
}
|
|
]
|
|
};
|
|
|
|
|
|
export function SideBarOld({
|
|
children,
|
|
activePath,
|
|
onNavigate,
|
|
data
|
|
}: SideBarOldProps) {
|
|
const router = useRouter();
|
|
const pathname = usePathname();
|
|
const [isMobile, setIsMobile] = useState(false);
|
|
const [isCollapsed, setIsCollapsed] = useState(false);
|
|
const [currentPath, setCurrentPath] = useState(pathname || activePath || '/machinery/list');
|
|
|
|
// 使用传入的数据或默认数据
|
|
const sidebarData = data || defaultSideBarData;
|
|
|
|
// 转换为 MenuItem 格式以兼容 LeftSidebar 组件
|
|
const menus = sidebarData.navMain.map(item => ({
|
|
id: item.url.replace(/\/[^\/]+/g, '').replace('/', '') || item.title.replace(/\s+/g, '-').toLowerCase(),
|
|
label: item.title,
|
|
icon: item.icon,
|
|
children: item.items?.map(child => ({
|
|
id: child.url.split('/').pop() || child.title.replace(/\s+/g, '-').toLowerCase(),
|
|
label: child.title,
|
|
path: child.url,
|
|
})),
|
|
}));
|
|
|
|
// 检测是否为移动设备
|
|
useEffect(() => {
|
|
const checkIsMobile = () => {
|
|
setIsMobile(window.innerWidth < 768);
|
|
};
|
|
|
|
checkIsMobile();
|
|
window.addEventListener('resize', checkIsMobile);
|
|
return () => window.removeEventListener('resize', checkIsMobile);
|
|
}, []);
|
|
|
|
// 监听路由变化,同步当前路径
|
|
useEffect(() => {
|
|
if (pathname) {
|
|
setCurrentPath(pathname);
|
|
}
|
|
}, [pathname]);
|
|
|
|
// 移动端时自动展开侧边栏
|
|
useEffect(() => {
|
|
if (isMobile) {
|
|
setIsCollapsed(false);
|
|
}
|
|
}, [isMobile]);
|
|
|
|
const handleNavigate = (path: string) => {
|
|
setCurrentPath(path);
|
|
onNavigate?.(path);
|
|
// 使用 Next.js 标准路由跳转
|
|
router.push(path);
|
|
};
|
|
return (
|
|
<div className={cn(
|
|
"flex h-full bg-background",
|
|
"min-h-screen"
|
|
)}>
|
|
{/* 左侧导航栏 - 独立滚动 */}
|
|
{!isMobile && (
|
|
<div className="sidebarScroll">
|
|
<LeftSidebar
|
|
menus={menus}
|
|
activePath={currentPath}
|
|
onNavigate={handleNavigate}
|
|
isMobile={isMobile}
|
|
isCollapsed={isCollapsed}
|
|
onToggleCollapse={() => setIsCollapsed(!isCollapsed)}
|
|
/>
|
|
</div>
|
|
)}
|
|
|
|
{/* 右侧主内容 - 独立滚动 */}
|
|
<div className="flex-1 contentScroll">
|
|
<MainContent
|
|
isMobile={isMobile}
|
|
sidebarOpen={!isCollapsed}
|
|
onToggleSidebar={() => setIsCollapsed(!isCollapsed)}
|
|
>
|
|
{children}
|
|
</MainContent>
|
|
</div>
|
|
|
|
{/* 移动端侧边栏 */}
|
|
{isMobile && (
|
|
<div className="fixed inset-y-0 left-0 z-50 w-64 sidebarScroll">
|
|
<LeftSidebar
|
|
menus={menus}
|
|
activePath={currentPath}
|
|
onNavigate={handleNavigate}
|
|
isMobile={isMobile}
|
|
isCollapsed={false}
|
|
onToggleCollapse={() => {}}
|
|
/>
|
|
</div>
|
|
)}
|
|
</div>
|
|
);
|
|
} |