fix
This commit is contained in:
@@ -1,130 +0,0 @@
|
||||
# 版本切换功能实现总结
|
||||
|
||||
## 实现概述
|
||||
|
||||
在设置的开发者选项中添加了版本切换功能,用户可以在 V1 和 V2 版本之间切换。
|
||||
|
||||
## 修改的文件
|
||||
|
||||
### 1. Web/src/stores/version.js (新增)
|
||||
- 创建 Pinia store 管理版本状态
|
||||
- 使用 localStorage 持久化版本选择
|
||||
- 提供 `setVersion()` 和 `isV2()` 方法
|
||||
|
||||
### 2. Web/src/views/SettingView.vue (修改)
|
||||
- 在开发者选项中添加"切换版本"选项
|
||||
- 显示当前版本(V1/V2)
|
||||
- 实现版本切换对话框
|
||||
- 实现版本切换后的路由跳转逻辑
|
||||
|
||||
### 3. Web/src/router/index.js (修改)
|
||||
- 引入 version store
|
||||
- 在路由守卫中添加版本路由重定向逻辑
|
||||
- V2 模式下自动跳转到 V2 路由(如果存在)
|
||||
- V1 模式下自动跳转到 V1 路由(如果在 V2 路由)
|
||||
|
||||
## 核心功能
|
||||
|
||||
1. **版本选择界面**
|
||||
- 设置页面显示当前版本
|
||||
- 点击弹出对话框,选择 V1 或 V2
|
||||
- 切换成功后显示提示信息
|
||||
|
||||
2. **智能路由跳转**
|
||||
- 选择 V2 后,如果当前路由有 V2 版本,自动跳转
|
||||
- 选择 V1 后,如果当前在 V2 路由,自动跳转到 V1
|
||||
- 没有对应版本时,保持当前路由不变
|
||||
|
||||
3. **路由守卫保护**
|
||||
- 每次路由跳转时检查版本设置
|
||||
- 自动重定向到正确版本的路由
|
||||
- 保留 query 和 params 参数
|
||||
|
||||
4. **状态持久化**
|
||||
- 版本选择保存在 localStorage
|
||||
- 刷新页面后版本设置保持不变
|
||||
|
||||
## V2 路由命名规范
|
||||
|
||||
V2 路由必须遵循命名规范:`原路由名-v2`
|
||||
|
||||
示例:
|
||||
- V1: `calendar` → V2: `calendar-v2`
|
||||
- V1: `budget` → V2: `budget-v2`
|
||||
|
||||
## 当前支持的 V2 路由
|
||||
|
||||
- `calendar` → `calendar-v2` (CalendarV2.vue)
|
||||
|
||||
## 测试验证
|
||||
|
||||
- ✅ ESLint 检查通过(无错误)
|
||||
- ✅ 构建成功(pnpm build)
|
||||
- ✅ 所有修改文件符合项目代码规范
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 用户操作流程
|
||||
|
||||
1. 进入"设置"页面
|
||||
2. 滚动到"开发者"分组
|
||||
3. 点击"切换版本"(当前版本显示在右侧)
|
||||
4. 选择"V1"或"V2"
|
||||
5. 系统自动跳转到对应版本的路由
|
||||
|
||||
### 开发者添加新 V2 路由
|
||||
|
||||
```javascript
|
||||
// router/index.js
|
||||
{
|
||||
path: '/xxx-v2',
|
||||
name: 'xxx-v2',
|
||||
component: () => import('../views/XxxViewV2.vue'),
|
||||
meta: { requiresAuth: true }
|
||||
}
|
||||
```
|
||||
|
||||
添加后即可自动支持版本切换。
|
||||
|
||||
## 技术细节
|
||||
|
||||
### 版本检测逻辑
|
||||
|
||||
```javascript
|
||||
// 在路由守卫中
|
||||
if (versionStore.isV2()) {
|
||||
// 尝试跳转到 V2 路由
|
||||
const v2RouteName = `${routeName}-v2`
|
||||
if (存在 v2Route) {
|
||||
跳转到 v2Route
|
||||
} else {
|
||||
保持当前路由
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 版本状态管理
|
||||
|
||||
```javascript
|
||||
// stores/version.js
|
||||
const currentVersion = ref(localStorage.getItem('app-version') || 'v1')
|
||||
|
||||
const setVersion = (version) => {
|
||||
currentVersion.value = version
|
||||
localStorage.setItem('app-version', version)
|
||||
}
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. V2 路由必须按照 `xxx-v2` 命名规范
|
||||
2. 如果页面没有 V2 版本,切换后会保持在 V1 版本
|
||||
3. 路由守卫会自动处理所有版本相关的路由跳转
|
||||
4. 版本状态持久化在 localStorage 中
|
||||
|
||||
## 后续改进建议
|
||||
|
||||
1. 可以在 UI 上添加更明显的版本标识
|
||||
2. 可以在无 V2 路由时给出提示
|
||||
3. 可以添加版本切换的动画效果
|
||||
4. 可以为不同版本设置不同的主题样式
|
||||
@@ -1,143 +0,0 @@
|
||||
# 版本切换功能测试文档
|
||||
|
||||
## 功能说明
|
||||
|
||||
在设置的开发者选项中添加了版本切换功能,用户可以在 V1 和 V2 版本之间切换。当选择 V2 时,如果有对应的 V2 路由则自动跳转,否则保持当前路由。
|
||||
|
||||
## 实现文件
|
||||
|
||||
1. **Store**: `Web/src/stores/version.js` - 版本状态管理
|
||||
2. **View**: `Web/src/views/SettingView.vue` - 设置页面添加版本切换入口
|
||||
3. **Router**: `Web/src/router/index.js` - 路由守卫实现版本路由重定向
|
||||
|
||||
## 功能特性
|
||||
|
||||
- ✅ 版本状态持久化存储(localStorage)
|
||||
- ✅ 设置页面显示当前版本(V1/V2)
|
||||
- ✅ 点击弹出对话框选择版本
|
||||
- ✅ 自动检测并跳转到对应版本路由
|
||||
- ✅ 如果没有对应版本路由,保持当前路由
|
||||
- ✅ 路由守卫自动处理版本路由
|
||||
|
||||
## 测试步骤
|
||||
|
||||
### 1. 基础功能测试
|
||||
|
||||
1. 启动应用并登录
|
||||
2. 进入"设置"页面
|
||||
3. 找到"开发者"分组下的"切换版本"选项
|
||||
4. 当前版本应显示为 "V1"(首次使用)
|
||||
|
||||
### 2. 切换到 V2 测试
|
||||
|
||||
1. 点击"切换版本"
|
||||
2. 弹出对话框,显示"选择版本"标题
|
||||
3. 对话框有两个按钮:"V1"(取消按钮)和"V2"(确认按钮)
|
||||
4. 点击"V2"按钮
|
||||
5. 应显示提示"已切换到 V2"
|
||||
6. "切换版本"选项的值应更新为 "V2"
|
||||
|
||||
### 3. V2 路由跳转测试
|
||||
|
||||
#### 测试有 V2 路由的情况(日历页面)
|
||||
|
||||
1. 确保当前版本为 V2
|
||||
2. 点击导航栏的"日历"(路由名:`calendar`)
|
||||
3. 应自动跳转到 `calendar-v2`(CalendarV2.vue)
|
||||
4. 地址栏 URL 应为 `/calendar-v2`
|
||||
|
||||
#### 测试没有 V2 路由的情况
|
||||
|
||||
1. 确保当前版本为 V2
|
||||
2. 点击导航栏的"账单分析"(路由名:`bill-analysis`)
|
||||
3. 应保持在 `bill-analysis` 路由(没有 v2 版本)
|
||||
4. 地址栏 URL 应为 `/bill-analysis`
|
||||
|
||||
### 4. 切换回 V1 测试
|
||||
|
||||
1. 当前版本为 V2,在 `calendar-v2` 页面
|
||||
2. 进入"设置"页面,点击"切换版本"
|
||||
3. 点击"V1"按钮
|
||||
4. 应显示提示"已切换到 V1"
|
||||
5. 如果当前在 V2 路由(如 `calendar-v2`),应自动跳转到 V1 路由(`calendar`)
|
||||
6. 地址栏 URL 应为 `/calendar`
|
||||
|
||||
### 5. 持久化测试
|
||||
|
||||
1. 切换到 V2 版本
|
||||
2. 刷新页面
|
||||
3. 重新登录后,进入"设置"页面
|
||||
4. "切换版本"选项应仍显示 "V2"
|
||||
5. 访问有 V2 路由的页面,应自动跳转到 V2 版本
|
||||
|
||||
### 6. 路由守卫测试
|
||||
|
||||
#### 直接访问 V2 路由(V1 模式下)
|
||||
|
||||
1. 确保当前版本为 V1
|
||||
2. 在地址栏直接输入 `/calendar-v2`
|
||||
3. 应自动重定向到 `/calendar`
|
||||
|
||||
#### 直接访问 V1 路由(V2 模式下)
|
||||
|
||||
1. 确保当前版本为 V2
|
||||
2. 在地址栏直接输入 `/calendar`
|
||||
3. 应自动重定向到 `/calendar-v2`
|
||||
|
||||
## 当前支持 V2 的路由
|
||||
|
||||
- `calendar` → `calendar-v2` (CalendarV2.vue)
|
||||
|
||||
## 代码验证
|
||||
|
||||
### 版本 Store 检查
|
||||
|
||||
```javascript
|
||||
// 打开浏览器控制台
|
||||
const versionStore = useVersionStore()
|
||||
console.log(versionStore.currentVersion) // 应输出 'v1' 或 'v2'
|
||||
console.log(versionStore.isV2()) // 应输出 true 或 false
|
||||
```
|
||||
|
||||
### LocalStorage 检查
|
||||
|
||||
```javascript
|
||||
// 打开浏览器控制台
|
||||
console.log(localStorage.getItem('app-version')) // 应输出 'v1' 或 'v2'
|
||||
```
|
||||
|
||||
## 预期结果
|
||||
|
||||
- ✅ 所有路由跳转正常
|
||||
- ✅ 版本切换提示正常显示
|
||||
- ✅ 版本状态持久化正常
|
||||
- ✅ 路由守卫正常工作
|
||||
- ✅ 没有控制台错误
|
||||
- ✅ UI 响应流畅
|
||||
|
||||
## 潜在问题
|
||||
|
||||
1. 如果用户在 V2 路由页面直接切换到 V1,可能会出现短暂的页面重载
|
||||
2. 某些页面可能没有 V2 版本,切换后会保持在 V1 版本
|
||||
|
||||
## 后续扩展
|
||||
|
||||
如需添加更多 V2 路由,只需:
|
||||
|
||||
1. 创建新的 Vue 组件(如 `XXXViewV2.vue`)
|
||||
2. 在 `router/index.js` 中添加路由,命名格式为 `原路由名-v2`
|
||||
3. 路由守卫会自动处理版本切换逻辑
|
||||
|
||||
## 示例:添加新的 V2 路由
|
||||
|
||||
```javascript
|
||||
// router/index.js
|
||||
{
|
||||
path: '/budget-v2',
|
||||
name: 'budget-v2',
|
||||
component: () => import('../views/BudgetViewV2.vue'),
|
||||
meta: { requiresAuth: true }
|
||||
}
|
||||
```
|
||||
|
||||
添加后,当用户选择 V2 版本并访问 `/budget` 时,会自动跳转到 `/budget-v2`。
|
||||
@@ -63,32 +63,38 @@ request.interceptors.response.use(
|
||||
const { status, data } = error.response
|
||||
let message = '请求失败'
|
||||
|
||||
switch (status) {
|
||||
case 400:
|
||||
message = data?.message || '请求参数错误'
|
||||
break
|
||||
case 401: {
|
||||
message = '未授权,请重新登录'
|
||||
// 清除登录状态并跳转到登录页
|
||||
const authStore = useAuthStore()
|
||||
authStore.logout()
|
||||
router.push({
|
||||
name: 'login',
|
||||
query: { redirect: router.currentRoute.value.fullPath }
|
||||
})
|
||||
break
|
||||
// 优先从后端返回的 BaseResponse 中提取 message
|
||||
if (data && data.message) {
|
||||
message = data.message
|
||||
} else {
|
||||
// 如果后端没有返回 message,使用默认提示
|
||||
switch (status) {
|
||||
case 400:
|
||||
message = '请求参数错误'
|
||||
break
|
||||
case 401: {
|
||||
message = '未授权,请重新登录'
|
||||
// 清除登录状态并跳转到登录页
|
||||
const authStore = useAuthStore()
|
||||
authStore.logout()
|
||||
router.push({
|
||||
name: 'login',
|
||||
query: { redirect: router.currentRoute.value.fullPath }
|
||||
})
|
||||
break
|
||||
}
|
||||
case 403:
|
||||
message = '拒绝访问'
|
||||
break
|
||||
case 404:
|
||||
message = '请求的资源不存在'
|
||||
break
|
||||
case 500:
|
||||
message = '服务器内部错误'
|
||||
break
|
||||
default:
|
||||
message = `请求失败 (${status})`
|
||||
}
|
||||
case 403:
|
||||
message = '拒绝访问'
|
||||
break
|
||||
case 404:
|
||||
message = '请求的资源不存在'
|
||||
break
|
||||
case 500:
|
||||
message = '服务器内部错误'
|
||||
break
|
||||
default:
|
||||
message = data?.message || `请求失败 (${status})`
|
||||
}
|
||||
|
||||
showToast(message)
|
||||
|
||||
@@ -2,14 +2,38 @@ import request from './request'
|
||||
|
||||
/**
|
||||
* 统计相关 API
|
||||
* 注:统计接口定义在 TransactionRecordController 中
|
||||
* 注:统计接口定义在 TransactionStatisticsController 中
|
||||
*/
|
||||
|
||||
// ===== 新统一接口(推荐使用) =====
|
||||
|
||||
/**
|
||||
* 获取月度统计数据
|
||||
* 按日期范围获取每日统计(新统一接口)
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {number} params.year - 年份
|
||||
* @param {number} params.month - 月份
|
||||
* @param {string} params.startDate - 开始日期(包含)格式: YYYY-MM-DD
|
||||
* @param {string} params.endDate - 结束日期(不包含)格式: YYYY-MM-DD
|
||||
* @param {string} [params.savingClassify] - 储蓄分类(可选,不传则使用系统配置)
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
* @returns {Array} data - 每日统计列表
|
||||
* @returns {number} data[].day - 日期(天)
|
||||
* @returns {number} data[].count - 交易笔数
|
||||
* @returns {number} data[].expense - 支出金额
|
||||
* @returns {number} data[].income - 收入金额
|
||||
* @returns {number} data[].saving - 储蓄金额
|
||||
*/
|
||||
export const getDailyStatisticsByRange = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetDailyStatisticsByRange',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 按日期范围获取汇总统计(新统一接口)
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} params.startDate - 开始日期(包含)格式: YYYY-MM-DD
|
||||
* @param {string} params.endDate - 结束日期(不包含)格式: YYYY-MM-DD
|
||||
* @returns {Promise<{success: boolean, data: Object}>}
|
||||
* @returns {Object} data.totalExpense - 总支出
|
||||
* @returns {Object} data.totalIncome - 总收入
|
||||
@@ -18,19 +42,19 @@ import request from './request'
|
||||
* @returns {Object} data.incomeCount - 收入笔数
|
||||
* @returns {Object} data.totalCount - 总笔数
|
||||
*/
|
||||
export const getMonthlyStatistics = (params) => {
|
||||
export const getSummaryByRange = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetMonthlyStatistics',
|
||||
url: '/TransactionStatistics/GetSummaryByRange',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取分类统计数据
|
||||
* 按日期范围获取分类统计(新统一接口)
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {number} params.year - 年份
|
||||
* @param {number} params.month - 月份
|
||||
* @param {string} params.startDate - 开始日期(包含)格式: YYYY-MM-DD
|
||||
* @param {string} params.endDate - 结束日期(不包含)格式: YYYY-MM-DD
|
||||
* @param {number} params.type - 交易类型 (0:支出, 1:收入, 2:不计入收支)
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
* @returns {Array} data - 分类统计列表
|
||||
@@ -39,30 +63,9 @@ export const getMonthlyStatistics = (params) => {
|
||||
* @returns {number} data[].percent - 百分比
|
||||
* @returns {number} data[].count - 交易笔数
|
||||
*/
|
||||
export const getCategoryStatistics = (params) => {
|
||||
export const getCategoryStatisticsByRange = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetCategoryStatistics',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 按日期范围获取分类统计数据
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} params.startDate - 开始日期 (格式: YYYY-MM-DD)
|
||||
* @param {string} params.endDate - 结束日期 (格式: YYYY-MM-DD)
|
||||
* @param {number} params.type - 交易类型 (0:支出, 1:收入, 2:不计入收支)
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
* @returns {Array} data - 分类统计列表
|
||||
* @returns {string} data[].classify - 分类名称
|
||||
* @returns {number} data[].amount - 金额
|
||||
* @returns {number} data[].percent - 百分比
|
||||
* @returns {number} data[].count - 交易笔数
|
||||
*/
|
||||
export const getCategoryStatisticsByDateRange = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetCategoryStatisticsByDateRange',
|
||||
url: '/TransactionStatistics/GetCategoryStatisticsByRange',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
@@ -89,16 +92,65 @@ export const getTrendStatistics = (params) => {
|
||||
})
|
||||
}
|
||||
|
||||
// ===== 旧接口(保留用于向后兼容,建议迁移到新接口) =====
|
||||
|
||||
/**
|
||||
* 获取月度统计数据
|
||||
* @deprecated 请使用 getSummaryByRange
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {number} params.year - 年份
|
||||
* @param {number} params.month - 月份
|
||||
* @returns {Promise<{success: boolean, data: Object}>}
|
||||
*/
|
||||
export const getMonthlyStatistics = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetMonthlyStatistics',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取分类统计数据
|
||||
* @deprecated 请使用 getCategoryStatisticsByRange
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {number} params.year - 年份
|
||||
* @param {number} params.month - 月份
|
||||
* @param {number} params.type - 交易类型 (0:支出, 1:收入, 2:不计入收支)
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
*/
|
||||
export const getCategoryStatistics = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetCategoryStatistics',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 按日期范围获取分类统计数据
|
||||
* @deprecated 请使用 getCategoryStatisticsByRange(DateTime 参数版本)
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} params.startDate - 开始日期 (格式: YYYY-MM-DD)
|
||||
* @param {string} params.endDate - 结束日期 (格式: YYYY-MM-DD)
|
||||
* @param {number} params.type - 交易类型 (0:支出, 1:收入, 2:不计入收支)
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
*/
|
||||
export const getCategoryStatisticsByDateRange = (params) => {
|
||||
return request({
|
||||
url: '/TransactionStatistics/GetCategoryStatisticsByDateRange',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定月份每天的消费统计
|
||||
* @deprecated 请使用 getDailyStatisticsByRange
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {number} params.year - 年份
|
||||
* @param {number} params.month - 月份
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
* @returns {Array} data - 每日统计列表
|
||||
* @returns {string} data[].date - 日期
|
||||
* @returns {number} data[].count - 交易笔数
|
||||
* @returns {number} data[].amount - 交易金额
|
||||
*/
|
||||
export const getDailyStatistics = (params) => {
|
||||
return request({
|
||||
@@ -110,13 +162,11 @@ export const getDailyStatistics = (params) => {
|
||||
|
||||
/**
|
||||
* 获取累积余额统计数据(用于余额卡片)
|
||||
* @deprecated 请使用 getDailyStatisticsByRange 并在前端计算累积余额
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {number} params.year - 年份
|
||||
* @param {number} params.month - 月份
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
* @returns {Array} data - 每日累积余额列表
|
||||
* @returns {string} data[].date - 日期
|
||||
* @returns {number} data[].cumulativeBalance - 累积余额
|
||||
*/
|
||||
export const getBalanceStatistics = (params) => {
|
||||
return request({
|
||||
@@ -128,14 +178,11 @@ export const getBalanceStatistics = (params) => {
|
||||
|
||||
/**
|
||||
* 获取指定周范围的每天的消费统计
|
||||
* @deprecated 请使用 getDailyStatisticsByRange
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} params.startDate - 开始日期 (yyyy-MM-dd)
|
||||
* @param {string} params.endDate - 结束日期 (yyyy-MM-dd)
|
||||
* @returns {Promise<{success: boolean, data: Array}>}
|
||||
* @returns {Array} data - 每日统计列表
|
||||
* @returns {string} data[].date - 日期
|
||||
* @returns {number} data[].count - 交易笔数
|
||||
* @returns {number} data[].amount - 交易金额
|
||||
*/
|
||||
export const getWeeklyStatistics = (params) => {
|
||||
return request({
|
||||
@@ -147,16 +194,11 @@ export const getWeeklyStatistics = (params) => {
|
||||
|
||||
/**
|
||||
* 获取指定日期范围的统计汇总数据
|
||||
* @deprecated 请使用 getSummaryByRange
|
||||
* @param {Object} params - 查询参数
|
||||
* @param {string} params.startDate - 开始日期 (yyyy-MM-dd)
|
||||
* @param {string} params.endDate - 结束日期 (yyyy-MM-dd)
|
||||
* @returns {Promise<{success: boolean, data: Object}>}
|
||||
* @returns {Object} data.totalExpense - 总支出
|
||||
* @returns {Object} data.totalIncome - 总收入
|
||||
* @returns {Object} data.balance - 结余
|
||||
* @returns {Object} data.expenseCount - 支出笔数
|
||||
* @returns {Object} data.incomeCount - 收入笔数
|
||||
* @returns {Object} data.totalCount - 总笔数
|
||||
*/
|
||||
export const getRangeStatistics = (params) => {
|
||||
return request({
|
||||
|
||||
@@ -137,7 +137,17 @@ import ExpenseCategoryCard from './modules/ExpenseCategoryCard.vue'
|
||||
import IncomeNoneCategoryCard from './modules/IncomeNoneCategoryCard.vue'
|
||||
import CategoryBillPopup from '@/components/CategoryBillPopup.vue'
|
||||
import GlassBottomNav from '@/components/GlassBottomNav.vue'
|
||||
import { getMonthlyStatistics, getCategoryStatistics, getCategoryStatisticsByDateRange, getDailyStatistics, getTrendStatistics, getWeeklyStatistics, getRangeStatistics } from '@/api/statistics'
|
||||
import {
|
||||
// 新统一接口
|
||||
getDailyStatisticsByRange,
|
||||
getSummaryByRange,
|
||||
getCategoryStatisticsByRange,
|
||||
getTrendStatistics,
|
||||
// 旧接口(兼容性保留)
|
||||
getMonthlyStatistics,
|
||||
getCategoryStatistics,
|
||||
getDailyStatistics
|
||||
} from '@/api/statistics'
|
||||
import { useMessageStore } from '@/stores/message'
|
||||
import { getCssVar } from '@/utils/theme'
|
||||
|
||||
@@ -351,12 +361,15 @@ const loadWeeklyData = async () => {
|
||||
// 周统计 - 计算当前周的开始和结束日期
|
||||
const weekStart = getWeekStartDate(currentDate.value)
|
||||
const weekEnd = new Date(weekStart)
|
||||
weekEnd.setDate(weekStart.getDate() + 6)
|
||||
weekEnd.setDate(weekStart.getDate() + 7) // 修改:+7 天,因为 endDate 是不包含的
|
||||
|
||||
// 获取周统计汇总
|
||||
const weekSummaryResult = await getRangeStatistics({
|
||||
startDate: formatDateToString(weekStart),
|
||||
endDate: formatDateToString(weekEnd)
|
||||
const startDateStr = formatDateToString(weekStart)
|
||||
const endDateStr = formatDateToString(weekEnd)
|
||||
|
||||
// 使用新的统一接口获取周统计汇总
|
||||
const weekSummaryResult = await getSummaryByRange({
|
||||
startDate: startDateStr,
|
||||
endDate: endDateStr
|
||||
})
|
||||
|
||||
if (weekSummaryResult?.success && weekSummaryResult.data) {
|
||||
@@ -369,10 +382,10 @@ const loadWeeklyData = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
// 获取周内每日统计
|
||||
const dailyResult = await getWeeklyStatistics({
|
||||
startDate: formatDateToString(weekStart),
|
||||
endDate: formatDateToString(weekEnd)
|
||||
// 使用新的统一接口获取周内每日统计
|
||||
const dailyResult = await getDailyStatisticsByRange({
|
||||
startDate: startDateStr,
|
||||
endDate: endDateStr
|
||||
})
|
||||
|
||||
if (dailyResult?.success && dailyResult.data) {
|
||||
@@ -392,23 +405,23 @@ const loadWeeklyData = async () => {
|
||||
const loadCategoryStatistics = async (year, month) => {
|
||||
try {
|
||||
const categoryYear = year
|
||||
const categoryMonth = month
|
||||
// 如果是年度统计,month应该传0表示查询全年
|
||||
const categoryMonth = currentPeriod.value === 'year' ? 0 : month
|
||||
|
||||
// 对于周统计,使用日期范围进行分类统计
|
||||
if (currentPeriod.value === 'week') {
|
||||
const weekStart = getWeekStartDate(currentDate.value)
|
||||
const weekEnd = new Date(weekStart)
|
||||
weekEnd.setDate(weekStart.getDate() + 6)
|
||||
weekEnd.setHours(23, 59, 59, 999)
|
||||
weekEnd.setDate(weekStart.getDate() + 7) // 修改:+7 天,因为 endDate 是不包含的
|
||||
|
||||
const startDateStr = formatDateToString(weekStart)
|
||||
const endDateStr = formatDateToString(weekEnd)
|
||||
|
||||
// 并发加载支出、收入和不计收支分类(使用日期范围)
|
||||
// 使用新的统一接口并发加载支出、收入和不计收支分类
|
||||
const [expenseResult, incomeResult, noneResult] = await Promise.allSettled([
|
||||
getCategoryStatisticsByDateRange({ startDate: startDateStr, endDate: endDateStr, type: 0 }),
|
||||
getCategoryStatisticsByDateRange({ startDate: startDateStr, endDate: endDateStr, type: 1 }),
|
||||
getCategoryStatisticsByDateRange({ startDate: startDateStr, endDate: endDateStr, type: 2 })
|
||||
getCategoryStatisticsByRange({ startDate: startDateStr, endDate: endDateStr, type: 0 }),
|
||||
getCategoryStatisticsByRange({ startDate: startDateStr, endDate: endDateStr, type: 1 }),
|
||||
getCategoryStatisticsByRange({ startDate: startDateStr, endDate: endDateStr, type: 2 })
|
||||
])
|
||||
|
||||
// 获取图表颜色配置
|
||||
|
||||
Reference in New Issue
Block a user