package main import ( "github.com/fsnotify/fsnotify" "github.com/gofiber/fiber/v2" "github.com/gofiber/swagger" "github.com/spf13/viper" "gofiber.study.skcks.cn/common/errorx" "gofiber.study.skcks.cn/common/response" "gofiber.study.skcks.cn/global" "gofiber.study.skcks.cn/logger" "os" "os/signal" _ "gofiber.study.skcks.cn/docs" ) var log = logger.Logger() var app *fiber.App // @title GoFiber Study API // @version 1.0 // @description 基于 Fiber 框架的 swagger // @termsOfService http://swagger.io/terms/ // @contact.name Shikong // @contact.email 919411476@qq.com // @license.name Apache 2.0 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @BasePath / func main() { viper.SetConfigName("config") viper.SetConfigType("yaml") viper.AddConfigPath(".") viper.AddConfigPath("./config") if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { log.Fatalf("未找到配置文件") } else { log.Fatalf("配置解析失败 %s", err) } } viper.WatchConfig() viper.OnConfigChange(func(in fsnotify.Event) { log.Infoln(in.Name) loadApp() }) loadApp() quit := make(chan os.Signal) signal.Notify(quit, os.Interrupt) <-quit log.Infof("关闭服务") } func loadApp() { err := viper.Unmarshal(global.Config) if err != nil { log.Fatalf("配置文件解析失败: %s", err) } log.Infof("\n%#v", global.Config) if app != nil { _ = app.Shutdown() } app = createApp() if err := app.Listen(global.Config.Server.Addr); err != nil { log.Fatalf("致命错误: %s", err) } } func createApp() *fiber.App { app := fiber.New(fiber.Config{ Prefork: global.Config.Server.PreFork, CaseSensitive: global.Config.Server.CaseSensitive, StrictRouting: global.Config.Server.StrictRouting, ServerHeader: global.Config.Server.ServerHeader, ErrorHandler: func(ctx *fiber.Ctx, err error) error { code := fiber.StatusInternalServerError if e, ok := err.(*fiber.Error); ok { code = e.Code } err = ctx.Status(code).JSON(errorx.NewDefaultError(err.Error())) if err != nil { return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error") } return nil }, }) swaggerHandler(app) helloWorld(app) errorHandler(app) app.Get("/routes", func(ctx *fiber.Ctx) error { return ctx.JSON(response.NewResponse(app.Stack())) }) return app } // helloWorld // // @Summary HelloWorld // @Description 简单的 HelloWorld 示例 // @Tags HelloWorld // @Accept json // @Produce json // @Success 200 {object} response.Response{data=string} // @Failure default {object} errorx.CodeErrorResponse // @Router / [get] func helloWorld(app *fiber.App) { app.Get("/", func(c *fiber.Ctx) error { log.Infof("\n%s", c.Request().String()) return c.JSON(response.NewResponse("Hello, World 👋!")) }) } // errorHandler // // @Summary 错误处理 // @Description 错误信息示例 // @Tags Error // @Accept json // @Produce json // @Failure default {object} errorx.CodeErrorResponse // @Router /error [get] // @Router /error [post] // @Router /error [put] // @Router /error [delete] // @Router /error [patch] // @Router /error [head] func errorHandler(app *fiber.App) { app.All("/error", func(ctx *fiber.Ctx) error { return ctx.JSON(errorx.NewDefaultError("错误信息示例")) }) } func swaggerHandler(app *fiber.App) { app.Get("/swagger/*", swagger.New(swagger.Config{ DeepLinking: false, // Expand ("list") or Collapse ("none") tag groups by default DocExpansion: "list", })) }