- 修复循环播放
This commit is contained in:
+49
-3
@@ -18,7 +18,7 @@ use std::fs;
|
||||
use tokio_stream::wrappers::BroadcastStream;
|
||||
use tokio_stream::StreamExt;
|
||||
use tower_http::cors::CorsLayer;
|
||||
use tower_http::services::{ServeDir, ServeFile};
|
||||
use tower_http::services::ServeDir;
|
||||
|
||||
// ===================== 媒体目录 =====================
|
||||
fn media_dir() -> PathBuf {
|
||||
@@ -46,8 +46,50 @@ impl AppState {
|
||||
}
|
||||
}
|
||||
|
||||
/// 智能查找 dist 目录(前端静态文件)
|
||||
/// 支持多种运行场景:
|
||||
/// - tauri dev 时 CWD = src-tauri/ → ../dist
|
||||
/// - 二进制在 target/release/dpm → ../../dist
|
||||
/// - 从项目根目录运行时 → dist
|
||||
fn dist_dir() -> PathBuf {
|
||||
let candidates: Vec<PathBuf> = {
|
||||
let mut c = Vec::new();
|
||||
// 1. 相对于当前工作目录
|
||||
c.push(PathBuf::from("dist"));
|
||||
c.push(PathBuf::from("../dist"));
|
||||
// 2. 相对于可执行文件路径
|
||||
if let Ok(exe) = std::env::current_exe() {
|
||||
if let Some(dir) = exe.parent() {
|
||||
// 二进制在 src-tauri/target/release/dpm → dist 在 dpm/dist/
|
||||
c.push(dir.join("../../../dist"));
|
||||
// macOS .app bundle: dpm.app/Contents/MacOS/dpm
|
||||
c.push(dir.join("../Resources/dist"));
|
||||
}
|
||||
}
|
||||
c
|
||||
};
|
||||
|
||||
for p in &candidates {
|
||||
let canonical = p.canonicalize();
|
||||
if let Ok(path) = canonical {
|
||||
if path.join("index.html").exists() {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback:直接尝试最常见的路径
|
||||
let fallback = PathBuf::from("../dist");
|
||||
eprintln!("[dpm] 警告: 找不到 dist 目录 (已尝试 {:?}),使用: {:?}", candidates, fallback);
|
||||
fallback
|
||||
}
|
||||
|
||||
// ===================== 路由构建 =====================
|
||||
pub fn create_router(state: AppState) -> Router {
|
||||
let dist = dist_dir();
|
||||
println!("[dpm] 静态文件目录: {:?}", dist);
|
||||
let dist_str = dist.to_string_lossy().to_string();
|
||||
|
||||
Router::new()
|
||||
.route("/api/login", post(login_handler))
|
||||
.route("/api/settings", get(get_settings).post(update_settings))
|
||||
@@ -61,11 +103,15 @@ pub fn create_router(state: AppState) -> Router {
|
||||
.route("/api/control", post(control_handler))
|
||||
.route("/api/state", get(get_state).post(update_state))
|
||||
.route("/api/events", get(sse_handler))
|
||||
// 媒体文件:用户目录 ~/Downloads/Media/
|
||||
.nest_service("/file", ServeDir::new(media_dir_str()))
|
||||
// SPA 静待文件回退
|
||||
.fallback_service(
|
||||
ServeDir::new("../dist")
|
||||
ServeDir::new(&dist_str)
|
||||
.append_index_html_on_directories(true)
|
||||
.fallback(ServeFile::new("../dist/index.html")),
|
||||
.fallback(tower_http::services::ServeFile::new(
|
||||
format!("{}/index.html", dist_str),
|
||||
)),
|
||||
)
|
||||
.layer(CorsLayer::permissive())
|
||||
.with_state(state)
|
||||
|
||||
Reference in New Issue
Block a user