From cbbebc33c8cf835d8381a00000427da172ad7c9a Mon Sep 17 00:00:00 2001
From: zhengkunwang223 <1paneldev@sina.com>
Date: Mon, 29 Sep 2025 11:26:20 +0800
Subject: [PATCH] feat: Delete associated database when deleting website
---
agent/app/dto/request/website.go | 1 +
agent/app/service/website.go | 30 +++++++++++++++++++
frontend/src/lang/modules/en.ts | 1 +
frontend/src/lang/modules/es-es.ts | 1 +
frontend/src/lang/modules/ja.ts | 1 +
frontend/src/lang/modules/ko.ts | 1 +
frontend/src/lang/modules/ms.ts | 1 +
frontend/src/lang/modules/pt-br.ts | 1 +
frontend/src/lang/modules/ru.ts | 1 +
frontend/src/lang/modules/tr.ts | 1 +
frontend/src/lang/modules/zh-Hant.ts | 1 +
frontend/src/lang/modules/zh.ts | 1 +
.../host/process/process/detail/index.vue | 23 ++++++++++++--
.../views/website/website/delete/index.vue | 24 ++++++++-------
14 files changed, 75 insertions(+), 13 deletions(-)
diff --git a/agent/app/dto/request/website.go b/agent/app/dto/request/website.go
index 54a388a96ce5..51fcc1b2c5f2 100644
--- a/agent/app/dto/request/website.go
+++ b/agent/app/dto/request/website.go
@@ -95,6 +95,7 @@ type WebsiteDelete struct {
DeleteApp bool `json:"deleteApp"`
DeleteBackup bool `json:"deleteBackup"`
ForceDelete bool `json:"forceDelete"`
+ DeleteDB bool `json:"deleteDB"`
}
type WebsiteOp struct {
diff --git a/agent/app/service/website.go b/agent/app/service/website.go
index ab39e9152748..cfe24d94c642 100644
--- a/agent/app/service/website.go
+++ b/agent/app/service/website.go
@@ -641,6 +641,36 @@ func (w WebsiteService) DeleteWebsite(req request.WebsiteDelete) error {
return buserr.WithName("ErrParentWebsite", strings.Join(names, ","))
}
}
+
+ if website.Type == constant.Runtime && req.DeleteDB && website.DbID != 0 {
+ switch website.DbType {
+ case constant.AppMysql, constant.AppMariaDB:
+ mysqlDB, _ := mysqlRepo.Get(repo.WithByID(website.DbID))
+ if mysqlDB.ID > 0 {
+ deleteReq := dto.MysqlDBDelete{
+ ID: mysqlDB.ID,
+ Database: mysqlDB.MysqlName,
+ ForceDelete: req.ForceDelete,
+ }
+ if err = NewIMysqlService().Delete(context.TODO(), deleteReq); err != nil && !req.ForceDelete {
+ return err
+ }
+ }
+ case constant.AppPostgresql, constant.AppPostgres:
+ pgDB, _ := postgresqlRepo.Get(repo.WithByID(website.DbID))
+ if pgDB.ID > 0 {
+ deleteReq := dto.PostgresqlDBDelete{
+ ID: pgDB.ID,
+ ForceDelete: req.ForceDelete,
+ Database: pgDB.PostgresqlName,
+ }
+ if err = NewIPostgresqlService().Delete(context.TODO(), deleteReq); err != nil && !req.ForceDelete {
+ return err
+ }
+ }
+ }
+ }
+
if err = delNginxConfig(website, req.ForceDelete); err != nil {
return err
}
diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts
index c3c7b950d1b0..fc6c9602b2e1 100644
--- a/frontend/src/lang/modules/en.ts
+++ b/frontend/src/lang/modules/en.ts
@@ -2347,6 +2347,7 @@ const message = {
'Force deletion will ignore errors during the deletion process and eventually delete metadata.',
deleteAppHelper: 'Delete associated applications and application backups at the same time',
deleteBackupHelper: 'Also delete website backups.',
+ deleteDatabaseHelper: 'Also delete the database associated with the website',
deleteConfirmHelper: `The delete operation can't be undone. Enter "{0}" to confirm deletion.`,
staticPath: 'The corresponding main directory is ',
limit: 'Scheme',
diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts
index 7c6e5fc94083..0bee1fd9d90e 100644
--- a/frontend/src/lang/modules/es-es.ts
+++ b/frontend/src/lang/modules/es-es.ts
@@ -2336,6 +2336,7 @@ const message = {
forceDeleteHelper: 'La eliminación forzada ignorará errores y eliminará metadatos igualmente.',
deleteAppHelper: 'Eliminar también aplicaciones y backups asociados',
deleteBackupHelper: 'Eliminar también copias de seguridad del sitio',
+ deleteDatabaseHelper: 'También eliminar la base de datos asociada al sitio web',
deleteConfirmHelper: `Esta acción es irreversible. Escribe "{0}" para confirmar.`,
staticPath: 'El directorio principal correspondiente es ',
limit: 'Esquema',
diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts
index 43018376f15a..32391ebabae2 100644
--- a/frontend/src/lang/modules/ja.ts
+++ b/frontend/src/lang/modules/ja.ts
@@ -2262,6 +2262,7 @@ const message = {
forceDeleteHelper: 'フォース削除は、削除プロセス中のエラーを無視し、最終的にメタデータを削除します。',
deleteAppHelper: '関連するアプリケーションとアプリケーションのバックアップを同時に削除する',
deleteBackupHelper: 'また、Webサイトのバックアップを削除します。',
+ deleteDatabaseHelper: 'ウェブサイトに関連付けられたデータベースも削除します',
deleteConfirmHelper:
'削除操作を元に戻すことはできません。 "{0}" を入力して、削除を確認します。',
staticPath: '対応するメインディレクトリはです',
diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts
index 7b8520b879f5..2e5b0f5c2ecd 100644
--- a/frontend/src/lang/modules/ko.ts
+++ b/frontend/src/lang/modules/ko.ts
@@ -2223,6 +2223,7 @@ const message = {
forceDeleteHelper: '강제 삭제는 삭제 과정에서 발생하는 오류를 무시하고 최종적으로 메타데이터를 삭제합니다.',
deleteAppHelper: '관련 애플리케이션 및 애플리케이션 백업을 동시에 삭제합니다.',
deleteBackupHelper: '웹사이트 백업도 삭제합니다.',
+ deleteDatabaseHelper: '웹사이트와 연결된 데이터베이스도 삭제합니다',
deleteConfirmHelper:
'삭제 작업은 되돌릴 수 없습니다. 확인하려면 "{0}"을(를) 입력하세요.',
staticPath: '해당 주요 디렉터리는',
diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts
index ab75a47e86c0..b3d12e501234 100644
--- a/frontend/src/lang/modules/ms.ts
+++ b/frontend/src/lang/modules/ms.ts
@@ -2316,6 +2316,7 @@ const message = {
forceDeleteHelper: 'Padam paksa akan mengabaikan ralat semasa proses pemadaman dan akhirnya memadam metadata.',
deleteAppHelper: 'Padam aplikasi yang berkaitan dan sandaran aplikasi pada masa yang sama',
deleteBackupHelper: 'Juga padamkan sandaran laman web.',
+ deleteDatabaseHelper: 'Juga hapuskan pangkalan data yang berkaitan dengan laman web',
deleteConfirmHelper: `Operasi pemadaman tidak boleh dibatalkan. Masukkan "{0}" untuk mengesahkan pemadaman.`,
staticPath: 'Direktori utama yang sepadan ialah ',
limit: 'Skim',
diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts
index 385510ffb259..a611d7a26bcf 100644
--- a/frontend/src/lang/modules/pt-br.ts
+++ b/frontend/src/lang/modules/pt-br.ts
@@ -2317,6 +2317,7 @@ const message = {
forceDeleteHelper: 'A exclusão forçada ignorará erros durante o processo de exclusão e excluirá os metadados.',
deleteAppHelper: 'Excluir aplicativos associados e backups de aplicativos ao mesmo tempo',
deleteBackupHelper: 'Excluir também backups do site.',
+ deleteDatabaseHelper: 'Também excluir o banco de dados associado ao site',
deleteConfirmHelper: `A operação de exclusão não pode ser desfeita. Digite "{0}" para confirmar a exclusão.`,
staticPath: 'O diretório principal correspondente é ',
limit: 'Plano',
diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts
index bde73a4f9c67..702ce23f00ef 100644
--- a/frontend/src/lang/modules/ru.ts
+++ b/frontend/src/lang/modules/ru.ts
@@ -2314,6 +2314,7 @@ const message = {
'Принудительное удаление будет игнорировать ошибки во время процесса удаления и в итоге удалит метаданные.',
deleteAppHelper: 'Удалить связанные приложения и резервные копии приложений одновременно',
deleteBackupHelper: 'Также удалить резервные копии веб-сайта.',
+ deleteDatabaseHelper: 'Также удалить базу данных, связанную с веб-сайтом',
deleteConfirmHelper:
'Операцию удаления нельзя отменить. Введите "{0}" для подтверждения удаления.',
staticPath: 'Соответствующая основная директория - ',
diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts
index ee7011420504..ab6b83373ea7 100644
--- a/frontend/src/lang/modules/tr.ts
+++ b/frontend/src/lang/modules/tr.ts
@@ -2376,6 +2376,7 @@ const message = {
'Zorla silme, silme işlemi sırasında oluşan hataları yok sayar ve nihayetinde meta verileri siler.',
deleteAppHelper: 'İlgili uygulamaları ve uygulama yedeklerini aynı anda sil',
deleteBackupHelper: 'Web sitesi yedeklerini de sil.',
+ deleteDatabaseHelper: 'Ayrıca web sitesi ile ilişkili veritabanını da sil',
deleteConfirmHelper:
'Silme işlemi geri alınamaz. Silmeyi onaylamak için "{0}" yazın.',
staticPath: 'Karşılık gelen ana dizin ',
diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts
index 6c97e9b300d1..9c01939afc93 100644
--- a/frontend/src/lang/modules/zh-Hant.ts
+++ b/frontend/src/lang/modules/zh-Hant.ts
@@ -2187,6 +2187,7 @@ const message = {
forceDeleteHelper: '強制刪除,會忽略刪除過程中產生的錯誤並最終刪除中繼資料',
deleteAppHelper: '同時刪除關聯應用、資料庫以及應用備份',
deleteBackupHelper: '同時刪除網站備份',
+ deleteDatabaseHelper: '同時刪除網站關聯資料庫',
deleteConfirmHelper: '刪除操作無法回滾,請輸入 "{0}" 刪除',
staticPath: '對應主目錄:',
limit: '限制方案',
diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts
index 8a67844e5f5c..5fe04fa7c0fe 100644
--- a/frontend/src/lang/modules/zh.ts
+++ b/frontend/src/lang/modules/zh.ts
@@ -2178,6 +2178,7 @@ const message = {
forceDeleteHelper: '强制删除,会忽略删除过程中产生的错误并最终删除元数据',
deleteAppHelper: '同时删除关联应用、数据库以及应用备份',
deleteBackupHelper: '同时删除网站备份',
+ deleteDatabaseHelper: '同时删除网站关联数据库',
deleteConfirmHelper: '删除操作无法回滚,请输入 "{0}" 删除',
staticPath: '对应主目录:',
limit: '限制方案',
diff --git a/frontend/src/views/host/process/process/detail/index.vue b/frontend/src/views/host/process/process/detail/index.vue
index dd0184907e68..0e023c4062e7 100644
--- a/frontend/src/views/host/process/process/detail/index.vue
+++ b/frontend/src/views/host/process/process/detail/index.vue
@@ -47,7 +47,7 @@
-
+
@@ -61,7 +61,7 @@
>
-
+
{{ row.localaddr.ip }}
@@ -90,6 +90,25 @@ const open = ref(false);
const data = ref({
name: '',
envs: [] as string[],
+ status: '',
+ PID: 0,
+ PPID: 0,
+ numThreads: 0,
+ numConnections: 0,
+ diskRead: '',
+ diskWrite: '',
+ username: '',
+ startTime: '',
+ cmdLine: '',
+ rss: '',
+ swap: '',
+ vms: '',
+ hwm: '',
+ data: '',
+ stack: '',
+ locked: '',
+ openFiles: [],
+ connects: [],
});
const resourceName = ref('');
const activeName = ref('basic');
diff --git a/frontend/src/views/website/website/delete/index.vue b/frontend/src/views/website/website/delete/index.vue
index 6ec25dfedced..1f95bbf1a8be 100644
--- a/frontend/src/views/website/website/delete/index.vue
+++ b/frontend/src/views/website/website/delete/index.vue
@@ -14,13 +14,18 @@
{{ $t('website.deleteAppHelper') }}
-
{{ $t('website.deleteBackupHelper') }}
+
+
+
+ {{ $t('website.deleteDatabaseHelper') }}
+
+
{{ $t('website.deleteSubsite', [subSites]) }}
@@ -51,15 +56,17 @@ import { ref } from 'vue';
import { Website } from '@/api/interface/website';
import { MsgSuccess } from '@/utils/message';
-const key = 1;
-const open = ref(false);
-const loading = ref(false);
-const deleteReq = ref({
+const initData = () => ({
id: 0,
deleteApp: false,
deleteBackup: false,
forceDelete: false,
+ deleteDB: false,
});
+const key = 1;
+const open = ref(false);
+const loading = ref(false);
+const deleteReq = ref(initData());
const type = ref('');
const em = defineEmits(['close']);
const deleteForm = ref();
@@ -74,12 +81,7 @@ const handleClose = () => {
};
const acceptParams = async (website: Website.WebsiteDTO) => {
- deleteReq.value = {
- id: 0,
- deleteApp: false,
- deleteBackup: false,
- forceDelete: false,
- };
+ deleteReq.value = initData();
subSites.value = '';
if (website.childSites && website.childSites.length > 0) {