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 整体布局架构图
下图展示了压测作业平台的前端页面布局结构,包含左侧导航栏、顶部状态栏、内容区域三大部分,以及内容区域内部的细分区域。
4.6 路由与布局的联动机制
路由配置与布局组件通过 嵌套路由出口(Outlet) 实现联动。每个层级的路由组件都可以定义自己的布局,子路由的页面内容在父布局的 <Outlet /> 位置渲染。
联动流程:
1. 用户点击左侧导航栏的“任务列表”菜单项。
2. 路由跳转到
3.
4.
5. 导航栏根据当前路由
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 资源。
- 骨架屏: 内容区域在页面加载时显示骨架屏,提升感知性能。
避坑提示: 不要在布局组件中直接发起数据请求。布局组件应保持纯净,只负责结构渲染;数据请求应下放到具体的页面组件中,避免布局重新渲染时重复请求。