refactor: remove showFile API for Docker compatibility
Docker 容器内无法调用宿主机文件管理器,移除 showFile 接口: - 移除后端 showFile 路由和处理函数 - 移除前端 showFile 调用和"打开文件位置"按钮 - 移除 opening 状态和 FolderSVG 组件 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -22,7 +22,6 @@ func API() *http.ServeMux {
|
|||||||
router.HandleFunc("/createTask", createTask)
|
router.HandleFunc("/createTask", createTask)
|
||||||
router.HandleFunc("/getActiveTask", getActiveTask)
|
router.HandleFunc("/getActiveTask", getActiveTask)
|
||||||
router.HandleFunc("/getTaskList", getTaskList)
|
router.HandleFunc("/getTaskList", getTaskList)
|
||||||
router.HandleFunc("/showFile", showFile)
|
|
||||||
router.HandleFunc("/getFields", getFields)
|
router.HandleFunc("/getFields", getFields)
|
||||||
router.HandleFunc("/saveFields", saveFields)
|
router.HandleFunc("/saveFields", saveFields)
|
||||||
router.HandleFunc("/logout", logout)
|
router.HandleFunc("/logout", logout)
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -139,39 +137,6 @@ func getTaskList(w http.ResponseWriter, r *http.Request) {
|
|||||||
util.Res{Success: true, Message: "获取成功", Data: tasks}.Write(w)
|
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) {
|
func deleteTask(w http.ResponseWriter, r *http.Request) {
|
||||||
// 支持单个删除(GET 参数 id)和批量删除(POST 参数 ids)
|
// 支持单个删除(GET 参数 id)和批量删除(POST 参数 ids)
|
||||||
var taskIDs []int
|
var taskIDs []int
|
||||||
|
|||||||
@@ -35,11 +35,6 @@ export const getTaskList = async (page: number, pageSize: number): Promise<TaskI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const showFile = async (path: string) => {
|
|
||||||
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 = {
|
type ActiveTask = {
|
||||||
bvid: string
|
bvid: string
|
||||||
|
|||||||
+6
-38
@@ -1,7 +1,7 @@
|
|||||||
import van, { State } from 'vanjs-core'
|
import van, { State } from 'vanjs-core'
|
||||||
import { Route, goto, now } from 'vanjs-router'
|
import { Route, goto, now } from 'vanjs-router'
|
||||||
import { checkLogin, GLOBAL_HAS_LOGIN, GLOBAL_HIDE_PAGE, ResJSON, VanComponent } from '../mixin'
|
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 { TaskInDB, TaskStatus } from '../work/type'
|
||||||
import { LoadingBox } from '../view'
|
import { LoadingBox } from '../view'
|
||||||
import { PlayerModalComp } from './playerModal'
|
import { PlayerModalComp } from './playerModal'
|
||||||
@@ -19,8 +19,6 @@ type TaskItem = TaskInDB & {
|
|||||||
mergeProgress: State<number>
|
mergeProgress: State<number>
|
||||||
/** 任务状态 */
|
/** 任务状态 */
|
||||||
statusState: State<TaskStatus>
|
statusState: State<TaskStatus>
|
||||||
/** 是否正在打开 */
|
|
||||||
opening: State<boolean>
|
|
||||||
/** 是否正在删除 */
|
/** 是否正在删除 */
|
||||||
deleting: State<boolean>
|
deleting: State<boolean>
|
||||||
/** 是否选中 */
|
/** 是否选中 */
|
||||||
@@ -133,7 +131,6 @@ export class TaskRoute implements VanComponent {
|
|||||||
videoProgress: van.state(1),
|
videoProgress: van.state(1),
|
||||||
mergeProgress: van.state(1),
|
mergeProgress: van.state(1),
|
||||||
statusState: van.state(task.status),
|
statusState: van.state(task.status),
|
||||||
opening: van.state(false),
|
|
||||||
deleting: van.state(false),
|
deleting: van.state(false),
|
||||||
selected: 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}`
|
const filename = `${task.title} ${btoa(task.id.toString()).replace(/=/g, '')}${ext}`
|
||||||
|
|
||||||
return div({
|
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,
|
hidden: task.deleting,
|
||||||
},
|
},
|
||||||
// 复选框
|
// 复选框
|
||||||
@@ -216,16 +213,13 @@ export class TaskRoute implements VanComponent {
|
|||||||
${task.statusState.val == 'waiting' || task.statusState.val == 'running'
|
${task.statusState.val == 'waiting' || task.statusState.val == 'running'
|
||||||
? 'text-primary' : ''}`
|
? 'text-primary' : ''}`
|
||||||
},
|
},
|
||||||
() => {
|
div(
|
||||||
if (task.opening.val) return '正在打开文件位置...'
|
|
||||||
return div(
|
|
||||||
span({
|
span({
|
||||||
class: `me-2 badge ${task.downloadType === 'audio' ? 'bg-success' : 'bg-primary'}`,
|
class: `me-2 badge ${task.downloadType === 'audio' ? 'bg-success' : 'bg-primary'}`,
|
||||||
title: task.downloadType === 'audio' ? '音频' : '视频'
|
title: task.downloadType === 'audio' ? '音频' : '视频'
|
||||||
}, task.downloadType === 'audio' ? 'A' : 'V'),
|
}, task.downloadType === 'audio' ? 'A' : 'V'),
|
||||||
span({}, filename),
|
span({}, filename),
|
||||||
)
|
)),
|
||||||
}),
|
|
||||||
div({ class: 'text-secondary small' },
|
div({ class: 'text-secondary small' },
|
||||||
() => {
|
() => {
|
||||||
if (task.statusState.val == 'waiting') return '等待下载'
|
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({
|
div({
|
||||||
class: 'me-4',
|
class: 'me-4',
|
||||||
hidden: task.statusState.val != 'done'
|
hidden: task.statusState.val != 'done'
|
||||||
&& task.statusState.val != 'error'
|
&& task.statusState.val != 'error'
|
||||||
|| task.opening.val
|
|
||||||
|| task.deleting.val
|
|| task.deleting.val
|
||||||
},
|
},
|
||||||
div({
|
div({
|
||||||
@@ -307,6 +280,7 @@ export class TaskRoute implements VanComponent {
|
|||||||
_that.DeleteSVG()
|
_that.DeleteSVG()
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
// 取消按钮
|
||||||
div({
|
div({
|
||||||
class: 'me-4',
|
class: 'me-4',
|
||||||
hidden: task.statusState.val != 'waiting' && task.statusState.val != 'running'
|
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" }),
|
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
|
export default () => new TaskRoute().element
|
||||||
Reference in New Issue
Block a user