package main import ( "embed" "net/http" "os" "path/filepath" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/assetserver" "github.com/wailsapp/wails/v2/pkg/options/windows" ) //go:embed all:frontend/dist var assets embed.FS func main() { app := NewApp() // 应用数据根目录:%AppData%\starmusic-pc // 若不显式指定 WebviewUserDataPath,WebView2 会默认用 %AppData%\starmusic.exe // (带 .exe 后缀,且与日志目录分离)。这里统一到同一个文件夹,便于用户查找与备份。 dataDir := appDataDir() _ = os.MkdirAll(dataDir, 0o755) // WebView2 会在该目录下创建 EBWebView\...(localStorage / IndexedDB / Cache 都在里面) _ = os.MkdirAll(filepath.Join(dataDir, "webview"), 0o755) err := wails.Run(&options.App{ Title: "星音乐 star-music", // 下面四个尺寸只是"期望值":窗口创建后会在 domReady 里按 // 实际屏幕可用区域校准(见 app.go 的 fitWindowToScreen), // 屏幕小的机器会自动收缩,不会超出屏幕范围。 Width: designWindowWidth, Height: designWindowHeight, MinWidth: minWindowWidth, MinHeight: minWindowHeight, Frameless: true, DisableResize: false, // 先隐藏,等尺寸校准完成后再显示: // 否则会先按大尺寸弹出来、再缩回去,出现明显闪动 StartHidden: true, BackgroundColour: &options.RGBA{R: 245, G: 246, B: 248, A: 1}, AssetServer: &assetserver.Options{ Assets: assets, // 未命中内嵌资源时交给自定义处理器(/audioproxy 本地音频代理, // 供前端同源拉流以实现真实音频频谱,见 proxy.go) Handler: http.HandlerFunc(app.audioProxy), }, Windows: &windows.Options{ WebviewUserDataPath: filepath.Join(dataDir, "webview"), }, OnStartup: app.startup, OnDomReady: app.domReady, OnShutdown: app.shutdown, Bind: []interface{}{ app, }, }) if err != nil { println("Error:", err.Error()) } }