diff --git a/internal/controllers/task_controller.go b/internal/controllers/task_controller.go index 376986b..7480313 100644 --- a/internal/controllers/task_controller.go +++ b/internal/controllers/task_controller.go @@ -96,8 +96,17 @@ func (tc *TaskController) CreateTask(c *gin.Context) { func (tc *TaskController) GetTasks(c *gin.Context) { p := utils.ParsePagination(c) name := c.DefaultQuery("name", "") + agentIDStr := c.DefaultQuery("agent_id", "") + + var agentID *uint + if agentIDStr != "" { + if id, err := strconv.ParseUint(agentIDStr, 10, 32); err == nil { + uid := uint(id) + agentID = &uid + } + } - tasks, total := tc.taskService.GetTasksWithPagination(p.Page, p.PageSize, name) + tasks, total := tc.taskService.GetTasksWithPagination(p.Page, p.PageSize, name, agentID) utils.PaginatedResponse(c, tasks, total, p) } diff --git a/internal/services/task_service.go b/internal/services/task_service.go index 845c1e1..25d43cc 100644 --- a/internal/services/task_service.go +++ b/internal/services/task_service.go @@ -39,7 +39,7 @@ func (ts *TaskService) GetTasks() []models.Task { } // GetTasksWithPagination 分页获取任务列表 -func (ts *TaskService) GetTasksWithPagination(page, pageSize int, name string) ([]models.Task, int64) { +func (ts *TaskService) GetTasksWithPagination(page, pageSize int, name string, agentID *uint) ([]models.Task, int64) { var tasks []models.Task var total int64 @@ -47,6 +47,9 @@ func (ts *TaskService) GetTasksWithPagination(page, pageSize int, name string) ( if name != "" { query = query.Where("name LIKE ?", "%"+name+"%") } + if agentID != nil { + query = query.Where("agent_id = ?", *agentID) + } query.Count(&total) query.Order("id DESC").Offset((page - 1) * pageSize).Limit(pageSize).Find(&tasks) diff --git a/web/src/api/index.ts b/web/src/api/index.ts index c3fd3f7..102834b 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -55,11 +55,12 @@ export const api = { request('/auth/register', { method: 'POST', body: JSON.stringify(data) }) }, tasks: { - list: (params?: { page?: number; page_size?: number; name?: string }) => { + list: (params?: { page?: number; page_size?: number; name?: string; agent_id?: number }) => { const query = new URLSearchParams() if (params?.page) query.set('page', String(params.page)) if (params?.page_size) query.set('page_size', String(params.page_size)) if (params?.name) query.set('name', params.name) + if (params?.agent_id) query.set('agent_id', String(params.agent_id)) return request(`/tasks?${query}`) }, create: (data: Partial) => request('/tasks', { method: 'POST', body: JSON.stringify(data) }), diff --git a/web/src/views/agents/Agents.vue b/web/src/views/agents/Agents.vue index 52b8ae5..8c88d6c 100644 --- a/web/src/views/agents/Agents.vue +++ b/web/src/views/agents/Agents.vue @@ -6,11 +6,14 @@ import { Label } from '@/components/ui/label' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription } from '@/components/ui/dialog' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '@/components/ui/alert-dialog' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' -import { RefreshCw, Trash2, Edit, Copy, Server, Search, Download, RotateCw, Plus, Ticket, Power, PowerOff } from 'lucide-vue-next' +import { RefreshCw, Trash2, Edit, Copy, Server, Search, Download, RotateCw, Plus, Ticket, Power, PowerOff, ListTodo } from 'lucide-vue-next' import { api, type Agent, type AgentRegCode } from '@/api' import { toast } from 'vue-sonner' +import { useRouter } from 'vue-router' import TextOverflow from '@/components/TextOverflow.vue' +const router = useRouter() + const agents = ref([]) const regCodes = ref([]) const loading = ref(false) @@ -121,6 +124,10 @@ async function forceUpdate(agent: Agent) { } } +function viewTasks(agent: Agent) { + router.push({ path: '/tasks', query: { agent_id: String(agent.id) } }) +} + function copyRegCode(code: string) { navigator.clipboard.writeText(code) toast.success('已复制') @@ -222,7 +229,7 @@ onUnmounted(() => { 构建时间 心跳时间 描述 - 操作 + 操作
@@ -248,11 +255,14 @@ onUnmounted(() => { - + + diff --git a/web/src/views/tasks/TaskDialog.vue b/web/src/views/tasks/TaskDialog.vue index 0b43785..2abffb0 100644 --- a/web/src/views/tasks/TaskDialog.vue +++ b/web/src/views/tasks/TaskDialog.vue @@ -98,6 +98,13 @@ watch(() => props.open, async (val) => { } }) +// 切换执行位置时,如果从本地切换到 Agent,清空工作目录 +watch(selectedAgentId, (newVal, oldVal) => { + if (oldVal === 'local' && newVal !== 'local') { + form.value.work_dir = '' + } +}) + async function loadData() { try { const [envs, agents] = await Promise.all([ @@ -159,7 +166,7 @@ async function save() {
- +
diff --git a/web/src/views/tasks/Tasks.vue b/web/src/views/tasks/Tasks.vue index 3da7e5d..a48da12 100644 --- a/web/src/views/tasks/Tasks.vue +++ b/web/src/views/tasks/Tasks.vue @@ -1,19 +1,20 @@ @@ -154,6 +190,11 @@ onMounted(() => {
+
+ + {{ filterAgentName }} + +