fix: 全面修复 22 项问题
严重 Bug: - NaN 金额校验绕过(add 页面 parseFloat 空字符串) - 4 个页面补充 waitForReady(add/budget/category-manage/group-manage) - 导出 Loading 遮罩不消失(profile exportData 缺 hideLoading) - Store 吞掉请求错误不 re-throw(transaction/stats/budget/user) - 分类排序 SQL 拼接改参数化查询(category PUT /sort) - 备份接口添加管理员权限检查(backup requireAdmin) 中等问题: - 群组加入竞态条件改为 INSERT IGNORE - 统计页切月/切Tab添加 loadSeq 防竞态 - stats store 补全 loading 状态 + Overview 初始值补全 7 字段 - 保存成功后返回不再弹「放弃修改」确认框 - 群组管理创建/加入添加 saving 双重提交保护 - 预算页添加 onShow 刷新 - 服务端输入校验(name/color/invite_code/微信code) UI/样式: - 触摸目标: bell/nav-back/nav-save→88rpx, avatar-badge→64rpx, action-btn→80rpx - :active 反馈: bell/profile-card/identity-card/id-manage/arrow/action-btn/group-btn/cat-info - 内联样式改动态绑定(4处 spacer 使用 capsuleRight) - FAB 文字+改用 Icon 组件 - prefers-reduced-motion 动画降级(Skeleton/profile/budget/add) - 胶囊适配(add/category-manage/group-manage) - CategoryIcon !important 改为 iconStyle 计算属性 文档: - CLAUDE.md 补充 SaveSuccess/ChartWrapper 组件 + category/budget/index API
This commit is contained in:
@@ -16,8 +16,9 @@ export const useBudgetStore = defineStore('budget', () => {
|
||||
try {
|
||||
const groupStore = useGroupStore()
|
||||
budget.value = await api.getBudget(month || getCurrentMonth(), groupStore.currentGroupId)
|
||||
} catch {
|
||||
} catch (err) {
|
||||
budget.value = null
|
||||
throw err
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
@@ -10,11 +10,13 @@ export type CategoryStat = api.CategoryStat
|
||||
export type TrendPoint = api.TrendPoint
|
||||
|
||||
export const useStatsStore = defineStore('stats', () => {
|
||||
const overview = ref<api.Overview>({ expense: 0, income: 0, count: 0, daily: 0 })
|
||||
const overview = ref<api.Overview>({ expense: 0, income: 0, expenseCount: 0, incomeCount: 0, count: 0, daily: 0, dailyIncome: 0 })
|
||||
const categoryStats = ref<api.CategoryStat[]>([])
|
||||
const trendData = ref<api.TrendPoint[]>([])
|
||||
const loading = ref(false)
|
||||
|
||||
async function fetchOverview(month?: string) {
|
||||
loading.value = true
|
||||
try {
|
||||
const groupStore = useGroupStore()
|
||||
const data = await api.getOverview({
|
||||
@@ -24,11 +26,17 @@ export const useStatsStore = defineStore('stats', () => {
|
||||
overview.value = {
|
||||
expense: Number(data?.expense) || 0,
|
||||
income: Number(data?.income) || 0,
|
||||
expenseCount: Number(data?.expenseCount) || 0,
|
||||
incomeCount: Number(data?.incomeCount) || 0,
|
||||
count: Number(data?.count) || 0,
|
||||
daily: Number(data?.daily) || 0
|
||||
daily: Number(data?.daily) || 0,
|
||||
dailyIncome: Number(data?.dailyIncome) || 0
|
||||
}
|
||||
} catch {
|
||||
overview.value = { expense: 0, income: 0, count: 0, daily: 0 }
|
||||
} catch (err) {
|
||||
overview.value = { expense: 0, income: 0, expenseCount: 0, incomeCount: 0, count: 0, daily: 0, dailyIncome: 0 }
|
||||
throw err
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,8 +49,9 @@ export const useStatsStore = defineStore('stats', () => {
|
||||
amount: Number(item.amount) || 0,
|
||||
count: Number(item.count) || 0
|
||||
})) : []
|
||||
} catch {
|
||||
} catch (err) {
|
||||
categoryStats.value = []
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,10 +63,11 @@ export const useStatsStore = defineStore('stats', () => {
|
||||
...item,
|
||||
amount: Number(item.amount) || 0
|
||||
})) : []
|
||||
} catch {
|
||||
} catch (err) {
|
||||
trendData.value = []
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
return { overview, categoryStats, trendData, fetchOverview, fetchCategoryStats, fetchTrend }
|
||||
return { overview, categoryStats, trendData, loading, fetchOverview, fetchCategoryStats, fetchTrend }
|
||||
})
|
||||
|
||||
@@ -21,9 +21,10 @@ export const useTransactionStore = defineStore('transaction', () => {
|
||||
transactions.value = data.list
|
||||
total.value = data.total
|
||||
currentPage.value = data.page
|
||||
} catch {
|
||||
} catch (err) {
|
||||
transactions.value = []
|
||||
total.value = 0
|
||||
throw err
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ export const useUserStore = defineStore('user', () => {
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('[UserStore] fetchUserInfo error:', e)
|
||||
throw e
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user