feat: 完善后端脚手架基础能力

This commit is contained in:
2026-08-09 01:06:21 +08:00
parent e311f416f2
commit f95311a107
61 changed files with 5630 additions and 521 deletions
+33 -12
View File
@@ -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{