From 4df0c3e46151bd4cbde3236d0ee6cb40c3bfa9c3 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Mon, 11 Aug 2025 18:26:45 +0800 Subject: [PATCH] feat: Optimize node synchronization logic (#9947) Refs #9691 --- core/app/service/backup.go | 37 ++++++++---------- core/app/service/script_library.go | 38 ++++++++----------- core/app/service/setting.go | 24 +++++------- core/i18n/lang/en.yaml | 10 ++++- core/i18n/lang/ja.yaml | 10 ++++- core/i18n/lang/ko.yaml | 10 ++++- core/i18n/lang/ms.yml | 10 ++++- core/i18n/lang/pt-BR.yaml | 10 ++++- core/i18n/lang/ru.yaml | 10 ++++- core/i18n/lang/tr.yaml | 11 +++++- core/i18n/lang/zh-Hant.yaml | 10 ++++- core/i18n/lang/zh.yaml | 11 +++++- core/init/cron/job/backup.go | 8 ++-- .../setting/backup-account/operate/index.vue | 2 - 14 files changed, 118 insertions(+), 83 deletions(-) diff --git a/core/app/service/backup.go b/core/app/service/backup.go index 30a04dc6c..9d42e2528 100644 --- a/core/app/service/backup.go +++ b/core/app/service/backup.go @@ -120,11 +120,9 @@ func (u *BackupService) Create(req dto.BackupOperate) error { if err := backupRepo.Create(&backup); err != nil { return err } - go func() { - if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { - global.LOG.Errorf("sync backup account to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { + global.LOG.Errorf("sync backup account to node failed, err: %v", err) + } return nil } @@ -179,12 +177,13 @@ func (u *BackupService) Delete(name string) error { return buserr.New("ErrBackupInUsed") } - go func() { - if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { - global.LOG.Errorf("sync backup account to node failed, err: %v", err) - } - }() - return backupRepo.Delete(repo.WithByName(name)) + if err := backupRepo.Delete(repo.WithByName(name)); err != nil { + return err + } + if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { + global.LOG.Errorf("sync backup account to node failed, err: %v", err) + } + return nil } func (u *BackupService) Update(req dto.BackupOperate) error { @@ -241,11 +240,9 @@ func (u *BackupService) Update(req dto.BackupOperate) error { if err := backupRepo.Save(&newBackup); err != nil { return err } - go func() { - if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { - global.LOG.Errorf("sync backup account to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { + global.LOG.Errorf("sync backup account to node failed, err: %v", err) + } return nil } @@ -285,11 +282,9 @@ func (u *BackupService) RefreshToken(req dto.OperateByName) error { if err := backupRepo.Save(&backup); err != nil { return err } - go func() { - if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { - global.LOG.Errorf("sync backup account to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { + global.LOG.Errorf("sync backup account to node failed, err: %v", err) + } return nil } diff --git a/core/app/service/script_library.go b/core/app/service/script_library.go index b6c3471a5..fddbc442c 100644 --- a/core/app/service/script_library.go +++ b/core/app/service/script_library.go @@ -118,14 +118,12 @@ func (u *ScriptService) Create(req dto.ScriptOperate) error { if err := scriptRepo.Create(&itemData); err != nil { return err } - go func() { - if req.IsInteractive { - return - } - if err := xpack.Sync(constant.SyncScripts); err != nil { - global.LOG.Errorf("sync scripts to node failed, err: %v", err) - } - }() + if req.IsInteractive { + return nil + } + if err := xpack.Sync(constant.SyncScripts); err != nil { + global.LOG.Errorf("sync scripts to node failed, err: %v", err) + } return nil } @@ -139,11 +137,9 @@ func (u *ScriptService) Delete(req dto.OperateByIDs) error { return err } } - go func() { - if err := xpack.Sync(constant.SyncScripts); err != nil { - global.LOG.Errorf("sync scripts to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncScripts); err != nil { + global.LOG.Errorf("sync scripts to node failed, err: %v", err) + } return nil } @@ -161,11 +157,9 @@ func (u *ScriptService) Update(req dto.ScriptOperate) error { if err := scriptRepo.Update(req.ID, updateMap); err != nil { return err } - go func() { - if err := xpack.Sync(constant.SyncScripts); err != nil { - global.LOG.Errorf("sync scripts to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncScripts); err != nil { + global.LOG.Errorf("sync scripts to node failed, err: %v", err) + } return nil } @@ -245,11 +239,9 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error { if err := global.DB.Model(&model.Setting{}).Where("key = ?", "ScriptVersion").Updates(map[string]interface{}{"value": string(versionRes)}).Error; err != nil { return fmt.Errorf("update script version in db failed, err: %v", err) } - go func() { - if err := xpack.Sync(constant.SyncScripts); err != nil { - global.LOG.Errorf("sync scripts to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncScripts); err != nil { + global.LOG.Errorf("sync scripts to node failed, err: %v", err) + } return nil }, nil) diff --git a/core/app/service/setting.go b/core/app/service/setting.go index 3210ab519..84cafe84c 100644 --- a/core/app/service/setting.go +++ b/core/app/service/setting.go @@ -142,11 +142,9 @@ func (u *SettingService) Update(key, value string) error { case "UserName", "Password": _ = global.SESSION.Clean() case "Language": - go func() { - if err := xpack.Sync(constant.SyncLanguage); err != nil { - global.LOG.Errorf("sync language to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncLanguage); err != nil { + global.LOG.Errorf("sync language to node failed, err: %v", err) + } } return nil @@ -215,15 +213,13 @@ func (u *SettingService) UpdateProxy(req dto.ProxyUpdate) error { if err := xpack.ProxyDocker(loadDockerProxy(req)); err != nil { return err } - go func() { - syncScope := constant.SyncSystemProxy - if req.WithDockerRestart { - syncScope = constant.SyncSystemProxyWithRestartDocker - } - if err := xpack.Sync(syncScope); err != nil { - global.LOG.Errorf("sync proxy to node failed, err: %v", err) - } - }() + syncScope := constant.SyncSystemProxy + if req.WithDockerRestart { + syncScope = constant.SyncSystemProxyWithRestartDocker + } + if err := xpack.Sync(syncScope); err != nil { + global.LOG.Errorf("sync proxy to node failed, err: %v", err) + } return nil } diff --git a/core/i18n/lang/en.yaml b/core/i18n/lang/en.yaml index 034586f63..2bc8a0bd3 100644 --- a/core/i18n/lang/en.yaml +++ b/core/i18n/lang/en.yaml @@ -102,13 +102,19 @@ DownloadPackage: "Downloading script library package" AnalyticCompletion: "Analysis completed, now syncing to database..." Node: "Node" -SyncNode: "Sync node data" +SyncNode: "Sync data to node {{ .name }}" LocalName: "'local' name is only used for system local identification" -SyncPackageData: "Package sync data [{{ .detail }}]" +SyncPackageData: "Package sync data" SyncPackageEncrypt: "Data package encryption" SyncRequest: "Request node sync API" SyncFailedRetry: "Node data sync timeout (attempt {{ .index }}), retrying..." SyncFailed: "Sync failed, please manually sync in the node list!" +SyncSystemProxy: "System Proxy Settings" +SyncScripts: "Script Library" +SyncBackupAccounts: "Backup Accounts" +SyncAlertSetting: "Alert Settings" +SyncCustomApp: "Custom App" +SyncLanguage: "System Language" #upgrade node NodeUpgrade: "Upgrade node {{ .name }}" diff --git a/core/i18n/lang/ja.yaml b/core/i18n/lang/ja.yaml index f8bc75125..3f06617ec 100644 --- a/core/i18n/lang/ja.yaml +++ b/core/i18n/lang/ja.yaml @@ -103,13 +103,19 @@ DownloadPackage: "スクリプトライブラリパッケージをダウンロ AnalyticCompletion: "解析が完了しました、データベースに同期しています..." Node: "ノード" -SyncNode: "ノードデータ同期" +SyncNode: "データをノード {{ .name }} に同期" LocalName: "'local'名称はシステムのローカル識別のみに使用されます" -SyncPackageData: "同期データのパッケージ化 [{{ .detail }}]" +SyncPackageData: "同期データのパッケージ化" SyncPackageEncrypt: "データパッケージの暗号化" SyncRequest: "ノード同期APIをリクエスト" SyncFailedRetry: "ノードデータ同期タイムアウト ({{ .index }}回目)、再試行中..." SyncFailed: "同期に失敗しました、ノードリストで手動同期してください!" +SyncSystemProxy: "システムプロキシ設定" +SyncScripts: "スクリプトライブラリ" +SyncBackupAccounts: "バックアップアカウント" +SyncAlertSetting: "アラート設定" +SyncCustomApp: "カスタムアプリ" +SyncLanguage: "システム言語" #upgrade node NodeUpgrade: "{{ .name }} ノードのアップグレード" diff --git a/core/i18n/lang/ko.yaml b/core/i18n/lang/ko.yaml index d326c4f50..21f4e9e42 100644 --- a/core/i18n/lang/ko.yaml +++ b/core/i18n/lang/ko.yaml @@ -102,13 +102,19 @@ DownloadPackage: "스크립트 라이브러리 패키지 다운로드 중" AnalyticCompletion: "분석 완료, 데이터베이스에 동기화 중..." Node: "노드" -SyncNode: "노드 데이터 동기화" +SyncNode: "데이터를 노드 {{ .name }}(으)로 동기화" LocalName: "'local' 이름은 시스템 로컬 식별 전용으로 사용됩니다" -SyncPackageData: "동기화 데이터 패키징 [{{ .detail }}]" +SyncPackageData: "동기화 데이터 패키징" SyncPackageEncrypt: "데이터 패키지 암호화" SyncRequest: "노드 동기화 API 요청" SyncFailedRetry: "노드 데이터 동기화 시간 초과 ({{ .index }}번째 시도), 재시도 중..." SyncFailed: "동기화 실패, 노드 목록에서 수동 동기화를 실행하세요!" +SyncSystemProxy: "시스템 프록시 설정" +SyncScripts: "스크립트 라이브러리" +SyncBackupAccounts: "백업 계정" +SyncAlertSetting: "알림 설정" +SyncCustomApp: "사용자 정의 앱" +SyncLanguage: "시스템 언어" #upgrade node NodeUpgrade: "{{ .name }} 노드 업그레이드" diff --git a/core/i18n/lang/ms.yml b/core/i18n/lang/ms.yml index 9e096f976..c8afc86b2 100644 --- a/core/i18n/lang/ms.yml +++ b/core/i18n/lang/ms.yml @@ -102,13 +102,19 @@ DownloadPackage: "Muat turun pakej pustaka skrip" AnalyticCompletion: "Analisis selesai, sedang menyegerakkan ke pangkalan data..." Node: "Nod" -SyncNode: "Segerakkan data nod" +SyncNode: "Selaraskan data ke nod {{ .name }}" LocalName: "Nama 'local' hanya digunakan untuk pengenalpastian tempatan sistem" -SyncPackageData: "Pakej data segerak [{{ .detail }}]" +SyncPackageData: "Pakej data segerak" SyncPackageEncrypt: "Enkripsi pakej data" SyncRequest: "Permintaan API segerak nod" SyncFailedRetry: "Segerakan data nod tamat masa (percubaan ke-{{ .index }}), mencuba semula..." SyncFailed: "Segerakan gagal, sila segerakkan secara manual dalam senarai nod!" +SyncSystemProxy: "Tetapan Proksi Sistem" +SyncScripts: "Pustaka Skrip" +SyncBackupAccounts: "Akaun Sandaran" +SyncAlertSetting: "Tetapan Amaran" +SyncCustomApp: "Aplikasi Tersuai" +SyncLanguage: "Bahasa Sistem" #upgrade node NodeUpgrade: "Naik taraf node {{ .name }}" diff --git a/core/i18n/lang/pt-BR.yaml b/core/i18n/lang/pt-BR.yaml index d695f9282..74ccde978 100644 --- a/core/i18n/lang/pt-BR.yaml +++ b/core/i18n/lang/pt-BR.yaml @@ -102,13 +102,19 @@ DownloadPackage: "Baixando pacote da biblioteca de scripts" AnalyticCompletion: "Análise concluída, agora sincronizando com o banco de dados..." Node: "Nó" -SyncNode: "Sincronizar dados do nó" +SyncNode: "Sincronizar dados para o nó {{ .name }}" LocalName: "O nome 'local' é usado apenas para identificação local do sistema" -SyncPackageData: "Empacotar dados de sincronização [{{ .detail }}]" +SyncPackageData: "Empacotar dados de sincronização" SyncPackageEncrypt: "Criptografia de pacote de dados" SyncRequest: "Solicitar API de sincronização de nó" SyncFailedRetry: "Tempo esgotado na sincronização de dados do nó (tentativa {{ .index }}), tentando novamente..." SyncFailed: "Falha na sincronização, por favor sincronize manualmente na lista de nós!" +SyncSystemProxy: "Configurações de Proxy do Sistema" +SyncScripts: "Biblioteca de Scripts" +SyncBackupAccounts: "Contas de Backup" +SyncAlertSetting: "Configurações de Alerta" +SyncCustomApp: "Aplicativo Personalizado" +SyncLanguage: "Idioma do Sistema" #upgrade node NodeUpgrade: "Atualizar nó {{ .name }}" diff --git a/core/i18n/lang/ru.yaml b/core/i18n/lang/ru.yaml index d7ae19b0e..16b750c8d 100644 --- a/core/i18n/lang/ru.yaml +++ b/core/i18n/lang/ru.yaml @@ -102,13 +102,19 @@ DownloadPackage: "Загрузка архива библиотеки скрип AnalyticCompletion: "Анализ завершён, начинается синхронизация с базой данных..." Node: "Узел" -SyncNode: "Синхронизация данных узла" +SyncNode: "Синхронизировать данные с узлом {{ .name }}" LocalName: "Имя 'local' используется только для локальной идентификации в системе" -SyncPackageData: "Упаковка данных синхронизации [{{ .detail }}]" +SyncPackageData: "Упаковка данных синхронизации" SyncPackageEncrypt: "Шифрование пакета данных" SyncRequest: "Запрос API синхронизации узла" SyncFailedRetry: "Таймаут синхронизации данных узла (попытка {{ .index }}), повторная попытка..." SyncFailed: "Ошибка синхронизации, выполните ручную синхронизацию в списке узлов!" +SyncSystemProxy: "Настройки системного прокси" +SyncScripts: "Библиотека скриптов" +SyncBackupAccounts: "Резервные аккаунты" +SyncAlertSetting: "Настройки оповещений" +SyncCustomApp: "Пользовательское приложение" +SyncLanguage: "Язык системы" #upgrade node NodeUpgrade: "Обновление узла {{ .name }}" diff --git a/core/i18n/lang/tr.yaml b/core/i18n/lang/tr.yaml index 462742a70..5287e352d 100644 --- a/core/i18n/lang/tr.yaml +++ b/core/i18n/lang/tr.yaml @@ -99,14 +99,21 @@ ScriptSyncSkip: "Mevcut betik kütüphanesi zaten en son sürüm!" DownloadData: "Betik kütüphanesi dosyası data.yaml indiriliyor" DownloadPackage: "Betik kütüphanesi paketi indiriliyor" AnalyticCompletion: "Analiz tamamlandı, şimdi veritabanına senkronize ediliyor..." + Node: "Düğüm" -SyncNode: "Düğüm verilerini senkronize et" +SyncNode: "Verileri {{ .name }} düğümüne senkronize et" LocalName: "'local' adı yalnızca sistem yerel tanımlaması için kullanılır" -SyncPackageData: "Paket senkronizasyon verisi [{{ .detail }}]" +SyncPackageData: "Paket senkronizasyon verisi" SyncPackageEncrypt: "Veri paketi şifreleme" SyncRequest: "Düğüm senkronizasyon API'si isteği" SyncFailedRetry: "Düğüm veri senkronizasyonu zaman aşımı (deneme {{ .index }}), yeniden deneniyor..." SyncFailed: "Senkronizasyon başarısız, lütfen düğüm listesinde manuel senkronize edin!" +SyncSystemProxy: "Sistem Vekil Sunucu Ayarları" +SyncScripts: "Komut Dosyası Kütüphanesi" +SyncBackupAccounts: "Yedek Hesaplar" +SyncAlertSetting: "Uyarı Ayarları" +SyncCustomApp: "Özel Uygulama" +SyncLanguage: "Sistem Dili" #upgrade node NodeUpgrade: "Düğümü yükselt {{ .name }}" diff --git a/core/i18n/lang/zh-Hant.yaml b/core/i18n/lang/zh-Hant.yaml index e4fe32c14..42d2e1c6e 100644 --- a/core/i18n/lang/zh-Hant.yaml +++ b/core/i18n/lang/zh-Hant.yaml @@ -103,13 +103,19 @@ AnalyticCompletion: "解析成功,現在開始同步到資料庫..." #sync node Node: "節點" -SyncNode: "同步節點資料" +SyncNode: "同步數據到節點 {{ .name }}" LocalName: "'local' 名稱僅用於系統本機標識" -SyncPackageData: "打包同步資料 [{{ .detail }}]" +SyncPackageData: "打包同步資料" SyncPackageEncrypt: "封包加密" SyncRequest: "請求節點同步介面" SyncFailedRetry: "第 {{ .index }} 次同步節點資料失敗逾時,正在重試..." SyncFailed: "同步失敗,請在節點列表中手動同步!" +SyncSystemProxy: "系統代理配置" +SyncScripts: "腳本庫" +SyncBackupAccounts: "備份帳號" +SyncAlertSetting: "告警設置" +SyncCustomApp: "自定義應用" +SyncLanguage: "系統語言" #upgrade node NodeUpgrade: "升級節點 {{ .name }}" diff --git a/core/i18n/lang/zh.yaml b/core/i18n/lang/zh.yaml index 76ea60468..d7844f0a2 100644 --- a/core/i18n/lang/zh.yaml +++ b/core/i18n/lang/zh.yaml @@ -103,13 +103,20 @@ AnalyticCompletion: "解析成功,现在开始同步到数据库..." #sync node Node: "节点" -SyncNode: "同步节点数据" +SyncNode: "同步数据到节点 {{ .name }}" LocalName: "local 名称仅用于系统本机标识" -SyncPackageData: "打包同步数据 [{{ .detail }}]" +SyncPackageData: "打包同步数据" SyncPackageEncrypt: "数据包加密" SyncRequest: "请求节点同步接口" SyncFailedRetry: "第 {{ .index }} 次同步节点数据失败超时,正在重试..." SyncFailed: "同步失败,请在节点列表中手动同步!" +SyncSystemProxy: "系统代理配置" +SyncScripts: "脚本库" +SyncBackupAccounts: "备份账号" +SyncAlertSetting: "告警设置" +SyncCustomApp: "自定义应用" +SyncLanguage: "系统语言" + #upgrade node NodeUpgrade: "升级节点 {{ .name }}" diff --git a/core/init/cron/job/backup.go b/core/init/cron/job/backup.go index 761383e8e..322c3ed37 100644 --- a/core/init/cron/job/backup.go +++ b/core/init/cron/job/backup.go @@ -56,10 +56,8 @@ func (b *backup) Run() { varsItem, _ := json.Marshal(varMap) _ = global.DB.Model(&model.BackupAccount{}).Where("id = ?", backupItem.ID).Updates(map[string]interface{}{"vars": string(varsItem)}).Error global.LOG.Infof("Refresh %s-%s access_token successful!", backupItem.Type, backupItem.Name) - go func() { - if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { - global.LOG.Errorf("sync backup account to node failed, err: %v", err) - } - }() + if err := xpack.Sync(constant.SyncBackupAccounts); err != nil { + global.LOG.Errorf("sync backup account to node failed, err: %v", err) + } } } diff --git a/frontend/src/views/setting/backup-account/operate/index.vue b/frontend/src/views/setting/backup-account/operate/index.vue index f4f56a0bf..c06ad235d 100644 --- a/frontend/src/views/setting/backup-account/operate/index.vue +++ b/frontend/src/views/setting/backup-account/operate/index.vue @@ -703,7 +703,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => { .then(() => { loading.value = false; MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); - emit('search'); drawerVisible.value = false; }) .catch(() => { @@ -715,7 +714,6 @@ const onSubmit = async (formEl: FormInstance | undefined) => { .then(() => { loading.value = false; MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); - emit('search'); drawerVisible.value = false; }) .catch(() => {