MySQL 就绪探测改为走 TCP(127.0.0.1:3306),避免初始化阶段只监听 socket 的临时服务器让探测提前通过,导致后端连入时遇到 unexpected EOF。 后端监听端口改为读取 APP_PORT(默认 8082),与脚本探测的空闲端口一致, 并在启动时和最终提示中打印完整访问地址;npm 默认使用 npmmirror 镜像, 同时将根目录编译产物 /server 加入忽略。
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package main
|
||
|
||
import (
|
||
"log"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/wmms/wmms/internal/handler"
|
||
"github.com/wmms/wmms/internal/repository"
|
||
"github.com/wmms/wmms/pkg/database"
|
||
)
|
||
|
||
func main() {
|
||
dsn := os.Getenv("DB_DSN")
|
||
if dsn == "" {
|
||
dsn = "root:1234@tcp(localhost:3306)/wmms?charset=utf8mb4&parseTime=true"
|
||
}
|
||
|
||
err := database.Init(dsn)
|
||
if err != nil {
|
||
log.Fatalf("Failed to initialize database: %v", err)
|
||
}
|
||
defer database.Close()
|
||
|
||
// Initialize users table and create default users
|
||
if err := repository.InitUserTable(); err != nil {
|
||
log.Fatalf("Failed to initialize users table: %v", err)
|
||
}
|
||
if err := repository.CreateDefaultUsers(); err != nil {
|
||
log.Fatalf("Failed to create default users: %v", err)
|
||
}
|
||
|
||
// Initialize applications table
|
||
appRepo := repository.NewApplicationRepository()
|
||
if err := appRepo.InitApplicationTable(); err != nil {
|
||
log.Fatalf("Failed to initialize applications table: %v", err)
|
||
}
|
||
|
||
r := gin.Default()
|
||
|
||
registerFrontendRoutes(r, "./frontend/dist")
|
||
|
||
// Serve uploaded files
|
||
r.Static("/uploads", "./uploads")
|
||
|
||
h := handler.NewHandler()
|
||
h.RegisterRoutes(r)
|
||
|
||
// WebSocket route
|
||
r.GET("/ws", handler.HandleWebSocket)
|
||
|
||
// 端口可通过 APP_PORT 覆盖,默认 8082,便于试用脚本探测空闲端口。
|
||
port := os.Getenv("APP_PORT")
|
||
if port == "" {
|
||
port = "8082"
|
||
}
|
||
addr := ":" + port
|
||
log.Printf("Server starting on %s", addr)
|
||
log.Println("Default users: admin/admin123, user/user123")
|
||
if err := r.Run(addr); err != nil {
|
||
log.Fatalf("Failed to start server: %v", err)
|
||
}
|
||
}
|
||
|
||
func registerFrontendRoutes(r *gin.Engine, distDir string) {
|
||
r.Static("/web", distDir)
|
||
r.Static("/assets", filepath.Join(distDir, "assets"))
|
||
r.GET("/", func(c *gin.Context) {
|
||
c.File(filepath.Join(distDir, "index.html"))
|
||
})
|
||
}
|