From 2567b75dfb14b80c73c70fdc7a5f47a988a3a322 Mon Sep 17 00:00:00 2001 From: jingrow Date: Mon, 27 Oct 2025 02:32:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=89=E8=A3=85app=E5=89=8D=E5=85=88?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E6=98=AF=E5=90=A6=E5=B7=B2=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=EF=BC=8C=E5=B7=B2=E5=AD=98=E5=9C=A8=E5=BC=B9=E7=AA=97=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=E8=A6=86=E7=9B=96=E5=AE=89=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../frontend/src/views/dev/AppDetail.vue | 31 ++++++++++++++++++- .../frontend/src/views/dev/AppMarketplace.vue | 31 ++++++++++++++++++- .../jingrow/api/local_app_installer.py | 30 ++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/apps/jingrow/frontend/src/views/dev/AppDetail.vue b/apps/jingrow/frontend/src/views/dev/AppDetail.vue index e32ac81..c75ce03 100644 --- a/apps/jingrow/frontend/src/views/dev/AppDetail.vue +++ b/apps/jingrow/frontend/src/views/dev/AppDetail.vue @@ -129,7 +129,7 @@ import { ref, onMounted, computed } from 'vue' import { useRoute, useRouter } from 'vue-router' import { get_session_api_headers } from '@/shared/api/auth' -import { NButton, NIcon, NSpin, NEmpty, useMessage } from 'naive-ui' +import { NButton, NIcon, NSpin, NEmpty, useMessage, useDialog } from 'naive-ui' import { Icon } from '@iconify/vue' import axios from 'axios' import { t } from '@/shared/i18n' @@ -138,6 +138,7 @@ import InstallProgressModal from './InstallProgressModal.vue' const route = useRoute() const router = useRouter() const message = useMessage() +const dialog = useDialog() const loading = ref(true) const error = ref('') @@ -197,6 +198,34 @@ async function installApp() { return } + // 先检查应用是否已存在 + try { + const appName = app.value.app_name || app.value.name + if (appName) { + const checkResponse = await axios.get(`/jingrow/check-app/${appName}`) + + if (checkResponse.data.exists) { + // 显示确认对话框 + dialog.warning({ + title: t('应用已存在'), + content: t('应用 "{0}" 已安装,是否覆盖安装?').replace('{0}', appName), + positiveText: t('确认覆盖'), + negativeText: t('取消'), + onPositiveClick: () => { + performInstall() + } + }) + return + } + } + } catch (error) { + console.error('Check app exists error:', error) + } + + performInstall() +} + +async function performInstall() { try { installing.value = true installProgress.value = 0 diff --git a/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue b/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue index 9d9a00e..a01cf6d 100644 --- a/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue +++ b/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue @@ -145,7 +145,7 @@