From 25df4203d72486a2542b24940c7e6cb331eeda41 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Sun, 5 Jul 2026 23:46:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=BB=98=E8=AE=A4=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E5=88=86=E4=BF=9D=E5=AD=98=E6=9C=AC=E5=9C=B0=E5=92=8C=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E4=B8=83=E7=89=9B=E4=BA=91=E4=B8=A4=E4=B8=AA=E6=8C=89?= =?UTF-8?q?=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/api/controller/ScriptController.java | 17 +++++++++-- .../par/core/adapter/GroovyScriptEngine.java | 30 ++++++++++++------- web/src/views/AccessResults.vue | 30 +++++++++---------- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/par-api/src/main/java/com/par/api/controller/ScriptController.java b/par-api/src/main/java/com/par/api/controller/ScriptController.java index 323ea85..9463cd1 100644 --- a/par-api/src/main/java/com/par/api/controller/ScriptController.java +++ b/par-api/src/main/java/com/par/api/controller/ScriptController.java @@ -73,8 +73,8 @@ public class ScriptController { return ApiResponse.success(Map.of("siteType", siteType, "script", script != null ? script : "")); } - /** 保存站点类型默认脚本(管理员) */ - @PutMapping("/api/v1/admin/scripts/default/{siteType}") + /** 保存站点类型默认脚本到本地 */ + @PutMapping("/api/v1/admin/scripts/default/{siteType}/save") public ApiResponse saveDefaultScript( @PathVariable String siteType, @RequestBody Map payload, @@ -82,6 +82,19 @@ public class ScriptController { checkAdmin(request); String script = payload.get("script"); if (script == null || script.isBlank()) return ApiResponse.error(400, "script is required"); + GroovyScriptEngine.saveDefaultLocal(siteType, script); + return ApiResponse.success(); + } + + /** 上传站点类型默认脚本到七牛云 */ + @PutMapping("/api/v1/admin/scripts/default/{siteType}/upload") + public ApiResponse uploadDefaultScript( + @PathVariable String siteType, + @RequestBody Map payload, + HttpServletRequest request) { + checkAdmin(request); + String script = payload.get("script"); + if (script == null || script.isBlank()) return ApiResponse.error(400, "script is required"); GroovyScriptEngine.saveDefaultScript(siteType, script); return ApiResponse.success(); } diff --git a/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java b/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java index 8b87440..71e7ddd 100644 --- a/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java +++ b/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java @@ -53,7 +53,24 @@ public class GroovyScriptEngine { } /** - * 保存站点类型默认脚本到七牛云+本地缓存 + * 保存默认脚本到本地文件(不上传七牛云) + */ + public static void saveDefaultLocal(String siteType, String script) { + if (siteType == null || script == null) return; + String key = siteType.toLowerCase(); + DEFAULT_SCRIPTS_CACHE.put(key, script); + try { + var path = java.nio.file.Paths.get( + GroovyScriptEngine.class.getClassLoader().getResource("scripts/default-" + key + ".groovy").toURI()); + java.nio.file.Files.writeString(path, script, java.nio.charset.StandardCharsets.UTF_8); + log.info("Default script saved locally: default-{}.groovy", key); + } catch (Exception e) { + log.warn("Local save failed: {}", e.getMessage()); + } + } + + /** + * 上传默认脚本到七牛云+本地缓存 */ public static void saveDefaultScript(String siteType, String script) { if (siteType == null || script == null) return; @@ -61,17 +78,8 @@ public class GroovyScriptEngine { DEFAULT_SCRIPTS_CACHE.put(key, script); if (storageService != null) { storageService.store(DEFAULT_SCRIPTS_PATH + key + ".groovy", script); - } else { - // 回退到 classpath 写入(开发环境) - try { - var path = java.nio.file.Paths.get( - GroovyScriptEngine.class.getClassLoader().getResource("scripts/default-" + key + ".groovy").toURI()); - java.nio.file.Files.writeString(path, script, java.nio.charset.StandardCharsets.UTF_8); - } catch (Exception e) { - log.warn("Fallback save failed: {}", e.getMessage()); - } } - log.info("Default script saved: default-{}.groovy", key); + log.info("Default script uploaded: default-{}.groovy", key); } /** diff --git a/web/src/views/AccessResults.vue b/web/src/views/AccessResults.vue index d343223..b037b4f 100644 --- a/web/src/views/AccessResults.vue +++ b/web/src/views/AccessResults.vue @@ -21,7 +21,8 @@ @@ -106,7 +107,7 @@ const sites = ref([]) const defaultTypes = ['nexusphp','mtorrent','gazelle','unit3d'] const defaultEditorVisible = ref(false), defaultViewVisible = ref(false) const editingDefaultType = ref(''), viewingDefaultType = ref(''), viewingDefaultScript = ref('') -const defaultScriptContent = ref(''), defaultSaving = ref(false) +const defaultScriptContent = ref(''), defaultSaving = ref(false), defaultUploading = ref(false) const editDefaultScript = async (type) => { editingDefaultType.value = type @@ -118,25 +119,24 @@ const editDefaultScript = async (type) => { } catch { ElMessage.error('加载默认脚本失败') } } -const viewDefaultScript = async (type) => { - viewingDefaultType.value = type - viewingDefaultScript.value = '加载中...' - defaultViewVisible.value = true - try { - const r = await api.raw.get('/admin/scripts/default/' + type) - viewingDefaultScript.value = (r.data||r||{}).script || (r||{}).script || '(空)' - } catch { viewingDefaultScript.value = '加载失败' } -} - -const saveDefaultScript = async () => { +const saveDefaultLocal = async () => { defaultSaving.value = true try { - await api.raw.put('/admin/scripts/default/' + editingDefaultType.value, { script: defaultScriptContent.value }) - ElMessage.success('已保存'); defaultEditorVisible.value = false + await api.raw.put('/admin/scripts/default/' + editingDefaultType.value + '/save', { script: defaultScriptContent.value }) + ElMessage.success('已保存到本地') } catch { ElMessage.error('保存失败') } finally { defaultSaving.value = false } } +const uploadDefaultScript = async () => { + defaultUploading.value = true + try { + await api.raw.put('/admin/scripts/default/' + editingDefaultType.value + '/upload', { script: defaultScriptContent.value }) + ElMessage.success('已上传'); defaultEditorVisible.value = false + } catch { ElMessage.error('上传失败') } + finally { defaultUploading.value = false } +} + const exportScripts = async () => { exporting.value = true try {