This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
stdErrors "errors"
|
||||
"os"
|
||||
"os/signal"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
@@ -197,6 +200,8 @@ func closeQueue(queueClient *queue.Client, appLogger *zap.Logger) {
|
||||
|
||||
// createFiberApp 创建 Fiber 应用
|
||||
func createFiberApp(cfg *config.Config, appLogger *zap.Logger) *fiber.App {
|
||||
registerTimeParserCompat()
|
||||
|
||||
return fiber.New(fiber.Config{
|
||||
AppName: "君鸿卡管系统 v1.0.0",
|
||||
StrictRouting: true,
|
||||
@@ -210,6 +215,60 @@ func createFiberApp(cfg *config.Config, appLogger *zap.Logger) *fiber.App {
|
||||
})
|
||||
}
|
||||
|
||||
// registerTimeParserCompat 注册时间参数解析兼容器
|
||||
// 兼容格式:RFC3339、2006-01-02、2006-01-02 15:04:05、2006-01-02T15:04:05
|
||||
func registerTimeParserCompat() {
|
||||
fiber.SetParserDecoder(fiber.ParserConfig{
|
||||
IgnoreUnknownKeys: true,
|
||||
ZeroEmpty: true,
|
||||
ParserType: []fiber.ParserType{
|
||||
{
|
||||
Customtype: time.Time{},
|
||||
Converter: func(value string) reflect.Value {
|
||||
parsedTime, err := parseFlexibleTime(value)
|
||||
if err != nil {
|
||||
return reflect.Value{}
|
||||
}
|
||||
return reflect.ValueOf(parsedTime)
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// parseFlexibleTime 解析多种常见时间格式
|
||||
func parseFlexibleTime(value string) (time.Time, error) {
|
||||
trimmed := strings.TrimSpace(value)
|
||||
if trimmed == "" {
|
||||
return time.Time{}, nil
|
||||
}
|
||||
|
||||
// 优先支持带时区的标准时间格式。
|
||||
if parsed, err := time.Parse(time.RFC3339, trimmed); err == nil {
|
||||
return parsed, nil
|
||||
}
|
||||
|
||||
// 兼容无时区格式,按服务器本地时区解析。
|
||||
layouts := []string{
|
||||
"2006-01-02 15:04:05",
|
||||
"2006-01-02T15:04:05",
|
||||
"2006-01-02",
|
||||
}
|
||||
var parseErr error
|
||||
for _, layout := range layouts {
|
||||
if parsed, err := time.ParseInLocation(layout, trimmed, time.Local); err == nil {
|
||||
return parsed, nil
|
||||
} else {
|
||||
parseErr = err
|
||||
}
|
||||
}
|
||||
|
||||
if parseErr == nil {
|
||||
parseErr = stdErrors.New("时间格式不支持")
|
||||
}
|
||||
return time.Time{}, parseErr
|
||||
}
|
||||
|
||||
// initMiddleware 注册中间件
|
||||
func initMiddleware(app *fiber.App, cfg *config.Config, appLogger *zap.Logger) {
|
||||
// 1. Recover - 必须第一个,捕获所有 panic
|
||||
|
||||
Reference in New Issue
Block a user