From 404a1a4bfe6f89d799ad299145307f053d5936c5 Mon Sep 17 00:00:00 2001 From: duorameng <2997944583@qq.com> Date: Thu, 30 Apr 2026 15:44:45 +0800 Subject: [PATCH] feat: add task running status #88 --- internal/models/task.go | 7 +++ internal/models/vo/task_vo.go | 7 +++ internal/utils/shell.go | 82 ++++++++++++++++++++++------------- web/src/api/index.ts | 1 + web/src/views/tasks/Tasks.vue | 14 ++++-- 5 files changed, 76 insertions(+), 35 deletions(-) diff --git a/internal/models/task.go b/internal/models/task.go index 5e0f566..0b894ae 100644 --- a/internal/models/task.go +++ b/internal/models/task.go @@ -99,6 +99,13 @@ type Task struct { UpdatedAt LocalTime `json:"updated_at"` } +func (t *Task) IsRunning() bool { + if string(t.RunningGo) == "" || string(t.RunningGo) == "[]" { + return false + } + return true +} + func (Task) TableName() string { return constant.TablePrefix + "tasks" } diff --git a/internal/models/vo/task_vo.go b/internal/models/vo/task_vo.go index a5d86c7..4370eb3 100644 --- a/internal/models/vo/task_vo.go +++ b/internal/models/vo/task_vo.go @@ -32,6 +32,7 @@ type TaskVO struct { NextRun *models.LocalTime `json:"next_run"` CreatedAt models.LocalTime `json:"created_at"` UpdatedAt models.LocalTime `json:"updated_at"` + RunningStatus string `json:"running_status"` } // ToTaskVO 将 Task 模型转换为 TaskVO @@ -64,6 +65,12 @@ func ToTaskVO(task *models.Task) *TaskVO { NextRun: task.NextRun, CreatedAt: task.CreatedAt, UpdatedAt: task.UpdatedAt, + RunningStatus: func() string { + if task.IsRunning() { + return "running" + } + return "idle" + }(), } } diff --git a/internal/utils/shell.go b/internal/utils/shell.go index 56a6c5e..9a39093 100644 --- a/internal/utils/shell.go +++ b/internal/utils/shell.go @@ -5,45 +5,65 @@ import ( "os/exec" "runtime" "strings" + "sync" ) +var ( + defaultShell string + defaultArgs []string + shellOnce sync.Once +) + + // GetShell 返回当前操作系统的 shell 和参数 func GetShell() (shell string, args []string) { - if runtime.GOOS == "windows" { - return "cmd", []string{} - } - - // 优先使用环境变量中的 SHELL - if envShell := os.Getenv("SHELL"); envShell != "" { - if _, err := os.Stat(envShell); err == nil { - return envShell, []string{} + shellOnce.Do(func() { + if runtime.GOOS == "windows" { + defaultShell = "cmd" + defaultArgs = []string{} + return } - } - // 尝试在 PATH 中查找 bash - if path, err := exec.LookPath("bash"); err == nil { - return path, []string{} - } - - // 尝试在 PATH 中查找 zsh - if path, err := exec.LookPath("zsh"); err == nil { - return path, []string{} - } - - // 尝试在 PATH 中查找 sh - if path, err := exec.LookPath("sh"); err == nil { - return path, []string{} - } - - // 最后回退到最常见的硬编码路径 - shells := []string{"/bin/bash", "/usr/bin/bash", "/bin/sh"} - for _, sh := range shells { - if _, err := os.Stat(sh); err == nil { - return sh, []string{} + // 1. 优先在 PATH 中查找 bash + if path, err := exec.LookPath("bash"); err == nil { + defaultShell = path + defaultArgs = []string{} + return } - } - return "sh", []string{} + // 2. 其次使用环境变量中的 SHELL + if envShell := os.Getenv("SHELL"); envShell != "" { + if _, err := os.Stat(envShell); err == nil { + defaultShell = envShell + defaultArgs = []string{} + return + } + } + + // 3. 尝试在 PATH 中查找 zsh 或 sh + for _, s := range []string{"zsh", "sh"} { + if path, err := exec.LookPath(s); err == nil { + defaultShell = path + defaultArgs = []string{} + return + } + } + + // 4. 最后回退到硬编码路径 + shells := []string{"/usr/bin/bash", "/bin/bash", "/usr/bin/sh", "/bin/sh"} + for _, sh := range shells { + if _, err := os.Stat(sh); err == nil { + defaultShell = sh + defaultArgs = []string{} + return + } + } + + defaultShell = "sh" + defaultArgs = []string{} + }) + + return defaultShell, defaultArgs } // GetShellCommand 返回执行命令的 shell 和参数 diff --git a/web/src/api/index.ts b/web/src/api/index.ts index a951584..c54ea57 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -362,6 +362,7 @@ export interface Task { enabled: boolean last_run: string next_run: string + running_status?: string created_at?: string updated_at?: string } diff --git a/web/src/views/tasks/Tasks.vue b/web/src/views/tasks/Tasks.vue index c28b2c4..334ff64 100644 --- a/web/src/views/tasks/Tasks.vue +++ b/web/src/views/tasks/Tasks.vue @@ -570,8 +570,10 @@ watch(() => route.query.agent_id, (newVal: any) => {
-
#{{ total - (currentPage - 1) * pageSize - index }}
+ class="flex items-center gap-2 px-4 py-1.5 hover:bg-muted/30 transition-colors"> +
+
+
#{{ total - (currentPage - 1) * pageSize - index }}
@@ -664,8 +666,10 @@ watch(() => route.query.agent_id, (newVal: any) => {
-
#{{ total - (currentPage - 1) * pageSize - index }}
+ class="flex items-center gap-2 px-4 py-2.5 hover:bg-muted/30 transition-colors"> +
+
+
#{{ total - (currentPage - 1) * pageSize - index }}
@@ -732,6 +736,8 @@ watch(() => route.query.agent_id, (newVal: any) => {
+
+
#{{ total - (currentPage - 1) * pageSize - index }}