Files
infinite-canvas/router/router.go
T
HouYunFei d40b9b53c2 fix(ai): 修复AI代理请求和图片生成功能
- 添加详细的错误日志记录,包括请求读取、渠道选择、请求构建和响应处理的失败情况
- 统一AI接口请求失败返回消息为"AI 接口请求失败"
- 添加对上游响应状态码>=400的检查和错误处理
- 在JWT解析中验证签名方法有效性,防止无效登录状态
- 移除JWT密钥警告日志,改为运行时生成随机密钥
- 调整应用配置模态框中云端和本地选项的显示顺序
- 添加图片生成元数据记录生成类型、模型、尺寸、质量和参考图等信息
- 实现空图片节点直接生成图片而不保留空框的功能
- 完善图片重试逻辑,优先使用保存的元数据进行重试
- 添加参考图片丢失时的错误提示
- 修复图片节点样式圆角显示问题
- 更新AI代理路径为/api/v1/*保持OpenAI风格
- 添加系统设置页面的安全警告提示
2026-05-21 17:50:14 +08:00

55 lines
2.1 KiB
Go

package router
import (
"net/http"
"github.com/basketikun/infinite-canvas/handler"
"github.com/basketikun/infinite-canvas/middleware"
"github.com/gin-gonic/gin"
)
func New() *gin.Engine {
router := gin.Default()
router.RedirectTrailingSlash = false
_ = router.SetTrustedProxies(nil)
api := router.Group("/api")
api.GET("/health", func(c *gin.Context) {
c.String(http.StatusOK, "ok")
})
api.POST("/auth/register", gin.WrapF(handler.Register))
api.POST("/auth/login", gin.WrapF(handler.Login))
api.GET("/auth/me", middleware.OptionalAuth, gin.WrapF(handler.CurrentUser))
api.GET("/settings", gin.WrapF(handler.Settings))
api.POST("/v1/images/generations", gin.WrapF(handler.AIImagesGenerations))
api.POST("/v1/images/edits", gin.WrapF(handler.AIImagesEdits))
api.POST("/v1/chat/completions", gin.WrapF(handler.AIChatCompletions))
api.GET("/prompts", middleware.OptionalAuth, gin.WrapF(handler.Prompts))
api.GET("/assets", middleware.OptionalAuth, gin.WrapF(handler.Assets))
api.POST("/admin/login", gin.WrapF(handler.AdminLogin))
admin := api.Group("/admin", middleware.AdminAuth)
admin.GET("/users", gin.WrapF(handler.AdminUsers))
admin.POST("/users", gin.WrapF(handler.AdminSaveUser))
admin.DELETE("/users/:id", func(c *gin.Context) {
handler.AdminDeleteUser(c.Writer, c.Request, c.Param("id"))
})
admin.GET("/settings", gin.WrapF(handler.AdminSettings))
admin.POST("/settings", gin.WrapF(handler.AdminSaveSettings))
admin.GET("/prompt-categories", gin.WrapF(handler.AdminPromptCategories))
admin.POST("/prompt-categories/sync", gin.WrapF(handler.AdminSyncPromptCategories))
admin.GET("/prompts", gin.WrapF(handler.AdminPrompts))
admin.POST("/prompts", gin.WrapF(handler.AdminSavePrompt))
admin.DELETE("/prompts/:id", func(c *gin.Context) {
handler.AdminDeletePrompt(c.Writer, c.Request, c.Param("id"))
})
admin.GET("/assets", gin.WrapF(handler.AdminAssets))
admin.POST("/assets", gin.WrapF(handler.AdminSaveAsset))
admin.DELETE("/assets/:id", func(c *gin.Context) {
handler.AdminDeleteAsset(c.Writer, c.Request, c.Param("id"))
})
router.NoRoute(middleware.NotFoundJSON)
return router
}