From 2a3dc99a7a25e6f54e5a0ca4f5030fa560f4569d Mon Sep 17 00:00:00 2001 From: yw1573 Date: Thu, 9 Apr 2026 18:11:56 +0800 Subject: [PATCH] refactor: remove showFile API for Docker compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Docker 容器内无法调用宿主机文件管理器,移除 showFile 接口: - 移除后端 showFile 路由和处理函数 - 移除前端 showFile 调用和"打开文件位置"按钮 - 移除 opening 状态和 FolderSVG 组件 Co-Authored-By: Claude Opus 4.6 --- internal/router/router.go | 1 - internal/router/task.go | 35 ------------------------- web/src/task/data.ts | 5 ---- web/src/task/index.ts | 54 ++++++++------------------------------- 4 files changed, 11 insertions(+), 84 deletions(-) diff --git a/internal/router/router.go b/internal/router/router.go index 94c8988..5d63da2 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -22,7 +22,6 @@ func API() *http.ServeMux { router.HandleFunc("/createTask", createTask) router.HandleFunc("/getActiveTask", getActiveTask) router.HandleFunc("/getTaskList", getTaskList) - router.HandleFunc("/showFile", showFile) router.HandleFunc("/getFields", getFields) router.HandleFunc("/saveFields", saveFields) router.HandleFunc("/logout", logout) diff --git a/internal/router/task.go b/internal/router/task.go index 6d3a7fa..f646e00 100644 --- a/internal/router/task.go +++ b/internal/router/task.go @@ -4,8 +4,6 @@ import ( "encoding/json" "fmt" "net/http" - "os/exec" - "runtime" "strconv" "time" @@ -139,39 +137,6 @@ func getTaskList(w http.ResponseWriter, r *http.Request) { util.Res{Success: true, Message: "获取成功", Data: tasks}.Write(w) } -// showFile 调用 Explorer 查看文件位置 -func showFile(w http.ResponseWriter, r *http.Request) { - if err := r.ParseForm(); err != nil { - util.Res{Success: false, Message: "参数错误"}.Write(w) - return - } - filePath := r.FormValue("filePath") - - var cmd *exec.Cmd - - // 根据操作系统选择命令 - switch runtime.GOOS { - case "windows": - // Windows 使用 explorer - cmd = exec.Command("explorer", "/select,", filePath) - case "darwin": - // macOS 使用 open - cmd = exec.Command("open", "-R", filePath) - case "linux": - // Linux 使用 xdg-open - cmd = exec.Command("xdg-open", filePath) - default: - util.Res{Success: false, Message: "不支持的操作系统"}.Write(w) - return - } - err := cmd.Start() - if err != nil { - util.Res{Success: false, Message: err.Error()}.Write(w) - return - } - util.Res{Success: true, Message: "操作成功"}.Write(w) -} - func deleteTask(w http.ResponseWriter, r *http.Request) { // 支持单个删除(GET 参数 id)和批量删除(POST 参数 ids) var taskIDs []int diff --git a/web/src/task/data.ts b/web/src/task/data.ts index 034d01d..d8245ef 100644 --- a/web/src/task/data.ts +++ b/web/src/task/data.ts @@ -35,11 +35,6 @@ export const getTaskList = async (page: number, pageSize: number): Promise { - const res = await fetch(`/api/showFile?filePath=${encodeURIComponent(path)}`).then(res => res.json()) as ResJSON - if (!res.success) throw new Error(res.message) -} - /** 用于刷新任务实时进度 */ type ActiveTask = { bvid: string diff --git a/web/src/task/index.ts b/web/src/task/index.ts index 38c33a4..c4c468a 100644 --- a/web/src/task/index.ts +++ b/web/src/task/index.ts @@ -1,7 +1,7 @@ import van, { State } from 'vanjs-core' import { Route, goto, now } from 'vanjs-router' import { checkLogin, GLOBAL_HAS_LOGIN, GLOBAL_HIDE_PAGE, ResJSON, VanComponent } from '../mixin' -import { deleteTask, getActiveTask, getTaskList, showFile, cancelTask, deleteTasks, cancelTasks } from './data' +import { deleteTask, getActiveTask, getTaskList, cancelTask, deleteTasks, cancelTasks } from './data' import { TaskInDB, TaskStatus } from '../work/type' import { LoadingBox } from '../view' import { PlayerModalComp } from './playerModal' @@ -19,8 +19,6 @@ type TaskItem = TaskInDB & { mergeProgress: State /** 任务状态 */ statusState: State - /** 是否正在打开 */ - opening: State /** 是否正在删除 */ deleting: State /** 是否选中 */ @@ -133,7 +131,6 @@ export class TaskRoute implements VanComponent { videoProgress: van.state(1), mergeProgress: van.state(1), statusState: van.state(task.status), - opening: van.state(false), deleting: van.state(false), selected: van.state(false) })) @@ -184,7 +181,7 @@ export class TaskRoute implements VanComponent { const filename = `${task.title} ${btoa(task.id.toString()).replace(/=/g, '')}${ext}` return div({ - class: () => `list-group-item p-0 hstack user-select-none ${task.statusState.val != 'done' && task.statusState.val != 'error' || task.opening.val ? 'disabled' : ''}`, + class: () => `list-group-item p-0 hstack user-select-none ${task.statusState.val != 'done' && task.statusState.val != 'error' ? 'disabled' : ''}`, hidden: task.deleting, }, // 复选框 @@ -216,16 +213,13 @@ export class TaskRoute implements VanComponent { ${task.statusState.val == 'waiting' || task.statusState.val == 'running' ? 'text-primary' : ''}` }, - () => { - if (task.opening.val) return '正在打开文件位置...' - return div( - span({ - class: `me-2 badge ${task.downloadType === 'audio' ? 'bg-success' : 'bg-primary'}`, - title: task.downloadType === 'audio' ? '音频' : '视频' - }, task.downloadType === 'audio' ? 'A' : 'V'), - span({}, filename), - ) - }), + div( + span({ + class: `me-2 badge ${task.downloadType === 'audio' ? 'bg-success' : 'bg-primary'}`, + title: task.downloadType === 'audio' ? '音频' : '视频' + }, task.downloadType === 'audio' ? 'A' : 'V'), + span({}, filename), + )), div({ class: 'text-secondary small' }, () => { if (task.statusState.val == 'waiting') return '等待下载' @@ -263,32 +257,11 @@ export class TaskRoute implements VanComponent { }), ) ), - // 操作按钮 - div({ - class: 'me-4', - hidden: task.statusState.val != 'done' - || task.opening.val - || task.deleting.val - }, - div({ - class: 'hover-btn', title: '打开文件位置', - onclick(event: Event) { - event.stopPropagation() - showFile(`${task.folder}\\${filename}`) - task.opening.val = true - setTimeout(() => { - task.opening.val = false - }, 3000) - } - }, - _that.FolderSVG() - ) - ), + // 删除按钮 div({ class: 'me-4', hidden: task.statusState.val != 'done' && task.statusState.val != 'error' - || task.opening.val || task.deleting.val }, div({ @@ -307,6 +280,7 @@ export class TaskRoute implements VanComponent { _that.DeleteSVG() ) ), + // 取消按钮 div({ class: 'me-4', hidden: task.statusState.val != 'waiting' && task.statusState.val != 'running' @@ -341,12 +315,6 @@ export class TaskRoute implements VanComponent { path({ "d": "M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708" }), ) } - - FolderSVG() { - return svg({ style: `width: 1em; height: 1em`, fill: "currentColor", class: "bi bi-folder2", viewBox: "0 0 16 16" }, - path({ "d": "M1 3.5A1.5 1.5 0 0 1 2.5 2h2.764c.958 0 1.76.56 2.311 1.184C7.985 3.648 8.48 4 9 4h4.5A1.5 1.5 0 0 1 15 5.5v7a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 1 12.5zM2.5 3a.5.5 0 0 0-.5.5V6h12v-.5a.5.5 0 0 0-.5-.5H9c-.964 0-1.71-.629-2.174-1.154C6.374 3.334 5.82 3 5.264 3zM14 7H2v5.5a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5z" }), - ) - } } export default () => new TaskRoute().element \ No newline at end of file