Files
EmailBill/openspec/changes/refactor-bill-list-component/tasks.md

136 lines
6.5 KiB
Markdown
Raw Normal View History

2026-02-15 10:10:28 +08:00
## 1. 组件基础结构搭建
- [x] 1.1 创建 `Web/src/components/Bill/BillListComponent.vue` 文件
- [x] 1.2 定义 TypeScript Props 接口dataSource, apiParams, transactions, showDelete, showCheckbox, enableFilter, enableSort, compact
- [x] 1.3 定义 Emits 接口load, click, delete, update:selectedIds
- [x] 1.4 创建组件骨架template、script setup、style scoped
- [x] 1.5 添加必要的 Vant 组件导入van-list, van-swipe-cell, van-dropdown-menu, van-loading, van-empty, van-icon, van-tag
## 2. 数据管理和状态
- [x] 2.1 实现 `dataSource` 模式切换逻辑api vs custom
- [x] 2.2 创建响应式数据状态transactions, loading, finished, page, pageSize
- [x] 2.3 实现筛选状态管理selectedType, selectedCategory, dateRange, sortBy
- [x] 2.4 实现多选状态管理localSelectedIds, 与 prop 同步)
- [x] 2.5 创建 computed 计算属性用于筛选和排序逻辑
## 3. API 数据加载
- [x] 3.1 导入 `@/api/transactionRecord` 的相关 API 方法
- [x] 3.2 实现初始加载逻辑fetchTransactions 方法)
- [x] 3.3 实现分页加载逻辑onLoad 方法,支持 van-list
- [x] 3.4 实现筛选条件变更时的数据重载逻辑
- [x] 3.5 处理 API 错误和加载状态
## 4. 筛选功能实现
- [x] 4.1 创建筛选栏 UIvan-dropdown-menu包含类型、分类、日期、排序四个下拉菜单
- [x] 4.2 实现类型筛选(支出、收入、不计入、全部)
- [x] 4.3 实现分类筛选(动态获取分类列表或预设常用分类)
- [x] 4.4 实现日期范围筛选(使用 van-calendar 弹出层)
- [x] 4.5 实现排序功能(金额降序、金额升序、时间降序、时间升序)
- [x] 4.6 添加筛选重置功能
- [x] 4.7 根据 `enableFilter` prop 控制筛选栏显示/隐藏
## 5. 账单列表展示
- [x] 5.1 创建账单卡片布局(基于 v2 风格,左侧图标、中间内容、右侧金额)
- [x] 5.2 实现紧凑模式样式(减少卡片间距至 6px内边距至 10px
- [x] 5.3 实现账单图标显示(根据分类映射图标,使用 getIconByClassify 方法)
- [x] 5.4 实现金额格式化(带符号、颜色区分支出/收入)
- [x] 5.5 实现类型标签显示(右上角,支出红色、收入绿色)
- [x] 5.6 实现时间格式化显示HH:MM 或 YYYY-MM-DD HH:MM
- [x] 5.7 实现空状态展示van-empty带友好文案
## 6. 左滑删除功能
- [x] 6.1 为每个账单项添加 van-swipe-cell 包裹
- [x] 6.2 创建删除按钮插槽(右侧滑出,红色按钮)
- [x] 6.3 实现删除确认对话框van-dialog
- [x] 6.4 实现删除 API 调用deleteTransaction
- [x] 6.5 删除成功后更新本地列表(移除对应项)
- [x] 6.6 显示删除成功/失败提示van-toast
- [x] 6.7 派发全局事件 `transaction-deleted`
- [x] 6.8 触发父组件 `@delete` 事件
- [x] 6.9 根据 `showDelete` prop 控制删除功能启用/禁用
## 7. 点击详情功能
- [x] 7.1 为账单卡片添加 @click 事件监听
- [x] 7.2 实现 handleClick 方法,触发 `@click` 事件并传递账单对象
- [x] 7.3 确保点击复选框或删除按钮时不触发详情事件(事件冒泡处理)
## 8. 多选功能
- [x] 8.1 在账单项左侧添加 van-checkbox根据 `showCheckbox` prop 控制显示)
- [x] 8.2 实现 checkbox 选中状态与 `selectedIds` prop 同步
- [x] 8.3 实现 toggleSelection 方法(切换选中状态)
- [x] 8.4 触发 `@update:selectedIds` 事件更新父组件状态
- [ ] 8.5 添加全选/取消全选功能(可选,视需求)
## 9. 样式和主题适配
- [x] 9.1 使用 SCSS 编写组件样式
- [x] 9.2 使用 CSS 变量适配 Vant 主题(`var(--van-danger-color)` 等)
- [x] 9.3 实现暗黑模式适配(检查暗色背景下的显示效果)
- [x] 9.4 根据 `compact` prop 调整卡片间距和内边距
- [x] 9.5 确保移动端响应式布局(处理小屏幕、横屏等情况)
- [x] 9.6 添加过渡动画(卡片删除、列表加载等)
## 10. 页面迁移 - TransactionsRecord
- [x] 10.1 在 `TransactionsRecord.vue` 中导入新组件 `BillListComponent`
- [x] 10.2 替换旧 `TransactionList` 组件为 `BillListComponent`
- [x] 10.3 传递必要的 propsshowCheckbox, selectedIds, apiParams
- [x] 10.4 更新事件监听(@click, @delete, @update:selectedIds
- [ ] 10.5 验证批量操作功能正常(选中、删除、导出等)
- [ ] 10.6 测试页面功能完整性
## 11. 页面迁移 - BillAnalysisView
- [x] 11.1 在 `BillAnalysisView.vue` 中导入新组件 `BillListComponent` (页面未使用旧组件,跳过)
- [x] 11.2 替换旧组件为 `BillListComponent` (页面未使用旧组件,跳过)
- [x] 11.3 传递筛选参数(如按分类、日期范围)(页面未使用旧组件,跳过)
- [x] 11.4 更新事件监听 (页面未使用旧组件,跳过)
- [x] 11.5 测试页面功能正常 (页面未使用旧组件,跳过)
## 12. 页面迁移 - 其他引用页面
- [x] 12.1 使用 grep 搜索所有引用旧 `TransactionList` 的文件
- [x] 12.2 逐个页面进行迁移(重复步骤 10-11 的流程)
- [x] 12.3 验证每个页面的功能和样式
- [x] 12.4 检查是否有遗漏的引用
## 13. CalendarV2 模块处理
- [x] 13.1 评估 `calendarV2/modules/TransactionList.vue` 的特殊功能Smart 按钮、日期联动等)
- [x] 13.2 决定是保留该文件还是迁移到新组件
- [x] 13.3 如保留,添加注释说明其特殊性;如迁移,确保功能对等
- [x] 13.4 测试 CalendarV2 的交易列表功能
## 14. 清理旧代码
- [x] 14.1 删除 `Web/src/components/TransactionList.vue`
- [x] 14.2 检查并删除相关的未使用导入
- [x] 14.3 更新 `AGENTS.md` 或相关文档,说明新组件的使用方式
- [x] 14.4 提交代码变更Git commit
## 15. 测试和验证
- [ ] 15.1 编写单元测试Vue Test Utils测试 props、emits、筛选、排序逻辑
- [ ] 15.2 手动测试所有功能点(筛选、排序、分页、删除、多选、详情)
- [ ] 15.3 测试暗黑模式显示效果
- [ ] 15.4 测试不同屏幕尺寸的响应式布局
- [ ] 15.5 测试 API 错误处理和边界情况(空数据、网络错误等)
- [ ] 15.6 回归测试所有迁移页面,确保无功能丢失
- [ ] 15.7 性能测试(加载 1000+ 条数据时的流畅度)
## 16. 文档和收尾
- [x] 16.1 编写组件使用文档Props、Emits、Slots 说明)
- [x] 16.2 更新 `Web/src/views/AGENTS.md`(如有)
- [x] 16.3 在组件文件顶部添加 JSDoc 注释
- [x] 16.4 代码格式化pnpm lint
- [x] 16.5 构建测试pnpm build
- [x] 16.6 最终代码审查