Files

3.0 KiB

在 /home/enzo/projects/hive-manage-v3/frontend/src/components/layout/ 下创建布局组件,并在 App.tsx 中集成路由框架。

组件 1: Sidebar.tsx

导航项结构(参考原型):

  • 蜂群态势: 📊 蜂群总览, 📡 Gateway, 🏥 健康分, 🤖 工蜂列表
  • 任务编排: 📋 看板追踪, ⏰ Cron, 🔔 事件管理
  • 通信频道: 📶 频道配置
  • 运维工具: 🔑 密钥, 📁 文件, 💻 终端, 📜 日志, 🔌 MCP接入, 📤 MCP对外
  • 知识库管理: 📚 事件档案
  • 系统: ⚙ 设置

Props: activePath, onNavigate(path:string)

  • 宽度 220px, bg=var(--bg-nav), 右侧 border
  • 顶部 Logo 48px: "🐝 知微蜂巢"
  • Section 标题 11px uppercase text-muted
  • NavItem: 默认 text-dim, hover bg-hover, active honey-glow + honey 文字 + 600 weight
  • Badge: 红色(失败计数)

组件 2: Header.tsx

Props: breadcrumb, onlineCount, runningCount, onSearch, theme, onToggleTheme

  • 高度 48px, bg=var(--bg-nav), 底部 border
  • 左侧: Logo + 面包屑
  • 中间: 搜索框 260px, bg=var(--bg-card)
  • 右侧: 在线数/运行中 标签 + 主题切换按钮(🌙/☀️) + 用户头像
  • useTheme hook: 读取 localStorage 'hive-theme', 默认跟随系统 prefers-color-scheme

组件 3/4: MobileNav.tsx + TabBar.tsx

MobileNav: 汉堡菜单 → 左侧抽屉 280px 滑入 + 遮罩 TabBar: 底部固定 56px, 4项(📊总览/📡Gateway/📋Kanban/⏰Cron)等宽分布, 激活态 honey

组件 5: AppLayout.tsx

桌面: CSS Grid (sidebar 220px + header 48px + main) 平板: sidebar 180px 移动 (<768px): 顶部 Header + TabBar + 汉堡抽屉 使用 useTheme hook 管理 data-theme 属性

App.tsx 更新

集成 react-router-dom:

  • / → 重定向到 /dashboard
  • /dashboard → DashboardPage
  • /gateway → GatewayPage
  • /health → HealthPage
  • /kanban → KanbanPage
  • /cron → CronPage
  • /keys → KeysPage
  • /events → EventArchivePage
  • /users → UserManagementPage
  • /audit → AuditLogPage
  • /login → LoginPage
  • 其余 → 404

路由配置用懒加载 React.lazy + Suspense(Skeleton)。

useTheme hook

// hooks/useTheme.ts
import { useState, useEffect } from 'react'

type Theme = 'dark' | 'light' | 'system'

export function useTheme() {
  const [theme, setTheme] = useState<Theme>(() => {
    return (localStorage.getItem('hive-theme') as Theme) || 'system'
  })

  useEffect(() => {
    const root = document.documentElement
    if (theme === 'system') {
      const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
      root.setAttribute('data-theme', prefersDark ? 'dark' : 'light')
    } else {
      root.setAttribute('data-theme', theme)
    }
    localStorage.setItem('hive-theme', theme)
  }, [theme])

  const toggle = () => setTheme(t => t === 'dark' ? 'light' : 'dark')
  return { theme, setTheme, toggle }
}

创建完成后提交:

cd /home/enzo/projects/hive-manage-v3 && git add frontend/src/components/layout/ frontend/src/App.tsx frontend/src/hooks/ && git commit -m "feat: layout components (Sidebar, Header, MobileNav, TabBar, AppLayout) with routing"