fast.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package frame
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. "github.com/spf13/pflag"
  6. "github.com/spf13/viper"
  7. "log"
  8. "net/http"
  9. "os"
  10. "os/signal"
  11. "syscall"
  12. "time"
  13. "ulink-admin/frame/third_plugins/inject"
  14. )
  15. const (
  16. usage = `fast`
  17. )
  18. var Permissions = make(gin.H)
  19. type Fast struct {
  20. routers map[string][]IRouter
  21. engine *gin.Engine
  22. op *Options
  23. usage string
  24. authHandler HandlerFunc
  25. configs []interface{}
  26. }
  27. func (g *Fast) Engine() *gin.Engine {
  28. return g.engine
  29. }
  30. // Ignite 项目初始化
  31. func Ignite() *Fast {
  32. op := DefaultOptions()
  33. op.AddFlags(pflag.CommandLine)
  34. g := &Fast{
  35. routers: make(map[string][]IRouter),
  36. engine: gin.New(),
  37. op: op,
  38. usage: usage,
  39. configs: make([]interface{}, 0),
  40. }
  41. return g
  42. }
  43. func (g *Fast) Use(middes ...IMidHandler) *Fast {
  44. for _, mid := range middes {
  45. g.engine.Use(MidFactory(mid))
  46. }
  47. return g
  48. }
  49. // 挂载权限
  50. func (g *Fast) Auth(handlerFunc HandlerFunc) *Fast {
  51. g.authHandler = handlerFunc
  52. return g
  53. }
  54. // 挂载权限检测方法
  55. func (g *Fast) Mount(name string, routers ...IRouter) *Fast {
  56. for _, r := range routers {
  57. aop.Provide(&inject.Object{Value: r})
  58. }
  59. if err := aop.Populate(); err != nil {
  60. panic(err)
  61. }
  62. if r, ok := g.routers[name]; ok {
  63. r = append(r, routers...)
  64. g.routers[name] = r
  65. return g
  66. }
  67. g.routers[name] = routers
  68. return g
  69. }
  70. func (g *Fast) Launch(addr ...string) {
  71. if len(addr) > 0 {
  72. g.op.AddrPort = addr[0]
  73. }
  74. g.run(g.op)
  75. }
  76. func (g *Fast) Banner(banner string) {
  77. g.usage = banner
  78. }
  79. func (g *Fast) Aop(class ...any) *Fast {
  80. for _, c := range class {
  81. aop.Provide(&inject.Object{Value: c})
  82. }
  83. if err := aop.Populate(); err != nil {
  84. panic(err)
  85. }
  86. return g
  87. }
  88. func (g *Fast) run(op *Options) {
  89. gin.SetMode(viper.GetString("mode"))
  90. for k, routers := range g.routers {
  91. for _, r := range routers {
  92. miss := make([]*TreePermission, 0)
  93. group := &Group{permissions: &miss, RouterGroup: g.engine.Group(k), authCheck: g.authHandler}
  94. r.Builder(group)
  95. Permissions[r.Name()] = group.GetPermissions()
  96. }
  97. }
  98. srv := &http.Server{
  99. Addr: op.AddrPort,
  100. Handler: g.engine,
  101. }
  102. go func() {
  103. // service connections
  104. log.Printf("Listening and serving HTTP on %s\n", op.AddrPort)
  105. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  106. log.Fatalf("listen: %s\n", err)
  107. }
  108. }()
  109. quit := make(chan os.Signal)
  110. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
  111. <-quit
  112. log.Println("Shutdown Server ...")
  113. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  114. defer cancel()
  115. if err := srv.Shutdown(ctx); err != nil {
  116. log.Fatal("Server Shutdown:", err)
  117. }
  118. select {
  119. case <-ctx.Done():
  120. log.Println("timeout of 5 seconds.")
  121. }
  122. log.Println("Server exiting")
  123. }
  124. func (g *Fast) Resource(f func(engine *gin.Engine)) *Fast {
  125. f(g.engine)
  126. return g
  127. }