perf: 性能优化与代码质量改进

- 简化ToastProvider组件,移除未使用导入
- 简化Stats页面代码
- 添加React ESLint配置
- 添加数据库索引和API参数验证
- 清理重复文件server.js.backup
- 移除前端未使用的UI代码和复杂样式

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-03-23 16:43:03 +08:00
co-authored by Claude Opus 4.6
parent 3975bbed73
commit 63c97ab31a
9 changed files with 43 additions and 859 deletions
+17 -12
View File
@@ -7,7 +7,7 @@ import RecordModal from '../components/RecordModal';
import { useToast } from '../components/ToastProvider';
import { useConfirm } from '../components/ConfirmProvider';
import { useCategories } from '../hooks/useCategories';
import { getMonthStr, formatMoney, formatMonth, parseDateTime, getDatePart } from '../lib/utils';
import { getMonthStr, formatMoney, formatMonth, parseDateTime, getDatePart, formatDate, getCurrentTimeStr } from '../lib/utils';
export default function Home() {
const router = useRouter();
@@ -31,12 +31,13 @@ export default function Home() {
showToast('分类加载失败', { tone: 'error' });
}
}, [categoriesError]);
const [formData, setFormData] = useState({
type: 'expense',
amount: '',
category: '',
date: new Date().toISOString().split('T')[0],
time: new Date().toTimeString().slice(0, 5),
date: formatDate(new Date()),
time: getCurrentTimeStr(),
note: '',
});
@@ -53,8 +54,8 @@ export default function Home() {
type: 'expense',
amount: '',
category: '',
date: new Date().toISOString().split('T')[0],
time: new Date().toTimeString().slice(0, 5),
date: formatDate(new Date()),
time: getCurrentTimeStr(),
note: '',
});
@@ -206,12 +207,16 @@ export default function Home() {
[groupedRecords]
);
const getDayExpense = (date) => {
const dayRecords = groupedRecords[date] || [];
return dayRecords
.filter((record) => record.type === 'expense')
.reduce((sum, record) => sum + record.amount, 0);
};
const dayExpenses = useMemo(() => {
const expenses = {};
for (const date of Object.keys(groupedRecords)) {
const dayRecords = groupedRecords[date] || [];
expenses[date] = dayRecords
.filter((record) => record.type === 'expense')
.reduce((sum, record) => sum + record.amount, 0);
}
return expenses;
}, [groupedRecords]);
const homeHeaderContent = (
<div className="header-center-container">
@@ -297,7 +302,7 @@ export default function Home() {
<div key={date} className="date-group">
<div className="date-label">
<span>{new Date(date).toLocaleDateString('zh-CN', { month: 'short', day: 'numeric', weekday: 'short' })}</span>
<span className="day-expense">支出 {formatMoney(getDayExpense(date))}</span>
<span className="day-expense">支出 {formatMoney(dayExpenses[date] || 0)}</span>
</div>
{groupedRecords[date].map((record) => {
const icon = categoryIconMap[`${record.type}:${record.category}`] || '📝';