From a3e4847744fb579aba9f3fa341d3bc839c48546e Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:05:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BF=AB=E7=85=A7=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=BC=82=E6=AD=A5=E8=8E=B7=E5=8F=96=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=20(#6670)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #6540 --- backend/app/api/v1/snapshot.go | 22 ++++++++++ backend/app/dto/setting.go | 7 ++- backend/app/service/snapshot.go | 36 ++++++++++----- backend/router/ro_setting.go | 1 + frontend/src/api/interface/setting.ts | 5 +++ frontend/src/api/modules/setting.ts | 3 ++ frontend/src/views/setting/snapshot/index.vue | 44 ++++++++++++++++--- 7 files changed, 101 insertions(+), 17 deletions(-) diff --git a/backend/app/api/v1/snapshot.go b/backend/app/api/v1/snapshot.go index a6dde9d8c..a98b95f30 100644 --- a/backend/app/api/v1/snapshot.go +++ b/backend/app/api/v1/snapshot.go @@ -120,6 +120,28 @@ func (b *BaseApi) SearchSnapshot(c *gin.Context) { }) } +// @Tags System Setting +// @Summary Load system snapshot size +// @Description 获取系统快照大小 +// @Accept json +// @Param request body dto.PageSnapshot true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Router /settings/snapshot/size [post] +func (b *BaseApi) LoadSnapshotSize(c *gin.Context) { + var req dto.PageSnapshot + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + data, err := snapshotService.LoadSize(req) + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, data) +} + // @Tags System Setting // @Summary Recover system backup // @Description 从系统快照恢复 diff --git a/backend/app/dto/setting.go b/backend/app/dto/setting.go index ed84c2c9f..1de8d8129 100644 --- a/backend/app/dto/setting.go +++ b/backend/app/dto/setting.go @@ -149,7 +149,6 @@ type SnapshotInfo struct { Message string `json:"message"` CreatedAt time.Time `json:"createdAt"` Version string `json:"version"` - Size int64 `json:"size"` InterruptStep string `json:"interruptStep"` RecoverStatus string `json:"recoverStatus"` @@ -160,6 +159,12 @@ type SnapshotInfo struct { LastRollbackedAt string `json:"lastRollbackedAt"` } +type SnapshotFile struct { + ID uint `json:"id"` + Name string `json:"name"` + Size int64 `json:"size"` +} + type UpgradeInfo struct { TestVersion string `json:"testVersion"` NewVersion string `json:"newVersion"` diff --git a/backend/app/service/snapshot.go b/backend/app/service/snapshot.go index ae230d9d1..082033085 100644 --- a/backend/app/service/snapshot.go +++ b/backend/app/service/snapshot.go @@ -28,6 +28,7 @@ type SnapshotService struct { type ISnapshotService interface { SearchWithPage(req dto.PageSnapshot) (int64, interface{}, error) + LoadSize(req dto.PageSnapshot) ([]dto.SnapshotFile, error) SnapshotCreate(req dto.SnapshotCreate) error SnapshotRecover(req dto.SnapshotRecover) error SnapshotRollback(req dto.SnapshotRecover) error @@ -47,15 +48,31 @@ func NewISnapshotService() ISnapshotService { } func (u *SnapshotService) SearchWithPage(req dto.PageSnapshot) (int64, interface{}, error) { - total, systemBackups, err := snapshotRepo.Page(req.Page, req.PageSize, commonRepo.WithLikeName(req.Info), commonRepo.WithOrderRuleBy(req.OrderBy, req.Order)) + total, records, err := snapshotRepo.Page(req.Page, req.PageSize, commonRepo.WithLikeName(req.Info), commonRepo.WithOrderRuleBy(req.OrderBy, req.Order)) if err != nil { return 0, nil, err } - dtoSnap, err := loadSnapSize(systemBackups) - if err != nil { - return 0, nil, err + var data []dto.SnapshotInfo + for _, record := range records { + var item dto.SnapshotInfo + if err := copier.Copy(&item, &record); err != nil { + return 0, nil, errors.WithMessage(constant.ErrStructTransform, err.Error()) + } + data = append(data, item) } - return total, dtoSnap, err + return total, data, err +} + +func (u *SnapshotService) LoadSize(req dto.PageSnapshot) ([]dto.SnapshotFile, error) { + _, records, err := snapshotRepo.Page(req.Page, req.PageSize, commonRepo.WithLikeName(req.Info), commonRepo.WithOrderRuleBy(req.OrderBy, req.Order)) + if err != nil { + return nil, err + } + data, err := loadSnapSize(records) + if err != nil { + return nil, err + } + return data, err } func (u *SnapshotService) SnapshotImport(req dto.SnapshotImport) error { @@ -510,15 +527,12 @@ func loadOs() string { } } -func loadSnapSize(records []model.Snapshot) ([]dto.SnapshotInfo, error) { - var datas []dto.SnapshotInfo +func loadSnapSize(records []model.Snapshot) ([]dto.SnapshotFile, error) { + var datas []dto.SnapshotFile clientMap := make(map[string]loadSizeHelper) var wg sync.WaitGroup for i := 0; i < len(records); i++ { - var item dto.SnapshotInfo - if err := copier.Copy(&item, &records[i]); err != nil { - return nil, errors.WithMessage(constant.ErrStructTransform, err.Error()) - } + item := dto.SnapshotFile{Name: records[i].Name, ID: records[i].ID} itemPath := fmt.Sprintf("system_snapshot/%s.tar.gz", item.Name) if _, ok := clientMap[records[i].DefaultDownload]; !ok { backup, err := backupRepo.Get(commonRepo.WithByType(records[i].DefaultDownload)) diff --git a/backend/router/ro_setting.go b/backend/router/ro_setting.go index e2a911e0a..5d25f465d 100644 --- a/backend/router/ro_setting.go +++ b/backend/router/ro_setting.go @@ -37,6 +37,7 @@ func (s *SettingRouter) InitRouter(Router *gin.RouterGroup) { settingRouter.POST("/snapshot", baseApi.CreateSnapshot) settingRouter.POST("/snapshot/status", baseApi.LoadSnapShotStatus) settingRouter.POST("/snapshot/search", baseApi.SearchSnapshot) + settingRouter.POST("/snapshot/size", baseApi.LoadSnapshotSize) settingRouter.POST("/snapshot/import", baseApi.ImportSnapshot) settingRouter.POST("/snapshot/del", baseApi.DeleteSnapshot) settingRouter.POST("/snapshot/recover", baseApi.RecoverSnapshot) diff --git a/frontend/src/api/interface/setting.ts b/frontend/src/api/interface/setting.ts index c5d2def9c..2e60ce791 100644 --- a/frontend/src/api/interface/setting.ts +++ b/frontend/src/api/interface/setting.ts @@ -145,6 +145,11 @@ export namespace Setting { lastRollbackedAt: string; secret: string; } + export interface SnapshotFile { + id: number; + name: string; + size: number; + } export interface SnapshotStatus { panel: string; panelInfo: string; diff --git a/frontend/src/api/modules/setting.ts b/frontend/src/api/modules/setting.ts index d9ecd3137..9e70c72dc 100644 --- a/frontend/src/api/modules/setting.ts +++ b/frontend/src/api/modules/setting.ts @@ -196,6 +196,9 @@ export const snapshotRollback = (param: Setting.SnapshotRecover) => { export const searchSnapshotPage = (param: SearchWithPage) => { return http.post>(`/settings/snapshot/search`, param); }; +export const loadSnapshotSize = (param: SearchWithPage) => { + return http.post>(`/settings/snapshot/size`, param); +}; // upgrade export const loadUpgradeInfo = () => { diff --git a/frontend/src/views/setting/snapshot/index.vue b/frontend/src/views/setting/snapshot/index.vue index fafd06fa2..ec017cc26 100644 --- a/frontend/src/views/setting/snapshot/index.vue +++ b/frontend/src/views/setting/snapshot/index.vue @@ -75,10 +75,15 @@ @@ -197,7 +202,13 @@