import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { toast } from 'react-hot-toast'; import { Database, Table as TableIcon, Edit3, Trash2, RefreshCw, Search, X } from 'lucide-react'; const DatabaseManager = ({ adminToken }) => { const [loading, setLoading] = useState(false); const [tables, setTables] = useState([]); const [selectedTable, setSelectedTable] = useState(''); const [tableData, setTableData] = useState([]); const [tableColumns, setTableColumns] = useState([]); const [searchTerm, setSearchTerm] = useState(''); const [editingRecord, setEditingRecord] = useState(null); const [editFormData, setEditFormData] = useState({}); useEffect(() => { fetchTables(); }, []); useEffect(() => { if (selectedTable) { fetchTableData(selectedTable); } }, [selectedTable]); const fetchTables = async () => { setLoading(true); try { const response = await axios.get('/api/admin/database/tables', { headers: { Authorization: `Bearer ${adminToken}` } }); setTables(response.data.tables); if (response.data.tables.length > 0 && !selectedTable) { setSelectedTable(response.data.tables[0]); } } catch (error) { toast.error('获取表列表失败'); console.error('Error fetching tables:', error); } finally { setLoading(false); } }; const fetchTableData = async (tableName) => { setLoading(true); try { const response = await axios.get(`/api/admin/database/${tableName}`, { headers: { Authorization: `Bearer ${adminToken}` } }); // 后端返回的是 items,不是 records const records = response.data.items || response.data.records || []; setTableData(records); if (records.length > 0) { setTableColumns(Object.keys(records[0])); } else { setTableColumns([]); } } catch (error) { toast.error('获取表数据失败'); console.error('Error fetching table data:', error); } finally { setLoading(false); } }; const handleEditRecord = (record) => { setEditingRecord(record); setEditFormData({ ...record }); }; const handleSaveEdit = async () => { if (!editingRecord || !editingRecord.id) { toast.error('无效的记录ID'); return; } try { await axios.put( `/api/admin/database/${selectedTable}/${editingRecord.id}`, editFormData, { headers: { Authorization: `Bearer ${adminToken}` } } ); toast.success('记录更新成功'); setEditingRecord(null); setEditFormData({}); fetchTableData(selectedTable); } catch (error) { toast.error(error.response?.data?.detail || '更新记录失败'); } }; const handleDeleteRecord = async (recordId) => { if (!window.confirm('确定要删除这条记录吗?此操作不可撤销。')) { return; } try { await axios.delete(`/api/admin/database/${selectedTable}/${recordId}`, { headers: { Authorization: `Bearer ${adminToken}` } }); toast.success('记录已删除'); fetchTableData(selectedTable); } catch (error) { toast.error('删除记录失败'); } }; const formatValue = (value) => { if (value === null || value === undefined) return '-'; if (typeof value === 'boolean') return value ? '是' : '否'; if (typeof value === 'string' && value.length > 50) { return value.substring(0, 50) + '...'; } return String(value); }; const filteredData = tableData.filter(record => { if (!searchTerm) return true; return Object.values(record).some(value => String(value).toLowerCase().includes(searchTerm.toLowerCase()) ); }); const getTableNameInChinese = (tableName) => { const nameMap = { 'users': '用户表', 'optimization_sessions': '优化会话表', 'optimization_segments': '优化段落表', 'system_settings': '系统设置表', 'card_keys': '卡密表', 'session_history': '会话历史表' }; return nameMap[tableName] || tableName; }; if (loading && !tableData.length) { return (
); } return (
{/* 表选择器 */}

数据库管理

{/* 搜索框 */}
setSearchTerm(e.target.value)} placeholder="搜索记录..." className="w-full pl-10 pr-4 py-2.5 bg-gray-50 border border-gray-200 rounded-xl focus:bg-white focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 transition-all text-sm" />
{/* 数据表格 */}
{tableData.length === 0 ? (

该表暂无数据

) : (
{tableColumns.map(column => ( ))} {filteredData.map((record, index) => ( {tableColumns.map(column => ( ))} ))}
{column} 操作
{formatValue(record[column])}
)}
共 {filteredData.length} 条记录
{/* 编辑弹窗 */} {editingRecord && (

编辑记录

{tableColumns.map(column => (
{column === 'id' ? ( ) : typeof editFormData[column] === 'boolean' ? ( ) : ( setEditFormData({ ...editFormData, [column]: e.target.value }) } className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" /> )}
))}
)}
); }; export default DatabaseManager;