归档
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 18s
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
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 18s
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
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Bill deletion requires user confirmation
|
||||
账单删除操作 MUST 要求用户显式确认,防止误操作导致数据丢失。删除确认对话框 SHALL 明确告知用户操作的不可逆性。
|
||||
|
||||
#### Scenario: User confirms bill deletion
|
||||
- **WHEN** 用户在日历页面的账单详情弹窗中点击"删除"按钮
|
||||
- **THEN** 系统弹出确认对话框,标题为"确认删除"
|
||||
- **AND** 对话框消息包含警告文本(如"确定要删除这条账单吗?此操作无法撤销。")
|
||||
- **AND** 对话框提供"确认"和"取消"两个按钮
|
||||
|
||||
#### Scenario: User confirms deletion
|
||||
- **WHEN** 用户在确认对话框中点击"确认"按钮
|
||||
- **THEN** 系统调用删除 API (`DELETE /api/bill/{id}`)
|
||||
- **AND** 删除成功后关闭账单详情弹窗
|
||||
- **AND** 日历视图自动刷新,删除的账单不再显示
|
||||
|
||||
#### Scenario: User cancels deletion
|
||||
- **WHEN** 用户在确认对话框中点击"取消"按钮
|
||||
- **THEN** 对话框关闭,账单详情弹窗保持打开状态
|
||||
- **AND** 账单未被删除
|
||||
|
||||
#### Scenario: Deletion fails due to server error
|
||||
- **WHEN** 用户确认删除,但后端返回错误(如网络异常或 500 错误)
|
||||
- **THEN** 系统显示错误提示(如"删除失败,请稍后重试")
|
||||
- **AND** 账单详情弹窗保持打开状态
|
||||
- **AND** 账单仍存在于系统中
|
||||
|
||||
### Requirement: Delete button event binding must be functional
|
||||
日历页面账单详情组件中的删除按钮 MUST 正确绑定点击事件处理函数,确保用户点击时能够触发删除流程。
|
||||
|
||||
#### Scenario: Delete button click triggers handler
|
||||
- **WHEN** 账单详情弹窗渲染完成
|
||||
- **THEN** "删除"按钮的 `@click` 或 `onClick` 事件绑定到正确的处理函数(如 `handleDelete`)
|
||||
- **AND** 点击按钮时控制台无 JavaScript 错误
|
||||
|
||||
#### Scenario: Button is not disabled during loading
|
||||
- **WHEN** 账单详情弹窗首次加载时
|
||||
- **THEN** "删除"按钮的 `disabled` 属性为 `false`(除非账单正在删除中)
|
||||
- **AND** 按钮可以正常响应点击事件
|
||||
@@ -0,0 +1,48 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Budget statistics API response includes complete data
|
||||
预算统计 API (`GET /api/budget/stats/{category}`) SHALL 返回完整的统计数据,包括用于前端图表渲染的 `Trend` 数组和用于明细弹窗的 `Description` HTML 内容。
|
||||
|
||||
响应结构中的 `Month` 和 `Year` 对象 MUST 包含以下字段:
|
||||
- `Limit`: 预算限额
|
||||
- `Current`: 当前实际金额
|
||||
- `Remaining`: 剩余金额
|
||||
- `UsagePercentage`: 使用百分比
|
||||
- `Trend`: 每日/每月累计金额数组 (`List<decimal?>`)
|
||||
- `Description`: HTML 格式的详细说明,包含计算公式和数据表格 (`string`)
|
||||
|
||||
#### Scenario: Monthly stats with trend data
|
||||
- **WHEN** 客户端请求月度预算统计 `GET /api/budget/stats/food?date=2026-02`
|
||||
- **THEN** 响应的 `month` 对象包含 `trend` 数组,长度等于该月天数(如28/29/30/31)
|
||||
- **AND** `trend` 数组每个元素表示截至该天的累计金额(支出类为递减,收入类为递增)
|
||||
- **AND** `trend` 数组中未到达的日期对应的元素为 `null`
|
||||
|
||||
#### Scenario: Monthly stats with description
|
||||
- **WHEN** 客户端请求月度预算统计 `GET /api/budget/stats/food?date=2026-02`
|
||||
- **THEN** 响应的 `month` 对象包含 `description` 字段
|
||||
- **AND** `description` 是 HTML 格式字符串,包含 `<table>` 标签展示明细数据
|
||||
- **AND** `description` 包含计算公式说明(如"剩余 = 限额 - 已用")
|
||||
|
||||
#### Scenario: Yearly stats with trend data
|
||||
- **WHEN** 客户端请求年度预算统计 `GET /api/budget/stats/salary?date=2026`
|
||||
- **THEN** 响应的 `year` 对象包含 `trend` 数组,长度为12(代表12个月)
|
||||
- **AND** `trend` 数组每个元素表示截至该月的累计金额
|
||||
- **AND** `trend` 数组中未到达的月份对应的元素为 `null`
|
||||
|
||||
#### Scenario: Yearly stats with description
|
||||
- **WHEN** 客户端请求年度预算统计 `GET /api/budget/stats/salary?date=2026`
|
||||
- **THEN** 响应的 `year` 对象包含 `description` 字段
|
||||
- **AND** `description` 是 HTML 格式字符串,包含年度统计明细
|
||||
|
||||
### Requirement: DTO mapping preserves all Service layer data
|
||||
Application 层的 `BudgetApplication.GetCategoryStatsAsync` 方法在将 Service 层的 `BudgetStatsDto` 映射到 API 响应 DTO 时,MUST 保留所有数据字段,不得丢失 `Trend` 和 `Description`。
|
||||
|
||||
#### Scenario: Mapping from Service DTO to API DTO
|
||||
- **WHEN** `BudgetApplication.GetCategoryStatsAsync` 接收到 Service 层返回的 `BudgetStatsDto`
|
||||
- **THEN** 映射后的 `BudgetStatsDetail` 对象包含 `Trend` 字段,其值等于 `BudgetStatsDto.Month.Trend` 或 `BudgetStatsDto.Year.Trend`
|
||||
- **AND** 映射后的 `BudgetStatsDetail` 对象包含 `Description` 字段,其值等于 `BudgetStatsDto.Month.Description` 或 `BudgetStatsDto.Year.Description`
|
||||
|
||||
#### Scenario: API response schema validation
|
||||
- **WHEN** 前端调用 `/api/budget/stats/{category}` 并解析 JSON 响应
|
||||
- **THEN** TypeScript 类型检查不报错,响应对象符合 `BudgetStatsResponse` 接口定义
|
||||
- **AND** `month.trend` 和 `month.description` 字段存在且非 `undefined`
|
||||
@@ -0,0 +1,37 @@
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: Bottom navigation statistics tab routes correctly
|
||||
底部导航栏的"统计"标签 MUST 正确配置路由路径,点击后能够跳转到统计页面 (`/statistics-v2`)。
|
||||
|
||||
#### Scenario: User clicks statistics tab in bottom navigation
|
||||
- **WHEN** 用户在应用底部导航栏点击"统计"图标或标签
|
||||
- **THEN** 浏览器 URL 变更为 `/statistics-v2`
|
||||
- **AND** 页面渲染统计页面组件(如 `StatisticsV2.vue`)
|
||||
- **AND** 底部导航栏的"统计"标签高亮显示为激活状态
|
||||
|
||||
#### Scenario: Direct URL access to statistics page
|
||||
- **WHEN** 用户直接在浏览器地址栏输入 `/statistics-v2` 并访问
|
||||
- **THEN** 应用正确渲染统计页面
|
||||
- **AND** 底部导航栏的"统计"标签高亮显示为激活状态
|
||||
|
||||
#### Scenario: Navigation tab configuration matches route definition
|
||||
- **WHEN** 前端代码加载时
|
||||
- **THEN** 底部导航组件(`van-tabbar` 或自定义组件)中"统计"标签的 `to` 或 `path` 属性值为 `/statistics-v2`
|
||||
- **AND** 路由配置文件 (`router/index.js`) 中存在 `path: '/statistics-v2'` 的路由定义
|
||||
|
||||
### Requirement: Vant DatetimePicker component must be registered
|
||||
Vant UI 库的 `van-datetime-picker` 组件 MUST 正确注册,以避免控制台出现 "Failed to resolve component" 警告。
|
||||
|
||||
#### Scenario: DatetimePicker used in application
|
||||
- **WHEN** 应用中任何页面使用 `<van-datetime-picker>` 组件
|
||||
- **THEN** 组件正常渲染,无控制台错误或警告
|
||||
- **AND** 控制台不显示 "Failed to resolve component: van-datetime-picker" 消息
|
||||
|
||||
#### Scenario: Global component registration in main.ts
|
||||
- **WHEN** 应用启动时执行 `main.ts` 或全局插件文件
|
||||
- **THEN** `DatetimePicker` 组件已通过 `app.use(DatetimePicker)` 全局注册
|
||||
- **OR** 在使用组件的文件中已通过 `import { DatetimePicker } from 'vant'` 和 `components: { VanDatetimePicker: DatetimePicker }` 局部注册
|
||||
|
||||
#### Scenario: No missing component warnings after fix
|
||||
- **WHEN** 用户浏览应用的所有页面(日历、预算、统计等)
|
||||
- **THEN** 浏览器开发者工具控制台中无任何 Vant 组件相关的警告或错误
|
||||
Reference in New Issue
Block a user