From b0a5fe1af5232120fb5beb8ad714c5072abe19b1 Mon Sep 17 00:00:00 2001 From: ssongliu Date: Thu, 12 Mar 2026 17:17:43 +0800 Subject: [PATCH] feat: add Agent quick jump with priority show strategy --- agent/app/dto/dashboard.go | 1 + agent/app/repo/app_launcher.go | 3 +- agent/app/service/dashboard.go | 12 ++++- agent/init/migration/migrate.go | 1 + agent/init/migration/migrations/init.go | 61 +++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 3 deletions(-) diff --git a/agent/app/dto/dashboard.go b/agent/app/dto/dashboard.go index 2fb4fd9d040f..e8c86fa1e80e 100644 --- a/agent/app/dto/dashboard.go +++ b/agent/app/dto/dashboard.go @@ -4,6 +4,7 @@ import "time" type DashboardBase struct { WebsiteNumber int `json:"websiteNumber"` + AgentNumber int `json:"agentNumber"` DatabaseNumber int `json:"databaseNumber"` CronjobNumber int `json:"cronjobNumber"` AppInstalledNumber int `json:"appInstalledNumber"` diff --git a/agent/app/repo/app_launcher.go b/agent/app/repo/app_launcher.go index 291ef68214ee..295776b69629 100644 --- a/agent/app/repo/app_launcher.go +++ b/agent/app/repo/app_launcher.go @@ -80,9 +80,10 @@ func (u *LauncherRepo) ListQuickJump(withAll bool) []model.QuickJump { } if !withAll && len(quicks) == 0 { return []model.QuickJump{ + {Name: "Agent", Title: "aiTools.agents.agents", Recommend: 1, IsShow: true, Router: "/ai/agents/agent"}, {Name: "Website", Title: "menu.website", Recommend: 10, IsShow: true, Router: "/websites"}, {Name: "Database", Title: "menu.database", Recommend: 30, IsShow: true, Router: "/databases"}, - {Name: "Cronjob", Title: "menu.cronjob", Recommend: 50, IsShow: true, Router: "/cronjobs"}, + {Name: "Cronjob", Title: "menu.cronjob", Recommend: 50, IsShow: false, Router: "/cronjobs"}, {Name: "AppInstalled", Title: "home.appInstalled", Recommend: 70, IsShow: true, Router: "/apps/installed"}, } } diff --git a/agent/app/service/dashboard.go b/agent/app/service/dashboard.go index 4b793727c16b..fb7b4fed2bad 100644 --- a/agent/app/service/dashboard.go +++ b/agent/app/service/dashboard.go @@ -361,6 +361,9 @@ func (u *DashboardService) LoadQuickOptions() []dto.QuickJump { _ = copier.Copy(&item, &quick) list = append(list, item) } + sort.Slice(list, func(i, j int) bool { + return list[i].Recommend < list[j].Recommend + }) return list } func (u *DashboardService) ChangeQuick(req dto.ChangeQuicks) error { @@ -612,6 +615,9 @@ func loadQuickJump(base *dto.DashboardBase) { website, _ := websiteRepo.GetBy() base.WebsiteNumber = len(website) + agents, _ := agentRepo.List() + base.AgentNumber = len(agents) + postgresqlDbs, _ := postgresqlRepo.List() mysqlDbs, _ := mysqlRepo.List() base.DatabaseNumber = len(mysqlDbs) + len(postgresqlDbs) @@ -625,6 +631,8 @@ func loadQuickJump(base *dto.DashboardBase) { quicks := launcherRepo.ListQuickJump(false) for i := 0; i < len(quicks); i++ { switch quicks[i].Name { + case "Agent": + quicks[i].Detail = fmt.Sprintf("%d", base.AgentNumber) case "Website": quicks[i].Detail = fmt.Sprintf("%d", base.WebsiteNumber) case "Database": @@ -638,7 +646,7 @@ func loadQuickJump(base *dto.DashboardBase) { _ = copier.Copy(&item, quicks[i]) base.QuickJumps = append(base.QuickJumps, item) } - sort.Slice(quicks, func(i, j int) bool { - return quicks[i].Recommend < quicks[j].Recommend + sort.Slice(base.QuickJumps, func(i, j int) bool { + return base.QuickJumps[i].Recommend < base.QuickJumps[j].Recommend }) } diff --git a/agent/init/migration/migrate.go b/agent/init/migration/migrate.go index 5ac95717aace..16b763bcc864 100644 --- a/agent/init/migration/migrate.go +++ b/agent/init/migration/migrate.go @@ -43,6 +43,7 @@ func InitAgentDB() { migrations.InitLocalSSHShow, migrations.InitRecordStatus, migrations.AddShowNameForQuickJump, + migrations.AddAgentQuickJump, migrations.AddTimeoutForClam, migrations.UpdateCronjobSpec, migrations.UpdateWebsiteSSLAddColumn, diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go index 2ebf08816e9b..ea83ad1e5710 100644 --- a/agent/init/migration/migrations/init.go +++ b/agent/init/migration/migrations/init.go @@ -589,6 +589,67 @@ var AddShowNameForQuickJump = &gormigrate.Migration{ }, } +var AddAgentQuickJump = &gormigrate.Migration{ + ID: "20260312-add-agent-quick-jump", + Migrate: func(tx *gorm.DB) error { + if err := tx.AutoMigrate(&model.QuickJump{}); err != nil { + return err + } + + var quicks []model.QuickJump + if err := tx.Find(&quicks).Error; err != nil { + return err + } + + var ( + cronjob *model.QuickJump + database *model.QuickJump + showList []*model.QuickJump + ) + for i := range quicks { + switch quicks[i].Name { + case "Cronjob": + cronjob = &quicks[i] + case "Database": + database = &quicks[i] + } + if quicks[i].IsShow { + showList = append(showList, &quicks[i]) + } + } + + showCount := len(showList) + updatedIDs := make(map[uint]struct{}) + kickedCronjob := false + if showCount >= 4 && cronjob != nil && cronjob.IsShow { + cronjob.IsShow = false + updatedIDs[cronjob.ID] = struct{}{} + kickedCronjob = true + } + if !kickedCronjob && showCount >= 4 && database != nil && database.IsShow { + database.IsShow = false + updatedIDs[database.ID] = struct{}{} + } + + for _, item := range quicks { + if _, ok := updatedIDs[item.ID]; !ok { + continue + } + if err := tx.Model(&model.QuickJump{}).Where("id = ?", item.ID).Update("is_show", item.IsShow).Error; err != nil { + return err + } + } + + return tx.Create(&model.QuickJump{ + Name: "Agent", + Title: "aiTools.agents.agents", + Recommend: 1, + IsShow: true, + Router: "/ai/agents/agent", + }).Error + }, +} + var AddTimeoutForClam = &gormigrate.Migration{ ID: "20250922-add-timeout-for-clam", Migrate: func(tx *gorm.DB) error {