package frame import ( "context" "github.com/gin-gonic/gin" "github.com/spf13/pflag" "github.com/spf13/viper" "log" "net/http" "os" "os/signal" "syscall" "time" "ulink-admin/frame/third_plugins/inject" ) const ( usage = `fast` ) var Permissions = make(gin.H) type Fast struct { routers map[string][]IRouter engine *gin.Engine op *Options usage string authHandler HandlerFunc configs []interface{} } func (g *Fast) Engine() *gin.Engine { return g.engine } // Ignite 项目初始化 func Ignite() *Fast { op := DefaultOptions() op.AddFlags(pflag.CommandLine) g := &Fast{ routers: make(map[string][]IRouter), engine: gin.New(), op: op, usage: usage, configs: make([]interface{}, 0), } return g } func (g *Fast) Use(middes ...IMidHandler) *Fast { for _, mid := range middes { g.engine.Use(MidFactory(mid)) } return g } // 挂载权限 func (g *Fast) Auth(handlerFunc HandlerFunc) *Fast { g.authHandler = handlerFunc return g } // 挂载权限检测方法 func (g *Fast) Mount(name string, routers ...IRouter) *Fast { for _, r := range routers { aop.Provide(&inject.Object{Value: r}) } if err := aop.Populate(); err != nil { panic(err) } if r, ok := g.routers[name]; ok { r = append(r, routers...) g.routers[name] = r return g } g.routers[name] = routers return g } func (g *Fast) Launch(addr ...string) { if len(addr) > 0 { g.op.AddrPort = addr[0] } g.run(g.op) } func (g *Fast) Banner(banner string) { g.usage = banner } func (g *Fast) Aop(class ...any) *Fast { for _, c := range class { aop.Provide(&inject.Object{Value: c}) } if err := aop.Populate(); err != nil { panic(err) } return g } func (g *Fast) run(op *Options) { gin.SetMode(viper.GetString("mode")) for k, routers := range g.routers { for _, r := range routers { miss := make([]*TreePermission, 0) group := &Group{permissions: &miss, RouterGroup: g.engine.Group(k), authCheck: g.authHandler} r.Builder(group) Permissions[r.Name()] = group.GetPermissions() } } srv := &http.Server{ Addr: op.AddrPort, Handler: g.engine, } go func() { // service connections log.Printf("Listening and serving HTTP on %s\n", op.AddrPort) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s\n", err) } }() quit := make(chan os.Signal) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutdown Server ...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal("Server Shutdown:", err) } select { case <-ctx.Done(): log.Println("timeout of 5 seconds.") } log.Println("Server exiting") } func (g *Fast) Resource(f func(engine *gin.Engine)) *Fast { f(g.engine) return g }