From 9eb712cc44bb7467f83e912af913898b3f81bb9d Mon Sep 17 00:00:00 2001 From: SunCheng Date: Thu, 19 Feb 2026 21:54:33 +0800 Subject: [PATCH] chore: add openspec artifacts for unify-bill-list-ui change --- .../changes/unify-bill-list-ui/.openspec.yaml | 2 + .../specs/bill-list-unified-ui/spec.md | 114 ++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 openspec/changes/unify-bill-list-ui/.openspec.yaml create mode 100644 openspec/changes/unify-bill-list-ui/specs/bill-list-unified-ui/spec.md diff --git a/openspec/changes/unify-bill-list-ui/.openspec.yaml b/openspec/changes/unify-bill-list-ui/.openspec.yaml new file mode 100644 index 0000000..d299748 --- /dev/null +++ b/openspec/changes/unify-bill-list-ui/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-19 diff --git a/openspec/changes/unify-bill-list-ui/specs/bill-list-unified-ui/spec.md b/openspec/changes/unify-bill-list-ui/specs/bill-list-unified-ui/spec.md new file mode 100644 index 0000000..69a323f --- /dev/null +++ b/openspec/changes/unify-bill-list-ui/specs/bill-list-unified-ui/spec.md @@ -0,0 +1,114 @@ +## ADDED Requirements + +### Requirement: Unified Bill List Component Usage +所有账单列表页面 SHALL 使用 `BillListComponent` 组件来展示账单列表,而不是自定义实现。 + +#### Scenario: Component Imported and Used +- **WHEN** 开发者查看任意账单列表页面的代码 +- **THEN** 页面 SHALL import `BillListComponent` from `@/components/Bill/BillListComponent.vue` +- **AND** 页面 SHALL 在 template 中使用 `` 标签 + +#### Scenario: No Custom List Rendering +- **WHEN** 开发者查看账单列表页面的代码 +- **THEN** 页面 SHALL NOT 包含自定义的 `van-swipe-cell` 列表渲染逻辑 +- **AND** 页面 SHALL NOT 包含重复的账单卡片样式定义 + +### Requirement: Custom Data Source Mode +账单列表页面 SHALL 使用 Custom 数据模式,父组件控制数据加载逻辑。 + +#### Scenario: Data Source Configuration +- **WHEN** 页面使用 `BillListComponent` +- **THEN** 组件 SHALL 配置 `data-source="custom"` prop +- **AND** 父组件 SHALL 通过 `:transactions` prop 传递账单数据数组 + +#### Scenario: Parent Controlled Loading +- **WHEN** 页面需要加载账单数据 +- **THEN** 父组件 SHALL 负责调用 API 获取数据 +- **AND** 父组件 SHALL 负责数据筛选和分页逻辑 +- **AND** `BillListComponent` SHALL 仅负责展示传入的数据 + +### Requirement: Business Logic Preservation +迁移后的页面 SHALL 保持原有的业务逻辑完整,包括事件处理、数据刷新和特定筛选。 + +#### Scenario: Click Event Handling +- **WHEN** 用户点击账单卡片 +- **THEN** `BillListComponent` SHALL emit `@click` 事件 +- **AND** 父组件 SHALL 处理该事件,执行原有的业务逻辑(如显示详情弹窗) + +#### Scenario: Delete Event Handling +- **WHEN** 用户左滑删除账单 +- **THEN** `BillListComponent` SHALL emit `@delete` 事件(内部已完成 API 调用) +- **AND** 父组件 SHALL 更新本地数据列表,移除已删除的账单 + +#### Scenario: Global Event Listening +- **WHEN** 页面监听全局事件(如 `transaction-deleted`) +- **THEN** 迁移后页面 SHALL 保留所有全局事件监听器 +- **AND** 事件处理逻辑 SHALL 保持不变 + +### Requirement: Feature Configuration +页面 SHALL 通过 props 配置 `BillListComponent` 的功能开关,仅启用所需功能。 + +#### Scenario: Filter Bar Control +- **WHEN** 页面不需要筛选栏功能 +- **THEN** 页面 SHALL 设置 `:enable-filter="false"` prop +- **AND** `BillListComponent` SHALL NOT 显示筛选栏 UI + +#### Scenario: Checkbox Control +- **WHEN** 页面不需要多选功能 +- **THEN** 页面 SHALL 设置 `:show-checkbox="false"` prop +- **AND** `BillListComponent` SHALL NOT 显示复选框 + +#### Scenario: Delete Button Control +- **WHEN** 页面需要左滑删除功能 +- **THEN** 页面 SHALL 设置 `:show-delete="true"` prop +- **AND** `BillListComponent` SHALL 显示左滑删除按钮 + +### Requirement: Visual Consistency +所有账单列表页面 SHALL 使用一致的视觉设计和交互模式。 + +#### Scenario: Card Layout Consistency +- **WHEN** 用户查看任意账单列表页面 +- **THEN** 所有账单卡片 SHALL 使用相同的布局:左侧图标、中间内容、右侧金额 +- **AND** 卡片样式 SHALL 与 `/balance` 页面一致 + +#### Scenario: Icon Display Consistency +- **WHEN** 账单有分类信息 +- **THEN** 系统 SHALL 显示对应的 Iconify 图标或降级为 Vant 图标 +- **AND** 图标颜色和背景 SHALL 根据账单类型(支出/收入/不计入)统一着色 + +#### Scenario: Amount Formatting Consistency +- **WHEN** 系统显示账单金额 +- **THEN** 支出 SHALL 显示为红色 `- ¥XX.XX` +- **AND** 收入 SHALL 显示为绿色 `+ ¥XX.XX` +- **AND** 不计入 SHALL 显示为灰色 `¥XX.XX` + +### Requirement: Migration Coverage +系统 SHALL 完成所有指定页面的账单列表迁移。 + +#### Scenario: All Target Pages Migrated +- **WHEN** 迁移完成 +- **THEN** 以下 6 个页面 SHALL 全部使用 `BillListComponent`: + - `MessageView.vue` + - `EmailRecord.vue` + - `PeriodicRecord.vue` + - `ClassificationEdit.vue` + - `calendarV2/modules/TransactionList.vue` + - `budgetV2/Index.vue` + +#### Scenario: No Functional Regression +- **WHEN** 迁移完成后用户使用任意账单列表页面 +- **THEN** 所有原有功能 SHALL 正常工作(点击、删除、筛选、分页) +- **AND** 用户 SHALL NOT 遇到任何功能缺失或异常 + +### Requirement: Code Quality +迁移后的代码 SHALL 保持高质量,移除废弃代码。 + +#### Scenario: No Dead Code +- **WHEN** 开发者审查迁移后的页面代码 +- **THEN** 页面 SHALL NOT 包含废弃的自定义列表代码 +- **AND** 页面 SHALL NOT 包含未使用的列表样式定义 + +#### Scenario: Component Import Clarity +- **WHEN** 开发者查看页面导入语句 +- **THEN** 页面 SHALL 明确 import `BillListComponent` +- **AND** 页面 SHALL 移除原有的自定义列表组件导入(如果有)