@@ -456,3 +456,20 @@ func (tc *TaskController) StopTask(c *gin.Context) {
|
||||
|
||||
utils.SuccessMsg(c, "停止请求已发送")
|
||||
}
|
||||
|
||||
// GetTags 获取所有任务标签
|
||||
// @Summary 获取所有任务标签
|
||||
// @Description 获取系统中所有任务已使用的唯一标签列表
|
||||
// @Tags 任务管理
|
||||
// @Produce json
|
||||
// @Security BearerAuth
|
||||
// @Success 200 {object} utils.Response{data=[]string}
|
||||
// @Router /tasks/tags [get]
|
||||
func (tc *TaskController) GetTags(c *gin.Context) {
|
||||
tags, err := tc.taskService.GetAllTags()
|
||||
if err != nil {
|
||||
utils.ServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
utils.Success(c, tags)
|
||||
}
|
||||
|
||||
@@ -76,6 +76,7 @@ func registerTaskRoutes(g *gin.RouterGroup, c *Controllers) {
|
||||
tasks.POST("/batch-delete", c.Task.BatchDeleteTasks)
|
||||
tasks.DELETE("/batch-by-query", c.Task.BatchDeleteByQuery)
|
||||
tasks.POST("/stop/:logID", c.Task.StopTask)
|
||||
tasks.GET("/tags", c.Task.GetTags)
|
||||
}
|
||||
|
||||
execution := g.Group("/execute")
|
||||
|
||||
@@ -5,9 +5,11 @@ import (
|
||||
"github.com/engigu/baihu-panel/internal/database"
|
||||
"github.com/engigu/baihu-panel/internal/models"
|
||||
"github.com/engigu/baihu-panel/internal/utils"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type TaskService struct{}
|
||||
type TaskService struct {
|
||||
}
|
||||
|
||||
func NewTaskService() *TaskService {
|
||||
return &TaskService{}
|
||||
@@ -56,6 +58,8 @@ func (ts *TaskService) CreateTask(name, command, schedule string, timeout int, w
|
||||
task.NextRun = nil
|
||||
}
|
||||
database.DB.Select("*").Create(task)
|
||||
|
||||
|
||||
return task
|
||||
}
|
||||
|
||||
@@ -74,10 +78,25 @@ func (ts *TaskService) GetTasksWithPagination(page, pageSize int, name string, a
|
||||
if name != "" {
|
||||
query = query.Where("name LIKE ? OR remark LIKE ?", "%"+name+"%", "%"+name+"%")
|
||||
}
|
||||
|
||||
// 标签筛选 (并集)
|
||||
if tags != "" {
|
||||
query = query.Where("tags LIKE ?", "%"+tags+"%")
|
||||
tagList := strings.Split(tags, ",")
|
||||
var orConditions []string
|
||||
var orValues []interface{}
|
||||
for _, tag := range tagList {
|
||||
tag = strings.TrimSpace(tag)
|
||||
if tag != "" {
|
||||
orConditions = append(orConditions, "tags LIKE ?")
|
||||
orValues = append(orValues, "%"+tag+"%")
|
||||
}
|
||||
}
|
||||
if len(orConditions) > 0 {
|
||||
query = query.Where(strings.Join(orConditions, " OR "), orValues...)
|
||||
}
|
||||
}
|
||||
if taskType != "" {
|
||||
|
||||
if taskType != "" && taskType != "all" {
|
||||
query = query.Where("type = ?", taskType)
|
||||
}
|
||||
if agentID != nil {
|
||||
@@ -136,6 +155,7 @@ func (ts *TaskService) UpdateTask(id string, name, command, schedule string, tim
|
||||
"RetryCount", "RetryInterval", "RandomRange", "Type",
|
||||
"TriggerType", "Config", "SourceID",
|
||||
).Updates(&task)
|
||||
|
||||
return &task
|
||||
}
|
||||
|
||||
@@ -154,3 +174,26 @@ func (ts *TaskService) BatchDeleteTasks(ids []string) int64 {
|
||||
result := database.DB.Where("id IN ?", ids).Delete(&models.Task{})
|
||||
return result.RowsAffected
|
||||
}
|
||||
|
||||
// GetAllTags 获取所有任务标签
|
||||
func (ts *TaskService) GetAllTags() ([]string, error) {
|
||||
var tasks []models.Task
|
||||
database.DB.Select("tags").Where("tags != ?", "").Find(&tasks)
|
||||
|
||||
tagMap := make(map[string]bool)
|
||||
for _, task := range tasks {
|
||||
tags := strings.Split(task.Tags, ",")
|
||||
for _, tag := range tags {
|
||||
tag = strings.TrimSpace(tag)
|
||||
if tag != "" {
|
||||
tagMap[tag] = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result := make([]string, 0, len(tagMap))
|
||||
for tag := range tagMap {
|
||||
result = append(result, tag)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user