From 463523f0b83a2aa19d3229a37f999e50abdcf2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Fri, 31 Oct 2025 14:25:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=95=B0=E6=8D=AE=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logger/define.go | 17 ----------------- logger/instance.go | 8 ++++++++ router/common_param.go | 43 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 20 deletions(-) delete mode 100644 logger/define.go diff --git a/logger/define.go b/logger/define.go deleted file mode 100644 index cc62753..0000000 --- a/logger/define.go +++ /dev/null @@ -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"` -} diff --git a/logger/instance.go b/logger/instance.go index 94be1da..5c9263b 100644 --- a/logger/instance.go +++ b/logger/instance.go @@ -20,3 +20,11 @@ func SetInstance(l *zap.Logger) { } Instance = l } + +const ( + RecordType = "GIN_LOG" +) + +const ( + CodeInjectCommonParam = "inject-common-param" +) diff --git a/router/common_param.go b/router/common_param.go index d23004d..29f03f9 100644 --- a/router/common_param.go +++ b/router/common_param.go @@ -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 }