feat: 完善后端脚手架基础能力
This commit is contained in:
@@ -9,24 +9,39 @@ import (
|
||||
"os/signal"
|
||||
"skeleton/config"
|
||||
"skeleton/database"
|
||||
"skeleton/docs"
|
||||
"skeleton/middlewares"
|
||||
"skeleton/models"
|
||||
"skeleton/observability"
|
||||
"skeleton/routes"
|
||||
_ "skeleton/routes/rest" // 导入触发 init() 自动注册路由
|
||||
"skeleton/utils"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/MUKE-coder/gin-docs/gindocs"
|
||||
"github.com/swaggo/files"
|
||||
ginSwagger "github.com/swaggo/gin-swagger"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
var buildVersion = "dev"
|
||||
|
||||
// @title Skeleton API
|
||||
// @version 0.1.0
|
||||
// @description Skeleton API documentation.
|
||||
// @BasePath /api
|
||||
// @securityDefinitions.apikey BearerAuth
|
||||
// @in header
|
||||
// @name Authorization
|
||||
// @description 输入 Bearer {token}
|
||||
func main() {
|
||||
// 加载配置
|
||||
cfg, err := config.Load()
|
||||
if err != nil {
|
||||
log.Fatal("加载配置失败:", err)
|
||||
}
|
||||
if buildVersion != "dev" {
|
||||
cfg.App.Version = buildVersion
|
||||
}
|
||||
|
||||
// 初始化日志系统
|
||||
if err := middlewares.InitLogger(&cfg.Logger); err != nil {
|
||||
@@ -34,11 +49,23 @@ func main() {
|
||||
}
|
||||
|
||||
// 初始化JWT配置
|
||||
middlewares.InitJWT(cfg.JWT.Secret, cfg.JWT.ExpireHours, cfg.JWT.Issuer)
|
||||
middlewares.InitJWT(cfg.JWT.Secret, cfg.JWT.AccessExpireMinutes, cfg.JWT.RefreshExpireHours, cfg.JWT.Issuer)
|
||||
|
||||
// 确保在程序退出时同步日志缓冲区
|
||||
defer middlewares.Sync()
|
||||
|
||||
shutdownTracing, err := observability.InitTracing(context.Background(), cfg.Observability)
|
||||
if err != nil {
|
||||
zap.L().Fatal("链路追踪初始化失败", zap.Error(err))
|
||||
}
|
||||
defer func() {
|
||||
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
if err := shutdownTracing(shutdownCtx); err != nil {
|
||||
zap.L().Error("链路追踪关闭失败", zap.Error(err))
|
||||
}
|
||||
}()
|
||||
|
||||
// 使用结构化日志记录启动信息
|
||||
zap.L().Info("应用程序启动",
|
||||
zap.String("version", cfg.App.Version),
|
||||
@@ -66,15 +93,9 @@ func main() {
|
||||
// 设置路由
|
||||
r := routes.SetupRoutes(cfg)
|
||||
|
||||
// 挂载接口文档
|
||||
gindocs.Mount(r, database.GetDB(), gindocs.Config{
|
||||
Title: "Skeleton API",
|
||||
Description: "Skeleton API documentation",
|
||||
Version: cfg.App.Version,
|
||||
Models: []interface{}{
|
||||
models.User{},
|
||||
},
|
||||
})
|
||||
// 挂载 Swagger UI,文档由 `swag init` 根据注解生成。
|
||||
docs.SwaggerInfo.Version = cfg.App.Version
|
||||
r.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||
|
||||
// 创建HTTP服务器
|
||||
srv := &http.Server{
|
||||
|
||||
Reference in New Issue
Block a user