feat: 自动字段注入支持解析二级匿名字段
This commit is contained in:
@ -36,24 +36,42 @@ func (s *server) AddCommonParamRules(rules map[string]GetCommonParam) {
|
||||
func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
|
||||
innerCtx := util.GinCtxToContext(ctx)
|
||||
var (
|
||||
val any
|
||||
err error
|
||||
val any
|
||||
err error
|
||||
reflectFormValue reflect.Value
|
||||
reflectType reflect.Type
|
||||
ok bool
|
||||
)
|
||||
|
||||
reflectType := reflect.TypeOf(formValue)
|
||||
if reflectFormValue, ok = formValue.(reflect.Value); !ok {
|
||||
reflectFormValue = reflect.ValueOf(formValue)
|
||||
reflectType = reflect.TypeOf(formValue)
|
||||
} else {
|
||||
reflectType = reflectFormValue.Type()
|
||||
}
|
||||
|
||||
fieldTable := map[string]bool{}
|
||||
fieldNum := reflectType.Elem().NumField()
|
||||
for i := 0; i < fieldNum; i++ {
|
||||
// 提取全部结构体字段
|
||||
fieldTable[reflectType.Elem().Field(i).Name] = true
|
||||
if reflectType.Elem().Field(i).Anonymous && ((reflectType.Elem().Field(i).Type.Kind() == reflect.Ptr && reflectType.Elem().Field(i).Type.Kind() == reflect.Struct) || reflectType.Elem().Field(i).Type.Kind() == reflect.Struct) {
|
||||
anonymousFieldType := reflectType.Elem().Field(i).Type
|
||||
if anonymousFieldType.Kind() == reflect.Ptr {
|
||||
anonymousFieldType = anonymousFieldType.Elem()
|
||||
}
|
||||
for j := 0; j < anonymousFieldType.NumField(); j++ {
|
||||
fieldTable[anonymousFieldType.Field(j).Name] = true
|
||||
}
|
||||
} else {
|
||||
// 提取全部结构体字段
|
||||
fieldTable[reflectType.Elem().Field(i).Name] = true
|
||||
}
|
||||
}
|
||||
reflectValue := reflect.ValueOf(formValue)
|
||||
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(),
|
||||
"struct": reflectFormValue.Elem().Type().String(),
|
||||
}).ToFieldList()...)
|
||||
continue
|
||||
}
|
||||
@ -64,7 +82,7 @@ func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
|
||||
}).ToFieldList()...)
|
||||
return err
|
||||
}
|
||||
fieldValue := reflectValue.Elem().FieldByName(fieldName)
|
||||
fieldValue := reflectFormValue.Elem().FieldByName(fieldName)
|
||||
if !fieldValue.CanSet() {
|
||||
logDataList := pkgLogger.NewLogData(util.GinCtxToContext(ctx), logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
|
||||
"field_name": fieldName,
|
||||
|
||||
Reference in New Issue
Block a user