2025-03-15 16:07:45 +08:00
|
|
|
package web
|
|
|
|
|
|
|
|
|
|
import (
|
2025-03-31 09:09:05 +08:00
|
|
|
"net/http"
|
2025-04-16 14:01:30 +08:00
|
|
|
g "platform/web/globals"
|
2025-04-01 10:51:32 +08:00
|
|
|
"runtime"
|
2025-03-18 17:57:07 +08:00
|
|
|
|
2025-03-31 09:09:05 +08:00
|
|
|
"log/slog"
|
|
|
|
|
|
2025-03-15 16:07:45 +08:00
|
|
|
"github.com/gofiber/fiber/v2"
|
2025-03-18 17:57:07 +08:00
|
|
|
"github.com/gofiber/fiber/v2/middleware/logger"
|
|
|
|
|
"github.com/gofiber/fiber/v2/middleware/requestid"
|
2025-04-01 11:26:37 +08:00
|
|
|
"github.com/google/uuid"
|
|
|
|
|
"github.com/jxskiss/base62"
|
2025-03-31 09:09:05 +08:00
|
|
|
|
2025-04-21 13:57:57 +08:00
|
|
|
_ "net/http/pprof"
|
|
|
|
|
)
|
2025-03-15 16:07:45 +08:00
|
|
|
|
|
|
|
|
type Config struct {
|
|
|
|
|
Listen string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Server struct {
|
|
|
|
|
config *Config
|
|
|
|
|
fiber *fiber.App
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func New(config *Config) (*Server, error) {
|
|
|
|
|
_config := config
|
|
|
|
|
if config == nil {
|
|
|
|
|
_config = &Config{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &Server{
|
|
|
|
|
config: _config,
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) Run() error {
|
2025-03-31 09:09:05 +08:00
|
|
|
|
2025-04-16 14:01:30 +08:00
|
|
|
// inits
|
|
|
|
|
g.InitBaiyin()
|
|
|
|
|
g.InitAlipay()
|
2025-04-17 18:29:44 +08:00
|
|
|
// g.InitWechatPay()
|
2025-04-18 17:47:54 +08:00
|
|
|
g.InitAliyun()
|
2025-04-30 15:18:45 +08:00
|
|
|
g.InitValidator()
|
2025-04-16 14:01:30 +08:00
|
|
|
|
2025-04-01 11:26:37 +08:00
|
|
|
// config
|
2025-03-18 17:57:07 +08:00
|
|
|
s.fiber = fiber.New(fiber.Config{
|
2025-04-30 15:18:45 +08:00
|
|
|
ProxyHeader: fiber.HeaderXForwardedFor,
|
2025-03-18 17:57:07 +08:00
|
|
|
ErrorHandler: ErrorHandler,
|
|
|
|
|
})
|
|
|
|
|
|
2025-04-01 11:26:37 +08:00
|
|
|
s.fiber.Use(requestid.New(requestid.Config{
|
|
|
|
|
Generator: func() string {
|
|
|
|
|
binary, _ := uuid.New().MarshalBinary()
|
|
|
|
|
return base62.EncodeToString(binary)
|
|
|
|
|
},
|
|
|
|
|
}))
|
2025-05-07 19:03:44 +08:00
|
|
|
s.fiber.Use(logger.New(logger.Config{
|
|
|
|
|
Format: "🚀 ${time} | ${locals:authtype} ${locals:authid} | ${method} ${path} | ${status} | ${latency} | ${error}\n",
|
|
|
|
|
TimeFormat: "2006-01-02 15:04:05",
|
|
|
|
|
TimeZone: "Asia/Shanghai",
|
|
|
|
|
}))
|
2025-03-18 17:57:07 +08:00
|
|
|
|
|
|
|
|
ApplyRouters(s.fiber)
|
2025-03-15 16:07:45 +08:00
|
|
|
|
2025-04-01 10:51:32 +08:00
|
|
|
// pprof
|
2025-03-31 09:09:05 +08:00
|
|
|
go func() {
|
2025-04-01 10:51:32 +08:00
|
|
|
runtime.SetBlockProfileRate(1)
|
2025-03-31 09:09:05 +08:00
|
|
|
err := http.ListenAndServe(":6060", nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
slog.Error("pprof 服务错误", slog.Any("err", err))
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
2025-04-01 11:26:37 +08:00
|
|
|
// listen
|
2025-04-21 13:57:57 +08:00
|
|
|
slog.Info("Server started on :8080")
|
|
|
|
|
err := s.fiber.Listen(":8080")
|
2025-03-15 16:07:45 +08:00
|
|
|
if err != nil {
|
2025-03-18 17:57:07 +08:00
|
|
|
slog.Error("Failed to start server", slog.Any("err", err))
|
2025-03-15 16:07:45 +08:00
|
|
|
}
|
|
|
|
|
|
2025-03-18 17:57:07 +08:00
|
|
|
slog.Info("Server stopped")
|
2025-03-15 16:07:45 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) Stop() {
|
|
|
|
|
err := s.fiber.Shutdown()
|
|
|
|
|
if err != nil {
|
2025-03-18 17:57:07 +08:00
|
|
|
slog.Error("Failed to shutdown server", slog.Any("err", err))
|
2025-03-15 16:07:45 +08:00
|
|
|
}
|
|
|
|
|
}
|