4. 前端路由与页面布局:多级路由设计、左侧导航栏、顶部状态栏、内容区域布局

在自助容量压测作业平台中,前端架构的稳定性与可扩展性直接影响用户体验与后续迭代效率。本章聚焦于前端路由体系与页面布局的工程化设计,涵盖多级路由的嵌套策略、左侧导航栏的菜单结构、顶部状态栏的信息承载以及内容区域的弹性布局方案。

4.1 多级路由设计

压测平台的功能模块具有明显的层级关系:一级模块(如压测任务、数据管理、系统设置)下包含二级子模块(如任务列表、任务详情、任务报告),部分子模块还需进一步细分(如报告中的实时指标与历史趋势)。因此,采用 嵌套路由(Nested Routes) 是合理的选择。

路由层级 路径示例 对应组件 说明
一级 /tasks TaskLayout 任务模块的布局容器,包含子路由出口
二级 /tasks/list TaskList 任务列表页,展示所有压测任务
二级 /tasks/create TaskCreate 新建压测任务表单页
三级 /tasks/:id/detail TaskDetail 单个任务的详细配置与状态
三级 /tasks/:id/report TaskReport 任务压测报告,含实时图表
四级 /tasks/:id/report/metrics MetricsPanel 实时指标面板,每秒刷新
路由设计原则: 每个层级的路由组件只负责该层级的布局与公共逻辑,具体页面内容由子路由组件填充。例如 TaskLayout 只包含返回按钮与面包屑导航,不包含任务列表的业务逻辑。

4.2 左侧导航栏

左侧导航栏采用 可折叠的树形菜单,支持多级展开与收起。导航数据由路由配置自动生成,避免手动维护两份菜单数据。

  • 一级菜单: 压测任务、数据管理、监控告警、系统设置。
  • 二级菜单: 压测任务下包含任务列表、新建任务、任务模板;数据管理下包含数据源配置、数据集管理。
  • 三级菜单: 任务列表中的每个任务可展开查看详情、报告、日志。
  • 高亮规则: 当前路由匹配时,自动高亮对应的菜单项及其所有父级菜单。
  • 折叠状态: 用户可手动折叠导航栏,折叠后只显示图标,鼠标悬停时展开子菜单。
实现要点: 使用 react-router-dom 的 useLocation 监听路由变化,结合递归组件渲染树形菜单。菜单数据源建议使用 route.config.ts 统一管理,保持路由与菜单的单一数据源。

4.3 顶部状态栏

顶部状态栏固定于页面顶部,承载全局状态信息与操作入口,不随内容区域滚动。

区域 内容 说明
左侧 平台 Logo + 项目名称 点击可跳转至首页
中间 全局搜索框 支持搜索任务名称、数据源、用户
右侧 通知中心、当前用户头像、退出登录 通知中心显示未读消息数量
扩展区 当前压测环境标识(开发/测试/生产) 颜色区分,防止误操作
注意: 顶部状态栏的高度应固定为 56px 或 64px,与左侧导航栏的顶部对齐。状态栏的 z-index 需高于内容区域,避免被页面元素遮挡。

4.4 内容区域布局

内容区域采用 弹性布局(Flexbox),左侧导航栏固定宽度(默认 240px,折叠后 64px),右侧内容区域自动填充剩余宽度。内容区域内部可进一步划分为:

  • 面包屑导航: 位于内容区域顶部,显示当前页面路径,支持快速跳转。
  • 页面标题与操作栏: 显示当前页面名称,右侧放置新增、刷新、导出等操作按钮。
  • 主内容区: 根据路由渲染对应的页面组件,支持表格、表单、图表、日志流等。
  • 底部状态条(可选): 显示当前页面的数据加载状态、最后更新时间、分页信息等。
// 布局组件示例(React + TypeScript)
const MainLayout: React.FC = () => {
  return (
    <div className="main-layout">
      <Sidebar />
      <div className="content-wrapper">
        <TopBar />
        <div className="content-body">
          <Breadcrumb />
          <PageHeader />
          <Outlet />  {/* 子路由渲染位置 */}
          <StatusBar />
        </div>
      </div>
    </div>
  );
};

4.5 整体布局架构图

下图展示了压测作业平台的前端页面布局结构,包含左侧导航栏、顶部状态栏、内容区域三大部分,以及内容区域内部的细分区域。

压测作业平台前端布局架构图 顶部状态栏 Logo | 全局搜索 | 通知中心 | 用户头像 | 环境标识 左侧导航栏 ▶ 压测任务 任务列表 新建任务 任务模板 ▶ 数据管理 数据源配置 数据集管理 ▶ 监控告警 ▶ 系统设置 首页 > 压测任务 > 任务详情 任务详情 [编辑] [刷新] [导出] 主内容区(子路由渲染) 表格 / 表单 / 图表 / 日志流 数据加载完成 | 最后更新: 2025-01-15 14:32:08 | 共 23 条记录

4.6 路由与布局的联动机制

路由配置与布局组件通过 嵌套路由出口(Outlet) 实现联动。每个层级的路由组件都可以定义自己的布局,子路由的页面内容在父布局的 <Outlet /> 位置渲染。

联动流程:
1. 用户点击左侧导航栏的“任务列表”菜单项。
2. 路由跳转到 /tasks/list。
3. TaskLayout 组件渲染,包含面包屑与页面标题。
4. TaskLayout 内部的 <Outlet /> 渲染 TaskList 组件。
5. 导航栏根据当前路由 /tasks/list 自动高亮“压测任务 > 任务列表”。

4.7 响应式与折叠策略

视口宽度 导航栏状态 内容区域宽度 说明
>= 1200px 展开(240px) 剩余宽度 标准桌面布局
768px ~ 1199px 折叠(64px) 剩余宽度 节省空间,鼠标悬停展开子菜单
< 768px 隐藏(0px) 100% 移动端,通过汉堡菜单呼出导航
建议: 折叠状态下的导航栏应保留图标,并在图标右下角显示未读消息或任务状态的小红点。隐藏状态下,导航栏以抽屉(Drawer)形式从左侧滑出。

4.8 路由守卫与权限控制

压测平台涉及多角色权限(管理员、测试工程师、只读观察者),路由层面需实现 权限守卫。在路由配置中为每个页面定义 requiredRoles 字段,路由跳转前检查当前用户角色是否匹配。

// 路由守卫示例
const ProtectedRoute: React.FC<{ roles: string[] }> = ({ roles, children }) => {
  const { user } = useAuth();
  
  if (!user) {
    return <Navigate to="/login" replace />;
  }
  
  if (!roles.includes(user.role)) {
    return <Navigate to="/403" replace />;
  }
  
  return <>{children}</>;
};

// 路由配置中使用
{
  path: '/tasks/report',
  element: (
    <ProtectedRoute roles={['admin', 'engineer']}>
      <TaskReport />
    </ProtectedRoute>
  )
}

4.9 布局性能优化

  • 懒加载: 每个页面组件使用 React.lazy() 动态导入,减少首屏加载体积。
  • 缓存布局: 导航栏与顶部状态栏使用 React.memo 包裹,避免因内容区域更新而重新渲染。
  • 路由预加载: 用户鼠标悬停在导航菜单项时,预加载对应页面的 JS 资源。
  • 骨架屏: 内容区域在页面加载时显示骨架屏,提升感知性能。
避坑提示: 不要在布局组件中直接发起数据请求。布局组件应保持纯净,只负责结构渲染;数据请求应下放到具体的页面组件中,避免布局重新渲染时重复请求。