mirror of
https://gitee.com/shikong-sk/gofiber-study
synced 2025-02-23 23:32:15 +08:00
151 lines
3.6 KiB
Go
151 lines
3.6 KiB
Go
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",
|
|
}))
|
|
}
|