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 @@