diff --git a/backend/app/api/v1/backup.go b/backend/app/api/v1/backup.go index 5245ba37f..9966e4899 100644 --- a/backend/app/api/v1/backup.go +++ b/backend/app/api/v1/backup.go @@ -314,6 +314,16 @@ func (b *BaseApi) Recover(c *gin.Context) { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } + case "redis": + if err := backupService.RedisRecover(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + case "app": + if err := backupService.AppRecover(req); err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } } helper.SuccessWithData(c, nil) } @@ -339,11 +349,6 @@ func (b *BaseApi) RecoverByUpload(c *gin.Context) { } switch req.Type { - case "app": - if err := backupService.AppRecover(req); err != nil { - helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) - return - } case "mysql": if err := backupService.MysqlRecoverByUpload(req); err != nil { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) @@ -354,11 +359,6 @@ func (b *BaseApi) RecoverByUpload(c *gin.Context) { helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) return } - case "redis": - if err := backupService.RedisRecover(req); err != nil { - helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) - return - } } helper.SuccessWithData(c, nil) } diff --git a/backend/app/service/backup_app.go b/backend/app/service/backup_app.go index 60f9dc069..4dbf1279c 100644 --- a/backend/app/service/backup_app.go +++ b/backend/app/service/backup_app.go @@ -76,7 +76,7 @@ func (u *BackupService) AppRecover(req dto.CommonRecover) error { if _, err := compose.Down(install.GetComposePath()); err != nil { return err } - if err := handleAppRecover(&install, req.File); err != nil { + if err := handleAppRecover(&install, req.File, false); err != nil { return err } return nil @@ -120,7 +120,8 @@ func handleAppBackup(install *model.AppInstall, backupDir, fileName string) erro return nil } -func handleAppRecover(install *model.AppInstall, recoverFile string) error { +func handleAppRecover(install *model.AppInstall, recoverFile string, isRollback bool) error { + isOk := false fileOp := files.NewFileOp() if err := fileOp.Decompress(recoverFile, path.Dir(recoverFile), files.TarGz); err != nil { return err @@ -133,6 +134,24 @@ func handleAppRecover(install *model.AppInstall, recoverFile string) error { if !fileOp.Stat(tmpPath+"/app.json") || !fileOp.Stat(tmpPath+"/app.tar.gz") { return errors.New("the wrong recovery package does not have app.json or app.tar.gz files") } + if !isRollback { + rollbackFile := fmt.Sprintf("%s/original/app/%s_%s.tar.gz", global.CONF.System.BaseDir, install.Name, time.Now().Format("20060102150405")) + if err := handleAppBackup(install, path.Dir(rollbackFile), path.Base(rollbackFile)); err != nil { + global.LOG.Errorf("backup app %s for rollback before recover failed, err: %v", install.Name, err) + } + defer func() { + if !isOk { + if err := handleAppRecover(install, rollbackFile, true); err != nil { + global.LOG.Errorf("rollback app %s from %s failed, err: %v", install.Name, rollbackFile, err) + } + global.LOG.Infof("rollback app %s from %s successful", install.Name, rollbackFile) + _ = os.RemoveAll(rollbackFile) + } else { + _ = os.RemoveAll(rollbackFile) + } + }() + } + appjson, err := os.ReadFile(tmpPath + "/" + "app.json") if err != nil { return err @@ -195,5 +214,6 @@ func handleAppRecover(install *model.AppInstall, recoverFile string) error { if err := appInstallRepo.Save(install); err != nil { return err } + isOk = true return nil } diff --git a/backend/app/service/backup_database.go b/backend/app/service/backup_database.go index 543b2f270..d8207c1fb 100644 --- a/backend/app/service/backup_database.go +++ b/backend/app/service/backup_database.go @@ -59,7 +59,7 @@ func (u *BackupService) MysqlRecover(req dto.CommonRecover) error { return errors.New(fmt.Sprintf("%s file is not exist", req.File)) } global.LOG.Infof("recover database %s-%s from backup file %s", req.Name, req.DetailName, req.File) - if err := handleMysqlRecover(app, path.Dir(req.File), req.DetailName, path.Base(req.File)); err != nil { + if err := handleMysqlRecover(app, path.Dir(req.File), req.DetailName, path.Base(req.File), false); err != nil { return err } return nil @@ -114,7 +114,7 @@ func (u *BackupService) MysqlRecoverByUpload(req dto.CommonRecover) error { }() } - if err := handleMysqlRecover(app, path.Dir(file), req.DetailName, fileName); err != nil { + if err := handleMysqlRecover(app, path.Dir(file), req.DetailName, fileName, false); err != nil { return err } global.LOG.Info("recover from uploads successful!") @@ -141,7 +141,25 @@ func handleMysqlBackup(app *repo.RootInfo, backupDir, dbName, fileName string) e return nil } -func handleMysqlRecover(mysqlInfo *repo.RootInfo, recoverDir, dbName, fileName string) error { +func handleMysqlRecover(mysqlInfo *repo.RootInfo, recoverDir, dbName, fileName string, isRollback bool) error { + isOk := false + if !isRollback { + rollbackFile := fmt.Sprintf("%s/original/database/%s_%s.sql.gz", global.CONF.System.BaseDir, mysqlInfo.Name, time.Now().Format("20060102150405")) + if err := handleMysqlBackup(mysqlInfo, path.Dir(rollbackFile), dbName, path.Base(rollbackFile)); err != nil { + global.LOG.Errorf("backup mysql db %s for rollback before recover failed, err: %v", mysqlInfo.Name, err) + } + defer func() { + if !isOk { + if err := handleMysqlRecover(mysqlInfo, path.Dir(rollbackFile), dbName, path.Base(rollbackFile), true); err != nil { + global.LOG.Errorf("rollback mysql db %s from %s failed, err: %v", dbName, rollbackFile, err) + } + global.LOG.Infof("rollback mysql db %s from %s successful", dbName, rollbackFile) + _ = os.RemoveAll(rollbackFile) + } else { + _ = os.RemoveAll(rollbackFile) + } + }() + } file := recoverDir + "/" + fileName fi, _ := os.Open(file) defer fi.Close() @@ -166,5 +184,6 @@ func handleMysqlRecover(mysqlInfo *repo.RootInfo, recoverDir, dbName, fileName s if err != nil || strings.HasPrefix(string(stdStr), "ERROR ") { return errors.New(stdStr) } + isOk = true return nil } diff --git a/backend/app/service/backup_redis.go b/backend/app/service/backup_redis.go index cfdf93cb2..38b00b3be 100644 --- a/backend/app/service/backup_redis.go +++ b/backend/app/service/backup_redis.go @@ -4,6 +4,7 @@ import ( "fmt" "io/ioutil" "os" + "path" "strings" "time" @@ -38,8 +39,8 @@ func (u *BackupService) RedisBackup() error { if appendonly == "yes" { fileName = fmt.Sprintf("%s.tar.gz", timeNow) } - backupDir := fmt.Sprintf("%s/database/redis/%s/", localDir, redisInfo.Name) - if err := handleBackupRedis(redisInfo, backupDir, fileName); err != nil { + backupDir := fmt.Sprintf("%s/database/redis/%s", localDir, redisInfo.Name) + if err := handleRedisBackup(redisInfo, backupDir, fileName); err != nil { return err } record := &model.BackupRecord{ @@ -62,13 +63,13 @@ func (u *BackupService) RedisRecover(req dto.CommonRecover) error { return err } global.LOG.Infof("recover redis from backup file %s", req.File) - if err := handleRecoverRedis(redisInfo, req.File); err != nil { + if err := handleRedisRecover(redisInfo, req.File, false); err != nil { return err } return nil } -func handleBackupRedis(redisInfo *repo.RootInfo, backupDir, fileName string) error { +func handleRedisBackup(redisInfo *repo.RootInfo, backupDir, fileName string) error { fileOp := files.NewFileOp() if !fileOp.Stat(backupDir) { if err := os.MkdirAll(backupDir, os.ModePerm); err != nil { @@ -96,17 +97,44 @@ func handleBackupRedis(redisInfo *repo.RootInfo, backupDir, fileName string) err return nil } -func handleRecoverRedis(redisInfo *repo.RootInfo, recoverFile string) error { +func handleRedisRecover(redisInfo *repo.RootInfo, recoverFile string, isRollback bool) error { fileOp := files.NewFileOp() if !fileOp.Stat(recoverFile) { - return errors.New(fmt.Sprintf("%s file is not exist", recoverFile)) + return fmt.Errorf("%s file is not exist", recoverFile) } appendonly, err := configGetStr(redisInfo.ContainerName, redisInfo.Password, "appendonly") if err != nil { return err } + if (appendonly == "yes" && !strings.HasSuffix(recoverFile, ".tar.gz")) || (appendonly != "yes" && !strings.HasSuffix(recoverFile, ".rdb")) { + return fmt.Errorf("recover redis with appendonly=%s from file %s format error", appendonly, recoverFile) + } global.LOG.Infof("appendonly in redis conf is %s", appendonly) + isOk := false + if !isRollback { + defer func() { + suffix := "tar.gz" + if appendonly != "yes" { + suffix = "rdb" + } + rollbackFile := fmt.Sprintf("%s/original/database/redis/%s_%s.%s", global.CONF.System.BaseDir, redisInfo.Name, time.Now().Format("20060102150405"), suffix) + if err := handleRedisBackup(redisInfo, path.Dir(rollbackFile), path.Base(rollbackFile)); err != nil { + global.LOG.Errorf("backup database %s for rollback before recover failed, err: %v", redisInfo.Name, err) + } + defer func() { + if !isOk { + if err := handleRedisRecover(redisInfo, rollbackFile, true); err != nil { + global.LOG.Errorf("rollback redis from %s failed, err: %v", rollbackFile, err) + } + global.LOG.Infof("rollback redis from %s successful", rollbackFile) + _ = os.RemoveAll(rollbackFile) + } else { + _ = os.RemoveAll(rollbackFile) + } + }() + }() + } composeDir := fmt.Sprintf("%s/redis/%s", constant.AppInstallDir, redisInfo.Name) if _, err := compose.Down(composeDir + "/docker-compose.yml"); err != nil { return err diff --git a/backend/app/service/backup_website.go b/backend/app/service/backup_website.go index 3113c81de..2be8eae86 100644 --- a/backend/app/service/backup_website.go +++ b/backend/app/service/backup_website.go @@ -73,7 +73,7 @@ func (u *BackupService) WebsiteRecoverByUpload(req dto.CommonRecover) error { if err != nil { return err } - if err := handleWebsiteRecover(&website, tmpDir); err != nil { + if err := handleWebsiteRecover(&website, tmpDir, false); err != nil { return err } @@ -90,13 +90,13 @@ func (u *BackupService) WebsiteRecover(req dto.CommonRecover) error { return errors.New(fmt.Sprintf("%s file is not exist", req.File)) } global.LOG.Infof("recover website %s from backup file %s", req.Name, req.File) - if err := handleWebsiteRecover(&website, req.File); err != nil { + if err := handleWebsiteRecover(&website, req.File, false); err != nil { return err } return nil } -func handleWebsiteRecover(website *model.Website, recoverFile string) error { +func handleWebsiteRecover(website *model.Website, recoverFile string, isRollback bool) error { fileOp := files.NewFileOp() fileDir := strings.ReplaceAll(recoverFile, ".tar.gz", "") if err := fileOp.Decompress(recoverFile, path.Dir(recoverFile), files.TarGz); err != nil { @@ -115,6 +115,24 @@ func handleWebsiteRecover(website *model.Website, recoverFile string) error { return errors.New("the wrong recovery package does not have .sql.gz or .app.tar.gz files") } } + isOk := false + if !isRollback { + rollbackFile := fmt.Sprintf("%s/original/website/%s_%s.tar.gz", global.CONF.System.BaseDir, website.Alias, time.Now().Format("20060102150405")) + if err := handleWebsiteBackup(website, path.Dir(rollbackFile), path.Base(rollbackFile)); err != nil { + global.LOG.Errorf("backup website %s for rollback before recover failed, err: %v", website.Alias, err) + } + defer func() { + if !isOk { + if err := handleWebsiteRecover(website, rollbackFile, true); err != nil { + global.LOG.Errorf("rollback website %s from %s failed, err: %v", website.Alias, rollbackFile, err) + } + global.LOG.Infof("rollback website %s from %s successful", website.Alias, rollbackFile) + _ = os.RemoveAll(rollbackFile) + } else { + _ = os.RemoveAll(rollbackFile) + } + }() + } nginxInfo, err := appInstallRepo.LoadBaseInfo(constant.AppOpenresty, "") if err != nil { @@ -138,14 +156,14 @@ func handleWebsiteRecover(website *model.Website, recoverFile string) error { if err != nil { return err } - if err := handleMysqlRecover(mysqlInfo, fileDir, db.Name, fmt.Sprintf("%s.sql.gz", website.Alias)); err != nil { + if err := handleMysqlRecover(mysqlInfo, fileDir, db.Name, fmt.Sprintf("%s.sql.gz", website.Alias), isRollback); err != nil { return err } app, err := appInstallRepo.GetFirst(commonRepo.WithByID(website.AppInstallID)) if err != nil { return err } - if err := handleAppRecover(&app, fmt.Sprintf("%s/%s.app.tar.gz", fileDir, website.Alias)); err != nil { + if err := handleAppRecover(&app, fmt.Sprintf("%s/%s.app.tar.gz", fileDir, website.Alias), isRollback); err != nil { return err } if _, err := compose.Restart(fmt.Sprintf("%s/%s/%s/docker-compose.yml", constant.AppInstallDir, app.App.Key, app.Name)); err != nil { diff --git a/cmd/server/cmd/user-info.go b/cmd/server/cmd/user-info.go index dbd5d30f6..1e04a39ec 100644 --- a/cmd/server/cmd/user-info.go +++ b/cmd/server/cmd/user-info.go @@ -39,7 +39,7 @@ var userinfoCmd = &cobra.Command{ user := getSettingByKey(db, "UserName") password := getSettingByKey(db, "Password") port := getSettingByKey(db, "ServerPort") - enptrySetting := getSettingByKey(db, "ServerPort") + enptrySetting := getSettingByKey(db, "EncryptKey") p := "" if len(enptrySetting) == 16 { diff --git a/frontend/src/api/modules/backup.ts b/frontend/src/api/modules/backup.ts deleted file mode 100644 index 046f335d0..000000000 --- a/frontend/src/api/modules/backup.ts +++ /dev/null @@ -1,37 +0,0 @@ -import http from '@/api'; -import { Backup } from '../interface/backup'; -import { ResPage } from '../interface'; - -export const getBackupList = () => { - return http.get>(`/backups/search`); -}; - -export const getFilesFromBackup = (type: string) => { - return http.post>(`/backups/search/files`, { type: type }); -}; - -export const addBackup = (params: Backup.BackupOperate) => { - return http.post(`/backups`, params); -}; - -export const editBackup = (params: Backup.BackupOperate) => { - return http.post(`/backups/update`, params); -}; - -export const deleteBackup = (params: { ids: number[] }) => { - return http.post(`/backups/del`, params); -}; - -export const downloadBackupRecord = (params: Backup.RecordDownload) => { - return http.download(`/backups/record/download`, params, { responseType: 'blob' }); -}; -export const deleteBackupRecord = (params: { ids: number[] }) => { - return http.post(`/backups/record/del`, params); -}; -export const searchBackupRecords = (params: Backup.SearchBackupRecord) => { - return http.post>(`/backups/record/search`, params); -}; - -export const listBucket = (params: Backup.ForBucket) => { - return http.post(`/backups/buckets`, params); -}; diff --git a/frontend/src/api/modules/database.ts b/frontend/src/api/modules/database.ts index 371a5a1f0..633777b1a 100644 --- a/frontend/src/api/modules/database.ts +++ b/frontend/src/api/modules/database.ts @@ -1,5 +1,5 @@ import http from '@/api'; -import { SearchWithPage, ReqPage, ResPage, DescriptionUpdate } from '../interface'; +import { SearchWithPage, ResPage, DescriptionUpdate } from '../interface'; import { Database } from '../interface/database'; export const searchMysqlDBs = (params: SearchWithPage) => { @@ -54,7 +54,7 @@ export const loadRedisStatus = () => { export const loadRedisConf = () => { return http.get(`/databases/redis/conf`); }; -export const RedisPersistenceConf = () => { +export const redisPersistenceConf = () => { return http.get(`/databases/redis/persistence/conf`); }; export const changeRedisPassword = (params: Database.ChangeInfo) => { @@ -69,9 +69,3 @@ export const updateRedisConf = (params: Database.RedisConfUpdate) => { export const updateRedisConfByFile = (params: Database.RedisConfUpdateByFile) => { return http.post(`/databases/redis/conffile/update`, params); }; -export const recoverRedis = (param: Database.RedisRecover) => { - return http.post(`/databases/redis/recover`, param); -}; -export const redisBackupRedisRecords = (param: ReqPage) => { - return http.post>(`/databases/redis/backup/search`, param); -}; diff --git a/frontend/src/api/modules/setting.ts b/frontend/src/api/modules/setting.ts index c1371e03e..0220a7b1d 100644 --- a/frontend/src/api/modules/setting.ts +++ b/frontend/src/api/modules/setting.ts @@ -60,6 +60,16 @@ export const handleRecover = (params: Backup.Recover) => { export const handleRecoverByUpload = (params: Backup.Recover) => { return http.post(`/settings/backup/recover/byupload`, params); }; +export const downloadBackupRecord = (params: Backup.RecordDownload) => { + return http.download(`/settings/backup/record/download`, params, { responseType: 'blob' }); +}; +export const deleteBackupRecord = (params: { ids: number[] }) => { + return http.post(`/settings/backup/record/del`, params); +}; +export const searchBackupRecords = (params: Backup.SearchBackupRecord) => { + return http.post>(`/settings/backup/record/search`, params); +}; + export const getBackupList = () => { return http.get>(`/settings/backup/search`); }; @@ -75,15 +85,6 @@ export const editBackup = (params: Backup.BackupOperate) => { export const deleteBackup = (params: { ids: number[] }) => { return http.post(`/settings/backup/del`, params); }; -export const downloadBackupRecord = (params: Backup.RecordDownload) => { - return http.download(`/settings/backup/record/download`, params, { responseType: 'blob' }); -}; -export const deleteBackupRecord = (params: { ids: number[] }) => { - return http.post(`/settings/backup/record/del`, params); -}; -export const searchBackupRecords = (params: Backup.SearchBackupRecord) => { - return http.post>(`/settings/backup/record/search`, params); -}; export const listBucket = (params: Backup.ForBucket) => { return http.post(`/settings/backup/buckets`, params); }; diff --git a/frontend/src/views/database/redis/index.vue b/frontend/src/views/database/redis/index.vue index 7cd2dec7d..ab29d4c52 100644 --- a/frontend/src/views/database/redis/index.vue +++ b/frontend/src/views/database/redis/index.vue @@ -77,7 +77,7 @@ const isRefresh = ref(); const onSetting = async () => { isOnSetting.value = true; - terminalRef.value.onClose(false); + terminalRef.value?.onClose(false); settingRef.value!.acceptParams({ status: redisStatus.value, redisName: redisName.value }); }; @@ -124,7 +124,7 @@ const initTerminal = async () => { }; const closeTerminal = async (isKeepShow: boolean) => { isRefresh.value = !isRefresh.value; - terminalRef.value!.onClose(isKeepShow); + terminalRef.value?.onClose(isKeepShow); }; const onBefore = () => { diff --git a/frontend/src/views/database/redis/setting/index.vue b/frontend/src/views/database/redis/setting/index.vue index ebd0b9f92..f9382c9df 100644 --- a/frontend/src/views/database/redis/setting/index.vue +++ b/frontend/src/views/database/redis/setting/index.vue @@ -178,7 +178,6 @@ interface DialogProps { const changeTab = (val: string) => { activeName.value = val; - console.log(activeName.value); }; const acceptParams = (prop: DialogProps): void => { @@ -192,9 +191,6 @@ const acceptParams = (prop: DialogProps): void => { loadform(); } }; -const onClose = (): void => { - settingShow.value = false; -}; const portRef = ref(); const confirmPortRef = ref(); @@ -322,6 +318,5 @@ const loadConfFile = async () => { defineExpose({ acceptParams, - onClose, }); diff --git a/frontend/src/views/database/redis/setting/persistence/index.vue b/frontend/src/views/database/redis/setting/persistence/index.vue index ba6aaf3eb..236b8598f 100644 --- a/frontend/src/views/database/redis/setting/persistence/index.vue +++ b/frontend/src/views/database/redis/setting/persistence/index.vue @@ -79,12 +79,7 @@ - + + - - - - + { persistenceShow.value = true; if (prop.status === 'Running') { loadform(); - loadBackupRecords(); + search(); } }; -const onClose = (): void => { - persistenceShow.value = false; -}; const data = ref(); const selects = ref([]); @@ -188,12 +170,15 @@ const handleDelete = (index: number) => { form.saves.splice(index, 1); }; -const loadBackupRecords = async () => { +const search = async () => { let params = { + type: 'redis', + name: '', + detailName: '', page: paginationConfig.currentPage, pageSize: paginationConfig.pageSize, }; - const res = await redisBackupRedisRecords(params); + const res = await searchBackupRecords(params); data.value = res.data.items || []; paginationConfig.total = res.data.total; }; @@ -202,7 +187,7 @@ const onBackup = async () => { await handleBackup({ name: '', detailName: '', type: 'redis' }) .then(() => { loading.value = false; - loadBackupRecords(); + search(); MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); }) .catch(() => { @@ -211,11 +196,13 @@ const onBackup = async () => { }; const onRecover = async () => { let param = { - fileName: currentRow.value.fileName, - fileDir: currentRow.value.fileDir, + type: 'redis', + name: '', + detailName: '', + file: currentRow.value.fileDir + '/' + currentRow.value.fileName, }; loading.value = true; - await recoverRedis(param) + await handleRecover(param) .then(() => { loading.value = false; MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); @@ -225,22 +212,23 @@ const onRecover = async () => { }); }; -const onBatchDelete = async (row: Database.FileRecord | null) => { - let files: Array = []; +const onBatchDelete = async (row: Backup.RecordInfo | null) => { + let ids: Array = []; if (row) { - files.push(row.fileDir + '/' + row.fileName); + ids.push(row.id); } else { - selects.value.forEach((item: Database.FileRecord) => { - files.push(item.fileDir + '/' + item.fileName); + selects.value.forEach((item: Backup.RecordInfo) => { + ids.push(item.id); }); } - await useDeleteData(BatchDeleteFile, { isDir: false, paths: files }, 'commons.msg.delete'); - loadBackupRecords(); + await useDeleteData(deleteBackupRecord, { ids: ids }, 'commons.msg.delete'); + search(); }; + const buttons = [ { label: i18n.global.t('commons.button.recover'), - click: (row: Database.FileRecord) => { + click: (row: Backup.RecordInfo) => { currentRow.value = row; let params = { header: i18n.global.t('commons.button.recover'), @@ -252,7 +240,7 @@ const buttons = [ }, { label: i18n.global.t('commons.button.delete'), - click: (row: Database.FileRecord) => { + click: (row: Backup.RecordInfo) => { onBatchDelete(row); }, }, @@ -302,7 +290,7 @@ const onSave = async (formEl: FormInstance | undefined, type: string) => { const loadform = async () => { form.saves = []; - const res = await RedisPersistenceConf(); + const res = await redisPersistenceConf(); form.appendonly = res.data?.appendonly; form.appendfsync = res.data?.appendfsync; let itemSaves = res.data?.save.split(' '); @@ -315,6 +303,5 @@ const loadform = async () => { defineExpose({ acceptParams, - onClose, }); diff --git a/frontend/src/views/database/redis/setting/status/index.vue b/frontend/src/views/database/redis/setting/status/index.vue index 7346bf576..2aae3b370 100644 --- a/frontend/src/views/database/redis/setting/status/index.vue +++ b/frontend/src/views/database/redis/setting/status/index.vue @@ -140,9 +140,6 @@ const acceptParams = (prop: DialogProps): void => { loadStatus(); } }; -const onClose = (): void => { - statusShow.value = false; -}; const loadStatus = async () => { const res = await loadRedisStatus(); @@ -168,7 +165,6 @@ const loadStatus = async () => { defineExpose({ acceptParams, - onClose, });