package initialize import ( "net/http" "os" "git.echol.cn/loser/ai_proxy/server/docs" "git.echol.cn/loser/ai_proxy/server/global" "git.echol.cn/loser/ai_proxy/server/router" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) type justFilesFilesystem struct { fs http.FileSystem } func (fs justFilesFilesystem) Open(name string) (http.File, error) { f, err := fs.fs.Open(name) if err != nil { return nil, err } stat, err := f.Stat() if stat.IsDir() { return nil, os.ErrPermission } return f, nil } // Routers 初始化总路由 func Routers() *gin.Engine { Router := gin.New() // 设置文件上传大小限制(10MB) Router.MaxMultipartMemory = 10 << 20 // 使用 Gin 默认的 Recovery 中间件 Router.Use(gin.Recovery()) if gin.Mode() == gin.DebugMode { Router.Use(gin.Logger()) } // 简单的 CORS 中间件 Router.Use(func(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", "*") c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With, x-token") c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() }) systemRouter := router.RouterGroupApp.System appRouter := router.RouterGroupApp.App // 静态文件服务 Router.StaticFS(global.GVA_CONFIG.Local.StorePath, justFilesFilesystem{http.Dir(global.GVA_CONFIG.Local.StorePath)}) // Swagger 文档 docs.SwaggerInfo.BasePath = global.GVA_CONFIG.System.RouterPrefix Router.GET(global.GVA_CONFIG.System.RouterPrefix+"/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) global.GVA_LOG.Info("register swagger handler") // 路由组 PublicGroup := Router.Group(global.GVA_CONFIG.System.RouterPrefix) { // 健康检查 PublicGroup.GET("/health", func(c *gin.Context) { c.JSON(http.StatusOK, "ok") }) } // 系统管理路由 { systemGroup := PublicGroup.Group("v1/system") systemRouter.UserRouter.InitUserRouter(systemGroup) // 用户管理路由:/v1/system/user/* systemRouter.ApiRouter.InitApiRouter(systemGroup) // API管理路由:/v1/system/api/* } // 前台应用路由 { appGroup := PublicGroup.Group("app") appRouter.AiPresetRouter.InitAiPresetRouter(appGroup) // AI预设路由:/app/preset/* appRouter.AiProviderRouter.InitAiProviderRouter(appGroup) // AI提供商路由:/app/provider/* appRouter.PresetBindingRouter.InitPresetBindingRouter(appGroup) // 预设绑定路由:/app/binding/* } // OpenAI 兼容的代理接口 { v1Group := PublicGroup.Group("v1") appRouter.AiProxyRouter.InitAiProxyRouter(v1Group) // /v1/chat/completions } global.GVA_ROUTERS = Router.Routes() global.GVA_LOG.Info("router register success") return Router }