107 lines
3.0 KiB
Go
107 lines
3.0 KiB
Go
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
|
||
}
|