新增 Web 浏览端(Go+Vue 报表系统)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
fish
2026-05-03 14:34:50 +08:00
parent bf8f578761
commit 750584e619
47 changed files with 2557 additions and 18 deletions

74
web/backend/main.go Normal file
View File

@@ -0,0 +1,74 @@
package main
import (
"context"
"errors"
"io/fs"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"trade/web/internal/auth"
"trade/web/internal/config"
"trade/web/internal/handlers"
"trade/web/internal/router"
"trade/web/internal/store"
)
func main() {
cfg, err := config.Load()
if err != nil {
log.Fatalf("config: %v", err)
}
futures, err := store.OpenFutures(cfg.FuturesDBPath)
if err != nil {
log.Fatalf("open futures: %v", err)
}
defer futures.Close()
authDB, err := store.OpenAuth(cfg.AuthDBPath)
if err != nil {
log.Fatalf("open auth: %v", err)
}
defer authDB.Close()
if err := auth.Bootstrap(authDB, cfg.AdminUser, cfg.AdminPass); err != nil {
log.Fatalf("bootstrap: %v", err)
}
mgr := auth.NewManager(cfg.JWTSecret)
deps := &handlers.Deps{Auth: authDB, Futures: futures, JWT: mgr}
dist, err := fs.Sub(distFS, "dist")
if err != nil {
log.Fatalf("embed dist: %v", err)
}
srv := &http.Server{
Addr: cfg.ListenAddr,
Handler: router.New(deps, mgr, authDB, dist),
ReadHeaderTimeout: 10 * time.Second,
}
idle := make(chan struct{})
go func() {
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
<-stop
log.Println("shutting down ...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_ = srv.Shutdown(ctx)
close(idle)
}()
log.Printf("web 监听 %s", cfg.ListenAddr)
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Fatalf("listen: %v", err)
}
<-idle
}