router.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package router
  2. import (
  3. "IotAdmin/app/system/apis"
  4. "IotAdmin/common/middleware"
  5. "IotAdmin/common/middleware/handler"
  6. "IotAdmin/core/logger"
  7. "IotAdmin/core/sdk"
  8. "IotAdmin/core/sdk/config"
  9. jwt "IotAdmin/core/sdk/pkg/jwt-auth"
  10. "IotAdmin/core/sdk/pkg/ws"
  11. "mime"
  12. "os"
  13. "github.com/gin-gonic/gin"
  14. swaggerfiles "github.com/swaggo/files"
  15. ginSwagger "github.com/swaggo/gin-swagger"
  16. _ "IotAdmin/docs/admin"
  17. )
  18. var (
  19. routerNoCheckRole = make([]func(*gin.RouterGroup), 0)
  20. routerCheckRole = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)
  21. )
  22. // InitRouter 路由初始化
  23. func InitRouter() {
  24. var r *gin.Engine
  25. h := sdk.Runtime.GetEngine()
  26. if h == nil {
  27. logger.Fatal("未发现Engine...")
  28. os.Exit(-1)
  29. }
  30. switch h.(type) {
  31. case *gin.Engine:
  32. r = h.(*gin.Engine)
  33. default:
  34. logger.Fatal("不支持其他engine")
  35. os.Exit(-1)
  36. }
  37. // the jwt middleware
  38. authMiddleware, err := middleware.AuthInit()
  39. if err != nil {
  40. logger.Fatalf("JWT初始化错误, %s", err.Error())
  41. }
  42. // 注册系统路由
  43. initSysRouter(r, authMiddleware)
  44. // 注册业务路由
  45. noCheckRoleRouter(r)
  46. checkRoleRouter(r, authMiddleware)
  47. }
  48. func initSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup {
  49. g := r.Group("")
  50. sysBaseRouter(g, authMiddleware)
  51. // 静态文件
  52. sysStaticFileRouter(g)
  53. // swagger;注意:生产环境可以注释掉
  54. if config.ApplicationConfig.Mode != "prod" {
  55. sysSwaggerRouter(g)
  56. }
  57. return g
  58. }
  59. func sysBaseRouter(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
  60. go ws.WebsocketManager.Start()
  61. go ws.WebsocketManager.SendService()
  62. go ws.WebsocketManager.SendAllService()
  63. if config.ApplicationConfig.Mode != "prod" {
  64. r.GET("/", apis.Admin)
  65. }
  66. r.GET("/info", handler.Ping)
  67. r1 := r.Group("/api/")
  68. {
  69. r1.POST("/login", authMiddleware.LoginHandler)
  70. // Refresh time can be longer than token timeout
  71. r1.GET("/refresh-token", authMiddleware.RefreshHandler)
  72. // 验证码
  73. r1.GET("/captcha", (&apis.SystemApi{}).GenerateCaptchaHandler)
  74. }
  75. r2 := r.Group("/api/").Use(authMiddleware.MiddlewareFunc())
  76. {
  77. r2.POST("/logout", handler.LogOut)
  78. }
  79. wss := r.Group("").Use(authMiddleware.MiddlewareFunc())
  80. {
  81. wss.GET("/ws/:id/:channel", ws.WebsocketManager.WsClient)
  82. wss.GET("/ws-logout/:id/:channel", ws.WebsocketManager.UnWsClient)
  83. }
  84. }
  85. func sysStaticFileRouter(r *gin.RouterGroup) {
  86. err := mime.AddExtensionType(".js", "application/javascript")
  87. if err != nil {
  88. return
  89. }
  90. r.Static("/static", "./static")
  91. if config.ApplicationConfig.Mode != "prod" {
  92. r.Static("/form-generator", "./static/form-generator")
  93. }
  94. }
  95. func sysSwaggerRouter(r *gin.RouterGroup) {
  96. r.GET("/swagger/admin/*any", ginSwagger.WrapHandler(swaggerfiles.NewHandler(), ginSwagger.InstanceName("admin")))
  97. }
  98. // 无需认证的路由
  99. func noCheckRoleRouter(r *gin.Engine) *gin.Engine {
  100. // 可根据业务需求来设置接口版本
  101. v1 := r.Group("/api")
  102. for _, f := range routerNoCheckRole {
  103. f(v1)
  104. }
  105. return r
  106. }
  107. // 需要认证的路由
  108. func checkRoleRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {
  109. // 可根据业务需求来设置接口版本
  110. v1 := r.Group("/api")
  111. for _, f := range routerCheckRole {
  112. f(v1, authMiddleware)
  113. }
  114. return r
  115. }