Files
EmailBill/openspec/changes/archive/2026-02-13-budget-page-v2/specs/budget-v2-page-layout/spec.md
SunCheng 162b6d02dd
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 26s
Docker Build & Deploy / Deploy to Production (push) Successful in 8s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 2s
Docker Build & Deploy / WeChat Notification (push) Successful in 1s
fix
2026-02-13 22:49:07 +08:00

126 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## ADDED Requirements
### Requirement: 页面采用简洁的布局结构
预算 v2 页面 SHALL 采用简洁的布局结构包含DateSelectHeader、业务 tabs 和可滚动内容区域。
#### Scenario: 页面加载时显示完整布局
- **WHEN** 用户访问预算 v2 页面
- **THEN** 页面显示以下组件(从上到下):
- DateSelectHeader显示当前年月左右箭头
- van-tabs支出/收入/计划三个选项,默认选中"支出"
- 可滚动内容区域(包含预算统计和列表)
### Requirement: 使用 DateSelectHeader 组件作为页头
预算 v2 页面 SHALL 使用 `@/components/DateSelectHeader.vue` 组件作为页头,替代当前的 `van-nav-bar`
#### Scenario: 页头显示当前选中的年月
- **WHEN** 用户选择了 2024 年 3 月
- **THEN** 页头显示"2024年3月"
#### Scenario: 点击左箭头切换到上一个月
- **WHEN** 用户点击页头左箭头
- **THEN** 切换到上一个月(如从 2024年3月 切换到 2024年2月
- **AND** 页面数据自动刷新
#### Scenario: 点击右箭头切换到下一个月
- **WHEN** 用户点击页头右箭头,且当前不是当前月
- **THEN** 切换到下一个月,页面数据自动刷新
#### Scenario: 当前是当前月时禁用右箭头
- **WHEN** 用户在当前月(如今天是 2024年3月15日页面显示 2024年3月
- **THEN** 页头右箭头不可点击(不能查看未来月份)
#### Scenario: 点击日期打开日期选择器
- **WHEN** 用户点击页头的日期文字
- **THEN** 显示年月选择器弹窗van-date-pickercolumns-type: ['year', 'month']
#### Scenario: 日期选择器不能选择未来月份
- **WHEN** 用户在日期选择器中尝试选择未来月份
- **THEN** 显示提示"不能选择未来的月份"
- **AND** 不切换页面日期
### Requirement: 业务 tabs 紧随页头之后
预算页面 SHALL 在 DateSelectHeader 下方直接显示业务 tabs支出/收入/计划),使用 `van-tabs` 组件。
#### Scenario: 默认选中"支出" tab
- **WHEN** 用户访问预算 v2 页面
- **THEN** 业务 tabs 默认选中"支出"
#### Scenario: 切换到"收入" tab
- **WHEN** 用户点击"收入" tab
- **THEN** 内容区域显示收入预算的统计和列表
#### Scenario: 切换到"计划" tab
- **WHEN** 用户点击"计划" tab
- **THEN** 内容区域显示存款计划的列表
#### Scenario: 切换 tab 时保持页头日期不变
- **WHEN** 用户从"支出" tab 切换到"收入" tab
- **THEN** 页头显示的年月不变
- **AND** 加载该月的收入预算数据
### Requirement: 可滚动内容区域支持下拉刷新
内容区域 SHALL 支持下拉刷新,刷新当前选中的预算数据。
#### Scenario: 下拉刷新当前页面数据
- **WHEN** 用户在内容区域下拉
- **THEN** 显示刷新动画
- **AND** 重新加载当前月份和业务 tab 的数据
- **AND** 刷新完成后显示提示"刷新成功"
### Requirement: 支持左右滑动切换月份
预算页面 SHALL 支持在内容区域左右滑动来切换月份。
#### Scenario: 右滑切换到上一个月
- **WHEN** 用户在内容区域向右滑动超过 50px
- **THEN** 切换到上一个月
- **AND** 页面数据自动刷新
#### Scenario: 左滑切换到下一个月
- **WHEN** 用户在内容区域向左滑动超过 50px且不是当前月
- **THEN** 切换到下一个月
- **AND** 页面数据自动刷新
#### Scenario: 垂直滑动不触发月份切换
- **WHEN** 用户垂直滑动(滚动内容)
- **THEN** 不触发月份切换
#### Scenario: 当前月时左滑不切换
- **WHEN** 用户在当前月向左滑动
- **THEN** 不切换到下一个月(不能查看未来月份)
### Requirement: 页面底部留出安全距离
内容区域 SHALL 在底部留出足够的安全距离,避免被底部导航栏遮挡。
#### Scenario: 内容区域底部安全距离
- **WHEN** 用户滚动到内容底部
- **THEN** 内容底部与底部导航栏之间有足够的间距95px + env(safe-area-inset-bottom)
### Requirement: 支持 keep-alive 缓存
预算 v2 页面 SHALL 支持 Vue Router 的 keep-alive 缓存,提升用户体验。
#### Scenario: 从其他页面返回时保持状态
- **WHEN** 用户从预算页面跳转到其他页面,然后返回
- **THEN** 预算页面保持之前的状态(选中的月份、业务 tab、滚动位置
#### Scenario: 接收全局事件刷新数据
- **WHEN** 用户在其他页面添加或修改了预算记录,触发 'transactions-changed' 事件
- **THEN** 预算页面自动刷新数据(如果页面处于激活状态)
### Requirement: 加载状态和错误处理
页面 SHALL 提供清晰的加载状态和错误提示。
#### Scenario: 数据加载中显示加载动画
- **WHEN** 页面正在加载预算数据
- **THEN** 显示加载动画van-loading
#### Scenario: 数据加载失败显示错误提示
- **WHEN** 数据加载失败网络错误、API 错误等)
- **THEN** 显示错误提示van-empty with error image
- **AND** 提供"重试"按钮
#### Scenario: 点击重试按钮重新加载
- **WHEN** 用户点击"重试"按钮
- **THEN** 清除错误状态
- **AND** 重新加载当前月份和业务 tab 的数据