From a663ad044effd8780d4047bfb3f6ed27ce5d7d79 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Fri, 26 Dec 2025 20:42:50 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E5=88=B7=E6=96=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/src/config.rs | 17 +++++++++-- src-tauri/src/env_commands.rs | 12 ++------ src-tauri/src/env_manager.rs | 28 +++++++++++++------ src-tauri/src/env_providers/clojure.rs | 15 ++++++---- src-tauri/src/env_providers/scala.rs | 15 ++++++---- src/components/setting/EnvironmentManager.vue | 27 ++++++++++++++---- src/composables/useLanguageManager.ts | 19 ++++++++++++- src/types/app.ts | 1 + 8 files changed, 98 insertions(+), 36 deletions(-) diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index 7af01f3..b850fe0 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -319,11 +319,24 @@ pub fn get_app_config_internal() -> Result { } #[command] -pub async fn update_app_config(config: AppConfig) -> Result<(), String> { +pub async fn update_app_config( + config: AppConfig, + app_handle: tauri::AppHandle, +) -> Result<(), String> { + use tauri::Emitter; + let mut guard = get_config_manager()?; if let Some(config_manager) = guard.as_mut() { config_manager.config = config; - config_manager.save_config() + let result = config_manager.save_config(); + + // 保存成功后发送配置更新事件 + if result.is_ok() { + app_handle.emit("config-updated", ()).ok(); + info!("配置已更新,已发送 config-updated 事件"); + } + + result } else { Err("配置管理器未初始化".to_string()) } diff --git a/src-tauri/src/env_commands.rs b/src-tauri/src/env_commands.rs index f7e12ea..3d87f02 100644 --- a/src-tauri/src/env_commands.rs +++ b/src-tauri/src/env_commands.rs @@ -46,15 +46,9 @@ pub async fn switch_environment_version( ) -> Result<(), String> { info!("切换 {} 到版本 {}", language, version); let manager = env_manager.lock().await; - let result = manager.switch_version(&language, &version).await; - - if result.is_ok() { - // 发送配置更新事件通知前端刷新配置 - app_handle.emit("config-updated", ()).ok(); - info!("已发送配置更新事件"); - } - - result + manager + .switch_version(&language, &version, app_handle) + .await } #[tauri::command] diff --git a/src-tauri/src/env_manager.rs b/src-tauri/src/env_manager.rs index dcf8ff6..f685c8a 100644 --- a/src-tauri/src/env_manager.rs +++ b/src-tauri/src/env_manager.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use log::{error, info}; +use log::{error, info, warn}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::PathBuf; @@ -24,6 +24,7 @@ pub struct EnvironmentInfo { pub current_version: Option, pub installed_versions: Vec, pub available_versions: Vec, + pub error: Option, // 错误信息(如获取可用版本失败) } // 下载进度事件 @@ -67,7 +68,7 @@ pub trait EnvironmentProvider: Send + Sync { ) -> Result; // 切换到指定版本 - async fn switch_version(&self, version: &str) -> Result<(), String>; + async fn switch_version(&self, version: &str, app_handle: AppHandle) -> Result<(), String>; // 获取当前激活的版本 async fn get_current_version(&self) -> Result, String>; @@ -105,16 +106,22 @@ impl EnvironmentManager { let current_version = provider.get_current_version().await.ok().flatten(); let installed_versions = provider.get_installed_versions().await.unwrap_or_default(); - let available_versions = provider - .fetch_available_versions() - .await - .unwrap_or_default(); + + // 获取可用版本,如果失败也要返回已安装版本,并在错误信息中说明 + let (available_versions, error) = match provider.fetch_available_versions().await { + Ok(versions) => (versions, None), + Err(e) => { + warn!("获取可用版本失败: {}", e); + (vec![], Some(format!("获取可用版本失败: {}", e))) + } + }; Ok(EnvironmentInfo { language: language.to_string(), current_version, installed_versions, available_versions, + error, }) } @@ -133,14 +140,19 @@ impl EnvironmentManager { provider.download_and_install(version, app_handle).await } - pub async fn switch_version(&self, language: &str, version: &str) -> Result<(), String> { + pub async fn switch_version( + &self, + language: &str, + version: &str, + app_handle: AppHandle, + ) -> Result<(), String> { let provider = self .providers .get(language) .ok_or_else(|| format!("暂未支持 {} 语言,请前往 github 提供 issues", language))?; info!("切换 {} 到版本 {}", language, version); - provider.switch_version(version).await + provider.switch_version(version, app_handle).await } pub fn get_supported_languages(&self) -> Vec { diff --git a/src-tauri/src/env_providers/clojure.rs b/src-tauri/src/env_providers/clojure.rs index 872cda9..82e93db 100644 --- a/src-tauri/src/env_providers/clojure.rs +++ b/src-tauri/src/env_providers/clojure.rs @@ -594,7 +594,12 @@ impl ClojureEnvironmentProvider { Ok(()) } - async fn update_plugin_config(&self, version: &str, install_path: &str) -> Result<(), String> { + async fn update_plugin_config( + &self, + version: &str, + install_path: &str, + app_handle: &AppHandle, + ) -> Result<(), String> { use crate::config::{get_app_config_internal, update_app_config}; info!( @@ -616,7 +621,7 @@ impl ClojureEnvironmentProvider { } } - update_app_config(config) + update_app_config(config, app_handle.clone()) .await .map_err(|e| format!("保存配置失败: {}", e))?; @@ -794,7 +799,7 @@ impl EnvironmentProvider for ClojureEnvironmentProvider { // 清理临时解压目录 std::fs::remove_dir_all(&temp_extract_dir).ok(); - self.update_plugin_config(version, &install_path.to_string_lossy()) + self.update_plugin_config(version, &install_path.to_string_lossy(), &app_handle) .await?; emit_download_progress( @@ -810,7 +815,7 @@ impl EnvironmentProvider for ClojureEnvironmentProvider { Ok(install_path.to_string_lossy().to_string()) } - async fn switch_version(&self, version: &str) -> Result<(), String> { + async fn switch_version(&self, version: &str, app_handle: AppHandle) -> Result<(), String> { info!("切换 Clojure 版本到 {}", version); if !self.is_version_installed(version) { @@ -819,7 +824,7 @@ impl EnvironmentProvider for ClojureEnvironmentProvider { let install_path = self.get_version_install_path(version); - self.update_plugin_config(version, &install_path.to_string_lossy()) + self.update_plugin_config(version, &install_path.to_string_lossy(), &app_handle) .await?; info!("成功切换到 Clojure {}", version); diff --git a/src-tauri/src/env_providers/scala.rs b/src-tauri/src/env_providers/scala.rs index 555086f..cb0eb49 100644 --- a/src-tauri/src/env_providers/scala.rs +++ b/src-tauri/src/env_providers/scala.rs @@ -414,7 +414,12 @@ impl ScalaEnvironmentProvider { } // 更新配置以使用新版本 - async fn update_plugin_config(&self, version: &str, install_path: &str) -> Result<(), String> { + async fn update_plugin_config( + &self, + version: &str, + install_path: &str, + app_handle: &AppHandle, + ) -> Result<(), String> { use crate::config::{get_app_config_internal, update_app_config}; info!( @@ -444,7 +449,7 @@ impl ScalaEnvironmentProvider { } } - update_app_config(config) + update_app_config(config, app_handle.clone()) .await .map_err(|e| format!("保存配置失败: {}", e))?; @@ -622,7 +627,7 @@ impl EnvironmentProvider for ScalaEnvironmentProvider { } // 更新插件配置 - self.update_plugin_config(version, &actual_install_path.to_string_lossy()) + self.update_plugin_config(version, &actual_install_path.to_string_lossy(), &app_handle) .await?; emit_download_progress( @@ -638,7 +643,7 @@ impl EnvironmentProvider for ScalaEnvironmentProvider { Ok(actual_install_path.to_string_lossy().to_string()) } - async fn switch_version(&self, version: &str) -> Result<(), String> { + async fn switch_version(&self, version: &str, app_handle: AppHandle) -> Result<(), String> { info!("切换 Scala 版本到 {}", version); if !self.is_version_installed(version) { @@ -659,7 +664,7 @@ impl EnvironmentProvider for ScalaEnvironmentProvider { } } - self.update_plugin_config(version, &actual_install_path.to_string_lossy()) + self.update_plugin_config(version, &actual_install_path.to_string_lossy(), &app_handle) .await?; info!("成功切换到 Scala {}", version); diff --git a/src/components/setting/EnvironmentManager.vue b/src/components/setting/EnvironmentManager.vue index 5a98c93..7b1ecd1 100644 --- a/src/components/setting/EnvironmentManager.vue +++ b/src/components/setting/EnvironmentManager.vue @@ -69,8 +69,16 @@ + +
+
+ + {{ environmentInfo.error }} +
+
+ -
+

可下载版本

@@ -79,7 +87,8 @@
- + {{ downloadStatusText }} @@ -130,7 +139,7 @@