// Package router ... // // Description : router ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2025-10-30 15:39 package router import ( "reflect" "git.zhangdeman.cn/zhangdeman/gin/logger" "github.com/gin-gonic/gin" ) // GetCommonParam 获取公共参数 type GetCommonParam func(ctx *gin.Context) (any, error) // AddCommonParamRule 添加公共参数注入规则 func (s *server) AddCommonParamRule(fieldName string, getParamFunc GetCommonParam) { s.commonParam[fieldName] = getParamFunc } // AddCommonParamRules 批量添加公共参数注入规则 func (s *server) AddCommonParamRules(rules map[string]GetCommonParam) { for fieldName, rule := range rules { s.AddCommonParamRule(fieldName, rule) } } // injectCommonParam 注入公共参数 func (s *server) injectCommonParam(ctx *gin.Context, formValue any) error { reflectType := reflect.TypeOf(formValue) fieldTable := map[string]bool{} fieldNum := reflectType.Elem().NumField() for i := 0; i < fieldNum; i++ { // 提取全部结构体字段 fieldTable[reflectType.Elem().Field(i).Name] = true } reflectValue := reflect.ValueOf(formValue) for fieldName, getParamFunc := range s.commonParam { if _, ok := fieldTable[fieldName]; !ok { // 结构体字段未配置自动注入 continue } if val, err := getParamFunc(ctx); nil != err { logger.Instance.Error("inject common param failed") return err } reflectValue.Elem().FieldByName(fieldName) } }