123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- 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
- }
|