feat: 优化公共字段数据设置
This commit is contained in:
@ -1,17 +0,0 @@
|
|||||||
// Package logger ...
|
|
||||||
//
|
|
||||||
// Description : logger ...
|
|
||||||
//
|
|
||||||
// Author : go_developer@163.com<白茶清欢>
|
|
||||||
//
|
|
||||||
// Date : 2025-10-30 16:56
|
|
||||||
package logger
|
|
||||||
|
|
||||||
// Data 日志数据
|
|
||||||
type Data struct {
|
|
||||||
TraceID string `json:"trace_id" dc:"trace_id"`
|
|
||||||
RequestID string `json:"request_id" dc:"请求ID"`
|
|
||||||
UserID any `json:"user_id" dc:"用户IP"`
|
|
||||||
Hostname string `json:"hostname" dc:"服务器主机名称"`
|
|
||||||
HostIp string `json:"host_ip" dc:"主机IP"`
|
|
||||||
}
|
|
||||||
@ -20,3 +20,11 @@ func SetInstance(l *zap.Logger) {
|
|||||||
}
|
}
|
||||||
Instance = l
|
Instance = l
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
RecordType = "GIN_LOG"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CodeInjectCommonParam = "inject-common-param"
|
||||||
|
)
|
||||||
|
|||||||
@ -8,9 +8,12 @@
|
|||||||
package router
|
package router
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"git.zhangdeman.cn/zhangdeman/gin/logger"
|
"git.zhangdeman.cn/zhangdeman/gin/logger"
|
||||||
|
"git.zhangdeman.cn/zhangdeman/gin/util"
|
||||||
|
pkgLogger "git.zhangdeman.cn/zhangdeman/logger"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -31,6 +34,12 @@ func (s *server) AddCommonParamRules(rules map[string]GetCommonParam) {
|
|||||||
|
|
||||||
// injectCommonParam 注入公共参数
|
// injectCommonParam 注入公共参数
|
||||||
func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
|
func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
|
||||||
|
innerCtx := util.GinCtxToContext(ctx)
|
||||||
|
var (
|
||||||
|
val any
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
reflectType := reflect.TypeOf(formValue)
|
reflectType := reflect.TypeOf(formValue)
|
||||||
fieldTable := map[string]bool{}
|
fieldTable := map[string]bool{}
|
||||||
fieldNum := reflectType.Elem().NumField()
|
fieldNum := reflectType.Elem().NumField()
|
||||||
@ -42,12 +51,40 @@ func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
|
|||||||
for fieldName, getParamFunc := range s.commonParam {
|
for fieldName, getParamFunc := range s.commonParam {
|
||||||
if _, ok := fieldTable[fieldName]; !ok {
|
if _, ok := fieldTable[fieldName]; !ok {
|
||||||
// 结构体字段未配置自动注入
|
// 结构体字段未配置自动注入
|
||||||
|
logger.Instance.Debug("当前结构体不包含指定字段, 忽略执行", pkgLogger.NewLogData(innerCtx, logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
|
||||||
|
"field_name": fieldName,
|
||||||
|
"struct": reflectValue.Elem().Type().String(),
|
||||||
|
}).ToFieldList()...)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if val, err := getParamFunc(ctx); nil != err {
|
if val, err = getParamFunc(ctx); nil != err {
|
||||||
logger.Instance.Error("inject common param failed")
|
logger.Instance.Error("获取公共结构体字段参数值失败", pkgLogger.NewLogData(innerCtx, logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
|
||||||
|
"field_name": fieldName,
|
||||||
|
"err_msg": err.Error(),
|
||||||
|
}).ToFieldList()...)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
reflectValue.Elem().FieldByName(fieldName)
|
fieldValue := reflectValue.Elem().FieldByName(fieldName)
|
||||||
|
if !fieldValue.CanSet() {
|
||||||
|
logDataList := pkgLogger.NewLogData(util.GinCtxToContext(ctx), logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
|
||||||
|
"field_name": fieldName,
|
||||||
|
"field_type": fieldValue.Type().String(),
|
||||||
|
})
|
||||||
|
logger.Instance.Error("结构体字段不可设置值", logDataList.ToFieldList()...)
|
||||||
|
return errors.New(fieldName + ": 结构体字段不可设置值")
|
||||||
}
|
}
|
||||||
|
reflectVal := reflect.ValueOf(val)
|
||||||
|
if reflectVal.Type() != fieldValue.Type() {
|
||||||
|
logDataList := pkgLogger.NewLogData(util.GinCtxToContext(ctx), logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
|
||||||
|
"field_name": fieldName,
|
||||||
|
"field_type": fieldValue.Type().String(),
|
||||||
|
"value_type": reflectVal.Type().String(),
|
||||||
|
})
|
||||||
|
logger.Instance.Error("返回数据类型与字段类型不一致", logDataList.ToFieldList()...)
|
||||||
|
return errors.New(fieldName + ": 字段自动注入, 返回数据类型与字段类型不一致")
|
||||||
|
}
|
||||||
|
// 设置值
|
||||||
|
fieldValue.Set(reflectVal)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user