mirror of
https://github.com/setube/ogame-vue-ts.git
synced 2026-05-12 07:55:11 +08:00
- 移除对 Express 和相关中间件的依赖 - 新增 Go 编写的 HTTP 服务,支持嵌入前端资源 - 更新构建流程以使用 Go 编译跨平台可执行文件 - 配置 GitHub Actions 工作流以适应新的构建方式 - 实现自动打开浏览器和显示局域网访问地址功能 - 清理 package.json 中不再需要的脚本和依赖项 - 更新 pnpm-lock.yaml 文件以反映依赖变化
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"embed"
|
|
"fmt"
|
|
"io/fs"
|
|
"net"
|
|
"net/http"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
//go:embed docs/*
|
|
var content embed.FS
|
|
|
|
func main() {
|
|
// 1. 获取 docs 子目录的 FS 句柄
|
|
distFS, _ := fs.Sub(content, "docs")
|
|
|
|
// 2. 创建静态资源服务
|
|
fileServer := http.FileServer(http.FS(distFS))
|
|
|
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
path := strings.TrimPrefix(r.URL.Path, "/")
|
|
|
|
// 如果访问根路径或文件不存在,则回退到 index.html (支持 SPA)
|
|
_, err := distFS.Open(path)
|
|
if path == "" || err != nil {
|
|
// 读取 index.html 内容
|
|
indexData, err := fs.ReadFile(distFS, "index.html")
|
|
if err != nil {
|
|
http.Error(w, "Index not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
|
http.ServeContent(w, r, "index.html", time.Now(), strings.NewReader(string(indexData)))
|
|
return
|
|
}
|
|
|
|
// 正常提供静态文件
|
|
fileServer.ServeHTTP(w, r)
|
|
})
|
|
|
|
// 3. 自动寻找可用端口并获取局域网 IP
|
|
listener, _ := net.Listen("tcp", "0.0.0.0:0")
|
|
port := listener.Addr().(*net.TCPAddr).Port
|
|
localUrl := fmt.Sprintf("http://localhost:%d", port)
|
|
lanUrl := fmt.Sprintf("http://%s:%d", getLocalIp(), port)
|
|
|
|
fmt.Println("-----------------------------------")
|
|
fmt.Printf("🚀 OGame 程序已启动!\n")
|
|
fmt.Printf("🔗 本地访问: %s\n", localUrl)
|
|
fmt.Printf("🌐 局域网访问: %s\n", lanUrl)
|
|
fmt.Println("-----------------------------------")
|
|
|
|
// 4. 自动打开浏览器
|
|
go openBrowser(localUrl)
|
|
|
|
// 5. 启动服务
|
|
http.Serve(listener, nil)
|
|
}
|
|
|
|
func getLocalIp() string {
|
|
addrs, err := net.InterfaceAddrs()
|
|
if err != nil {
|
|
return "localhost"
|
|
}
|
|
for _, address := range addrs {
|
|
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
|
if ipnet.IP.To4() != nil {
|
|
return ipnet.IP.String()
|
|
}
|
|
}
|
|
}
|
|
return "localhost"
|
|
}
|
|
|
|
func openBrowser(url string) {
|
|
var cmd string
|
|
var args []string
|
|
|
|
switch runtime.GOOS {
|
|
case "windows":
|
|
cmd = "cmd"
|
|
args = []string{"/c", "start", url}
|
|
case "darwin":
|
|
cmd = "open"
|
|
args = []string{url}
|
|
default: // linux
|
|
cmd = "xdg-open"
|
|
args = []string{url}
|
|
}
|
|
exec.Command(cmd, args...).Start()
|
|
} |