Files
SunCheng 32d5ed62d0
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 16s
Docker Build & Deploy / Deploy to Production (push) Successful in 6s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 1s
Docker Build & Deploy / WeChat Notification (push) Successful in 1s
fix
2026-02-20 14:57:19 +08:00

5.3 KiB
Raw Blame History

ADDED Requirements

Requirement: PopupContainer 组件导入路径迁移

所有引用 PopupContainer.vue 的文件必须更新导入路径为 PopupContainerV2.vue,并将组件名更改为 PopupContainerV2

Scenario: 更新 import 语句

  • WHEN 文件中存在 import PopupContainer from '@/components/PopupContainer.vue'import PopupContainer from './PopupContainer.vue'
  • THEN 系统必须将其替换为 import PopupContainerV2 from '@/components/PopupContainerV2.vue'

Scenario: 更新模板中的组件名

  • WHEN 模板中使用 <PopupContainer> 标签
  • THEN 系统必须将其替换为 <PopupContainerV2>

Requirement: Props API 映射转换

V1 和 V2 的 props 差异必须通过重构适配,确保功能等价。

Scenario: 基础 props 映射

  • WHEN V1 使用 v-model:showtitle 等基础 props
  • THEN V2 必须保留这些 props 不变(modelValuetitle 在两个版本中一致)

Scenario: height prop 默认值处理

  • WHEN V1 未显式指定 height prop默认 80%
  • THEN V2 必须显式添加 :height="'80%'" 以保持一致的视觉效果

Scenario: 移除不支持的 props

  • WHEN V1 使用 closeablesubtitleshowConfirmButtonshowCancelButtonconfirmTextcancelText 等 props
  • THEN 系统必须移除这些 props并通过插槽方式重构见下一需求

Requirement: subtitle 功能迁移

V1 的 subtitle prop 必须转换为 V2 的默认插槽内容或自定义标题结构。

Scenario: subtitle 作为内容区域展示

  • WHEN V1 使用 subtitle prop 显示副标题
  • THEN 必须将 subtitle 内容移至 <PopupContainerV2> 的默认插槽中,并使用适当的样式包裹(如 <p class="subtitle-text">{{ subtitle }}</p>

Scenario: subtitle 包含 HTML 内容

  • WHEN V1 的 subtitle 使用 v-html 渲染(如统计信息)
  • THEN 必须在默认插槽中创建等价的 HTML 结构,保持语义和样式一致

Requirement: 确认/取消按钮迁移

V1 的 showConfirmButtonshowCancelButton 等按钮相关 props 必须转换为 V2 的 footer 插槽。

Scenario: 标准确认/取消按钮

  • WHEN V1 使用 show-confirm-buttonshow-cancel-button props
  • THEN 必须在 V2 的 <template #footer> 中手动创建 <van-button> 组件,绑定相同的事件处理器(@confirm@cancel

Scenario: 自定义按钮文本

  • WHEN V1 使用 confirm-textcancel-text 自定义按钮文字
  • THEN 必须将文本内容应用到 footer 插槽中的按钮组件

Scenario: 按钮布局样式

  • WHEN 创建 footer 插槽内的按钮
  • THEN 必须使用 flexbox 布局确保按钮水平排列,间距为 12px与 V1 的视觉效果一致

Requirement: header-actions 插槽迁移

V1 的 header-actions 插槽必须根据业务逻辑转换为 V2 的内容区域或自定义实现。

Scenario: 移除 header-actions 插槽

  • WHEN V1 使用 <template #header-actions> 插槽放置操作按钮
  • THEN V2 必须将这些按钮移至默认插槽顶部或 footer 插槽中,根据业务语义选择合适位置

Scenario: 保持操作按钮的视觉层级

  • WHEN V1 的 header-actions 与标题同行显示grid 布局)
  • THEN 必须在 V2 的默认插槽中创建自定义布局,使用绝对定位或 flexbox 实现相同效果

Requirement: 样式和暗色模式兼容性

迁移后的组件必须保持视觉一致性,正确响应暗色模式。

Scenario: 暗色模式自动适配

  • WHEN 用户切换到暗色模式
  • THEN V2 的硬编码颜色(#ffffff#09090b 等)必须通过 @media (prefers-color-scheme: dark) 自动切换

Scenario: 内容区域 padding 处理

  • WHEN V1 的可滚动内容区域有默认样式
  • THEN V2 的内容插槽无默认 padding必须由使用方手动添加<div class="content" style="padding: 16px">

Requirement: 事件处理器兼容性

V1 的事件(@confirm@cancel)必须正确映射到 V2 的按钮点击事件。

Scenario: 确认事件触发

  • WHEN 用户点击 footer 插槽中的确认按钮
  • THEN 必须手动触发原有的 @confirm 事件处理逻辑(可能需要通过 emit 或直接调用方法)

Scenario: 取消事件触发

  • WHEN 用户点击取消按钮或关闭弹窗
  • THEN 必须确保原有的 @cancel 逻辑被正确执行V2 已通过关闭按钮自动关闭弹窗,但可能需要额外的清理逻辑)

Requirement: 代码质量和测试

迁移后的代码必须通过 ESLint 检查,并保持功能正确性。

Scenario: ESLint 验证通过

  • WHEN 完成迁移后
  • THEN 运行 pnpm lint 必须无错误和警告

Scenario: 功能回归测试

  • WHEN 迁移后的页面加载
  • THEN 弹窗的打开/关闭、内容展示、按钮交互必须与迁移前行为一致

Requirement: 删除旧版本组件

所有迁移完成后,必须删除 PopupContainer.vue 文件以避免混淆。

Scenario: 文件删除

  • WHEN 所有 18 个文件迁移完成并验证通过
  • THEN 系统必须删除 Web/src/components/PopupContainer.vue 文件

Scenario: 无残留引用

  • WHEN 删除旧组件后
  • THEN 项目中不得存在任何对 PopupContainer.vue 的引用(通过全局搜索验证)