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 | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	RecordType = "GIN_LOG" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	CodeInjectCommonParam = "inject-common-param" | ||||
| ) | ||||
|  | ||||
| @ -8,9 +8,12 @@ | ||||
| package router | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"reflect" | ||||
|  | ||||
| 	"git.zhangdeman.cn/zhangdeman/gin/logger" | ||||
| 	"git.zhangdeman.cn/zhangdeman/gin/util" | ||||
| 	pkgLogger "git.zhangdeman.cn/zhangdeman/logger" | ||||
| 	"github.com/gin-gonic/gin" | ||||
| ) | ||||
|  | ||||
| @ -31,6 +34,12 @@ func (s *server) AddCommonParamRules(rules map[string]GetCommonParam) { | ||||
|  | ||||
| // injectCommonParam 注入公共参数 | ||||
| func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error { | ||||
| 	innerCtx := util.GinCtxToContext(ctx) | ||||
| 	var ( | ||||
| 		val any | ||||
| 		err error | ||||
| 	) | ||||
|  | ||||
| 	reflectType := reflect.TypeOf(formValue) | ||||
| 	fieldTable := map[string]bool{} | ||||
| 	fieldNum := reflectType.Elem().NumField() | ||||
| @ -42,12 +51,40 @@ func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error { | ||||
| 	for fieldName, getParamFunc := range s.commonParam { | ||||
| 		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 | ||||
| 		} | ||||
| 		if val, err := getParamFunc(ctx); nil != err { | ||||
| 			logger.Instance.Error("inject common param failed") | ||||
| 		if val, err = getParamFunc(ctx); nil != err { | ||||
| 			logger.Instance.Error("获取公共结构体字段参数值失败", pkgLogger.NewLogData(innerCtx, logger.RecordType, logger.CodeInjectCommonParam, map[string]any{ | ||||
| 				"field_name": fieldName, | ||||
| 				"err_msg":    err.Error(), | ||||
| 			}).ToFieldList()...) | ||||
| 			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