web-router.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package router
  2. import (
  3. "embed"
  4. "net/http"
  5. "strings"
  6. "github.com/QuantumNous/new-api/common"
  7. "github.com/QuantumNous/new-api/controller"
  8. "github.com/QuantumNous/new-api/middleware"
  9. "github.com/gin-contrib/gzip"
  10. "github.com/gin-contrib/static"
  11. "github.com/gin-gonic/gin"
  12. )
  13. // ThemeAssets holds the embedded frontend assets for both themes.
  14. type ThemeAssets struct {
  15. DefaultBuildFS embed.FS
  16. DefaultIndexPage []byte
  17. ClassicBuildFS embed.FS
  18. ClassicIndexPage []byte
  19. }
  20. func SetWebRouter(router *gin.Engine, assets ThemeAssets) {
  21. defaultFS := common.EmbedFolder(assets.DefaultBuildFS, "web/default/dist")
  22. classicFS := common.EmbedFolder(assets.ClassicBuildFS, "web/classic/dist")
  23. themeFS := common.NewThemeAwareFS(defaultFS, classicFS)
  24. router.Use(gzip.Gzip(gzip.DefaultCompression))
  25. router.Use(middleware.GlobalWebRateLimit())
  26. router.Use(middleware.Cache())
  27. router.Use(static.Serve("/", themeFS))
  28. router.NoRoute(func(c *gin.Context) {
  29. c.Set(middleware.RouteTagKey, "web")
  30. if strings.HasPrefix(c.Request.RequestURI, "/v1") || strings.HasPrefix(c.Request.RequestURI, "/api") || strings.HasPrefix(c.Request.RequestURI, "/assets") {
  31. controller.RelayNotFound(c)
  32. return
  33. }
  34. c.Header("Cache-Control", "no-cache")
  35. if common.GetTheme() == "classic" {
  36. c.Data(http.StatusOK, "text/html; charset=utf-8", assets.ClassicIndexPage)
  37. } else {
  38. c.Data(http.StatusOK, "text/html; charset=utf-8", assets.DefaultIndexPage)
  39. }
  40. })
  41. }