From 45428f3e0b7b76d618f91180777e50274e7d0d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Fri, 21 Mar 2025 03:48:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=BC=96=E6=8E=92=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/biz/container_compose.go | 4 ++- internal/data/container_compose.go | 42 +++++++++++++++++++++++---- internal/service/container_compose.go | 4 +-- pkg/types/container_compose.go | 17 +++++++++++ 4 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 pkg/types/container_compose.go diff --git a/internal/biz/container_compose.go b/internal/biz/container_compose.go index 4e3a9852..aeb05ab4 100644 --- a/internal/biz/container_compose.go +++ b/internal/biz/container_compose.go @@ -1,7 +1,9 @@ package biz +import "github.com/tnb-labs/panel/pkg/types" + type ContainerComposeRepo interface { - List() ([]string, error) + List() ([]types.ContainerCompose, error) Get(name string) (string, string, error) Create(name, compose, env string) error Update(name, compose, env string) error diff --git a/internal/data/container_compose.go b/internal/data/container_compose.go index f2d9bbf1..c92232c9 100644 --- a/internal/data/container_compose.go +++ b/internal/data/container_compose.go @@ -1,13 +1,16 @@ package data import ( + "encoding/json" "io/fs" "os" "path/filepath" + "time" "github.com/tnb-labs/panel/internal/app" "github.com/tnb-labs/panel/internal/biz" "github.com/tnb-labs/panel/pkg/shell" + "github.com/tnb-labs/panel/pkg/types" ) type containerComposeRepo struct{} @@ -17,24 +20,51 @@ func NewContainerComposeRepo() biz.ContainerComposeRepo { } // List 列出所有编排文件名 -func (r *containerComposeRepo) List() ([]string, error) { - dir := filepath.Join(app.Root, "server", "compose") - var names []string - err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { +func (r *containerComposeRepo) List() ([]types.ContainerCompose, error) { + raw, err := shell.Execf("docker compose ls --format json") + if err != nil { + return nil, err + } + + var composeRaws []types.ContainerComposeRaw + if err = json.Unmarshal([]byte(raw), &composeRaws); err != nil { + return nil, err + } + + index := make(map[string]int) + var composes []types.ContainerCompose + err = filepath.WalkDir(filepath.Join(app.Root, "server", "compose"), func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if !d.IsDir() { return nil } - names = append(names, filepath.Base(path)) + var createdAt time.Time + if info, err := d.Info(); err == nil { + createdAt = info.ModTime() + } + composes = append(composes, types.ContainerCompose{ + Name: filepath.Base(path), + Dir: path, + Status: "unknown", + CreatedAt: createdAt, + }) + index[filepath.Base(path)] = len(composes) - 1 return nil }) if err != nil { return nil, err } - return names, nil + // 更新状态 + for _, item := range composeRaws { + if i, ok := index[item.Name]; ok { + composes[i].Status = item.Status + } + } + + return composes, nil } // Get 获取编排文件和环境变量内容 diff --git a/internal/service/container_compose.go b/internal/service/container_compose.go index f62c1b33..0a0916f0 100644 --- a/internal/service/container_compose.go +++ b/internal/service/container_compose.go @@ -20,13 +20,13 @@ func NewContainerComposeService(containerCompose biz.ContainerComposeRepo) *Cont } func (s *ContainerComposeService) List(w http.ResponseWriter, r *http.Request) { - files, err := s.containerComposeRepo.List() + composes, err := s.containerComposeRepo.List() if err != nil { Error(w, http.StatusInternalServerError, "%v", err) return } - paged, total := Paginate(r, files) + paged, total := Paginate(r, composes) Success(w, chix.M{ "total": total, diff --git a/pkg/types/container_compose.go b/pkg/types/container_compose.go new file mode 100644 index 00000000..a09a94e6 --- /dev/null +++ b/pkg/types/container_compose.go @@ -0,0 +1,17 @@ +package types + +import "time" + +// ContainerComposeRaw docker compose ls 命令原始输出 +type ContainerComposeRaw struct { + Name string `json:"Name"` + Status string `json:"Status"` + ConfigFiles string `json:"ConfigFiles"` +} + +type ContainerCompose struct { + Name string `json:"name"` + Dir string `json:"dir"` + Status string `json:"status"` + CreatedAt time.Time `json:"created_at"` +}