This repository has been archived on 2026-08-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Cyrene/backend/gateway/internal/router/router.go
T
AskaEth d15acf587c feat: DevTools综合升级 — 记忆查询 + 会话监看 + WebUI侧边栏重构
- docs: 17个文件重命名为 YYYY-MM-DD.HH-mm-SS-内容.md 格式
- config: 管理员凭据移至 backend/.env (ADMIN_USERNAME/PASSWORD)
- gateway: 新增 SessionState 会话追踪 + GET /api/v1/admin/sessions
- devtools: 新增7个代理端点 (dashboard/sessions/memory)
- devtools: WebUI重构为侧边栏 + 5面板 (仪表盘/记忆/会话/服务/性能)
2026-05-16 15:02:44 +08:00

108 lines
2.8 KiB
Go

package router
import (
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/yourname/cyrene-ai/gateway/internal/config"
"github.com/yourname/cyrene-ai/gateway/internal/handler"
"github.com/yourname/cyrene-ai/gateway/internal/middleware"
"github.com/yourname/cyrene-ai/gateway/internal/ws"
)
// Setup 注册所有路由
func Setup(r *gin.Engine, hub *ws.Hub, cfg *config.Config) {
// 限流器
rateLimiter := middleware.NewRateLimiter(10, 20) // 每秒10个请求,突发20
// 初始化处理器
authHandler := handler.NewAuthHandler(cfg)
sessionHandler := handler.NewSessionHandler(hub)
memoryHandler := handler.NewMemoryHandler(cfg.AICoreURL)
chatHandler := handler.NewChatHandler(cfg, hub)
// ========== 公开路由 ==========
api := r.Group("/api/v1")
// 健康检查
api.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{
"status": "ok",
"service": "cyrene-gateway",
"ws_connections": hub.ClientCount(),
})
})
// 认证 (无需JWT)
auth := api.Group("/auth")
{
auth.POST("/register", authHandler.Register)
auth.POST("/login", authHandler.Login)
}
// ========== 需要认证的路由 ==========
protected := api.Group("")
protected.Use(middleware.JWTAuth(cfg))
protected.Use(rateLimiter.Handler())
{
// Token刷新
protected.POST("/auth/refresh", authHandler.RefreshToken)
// 会话管理
sessions := protected.Group("/sessions")
{
sessions.POST("", sessionHandler.Create)
sessions.GET("", sessionHandler.List)
sessions.GET("/:id", sessionHandler.Get)
sessions.DELETE("/:id", sessionHandler.Delete)
}
// 记忆管理
memory := protected.Group("/memory")
{
memory.GET("/search", memoryHandler.Query)
memory.GET("", memoryHandler.List)
memory.POST("", memoryHandler.Add)
}
// Admin 路由 (需要管理员权限)
admin := protected.Group("/admin")
admin.Use(adminAuth())
{
admin.GET("/sessions", sessionHandler.ListActiveSessions)
admin.GET("/sessions/:id", sessionHandler.GetSession)
}
}
// ========== WebSocket路由 ==========
// WebSocket升级在HTTP层,token通过query参数或Header传递
wsGroup := r.Group("/ws")
{
wsGroup.GET("/chat", chatHandler.HandleWebSocket)
}
// ========== 静态文件服务 (生产环境) ==========
if cfg.Env == "production" {
r.Static("/assets", "./public/assets")
r.StaticFile("/", "./public/index.html")
r.NoRoute(func(c *gin.Context) {
c.File("./public/index.html")
})
}
}
// adminAuth 管理员权限中间件 (检查 userID 是否以 "admin_" 开头)
func adminAuth() gin.HandlerFunc {
return func(c *gin.Context) {
userID := middleware.GetUserID(c)
if userID == "" || !strings.HasPrefix(userID, "admin_") {
c.JSON(http.StatusForbidden, gin.H{"error": "需要管理员权限"})
c.Abort()
return
}
c.Next()
}
}