From cc5563bff2a42bba872d358a9c47b68774d81b80 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Thu, 4 Dec 2025 16:13:13 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=8A=E4=BC=A0=EF=BC=8C=E8=87=AA=E5=B8=A6=E5=8E=BB?= =?UTF-8?q?=E9=87=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/admin/page.tsx | 128 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 1b93c49..a4ed081 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -3210,6 +3210,83 @@ const ConfigFileComponent = ({ config, refreshConfig }: { config: AdminConfig | }); }; + // 处理文件上传 + const handleFileUpload = async (event: React.ChangeEvent) => { + const file = event.target.files?.[0]; + if (!file) return; + + // 检查文件类型 + if (!file.name.toLowerCase().endsWith('.json')) { + showError('请上传JSON格式的文件', showAlert); + return; + } + + await withLoading('uploadConfig', async () => { + try { + const fileContent = await file.text(); + + // 验证JSON格式 + let parsedConfig; + try { + parsedConfig = JSON.parse(fileContent); + } catch (parseError) { + showError('JSON格式错误,请检查文件内容', showAlert); + return; + } + + // 检查是否包含api_site字段 + if (!parsedConfig.api_site) { + showError('配置文件必须包含api_site字段', showAlert); + return; + } + + // 根据api字段进行去重 + const existingConfig = configContent ? JSON.parse(configContent) : { api_site: {} }; + const existingApis = new Set(); + + // 收集现有配置中的所有api + Object.values(existingConfig.api_site || {}).forEach((site: any) => { + if (site.api) { + existingApis.add(site.api); + } + }); + + // 合并新配置,去重处理 + const mergedApiSite = { ...existingConfig.api_site }; + let duplicateCount = 0; + + Object.entries(parsedConfig.api_site || {}).forEach(([key, site]: [string, any]) => { + if (site.api && existingApis.has(site.api)) { + duplicateCount++; + // 跳过重复的api + return; + } + mergedApiSite[key] = site; + }); + + const mergedConfig = { + ...parsedConfig, + api_site: mergedApiSite + }; + + // 更新配置内容 + setConfigContent(JSON.stringify(mergedConfig, null, 2)); + + const message = duplicateCount > 0 + ? `配置上传成功,跳过了 ${duplicateCount} 个重复的API` + : '配置上传成功'; + showSuccess(message, showAlert); + + } catch (err) { + showError(err instanceof Error ? err.message : '文件上传失败', showAlert); + throw err; + } + }); + + // 清空文件输入 + event.target.value = ''; + }; + // 保存配置文件 const handleSave = async () => { await withLoading('saveConfig', async () => { @@ -3350,6 +3427,57 @@ const ConfigFileComponent = ({ config, refreshConfig }: { config: AdminConfig | /> + {/* 文件上传区域 */} +
+
+ +
+ 支持根据API字段自动去重 +
+
+
+ + +
+

+ 上传的JSON配置将自动合并到当前配置,重复的API地址将被自动过滤 +

+
+
支持 JSON 格式,用于配置视频源和自定义分类