refactor: 代码质量优化与安全修复

- 删除根目录重复的 server.js (830行),统一使用模块化的 server/index.js
- 修复 ESLint 错误: 移除未使用变量、修复 const 声明、处理未使用参数
- 修复 React Hooks 依赖警告: 使用 useCallback 包装函数并添加正确依赖项
- SQL LIKE 查询添加特殊字符转义,防止注入风险
- 移除 CSS 中重复的 @keyframes spin 定义

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-03-26 10:49:12 +08:00
co-authored by Claude Opus 4.6
parent 63c97ab31a
commit 98aa39cb1c
11 changed files with 54 additions and 887 deletions
+12 -12
View File
@@ -1,4 +1,4 @@
import { useState, useEffect } from 'react';
import { useState, useEffect, useCallback } from 'react';
import { useRouter } from 'next/router';
import { isLoggedIn, getRecurringBills, createRecurringBill, updateRecurringBill, deleteRecurringBill, applyRecurringBill } from '../lib/api';
import AppShell from '../components/AppShell';
@@ -20,7 +20,7 @@ export default function Recurring() {
if (categoriesError) {
showToast('分类加载失败', { tone: 'error' });
}
}, [categoriesError]);
}, [categoriesError, showToast]);
const [bills, setBills] = useState([]);
const [modalOpen, setModalOpen] = useState(false);
const [editingBill, setEditingBill] = useState(null);
@@ -38,15 +38,7 @@ export default function Recurring() {
is_active: true,
});
useEffect(() => {
if (!isLoggedIn()) {
router.push('/login');
return;
}
loadBills();
}, [router]);
const loadBills = async () => {
const loadBills = useCallback(async () => {
setLoading(true);
try {
const data = await getRecurringBills();
@@ -57,7 +49,15 @@ export default function Recurring() {
} finally {
setLoading(false);
}
};
}, [showToast]);
useEffect(() => {
if (!isLoggedIn()) {
router.push('/login');
return;
}
loadBills();
}, [router, loadBills]);
const openAddModal = () => {
setEditingBill(null);