From fb56e3f47dfb40898a2fecc7a4ae9a4dc857d26a Mon Sep 17 00:00:00 2001 From: ssongliu Date: Fri, 3 Apr 2026 11:24:10 +0800 Subject: [PATCH] fix: tighten clean tree delete semantics --- agent/app/dto/setting.go | 1 + agent/app/service/device_clean.go | 60 ++++++++++++++-------- core/go.sum | 27 ++++------ frontend/src/api/interface/toolbox.ts | 1 + frontend/src/views/toolbox/clean/index.vue | 52 +++++++------------ 5 files changed, 68 insertions(+), 73 deletions(-) diff --git a/agent/app/dto/setting.go b/agent/app/dto/setting.go index 0eae17dd67f0..ed30e8231606 100644 --- a/agent/app/dto/setting.go +++ b/agent/app/dto/setting.go @@ -55,6 +55,7 @@ type CleanTree struct { Size uint64 `json:"size"` IsCheck bool `json:"isCheck"` IsRecommend bool `json:"isRecommend"` + CanDelete bool `json:"canDelete"` } type Clean struct { diff --git a/agent/app/service/device_clean.go b/agent/app/service/device_clean.go index f5ea1fb39c62..8fcf9344f2c2 100644 --- a/agent/app/service/device_clean.go +++ b/agent/app/service/device_clean.go @@ -49,6 +49,7 @@ func (u *DeviceService) Scan() dto.CleanData { Size: uint64(originalSize), IsCheck: originalSize > 0, IsRecommend: true, + CanDelete: false, Type: "1panel_original", Children: loadTreeWithDir(true, "1panel_original", originalPath, fileOp), }) @@ -68,6 +69,7 @@ func (u *DeviceService) Scan() dto.CleanData { Size: rollbackSize, IsCheck: rollbackSize > 0, IsRecommend: true, + CanDelete: false, Type: "rollback", Children: rollBackTree, }) @@ -105,11 +107,7 @@ func (u *DeviceService) Clean(req []dto.Clean) { case "tmp_backup": dropFileOrDir(path.Join(global.Dir.LocalBackupDir, "tmp")) case "unknown_backup": - if strings.HasPrefix(item.Name, path.Join(global.Dir.LocalBackupDir, "log/website")) { - dropFileOrDir(item.Name) - } else { - dropFile(item.Name) - } + dropFileOrDir(item.Name) case "rollback": dropFileOrDir(path.Join(global.Dir.BaseDir, rollbackPath, "app")) @@ -269,6 +267,7 @@ func loadUpgradeTree(fileOp fileUtils.FileOp) dto.CleanTree { Size: uint64(upgradeSize), IsCheck: false, IsRecommend: true, + CanDelete: false, Type: "upgrade", Children: loadTreeWithDir(true, "upgrade", upgradePath, fileOp), } @@ -302,6 +301,7 @@ func loadAgentPackage(fileOp fileUtils.FileOp) dto.CleanTree { Label: "agent_packages", IsCheck: false, IsRecommend: true, + CanDelete: false, Type: "agent", } files, _ := os.ReadDir(pathItem) @@ -316,6 +316,7 @@ func loadAgentPackage(fileOp fileUtils.FileOp) dto.CleanTree { Size: uint64(itemSize), IsCheck: true, IsRecommend: true, + CanDelete: true, Type: "agent", }) } else { @@ -333,6 +334,7 @@ func loadAgentPackage(fileOp fileUtils.FileOp) dto.CleanTree { Size: uint64(itemSize.Size()), IsCheck: !isCurrentVersion, IsRecommend: true, + CanDelete: true, Type: "agent", }) } @@ -353,6 +355,7 @@ func loadBackupTree(fileOp fileUtils.FileOp) []dto.CleanTree { Size: uint64(tmpSize), IsCheck: tmpSize != 0, IsRecommend: true, + CanDelete: true, Type: "tmp_backup", }) backupRecords, _ := backupRepo.ListRecord() @@ -391,6 +394,7 @@ func loadUnknownApps(fileOp fileUtils.FileOp, recordMap map[string][]string) dto Label: "unknown_app", IsCheck: false, IsRecommend: false, + CanDelete: false, Name: backupPath, Type: "unknown_backup", } @@ -419,6 +423,7 @@ func loadUnknownDbs(fileOp fileUtils.FileOp, recordMap map[string][]string) dto. Name: backupPath, IsCheck: false, IsRecommend: false, + CanDelete: false, Type: "unknown_backup", } _ = loadFileOrDirWithExclude(fileOp, 0, backupPath, &treeData, excludePaths) @@ -442,6 +447,7 @@ func loadUnknownWebsites(fileOp fileUtils.FileOp, recordMap map[string][]string) Name: backupPath, IsCheck: false, IsRecommend: false, + CanDelete: false, Type: "unknown_backup", } _ = loadFileOrDirWithExclude(fileOp, 0, backupPath, &treeData, excludePaths) @@ -460,6 +466,7 @@ func loadUnknownSnapshot(fileOp fileUtils.FileOp) dto.CleanTree { Name: backupPath, IsCheck: false, IsRecommend: false, + CanDelete: false, Type: "unknown_backup", } entries, _ := os.ReadDir(backupPath) @@ -473,6 +480,7 @@ func loadUnknownSnapshot(fileOp fileUtils.FileOp) dto.CleanTree { Label: entry.Name(), IsCheck: false, IsRecommend: false, + CanDelete: true, Name: childPath, Type: "unknown_backup", } @@ -499,6 +507,7 @@ func loadUnknownWebsiteLog(fileOp fileUtils.FileOp) dto.CleanTree { Label: "unknown_website_log", IsCheck: false, IsRecommend: true, + CanDelete: false, Type: "unknown_backup", } dir := path.Join(global.Dir.LocalBackupDir, "log/website") @@ -522,6 +531,7 @@ func loadUnknownWebsiteLog(fileOp fileUtils.FileOp) dto.CleanTree { Label: dirName, IsCheck: true, IsRecommend: true, + CanDelete: true, Name: dirPath, Type: "unknown_backup", Size: uint64(itemSize), @@ -552,6 +562,7 @@ func loadFileOrDirWithExclude(fileOp fileUtils.FileOp, index uint, dir string, r Label: entry.Name(), IsCheck: false, IsRecommend: false, + CanDelete: true, Name: childPath, Type: "unknown_backup", } @@ -564,18 +575,19 @@ func loadFileOrDirWithExclude(fileOp fileUtils.FileOp, index uint, dir string, r for _, child := range childNode.Children { childNode.Size += child.Size } - rootTree.Size += childNode.Size } else { itemSize, _ := fileOp.GetDirSize(childPath) childNode.Size = uint64(itemSize) - rootTree.Size += childNode.Size + } + if childNode.Size == 0 { + continue } } else { info, _ := entry.Info() childNode.Size = uint64(info.Size()) - rootTree.Size += childNode.Size } + rootTree.Size += childNode.Size rootTree.Children = append(rootTree.Children, childNode) } return nil @@ -633,6 +645,7 @@ func loadDownloadTree(fileOp fileUtils.FileOp) []dto.CleanTree { Label: "app_tmp_download", IsCheck: true, IsRecommend: true, + CanDelete: false, Type: "app_tmp_download", Name: "apps", } @@ -653,19 +666,19 @@ func loadLogTree(fileOp fileUtils.FileOp) []dto.CleanTree { for _, file := range list1 { size += file.Size } - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "system_log", Size: size, Children: list1, Type: "system_log", IsRecommend: true}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "system_log", Size: size, Children: list1, Type: "system_log", IsRecommend: true, CanDelete: false}) path2 := path.Join(global.Dir.TaskDir) list2 := loadTreeWithDir(false, "task_log", path2, fileOp) size2, _ := fileOp.GetDirSize(path2) - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "task_log", Size: uint64(size2), Children: list2, Type: "task_log"}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "task_log", Size: uint64(size2), Children: list2, Type: "task_log", CanDelete: false}) websiteLogList := loadWebsiteLogTree(fileOp) logTotalSize := uint64(0) for _, websiteLog := range websiteLogList { logTotalSize += websiteLog.Size } - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "website_log", Size: logTotalSize, Children: websiteLogList, Type: "website_log", IsRecommend: false}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "website_log", Size: logTotalSize, Children: websiteLogList, Type: "website_log", IsRecommend: false, CanDelete: false}) return treeData } @@ -679,11 +692,12 @@ func loadWebsiteLogTree(fileOp fileUtils.FileOp) []dto.CleanTree { for _, website := range websites { size3, _ := fileOp.GetDirSize(path.Join(GetSiteDir(website.Alias), "log")) res = append(res, dto.CleanTree{ - ID: uuid.NewString(), - Label: website.PrimaryDomain, - Size: uint64(size3), - Type: "website_log", - Name: website.Alias, + ID: uuid.NewString(), + Label: website.PrimaryDomain, + Size: uint64(size3), + Type: "website_log", + Name: website.Alias, + CanDelete: true, }) } return res @@ -733,6 +747,7 @@ func loadAppTmpDownloadTree(fileOp fileUtils.FileOp) []dto.CleanTree { appTree.Name = appKey appTree.IsRecommend = true appTree.IsCheck = true + appTree.CanDelete = false for _, version := range missingVersions { versionPath := filepath.Join(appPath, version) size, _ := fileOp.GetDirSize(versionPath) @@ -743,6 +758,7 @@ func loadAppTmpDownloadTree(fileOp fileUtils.FileOp) []dto.CleanTree { Size: uint64(size), IsCheck: true, IsRecommend: true, + CanDelete: true, Type: "app_tmp_download_version", Name: path.Join(appKey, version), }) @@ -770,7 +786,7 @@ func loadContainerTree() []dto.CleanTree { imageSize += uint64(file.Size) } } - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "container_images", Size: imageSize, Children: nil, Type: "images", IsRecommend: true}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "container_images", Size: imageSize, Children: nil, Type: "images", IsRecommend: true, CanDelete: true}) containerSize := uint64(0) for _, file := range diskUsage.Containers { @@ -778,7 +794,7 @@ func loadContainerTree() []dto.CleanTree { containerSize += uint64(file.SizeRw) } } - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "container_containers", Size: containerSize, Children: nil, Type: "containers", IsRecommend: true}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "container_containers", Size: containerSize, Children: nil, Type: "containers", IsRecommend: true, CanDelete: true}) volumeSize := uint64(0) for _, file := range diskUsage.Volumes { @@ -786,7 +802,7 @@ func loadContainerTree() []dto.CleanTree { volumeSize += uint64(file.UsageData.Size) } } - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "container_volumes", Size: volumeSize, IsCheck: volumeSize > 0, Children: nil, Type: "volumes", IsRecommend: true}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "container_volumes", Size: volumeSize, IsCheck: volumeSize > 0, Children: nil, Type: "volumes", IsRecommend: true, CanDelete: true}) var buildCacheTotalSize int64 for _, cache := range diskUsage.BuildCache { @@ -794,7 +810,7 @@ func loadContainerTree() []dto.CleanTree { buildCacheTotalSize += cache.Size } } - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "build_cache", Size: uint64(buildCacheTotalSize), IsCheck: buildCacheTotalSize > 0, Type: "build_cache", IsRecommend: true}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: "build_cache", Size: uint64(buildCacheTotalSize), IsCheck: buildCacheTotalSize > 0, Type: "build_cache", IsRecommend: true, CanDelete: true}) return treeData } @@ -804,7 +820,7 @@ func loadTreeWithCheck(treeData []dto.CleanTree, pathItem, treeType string, file return treeData } list := loadTreeWithAllFile(true, pathItem, treeType, pathItem, fileOp) - treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: treeType, Size: uint64(size), IsCheck: size > 0, Children: list, Type: treeType, IsRecommend: true}) + treeData = append(treeData, dto.CleanTree{ID: uuid.NewString(), Label: treeType, Size: uint64(size), IsCheck: size > 0, Children: list, Type: treeType, IsRecommend: true, CanDelete: false}) return treeData } @@ -831,6 +847,7 @@ func loadTreeWithDir(isCheck bool, treeType, pathItem string, fileOp fileUtils.F Name: strings.TrimPrefix(file.Name(), "/"), IsCheck: isCheck, IsRecommend: isCheck, + CanDelete: true, } lists = append(lists, item) } @@ -878,6 +895,7 @@ func loadTreeWithAllFile(isCheck bool, originalPath, treeType, pathItem string, Name: name, IsCheck: isCheck, IsRecommend: isCheck, + CanDelete: true, } if file.IsDir() { item.Children = loadTreeWithAllFile(isCheck, originalPath, treeType, path.Join(pathItem, file.Name()), fileOp) diff --git a/core/go.sum b/core/go.sum index b6f759fc4329..8c553b2b1267 100644 --- a/core/go.sum +++ b/core/go.sum @@ -223,18 +223,15 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE= -golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY= golang.org/x/image v0.38.0 h1:5l+q+Y9JDC7mBOMjo4/aPhMDcxEptsX+Tt3GgRQRPuE= golang.org/x/image v0.38.0/go.mod h1:/3f6vaXC+6CEanU4KJxbcUZyEePbyKbaLoDOe4ehFYY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -242,14 +239,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -262,30 +257,26 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= diff --git a/frontend/src/api/interface/toolbox.ts b/frontend/src/api/interface/toolbox.ts index b1bbe9804a5f..741c0100e762 100644 --- a/frontend/src/api/interface/toolbox.ts +++ b/frontend/src/api/interface/toolbox.ts @@ -51,6 +51,7 @@ export namespace Toolbox { size: number; isCheck: boolean; isRecommend: boolean; + canDelete: boolean; } export interface Fail2banBaseInfo { diff --git a/frontend/src/views/toolbox/clean/index.vue b/frontend/src/views/toolbox/clean/index.vue index 3232aaed2a0e..7625e7d9f592 100644 --- a/frontend/src/views/toolbox/clean/index.vue +++ b/frontend/src/views/toolbox/clean/index.vue @@ -315,6 +315,10 @@ const form = reactive({ lastCleanData: '', }); +const hasChildren = (node: any) => Array.isArray(node?.children) && node.children.length > 0; + +const canDeleteNode = (node: any) => !!node?.canDelete; + const scanData = async () => { loading.value = true; await scan() @@ -395,26 +399,12 @@ const search = async () => { }; const loadSubmitCheck = (data: any) => { - if (data.children === null) { - if (data.isCheck) { - submitCleans.value.push({ treeType: data.type, name: data.name, size: data.size }); - } - return; - } - for (const item of data) { - if (item.type === 'unknown_backup' && item.isCheck && item.children) { - loadSubmitCheck(item.children); - continue; - } - if (item.isCheck && item.type === 'upgrade' && !item.children) { - submitCleans.value.push({ treeType: item.type, name: item.name, size: item.size }); - continue; - } - if (item.isCheck && item.type !== 'app_tmp_download' && item.type !== 'upgrade') { + const nodes = Array.isArray(data) ? data : [data]; + for (const item of nodes) { + if (canDeleteNode(item) && item.isCheck) { submitCleans.value.push({ treeType: item.type, name: item.name, size: item.size }); - continue; } - if (item.children) { + if (hasChildren(item)) { loadSubmitCheck(item.children); } } @@ -435,56 +425,50 @@ function onChange(data: any, checked: any) { selectSize.value = 0; let systemSelects = systemRef.value.getCheckedNodes(false, true); for (const item of systemSelects) { - if (item.children === null) { + if (canDeleteNode(item)) { selectSize.value = selectSize.value + Number(item.size); } } let backupSelects = backupRef.value.getCheckedNodes(false, true); for (const item of backupSelects) { - if (item.children === null) { + if (canDeleteNode(item)) { selectSize.value = selectSize.value + Number(item.size); } } let uploadSelects = uploadRef.value.getCheckedNodes(false, true); for (const item of uploadSelects) { - if (item.children === null) { + if (canDeleteNode(item)) { selectSize.value = selectSize.value + Number(item.size); } } let downloadSelects = downloadRef.value.getCheckedNodes(false, true); for (const item of downloadSelects) { - if (item.children === null) { + if (canDeleteNode(item)) { selectSize.value = selectSize.value + Number(item.size); } } let systemLogSelects = systemLogRef.value.getCheckedNodes(false, true); for (const item of systemLogSelects) { - if (item.children === null) { + if (canDeleteNode(item)) { selectSize.value = selectSize.value + Number(item.size); } } let containerSelects = containerRef.value.getCheckedNodes(false, true); for (const item of containerSelects) { - if (item.children === null) { + if (canDeleteNode(item)) { selectSize.value = selectSize.value + Number(item.size); } } } function loadCheck(data: any, checkList: any) { - if (data.children === null) { - if (data.isCheck) { - checkList.push(data.id); - } - return; - } - for (const item of data) { - if (item.isCheck) { + const nodes = Array.isArray(data) ? data : [data]; + for (const item of nodes) { + if (canDeleteNode(item) && item.isCheck) { selectSize.value = selectSize.value + Number(item.size); checkList.push(item.id); - continue; } - if (item.children) { + if (hasChildren(item)) { loadCheck(item.children, checkList); } }