🎨 优化项目结构 && 完善ai配置

This commit is contained in:
2026-03-03 15:39:23 +08:00
parent 557c865948
commit 2714e63d2a
585 changed files with 62223 additions and 100018 deletions

View File

@@ -2,31 +2,54 @@ package middleware
import (
"context"
"time"
"git.echol.cn/loser/ai_proxy/server/model/common/response"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
// Timeout 超时中间件
func Timeout(timeout time.Duration) gin.HandlerFunc {
// TimeoutMiddleware 创建超时中间件
// 入参 timeout 设置超时时间例如time.Second * 5
// 使用示例 xxx.Get("path",middleware.TimeoutMiddleware(30*time.Second),HandleFunc)
func TimeoutMiddleware(timeout time.Duration) gin.HandlerFunc {
return func(c *gin.Context) {
ctx, cancel := context.WithTimeout(c.Request.Context(), timeout)
defer cancel()
c.Request = c.Request.WithContext(ctx)
finished := make(chan struct{})
// 使用 buffered channel 避免 goroutine 泄漏
done := make(chan struct{}, 1)
panicChan := make(chan interface{}, 1)
go func() {
defer func() {
if p := recover(); p != nil {
select {
case panicChan <- p:
default:
}
}
select {
case done <- struct{}{}:
default:
}
}()
c.Next()
finished <- struct{}{}
}()
select {
case p := <-panicChan:
panic(p)
case <-done:
return
case <-ctx.Done():
response.FailWithMessage("请求超时", c)
c.Abort()
case <-finished:
// 确保服务器超时设置足够长
c.Header("Connection", "close")
c.AbortWithStatusJSON(http.StatusGatewayTimeout, gin.H{
"code": 504,
"msg": "请求超时",
})
return
}
}
}