chore: update frontend/src/pages/Record/index.tsx
This commit is contained in:
@@ -1,17 +1,8 @@
|
|||||||
import React, { useState, useEffect, useRef, useMemo } from 'react'
|
import React, { useState, useEffect, useRef, useMemo } from 'react'
|
||||||
import { useDataStore } from '../../stores'
|
import { useDataStore } from '../../stores'
|
||||||
|
|
||||||
/**
|
|
||||||
* 记账页面 - Record
|
|
||||||
* 功能:账单明细列表展示、新增/删除账单记录、按类型筛选(全部/支出/收入)
|
|
||||||
* 数据来源:通过 useDataStore 获取 records 列表并执行 CRUD 操作
|
|
||||||
* API 依赖:
|
|
||||||
* - GET /api/records - 获取账单记录列表
|
|
||||||
* - POST /api/records - 创建新账单记录
|
|
||||||
* - DELETE /api/records/:id - 删除账单记录
|
|
||||||
*/
|
|
||||||
const RecordPage: React.FC = () => {
|
const RecordPage: React.FC = () => {
|
||||||
const { records, loading, fetchRecords, createRecord } = useDataStore()
|
const { records, accounts, loading, fetchRecords, fetchAccounts, createRecord } = useDataStore()
|
||||||
// 筛选状态:全部/支出/收入,用于过滤展示
|
// 筛选状态:全部/支出/收入,用于过滤展示
|
||||||
const [filterType, setFilterType] = useState<'all' | 'expense' | 'income'>('all')
|
const [filterType, setFilterType] = useState<'all' | 'expense' | 'income'>('all')
|
||||||
const [showModal, setShowModal] = useState(false)
|
const [showModal, setShowModal] = useState(false)
|
||||||
@@ -23,13 +14,17 @@ const RecordPage: React.FC = () => {
|
|||||||
const PAGE_SIZE = 10; // 每页显示10条记录
|
const PAGE_SIZE = 10; // 每页显示10条记录
|
||||||
const [currentPage, setCurrentPage] = useState(1);
|
const [currentPage, setCurrentPage] = useState(1);
|
||||||
const [isPageChanging, setIsPageChanging] = useState(false);
|
const [isPageChanging, setIsPageChanging] = useState(false);
|
||||||
|
|
||||||
|
// 默认账户:取第一个账户的 ID,若无账户则默认 0(后端会报错提示)
|
||||||
|
const defaultAccountId = accounts.length > 0 ? accounts[0].id : 0
|
||||||
|
|
||||||
const [formData, setFormData] = useState({
|
const [formData, setFormData] = useState({
|
||||||
type: 'expense' as 'expense' | 'income',
|
type: 'expense' as 'expense' | 'income',
|
||||||
category: '餐饮',
|
category: '餐饮',
|
||||||
amount: 0,
|
amount: 0,
|
||||||
date: new Date().toISOString().split('T')[0],
|
date: new Date().toISOString().split('T')[0],
|
||||||
description: '',
|
description: '',
|
||||||
accountId: 3
|
accountId: defaultAccountId
|
||||||
})
|
})
|
||||||
|
|
||||||
const expenseCategories = ['餐饮', '交通', '购物', '娱乐', '医疗', '其他']
|
const expenseCategories = ['餐饮', '交通', '购物', '娱乐', '医疗', '其他']
|
||||||
@@ -37,10 +32,11 @@ const RecordPage: React.FC = () => {
|
|||||||
|
|
||||||
const currentCategories = formData.type === 'expense' ? expenseCategories : incomeCategories
|
const currentCategories = formData.type === 'expense' ? expenseCategories : incomeCategories
|
||||||
|
|
||||||
// 组件挂载时拉取记录列表,供筛选和分页使用
|
// 组件挂载时拉取账户列表和记录列表,供筛选和表单使用
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
fetchAccounts()
|
||||||
fetchRecords()
|
fetchRecords()
|
||||||
}, [fetchRecords])
|
}, [fetchAccounts, fetchRecords])
|
||||||
|
|
||||||
// 使用 useMemo 缓存筛选+排序结果,避免每次渲染重新计算
|
// 使用 useMemo 缓存筛选+排序结果,避免每次渲染重新计算
|
||||||
// 按创建时间降序排列,最新记录在前
|
// 按创建时间降序排列,最新记录在前
|
||||||
@@ -86,7 +82,6 @@ const RecordPage: React.FC = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 表单提交 - 创建记录成功后显示 toast 并重置表单
|
// 表单提交 - 创建记录成功后显示 toast 并重置表单
|
||||||
// accountId 硬编码为 3,后续应从用户上下文动态获取
|
|
||||||
const handleSubmit = async (e: React.FormEvent) => {
|
const handleSubmit = async (e: React.FormEvent) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
try {
|
try {
|
||||||
@@ -100,7 +95,7 @@ const RecordPage: React.FC = () => {
|
|||||||
amount: 0,
|
amount: 0,
|
||||||
date: new Date().toISOString().split('T')[0],
|
date: new Date().toISOString().split('T')[0],
|
||||||
description: '',
|
description: '',
|
||||||
accountId: 3
|
accountId: defaultAccountId
|
||||||
})
|
})
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to create record:', error)
|
console.error('Failed to create record:', error)
|
||||||
|
|||||||
Reference in New Issue
Block a user