Files
曾志威 4b1ffb4c6a
continuous-integration/drone Build is passing
样式调整
2026-05-11 20:42:36 +08:00

68 lines
1.9 KiB
Go

// AShareView 服务端入口
// A股市场数据可视化平台后端,提供市场概览、指数行情、K线叠加对比等 API
package main
import (
"ashareview-server/config"
"ashareview-server/handler"
"ashareview-server/repository"
"ashareview-server/router"
"ashareview-server/service"
"fmt"
"log"
"time"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// 加载配置
cfg := config.Load()
// 连接 MySQL
db, err := gorm.Open(mysql.Open(cfg.DB.DSN()), &gorm.Config{})
if err != nil {
log.Fatalf("failed to connect database: %v", err)
}
fmt.Println("Database connected successfully")
// 异步创建常用索引,已存在则跳过
go func() {
time.Sleep(3 * time.Second)
indexes := []struct {
name string
sql string
}{
{"idx_sd_date", "ALTER TABLE stock_daily ADD INDEX idx_sd_date (date)"},
{"idx_sd_code_date", "ALTER TABLE stock_daily ADD INDEX idx_sd_code_date (code, date)"},
{"idx_sd_date_pct", "ALTER TABLE stock_daily ADD INDEX idx_sd_date_pct (date, pct_change)"},
}
for _, idx := range indexes {
var cnt int64
db.Raw("SELECT COUNT(*) FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'stock_daily' AND index_name = ?", idx.name).Scan(&cnt)
if cnt == 0 {
if err := db.Exec(idx.sql).Error; err == nil {
fmt.Printf("index created: %s\n", idx.name)
}
}
}
}()
// 分层初始化: Repository -> Service -> Handler
stockRepo := repository.NewStockRepo(db)
dashboardSvc := service.NewDashboardService(stockRepo)
dashboardHandler := handler.NewDashboardHandler(dashboardSvc)
// 启动 HTTP 服务
r := gin.Default()
router.Setup(r, dashboardHandler)
addr := fmt.Sprintf(":%s", cfg.Server.Port)
fmt.Printf("Server running on http://localhost%s\n", addr)
if err := r.Run(addr); err != nil {
log.Fatalf("failed to start server: %v", err)
}
}