package server import ( "context" "fmt" "strconv" "time" "busniess-user-center/config" "busniess-user-center/pkg/middleware/decoder" "busniess-user-center/pkg/middleware/jwt" "busniess-user-center/pkg/middleware/logger" "busniess-user-center/pkg/middleware/recovery" "busniess-user-center/pkg/redis" "busniess-user-center/pkg/utils/token" "busniess-user-center/pkg/validator" "busniess-user-center/server/application" "busniess-user-center/server/organization" "busniess-user-center/server/role" "busniess-user-center/server/user" "github.com/gin-contrib/gzip" "github.com/gin-contrib/pprof" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/samber/do" "go.uber.org/zap" ) const ( httpPost = ":9000" ) // todo gin 注册自己的校验器 func addr() string { conf := do.MustInvoke[*config.AppConfig](nil) if conf.App.Port > 0 { return ":" + strconv.Itoa(conf.App.Port) } return httpPost } func RunWebServer(ctx context.Context) error { // 启用插件 engine, err := newGinEngine() if err != nil { return err } return engine.Run(addr()) } func newGinEngine() (*gin.Engine, error) { setBindValidator() engine := gin.New() pprof.Register(engine) // 设置解压插件 engine.Use(gzip.Gzip(gzip.DefaultCompression)) // 设置日志插件 slogger := do.MustInvoke[*zap.SugaredLogger](nil) conf := do.MustInvoke[*config.AppConfig](nil) engine.Use(logger.GinLoggerMiddleware(slogger)) engine.Use(recovery.GinRecoverMiddleware(slogger)) // 解码器插件 engine.Use(decoder.Base64Decoder(slogger)) engine.GET("/metrics", gin.WrapH(promhttp.Handler())) engine.GET("/version", func(c *gin.Context) { c.JSON(200, gin.H{ "version": conf.GetVersion(), }) }) if err := registerWebRoute(engine); err != nil { return nil, err } return engine, nil } func registerWebRoute(engine *gin.Engine) error { // 注册jwt插件-除了登陆接口 redis := do.MustInvoke[*redis.Redis](nil) conf := do.MustInvoke[*config.AppConfig](nil) logger := do.MustInvoke[*zap.SugaredLogger](nil) exprieDuration := time.Duration(conf.Jwt.Expires) * time.Second tokenFresher := token.NewTokenRefresher(redis, exprieDuration) do.ProvideValue(nil, tokenFresher) jwt, err := jwt.NewJwtAuthMiddleware(logger, tokenFresher, []byte(conf.Jwt.Secret), exprieDuration) if err != nil { panic(fmt.Sprintf("newjwtAuthMiddleware fail:%s", err.Error())) } loginVerify := jwt.AuthHandler() api := engine.Group("/api") api.Use(loginVerify) userApi := api.Group("/user") user.RegisterRoute(userApi) orgApi := api.Group("/organization") organization.RegisterRoute(orgApi) roleApi := api.Group("/role") role.RegisterRoute(roleApi) appApi := api.Group("/application") application.RegisterRoute(appApi) return nil } func setBindValidator() { binding.Validator = validator.NewValidator() }