125 lines
2.9 KiB
Go
125 lines
2.9 KiB
Go
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()
|
|
}
|