公共参数自动注入, 增加参数是否已赋值检测 #18

Merged
zhangdeman merged 13 commits from feature/upgrade_common_param into master 2025-11-01 18:54:52 +08:00
6 changed files with 236 additions and 64 deletions
Showing only changes of commit 645876e316 - Show all commits

View File

@ -53,7 +53,9 @@ func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
fieldTable := map[string]bool{} fieldTable := map[string]bool{}
fieldNum := reflectType.Elem().NumField() fieldNum := reflectType.Elem().NumField()
for i := 0; i < fieldNum; i++ { for i := 0; i < fieldNum; i++ {
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) { 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 anonymousFieldType := reflectType.Elem().Field(i).Type
if anonymousFieldType.Kind() == reflect.Ptr { if anonymousFieldType.Kind() == reflect.Ptr {
anonymousFieldType = anonymousFieldType.Elem() anonymousFieldType = anonymousFieldType.Elem()
@ -75,6 +77,16 @@ func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
}).ToFieldList()...) }).ToFieldList()...)
continue continue
} }
fieldValue := reflectFormValue.Elem().FieldByName(fieldName)
if !fieldValue.IsZero() {
// 表单次数不为空, 说明从参数中传递, 不做覆盖填充
logger.Instance.Debug("指定字段已赋值, 不做重新覆盖填充处理, 跳过", pkgLogger.NewLogData(innerCtx, logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
"field_name": fieldName,
"struct": reflectFormValue.Elem().Type().String(),
"input_form_value": fieldValue.Interface(),
}).ToFieldList()...)
continue
}
if val, err = getParamFunc(ctx); nil != err { if val, err = getParamFunc(ctx); nil != err {
logger.Instance.Error("获取公共结构体字段参数值失败", pkgLogger.NewLogData(innerCtx, logger.RecordType, logger.CodeInjectCommonParam, map[string]any{ logger.Instance.Error("获取公共结构体字段参数值失败", pkgLogger.NewLogData(innerCtx, logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
"field_name": fieldName, "field_name": fieldName,
@ -82,7 +94,6 @@ func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error {
}).ToFieldList()...) }).ToFieldList()...)
return err return err
} }
fieldValue := reflectFormValue.Elem().FieldByName(fieldName)
if !fieldValue.CanSet() { if !fieldValue.CanSet() {
logDataList := pkgLogger.NewLogData(util.GinCtxToContext(ctx), logger.RecordType, logger.CodeInjectCommonParam, map[string]any{ logDataList := pkgLogger.NewLogData(util.GinCtxToContext(ctx), logger.RecordType, logger.CodeInjectCommonParam, map[string]any{
"field_name": fieldName, "field_name": fieldName,