Files
EmailBill/openspec/changes/archive/2026-02-13-budget-page-v2/specs/budget-v2-page-layout/spec.md

126 lines
5.1 KiB
Markdown
Raw Normal View History

2026-02-13 22:49:07 +08:00
## 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 的数据