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