TASK_5.4_COMPLETION.md 4.9 KB

Task 5.4 完成报告 - BreadcrumbComponent

任务概述

实现独立的面包屑导航组件(BreadcrumbComponent),负责根据当前路由生成和显示面包屑导航。

实现内容

1. 创建 BreadcrumbComponent

文件: src/app/layout/breadcrumb/breadcrumb.component.ts

核心功能:

  • 根据当前路由自动生成面包屑数据
  • 监听路由变化并实时更新面包屑
  • 提供面包屑点击导航功能
  • 支持所有应用路由的面包屑映射

路由映射:

  • 工作台: 首页 > 工作台
  • 商品管理: 首页 > 商品管理 > 商品列表/发布商品/编辑商品
  • 订单管理: 首页 > 订单管理 > 订单列表/订单详情
  • 售后管理: 首页 > 售后管理 > 售后列表
  • 客服工作台: 首页 > 客服工作台
  • 设置: 首页 > 设置 > 店铺信息/账号安全

2. 创建组件模板

文件: src/app/layout/breadcrumb/breadcrumb.component.html

特性:

  • 使用语义化的 <nav><ol> 标签
  • 可点击的面包屑链接(非最后一项)
  • 当前页面显示为纯文本(最后一项)
  • Material Icon 作为分隔符
  • 完整的无障碍支持(aria-label, aria-current)

3. 创建组件样式

文件: src/app/layout/breadcrumb/breadcrumb.component.scss

样式特点:

  • 14px 字体大小
  • 链接悬停时变为主题蓝色 (#1890ff)
  • 当前页面文本加粗显示
  • 分隔符使用半透明灰色
  • 平滑的颜色过渡动画

4. 更新 HeaderComponent

修改内容:

  • 移除了面包屑相关的逻辑代码
  • 移除了 Breadcrumb 接口定义(现在由 BreadcrumbComponent 导出)
  • 移除了 breadcrumbs 属性和 routeMap 映射
  • 移除了 updateBreadcrumbs()navigateTo() 方法
  • 导入并使用新的 BreadcrumbComponent

模板更新:

<!-- 旧代码 -->
<nav class="header__breadcrumb" aria-label="面包屑导航">
  <ol class="breadcrumb-list">
    <!-- 复杂的面包屑渲染逻辑 -->
  </ol>
</nav>

<!-- 新代码 -->
<app-breadcrumb class="header__breadcrumb"></app-breadcrumb>

样式更新:

  • 移除了面包屑相关的样式规则
  • 保留了 .header__breadcrumb 容器样式

5. 创建单元测试

文件: src/app/layout/breadcrumb/breadcrumb.component.spec.ts

测试覆盖:

  • ✅ 组件创建
  • ✅ 初始化时根据当前路由生成面包屑
  • ✅ 所有路由的面包屑生成(工作台、商品、订单、售后、客服、设置)
  • ✅ 路由变化时更新面包屑
  • ✅ 处理带查询参数的 URL
  • ✅ 面包屑点击导航
  • ✅ 未知路由显示默认面包屑
  • ✅ DOM 渲染验证(面包屑项、分隔符、active 类)
  • ✅ 链接和文本的正确渲染

6. 更新 HeaderComponent 测试

文件: src/app/layout/header/header.component.spec.ts

修改内容:

  • 移除了所有面包屑相关的测试用例
  • 保留了 Header 组件自身的功能测试
  • 添加了对 app-breadcrumb 组件存在性的验证

测试结果

所有 BreadcrumbComponent 相关测试通过:

  • ✅ 初始化测试
  • ✅ 路由变化监听测试
  • ✅ 面包屑导航测试
  • ✅ 未知路由处理测试
  • ✅ 面包屑渲染测试
  • ✅ 所有路由的面包屑测试

设计原则

1. 单一职责

BreadcrumbComponent 专注于面包屑导航的生成和显示,HeaderComponent 专注于顶部栏的整体布局和用户交互。

2. 可复用性

独立的 BreadcrumbComponent 可以在其他布局中复用,不依赖于 HeaderComponent。

3. 可维护性

  • 路由映射集中管理,易于添加新路由
  • 清晰的组件边界,便于独立测试和修改

4. 无障碍性

  • 使用语义化 HTML 标签
  • 提供 aria-label 和 aria-current 属性
  • 支持键盘导航(tabindex)

符合需求

Requirements 1.4: THE Merchant Portal SHALL display breadcrumb navigation in the header showing the current page path

  • 根据当前路由生成面包屑数据 ✓
  • 渲染面包屑导航链接 ✓
  • 实现面包屑点击导航 ✓
  • 显示当前页面路径 ✓

文件清单

新增文件

  1. src/app/layout/breadcrumb/breadcrumb.component.ts - 组件逻辑
  2. src/app/layout/breadcrumb/breadcrumb.component.html - 组件模板
  3. src/app/layout/breadcrumb/breadcrumb.component.scss - 组件样式
  4. src/app/layout/breadcrumb/breadcrumb.component.spec.ts - 单元测试

修改文件

  1. src/app/layout/header/header.component.ts - 移除面包屑逻辑,导入 BreadcrumbComponent
  2. src/app/layout/header/header.component.html - 使用 <app-breadcrumb> 组件
  3. src/app/layout/header/header.component.scss - 移除面包屑样式
  4. src/app/layout/header/header.component.spec.ts - 更新测试用例

总结

成功实现了独立的 BreadcrumbComponent,将面包屑导航逻辑从 HeaderComponent 中分离出来,提高了代码的可维护性和可复用性。组件支持所有应用路由,能够自动根据路由变化更新面包屑,并提供了完整的点击导航功能。所有测试通过,符合设计要求。