diff --git a/apps/jingrow/frontend/src/views/dev/AppDetail.vue b/apps/jingrow/frontend/src/views/dev/AppDetail.vue index c75ce03..b1b1b4a 100644 --- a/apps/jingrow/frontend/src/views/dev/AppDetail.vue +++ b/apps/jingrow/frontend/src/views/dev/AppDetail.vue @@ -12,11 +12,17 @@ {{ t('Back') }} - + - {{ t('Install') }} + {{ isCurrentAppInstalled ? t('Update') : t('Install') }} @@ -151,8 +157,18 @@ const installMessage = ref('') const installStatus = ref<'success' | 'error' | 'info'>('info') const showProgressModal = ref(false) +// 已安装应用集合 +const installedAppNames = ref>(new Set()) + const appName = computed(() => route.params.name as string) +// 检查当前应用是否已安装 +const isCurrentAppInstalled = computed(() => { + if (!app.value) return false + const appName = app.value.app_name || app.value.name || '' + return installedAppNames.value.has(appName.toLowerCase()) +}) + async function loadAppDetail() { loading.value = true error.value = '' @@ -261,6 +277,9 @@ async function performInstall() { installMessage.value = t('应用安装成功!') message.success(t('应用安装成功')) + // 刷新已安装应用列表 + loadInstalledApps() + setTimeout(() => { showProgressModal.value = false }, 2000) @@ -280,8 +299,27 @@ async function performInstall() { } } +// 加载已安装应用列表 +async function loadInstalledApps() { + try { + const response = await axios.get('/jingrow/installed-app-names') + if (response.data.success) { + const apps = response.data.apps || [] + installedAppNames.value = new Set(apps) + } + } catch (error) { + console.error('Load installed apps error:', error) + } +} + onMounted(() => { loadAppDetail() + loadInstalledApps() + + // 监听全局事件 + window.addEventListener('installedAppsUpdated', () => { + loadInstalledApps() + }) }) diff --git a/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue b/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue index 1710049..d532492 100644 --- a/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue +++ b/apps/jingrow/frontend/src/views/dev/AppMarketplace.vue @@ -361,23 +361,10 @@ function truncateText(text: string, maxLength: number): string { // 加载已安装应用列表 async function loadInstalledApps() { try { - const cached = sessionStorage.getItem('installed_apps_names') - if (cached) { - const data = JSON.parse(cached) - if (Date.now() - data.timestamp < 30 * 60 * 1000) { - installedAppNames.value = new Set(data.apps || []) - return - } - } - const response = await axios.get('/jingrow/installed-app-names') if (response.data.success) { const apps = response.data.apps || [] installedAppNames.value = new Set(apps) - sessionStorage.setItem('installed_apps_names', JSON.stringify({ - apps, - timestamp: Date.now() - })) } } catch (error) { console.error('Load installed apps error:', error) @@ -393,6 +380,11 @@ function isAppInstalled(appName: string): boolean { onMounted(() => { loadApps() loadInstalledApps() + + // 监听全局事件 + window.addEventListener('installedAppsUpdated', () => { + loadInstalledApps() + }) }) // 监听搜索和排序变化