diff --git a/.env.example b/.env.example index 4228329..da21fb7 100644 --- a/.env.example +++ b/.env.example @@ -4,7 +4,8 @@ # Tauri Rust 请求后端基址(拉取 appConfig、脚本等) # AICLIENT_API_BASE=http://127.0.0.1:8001 - +# ffmpeg(抖音流水线提音频必需):放入 src-tauri/binaries/ffmpeg.exe 或设置绝对路径 +# AICLIENT_FFMPEG_PATH=C:/path/to/ffmpeg.exe # 应用配置在 pythonbackend 的 MySQL 表 desktop_configs(name/value), # 登录后自动同步;Node 流水线通过环境变量 AICLIENT_CFG_ 读取。 diff --git a/src-tauri/src/api_client.rs b/src-tauri/src/api_client.rs index fcc5291..267b57c 100644 --- a/src-tauri/src/api_client.rs +++ b/src-tauri/src/api_client.rs @@ -65,13 +65,18 @@ pub async fn request_json( let res = req.send().await.map_err(|e| { if e.is_connect() { + println!("无法连接服务器,请确认后端已启动"); "无法连接服务器,请确认后端已启动".to_string() + } else { + println!("e: {}", e); e.to_string() + } })?; let status = res.status().as_u16(); + println!("status: {}", status); let encrypted = res .headers() .get(ENCRYPTED_HEADER) diff --git a/src-tauri/src/app_config.rs b/src-tauri/src/app_config.rs index 4ba1661..3ab5772 100644 --- a/src-tauri/src/app_config.rs +++ b/src-tauri/src/app_config.rs @@ -211,6 +211,7 @@ impl AppConfig { self.clear_server().await; return Ok(()); } + match fetch_from_server(token).await { Ok(map) => { let mut g = self.inner.write().await; @@ -243,10 +244,15 @@ async fn fetch_from_server(token: &str) -> Result, AppCo format!("Bearer {}", token.trim()), ); - let (status, v) = crate::api_client::request_json("GET", "/appConfig", None, headers) - .await - .map_err(|e| AppConfigError::Fetch(e))?; - + let (status, v) = match crate::api_client::request_json("GET", "/appConfig", None, headers).await + { + Ok(pair) => pair, + Err(e) => { + log::warn!(target: "app_config", "GET /appConfig 请求失败(未拿到响应体): {e}"); + println!("GET /appConfig 请求失败(未拿到响应体): {e}"); + return Err(AppConfigError::Fetch(e)); + } + }; if status == 401 { return Err(AppConfigError::Fetch("未认证或令牌已失效".into())); } diff --git a/src-tauri/src/ffmpeg.rs b/src-tauri/src/ffmpeg.rs index b76f018..2fcb375 100644 --- a/src-tauri/src/ffmpeg.rs +++ b/src-tauri/src/ffmpeg.rs @@ -43,6 +43,11 @@ pub fn locate_ffmpeg() -> Option { if flat.exists() { return Some(flat); } + // target/debug/tauri-app.exe → src-tauri/binaries/ffmpeg.exe + let dev_bin = dir.join("..").join("..").join("binaries").join(exe_name()); + if dev_bin.exists() { + return Some(dev_bin); + } } } let dev = PathBuf::from("src-tauri/binaries").join(exe_name()); diff --git a/src-tauri/src/nodejs.rs b/src-tauri/src/nodejs.rs index 8b9097e..372f04e 100644 --- a/src-tauri/src/nodejs.rs +++ b/src-tauri/src/nodejs.rs @@ -364,6 +364,11 @@ async fn run_script_bundle( for (key, value) in config_env { cmd.env(key, value); } + if let Some(ffmpeg_path) = crate::ffmpeg::locate_ffmpeg() { + if ffmpeg_path.exists() { + cmd.env("AICLIENT_FFMPEG_PATH", ffmpeg_path); + } + } let mut child = cmd.spawn()?; // 把 params JSON 灌进 stdin diff --git a/src/views/LocalConfigView.vue b/src/views/LocalConfigView.vue index 7824366..fb8703b 100644 --- a/src/views/LocalConfigView.vue +++ b/src/views/LocalConfigView.vue @@ -48,6 +48,8 @@ async function loadAll() { invoke("list_local_app_config"), invoke("get_app_config_detail"), ]); + // console.log("local",local) + // console.log("detail",detail) localItems.value = Array.isArray(local) ? local : []; mergedDetail.value = Array.isArray(detail) ? detail : []; } catch (err) {