refactor: API 请求整合与 Bug 修复
前端重构: - 新增 api/ 目录统一管理所有 API 请求 - 所有 stores 和 pages 改为使用 api 模块 - 修复日期格式化函数,支持 Date 对象和 ISO 字符串 - 修复 TransactionItem 使用 CategoryIcon 组件 - 优化 ChartWrapper 区分 H5 和小程序环境 后端修复: - 修复 auth 中间件 PUBLIC_PATHS 缺少 demo-login - 修复备份工具命令注入漏洞,改用 execFile - 修复 stats 路由 type 参数验证 - 优化分类排序为批量 SQL 更新 - 合并迁移和删除为数据库事务原子操作 - 修复交易和统计日期返回格式 - 新增自动备份功能(启动时备份)
This commit is contained in:
@@ -1,40 +1,21 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref } from 'vue'
|
||||
import { request } from '@/utils/request'
|
||||
import * as api from '@/api/stats'
|
||||
import { getCurrentMonth } from '@/utils/format'
|
||||
|
||||
export interface Overview {
|
||||
expense: number
|
||||
income: number
|
||||
count: number
|
||||
daily: number
|
||||
}
|
||||
|
||||
export interface CategoryStat {
|
||||
id: number
|
||||
name: string
|
||||
icon: string
|
||||
color: string
|
||||
amount: number
|
||||
count: number
|
||||
}
|
||||
|
||||
export interface TrendPoint {
|
||||
date: string
|
||||
amount: number
|
||||
}
|
||||
// 重新导出类型以保持向后兼容
|
||||
export type Overview = api.Overview
|
||||
export type CategoryStat = api.CategoryStat
|
||||
export type TrendPoint = api.TrendPoint
|
||||
|
||||
export const useStatsStore = defineStore('stats', () => {
|
||||
const overview = ref<Overview>({ expense: 0, income: 0, count: 0, daily: 0 })
|
||||
const categoryStats = ref<CategoryStat[]>([])
|
||||
const trendData = ref<TrendPoint[]>([])
|
||||
const overview = ref<api.Overview>({ expense: 0, income: 0, count: 0, daily: 0 })
|
||||
const categoryStats = ref<api.CategoryStat[]>([])
|
||||
const trendData = ref<api.TrendPoint[]>([])
|
||||
|
||||
async function fetchOverview(month?: string) {
|
||||
try {
|
||||
overview.value = await request<Overview>({
|
||||
url: '/stats/overview',
|
||||
data: { month: month || getCurrentMonth() }
|
||||
})
|
||||
overview.value = await api.getOverview({ month: month || getCurrentMonth() })
|
||||
} catch {
|
||||
overview.value = { expense: 0, income: 0, count: 0, daily: 0 }
|
||||
}
|
||||
@@ -42,10 +23,7 @@ export const useStatsStore = defineStore('stats', () => {
|
||||
|
||||
async function fetchCategoryStats(month?: string, type: string = 'expense') {
|
||||
try {
|
||||
categoryStats.value = await request<CategoryStat[]>({
|
||||
url: '/stats/category',
|
||||
data: { month: month || getCurrentMonth(), type }
|
||||
})
|
||||
categoryStats.value = await api.getCategoryStats(month || getCurrentMonth(), type)
|
||||
} catch {
|
||||
categoryStats.value = []
|
||||
}
|
||||
@@ -53,10 +31,7 @@ export const useStatsStore = defineStore('stats', () => {
|
||||
|
||||
async function fetchTrend(month?: string, type: string = 'expense') {
|
||||
try {
|
||||
trendData.value = await request<TrendPoint[]>({
|
||||
url: '/stats/trend',
|
||||
data: { month: month || getCurrentMonth(), type }
|
||||
})
|
||||
trendData.value = await api.getTrend(month || getCurrentMonth(), type)
|
||||
} catch {
|
||||
trendData.value = []
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user