'use client' import { useState } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' import DataSourceConfigForm from './DataSourceConfigForm' import type { APIEndpoint, DataSource } from '@/types/admin' import { authenticatedFetch } from '@/lib/auth' interface DataSourceManagementProps { endpoint: APIEndpoint onClose: () => void onUpdate: () => void } export default function DataSourceManagement({ endpoint, onClose, onUpdate }: DataSourceManagementProps) { const [showCreateForm, setShowCreateForm] = useState(false) const [editingDataSource, setEditingDataSource] = useState(null) const [formData, setFormData] = useState({ name: '', type: 'manual' as 'lankong' | 'manual' | 'api_get' | 'api_post' | 'endpoint', config: '', cache_duration: 3600, is_active: true }) const createDataSource = async (e: React.FormEvent) => { e.preventDefault() try { // 处理配置数据 let config = formData.config if (formData.type === 'manual') { // 将每行URL转换为JSON格式,过滤掉空行和注释行 const urls = formData.config.split('\n') .map(url => url.trim()) .filter(url => url.length > 0 && !url.startsWith('#')) config = JSON.stringify({ urls }) } const response = await authenticatedFetch(`/api/admin/endpoints/${endpoint.id}/data-sources`, { method: 'POST', body: JSON.stringify({ ...formData, config, endpoint_id: endpoint.id }), }) if (response.ok) { onUpdate() setFormData({ name: '', type: 'manual' as const, config: '', cache_duration: 3600, is_active: true }) setShowCreateForm(false) alert('数据源创建成功') } else { alert('创建数据源失败') } } catch (error) { console.error('Failed to create data source:', error) alert('创建数据源失败') } } const syncDataSource = async (dataSourceId: number) => { try { const response = await authenticatedFetch(`/api/admin/data-sources/${dataSourceId}/sync`, { method: 'POST', }) if (response.ok) { onUpdate() alert('数据源同步成功') } else { alert('数据源同步失败') } } catch (error) { console.error('Failed to sync data source:', error) alert('数据源同步失败') } } const updateDataSource = async (e: React.FormEvent) => { e.preventDefault() if (!editingDataSource) return try { // 处理配置数据 let config = formData.config if (formData.type === 'manual') { // 将每行URL转换为JSON格式,过滤掉空行和注释行 const urls = formData.config.split('\n') .map(url => url.trim()) .filter(url => url.length > 0 && !url.startsWith('#')) config = JSON.stringify({ urls }) } const response = await authenticatedFetch(`/api/admin/data-sources/${editingDataSource.id}`, { method: 'PUT', body: JSON.stringify({ ...formData, config }), }) if (response.ok) { onUpdate() setFormData({ name: '', type: 'manual' as const, config: '', cache_duration: 3600, is_active: true }) setEditingDataSource(null) alert('数据源更新成功') } else { alert('更新数据源失败') } } catch (error) { console.error('Failed to update data source:', error) alert('更新数据源失败') } } const startEditDataSource = (dataSource: DataSource) => { setEditingDataSource(dataSource) // 处理配置数据回显 let config = dataSource.config if (dataSource.type === 'manual') { try { // 将JSON格式转换为每行一个URL的格式 const parsed = JSON.parse(dataSource.config) if (parsed.urls && Array.isArray(parsed.urls)) { config = parsed.urls.join('\n') } } catch (error) { console.error('Failed to parse manual config:', error) // 如果解析失败,保持原始配置 } } setFormData({ name: dataSource.name, type: dataSource.type, config: config, cache_duration: dataSource.cache_duration, is_active: dataSource.is_active }) setShowCreateForm(false) // 关闭创建表单 } const cancelEdit = () => { setEditingDataSource(null) setFormData({ name: '', type: 'manual' as const, config: '', cache_duration: 3600, is_active: true }) } const deleteDataSource = async (dataSourceId: number) => { if (!confirm('确定要删除这个数据源吗?')) { return } try { const response = await authenticatedFetch(`/api/admin/data-sources/${dataSourceId}`, { method: 'DELETE', }) if (response.ok) { onUpdate() alert('数据源删除成功') } else { alert('数据源删除失败') } } catch (error) { console.error('Failed to delete data source:', error) alert('数据源删除失败') } } const getTypeDisplayName = (type: string) => { switch (type) { case 'manual': return '手动' case 'lankong': return '兰空图床' case 'api_get': return 'GET接口' case 'api_post': return 'POST接口' case 'endpoint': return '已有端点' default: return type } } return (

管理数据源 - {endpoint.name}

数据源列表

{(showCreateForm || editingDataSource) && (
{editingDataSource ? '编辑数据源' : '创建新数据源'}
setFormData({ ...formData, name: e.target.value })} required />
setFormData({ ...formData, config })} />
setFormData({ ...formData, cache_duration: parseInt(e.target.value) || 0 })} min="0" />

设置为0表示不缓存,建议设置3600秒(1小时)以上

setFormData({ ...formData, is_active: checked })} />
)}
名称 类型 状态 缓存时长 最后同步 操作 {endpoint.data_sources && endpoint.data_sources.length > 0 ? ( endpoint.data_sources.map((dataSource) => ( {dataSource.name} {getTypeDisplayName(dataSource.type)} {dataSource.is_active ? '启用' : '禁用'} {dataSource.cache_duration > 0 ? `${dataSource.cache_duration}秒` : '不缓存'} {dataSource.last_sync ? new Date(dataSource.last_sync).toLocaleString() : '未同步'}
)) ) : ( 暂无数据源,点击"添加数据源"开始配置 )}
) }