package router import ( "github.com/gin-gonic/gin" "level_go/internal/api" ) // NewRouter 创建并配置 API 路由。 // // 函数集中注册跨域中间件和 v1 版本接口,调用方只需要注入各业务 Handler。 func NewRouter(commonApi *api.CommonHandler, stockApi *api.StockHandler, limitBoardApi *api.LimitBoardHandler) *gin.Engine { r := gin.New() r.Use(gin.Recovery()) // 跨域中间件允许前端从任意来源访问接口,并暴露 CSV 下载需要的 Content-Disposition。 r.Use(func(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type") c.Writer.Header().Set("Access-Control-Expose-Headers", "Content-Disposition") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }) r.Use(cacheableGETResponseMiddleware(newResponseCacheStore())) v1 := r.Group("/api/v1") { v1.GET("/common/trade-calendar", commonApi.GetTradeCalendar) v1.POST("/stock/analyze", stockApi.Analyze) v1.GET("/stock/kline/:code", stockApi.GetKlineData) limitBoard := v1.Group("/limit-board") { limitBoard.GET("/overview", limitBoardApi.GetOverview) limitBoard.GET("/open-lower-groups", limitBoardApi.GetOpenLowerGroups) limitBoard.GET("/open-threshold", limitBoardApi.GetOpenThresholdGroups) limitBoard.GET("/open-threshold-groups", limitBoardApi.GetOpenThresholdGroups) limitBoard.GET("/second-board-profit", limitBoardApi.ListSecondBoardProfit) limitBoard.GET("/second-cal", limitBoardApi.GetSecondCal) limitBoard.GET("/break-next-performance", limitBoardApi.GetBreakNextPerformance) } download := v1.Group("/download") { download.GET("/limit-board/second-board-profit-csv", limitBoardApi.DownloadSecondBoardProfitCSV) download.GET("/limit-board/break-next-performance-csv", limitBoardApi.DownloadBreakNextPerformanceCSV) } } return r }