Compare commits
	
		
			7 Commits
		
	
	
		
			master
			...
			feature/up
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2deff38f9d | |||
| 463523f0b8 | |||
| 4eea5a5167 | |||
| 38ccde2c37 | |||
| 028d16ac5a | |||
| 1a9bc7b6dd | |||
| 64a3652137 | 
							
								
								
									
										25
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								go.sum
									
									
									
									
									
								
							| @ -1,11 +1,8 @@ | ||||
| git.zhangdeman.cn/zhangdeman/api-doc v1.0.3-0.20250930090005-69177ebcd195 h1:S1DqbZdJxKxzEbanmG2I/yycScml7dJbYR+VrXzeuo0= | ||||
| git.zhangdeman.cn/zhangdeman/api-doc v1.0.3-0.20250930090005-69177ebcd195/go.mod h1:tMqiqByNQ5WmFieruKEcEVJv0g2QqA5XSqV0S9WvOZU= | ||||
| git.zhangdeman.cn/zhangdeman/api-doc v1.0.3-0.20251013152001-868ee8955623 h1:QiqETEQx2PBv2fF3UwPS11dsbVDcF3WNCmRRA8zrqAk= | ||||
| git.zhangdeman.cn/zhangdeman/api-doc v1.0.3-0.20251013152001-868ee8955623/go.mod h1:ryyMI2gPgotFD1lZC50p2vRyX8bf3MRwO9tos41z4WU= | ||||
| git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250916024308-d378e6c57772 h1:Yo1ur3LnDF5s7F7tpJsNrdUSF8LwYKnN9TdQU32F3eU= | ||||
| git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250916024308-d378e6c57772/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc= | ||||
| git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250429065800-fc340b9417cf h1:xCPM3U6i62UvLo9VNvDP45Ue3dPl7ratHu1rSEJRE2k= | ||||
| git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250429065800-fc340b9417cf/go.mod h1:onY+qrB+Uwfuv75JlgHlGdkirAfYcINrvCashtVoBX0= | ||||
| git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20251013092857-dcf591d4e8a8 h1:Pw981jG3hH9ZHrB3s1xPpsZafgX3USuMAjnGi2GEP9Y= | ||||
| git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20251013092857-dcf591d4e8a8/go.mod h1:xtCw3om5DRrG30EfQd/lfQPXgptfK7l9oBSt4Kdhjok= | ||||
| git.zhangdeman.cn/zhangdeman/easylock v0.0.0-20230731062340-983985c12eda h1:bMD6r9gjRy7cO+T4zRQVYAesgIblBdTnhzT1vN5wjvI= | ||||
| git.zhangdeman.cn/zhangdeman/easylock v0.0.0-20230731062340-983985c12eda/go.mod h1:dT0rmHcJ9Z9IqWeMIt7YzR88nKkNV2V3dfG0j9Q6lK0= | ||||
| @ -15,30 +12,20 @@ git.zhangdeman.cn/zhangdeman/exception v0.0.0-20250510123912-a0d52fc093ab h1:O0X | ||||
| git.zhangdeman.cn/zhangdeman/exception v0.0.0-20250510123912-a0d52fc093ab/go.mod h1:Voc8J4ordx7nuMWpgACXXZULQy7ZIuBzcEIoS8VnDIw= | ||||
| git.zhangdeman.cn/zhangdeman/graceful v0.0.0-20250529070945-92833db6f3a4 h1:d1B3IXRitiMlY5ssEWRa//RQD24SqRPk/bCpL4/WyOA= | ||||
| git.zhangdeman.cn/zhangdeman/graceful v0.0.0-20250529070945-92833db6f3a4/go.mod h1:faaKb5d5tz3NmQQ+NrTnBDa1G/tN9/CVuKun1V4WBIE= | ||||
| git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251012094811-1afd71fd8627 h1:chAmVCoiWMcrmm+AfvesrhnZH+3+6LZZb+8UDj/E36M= | ||||
| git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251012094811-1afd71fd8627/go.mod h1:SZsX6q88TdR5JHZenesYhOw1x386ikfs2MkchQmW8D8= | ||||
| git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251031042950-416e962cbf3b h1:+ca511XlP+HoBa2zB/ERSIE6yTiqiXpsgqvs64kRAZA= | ||||
| git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251031042950-416e962cbf3b/go.mod h1:tlQR2nfdP291Lug+b3BSu0q+kTPoSVNRL5dPq2nv9zQ= | ||||
| git.zhangdeman.cn/zhangdeman/network v0.0.0-20250726060351-78810e906bfa h1:r3AK2EKbQ82ShC5+AjbE95sqm90CkpbzLpmoV3zok9Q= | ||||
| git.zhangdeman.cn/zhangdeman/network v0.0.0-20250726060351-78810e906bfa/go.mod h1:v0tMMfXvE4WyUxaRo1r/D20BAbMkT5QPLSW7XtgQOxo= | ||||
| git.zhangdeman.cn/zhangdeman/network v0.0.0-20251013095944-5b89fff39bde h1:+3zIOditaUwzSpl2ybM1PYN4OYTIKiemMBt+pNv3Yko= | ||||
| git.zhangdeman.cn/zhangdeman/network v0.0.0-20251013095944-5b89fff39bde/go.mod h1:Ewh0UYOqXxEh0khgHj9bDz1rbnd7cCCsJrcOTFX/8wg= | ||||
| git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc= | ||||
| git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI= | ||||
| git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU= | ||||
| git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd/go.mod h1:pLrQ63JICi81/3w2BrD26QZiu+IpddvEVfMJ6No3Xb4= | ||||
| git.zhangdeman.cn/zhangdeman/trace v0.0.0-20250830115953-2779077bc555 h1:XQgYVEui0QKl5NXOvYpAg48zSc81obXF9cOinU8JuqQ= | ||||
| git.zhangdeman.cn/zhangdeman/trace v0.0.0-20250830115953-2779077bc555/go.mod h1:+tLRnfL+ddqljSTOacSJoIv7TpbdWih3efd8Yvk/Hh8= | ||||
| git.zhangdeman.cn/zhangdeman/trace v0.0.0-20251013092356-b7b9fb5f8a76 h1:Y1GME5dg3jFmoURKvuujK07VUNMpsuRR4FkhinfBQIs= | ||||
| git.zhangdeman.cn/zhangdeman/trace v0.0.0-20251013092356-b7b9fb5f8a76/go.mod h1:avN/muzbNjUM2qamRZeY4fuLEmA9cmfslk1dkdtRQBE= | ||||
| git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e h1:Q973S6CcWr1ICZhFI1STFOJ+KUImCl2BaIXm6YppBqI= | ||||
| git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI= | ||||
| git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20241125101541-c5ea194c9c1e h1:YE2Gi+M03UDImIpWa3I7jzSesyfu2RL8x/4ONs5v0oE= | ||||
| git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20241125101541-c5ea194c9c1e/go.mod h1:L/7JugxKZL3JP9JP/XDvPAPz0FQXG1u181Su1+u/d1c= | ||||
| git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20251013144324-313024336a6f h1:InxNoLPHBLwCLblW0lsL2P1ZBYoUEzw9Yh+KNLt4Xmg= | ||||
| git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20251013144324-313024336a6f/go.mod h1:Pbs7tusW6RNcqrNCVcLE2zrM8JfPaO7lBJQuRiAzzLs= | ||||
| git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251013094128-d57d32b103be h1:mlmXacZHRKxmFmFKNFYRjZJ8+z2+QW3CH8L7AzoMTcQ= | ||||
| git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251013094128-d57d32b103be/go.mod h1:mBvTwcdqHRF3QIkAh92j/JRhru2LzyJ2LBqolxjzzKE= | ||||
| git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251014035305-c0ec06fa6dff h1:ym1Qs4diJe27CK/0K6vy7RvgH90mXgslWA++L8mXaKE= | ||||
| git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251014035305-c0ec06fa6dff/go.mod h1:mBvTwcdqHRF3QIkAh92j/JRhru2LzyJ2LBqolxjzzKE= | ||||
| github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= | ||||
| @ -47,12 +34,8 @@ github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc | ||||
| github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= | ||||
| github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= | ||||
| github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= | ||||
| github.com/bytedance/sonic v1.14.1 h1:FBMC0zVz5XUmE4z9wF4Jey0An5FueFvOsTKKKtwIl7w= | ||||
| github.com/bytedance/sonic v1.14.1/go.mod h1:gi6uhQLMbTdeP0muCnrjHLeCUPyb70ujhnNlhOylAFc= | ||||
| github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= | ||||
| github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= | ||||
| github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= | ||||
| github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= | ||||
| github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= | ||||
| github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= | ||||
| github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= | ||||
| @ -60,11 +43,8 @@ github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gE | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= | ||||
| github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1 h1:CaO/zOnF8VvUfEbhRatPcwKVWamvbYd8tQGRWacE9kU= | ||||
| github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1/go.mod h1:+hnT3ywWDTAFrW5aE+u2Sa/wT555ZqwoCS+pk3p6ry4= | ||||
| github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0= | ||||
| github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= | ||||
| github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik= | ||||
| github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= | ||||
| github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= | ||||
| @ -188,7 +168,6 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= | ||||
| github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= | ||||
| @ -209,8 +188,6 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= | ||||
| github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= | ||||
| github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= | ||||
| github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= | ||||
| github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= | ||||
| github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= | ||||
| github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= | ||||
| github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= | ||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||
|  | ||||
							
								
								
									
										30
									
								
								logger/instance.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								logger/instance.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| // Package logger ... | ||||
| // | ||||
| // Description : logger ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-10-30 16:54 | ||||
| package logger | ||||
|  | ||||
| import "go.uber.org/zap" | ||||
|  | ||||
| var ( | ||||
| 	Instance *zap.Logger = zap.NewNop() | ||||
| ) | ||||
|  | ||||
| // SetInstance 设置日志实例 | ||||
| func SetInstance(l *zap.Logger) { | ||||
| 	if nil == l { | ||||
| 		return | ||||
| 	} | ||||
| 	Instance = l | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	RecordType = "GIN_LOG" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	CodeInjectCommonParam = "inject-common-param" | ||||
| ) | ||||
							
								
								
									
										108
									
								
								router/common_param.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								router/common_param.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,108 @@ | ||||
| // Package router ... | ||||
| // | ||||
| // Description : router ... | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 2025-10-30 15:39 | ||||
| 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" | ||||
| ) | ||||
|  | ||||
| // 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 { | ||||
| 	innerCtx := util.GinCtxToContext(ctx) | ||||
| 	var ( | ||||
| 		val              any | ||||
| 		err              error | ||||
| 		reflectFormValue reflect.Value | ||||
| 		reflectType      reflect.Type | ||||
| 		ok               bool | ||||
| 	) | ||||
|  | ||||
| 	if reflectFormValue, ok = formValue.(reflect.Value); !ok { | ||||
| 		reflectFormValue = reflect.ValueOf(formValue) | ||||
| 		reflectType = reflect.TypeOf(formValue) | ||||
| 	} else { | ||||
| 		reflectType = reflectFormValue.Type() | ||||
| 	} | ||||
|  | ||||
| 	fieldTable := map[string]bool{} | ||||
| 	fieldNum := reflectType.Elem().NumField() | ||||
| 	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) { | ||||
| 			anonymousFieldType := reflectType.Elem().Field(i).Type | ||||
| 			if anonymousFieldType.Kind() == reflect.Ptr { | ||||
| 				anonymousFieldType = anonymousFieldType.Elem() | ||||
| 			} | ||||
| 			for j := 0; j < anonymousFieldType.NumField(); j++ { | ||||
| 				fieldTable[anonymousFieldType.Field(j).Name] = true | ||||
| 			} | ||||
| 		} else { | ||||
| 			// 提取全部结构体字段 | ||||
| 			fieldTable[reflectType.Elem().Field(i).Name] = true | ||||
| 		} | ||||
| 	} | ||||
| 	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":     reflectFormValue.Elem().Type().String(), | ||||
| 			}).ToFieldList()...) | ||||
| 			continue | ||||
| 		} | ||||
| 		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 | ||||
| 		} | ||||
| 		fieldValue := reflectFormValue.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 | ||||
| } | ||||
| @ -12,6 +12,7 @@ import ( | ||||
| 	"reflect" | ||||
| 	"sync" | ||||
|  | ||||
| 	"git.zhangdeman.cn/zhangdeman/consts" | ||||
| 	"git.zhangdeman.cn/zhangdeman/exception" | ||||
| 	"git.zhangdeman.cn/zhangdeman/gin/define" | ||||
| 	"git.zhangdeman.cn/zhangdeman/gin/request" | ||||
| @ -19,33 +20,54 @@ import ( | ||||
| 	"github.com/gin-gonic/gin" | ||||
| ) | ||||
|  | ||||
| func (s *server) getFormInitValue(ctx *gin.Context, uriCfg UriConfig) (any, error) { | ||||
| 	var ( | ||||
| 		formParam reflect.Value | ||||
| 		formValue any | ||||
| 		err       error | ||||
| 	) | ||||
|  | ||||
| 	if uriCfg.FormDataType.Kind() == reflect.Ptr { | ||||
| 		formParam = reflect.New(uriCfg.FormDataType.Elem()) | ||||
| 	} else { | ||||
| 		// 表单解析 | ||||
| 		formParam = reflect.New(uriCfg.FormDataType) | ||||
| 	} | ||||
| 	formValue = formParam.Interface() | ||||
| 	if err = request.Form.Parse(ctx, formValue); nil != err { | ||||
| 		// 格式化验证错误的信息 | ||||
| 		err = GetValidateErr(formValue, err) | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return formValue, nil | ||||
| } | ||||
|  | ||||
| // RequestHandler 获取请求处理方法 | ||||
| // | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 19:44 2025/1/27 | ||||
| func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | ||||
| func (s *server) RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | ||||
| 	return func(ctx *gin.Context) { | ||||
| 		var ( | ||||
| 			err error | ||||
| 			ok  bool | ||||
| 			e   exception.IException | ||||
| 			err        error | ||||
| 			ok         bool | ||||
| 			e          exception.IException | ||||
| 			formValue  any | ||||
| 			firstParam reflect.Value | ||||
| 		) | ||||
|  | ||||
| 		var formParam reflect.Value | ||||
| 		if uriCfg.FormDataType.Kind() == reflect.Ptr { | ||||
| 			formParam = reflect.New(uriCfg.FormDataType.Elem()) | ||||
| 		} else { | ||||
| 			// 表单解析 | ||||
| 			formParam = reflect.New(uriCfg.FormDataType) | ||||
| 		} | ||||
| 		formValue := formParam.Interface() | ||||
| 		if err = request.Form.Parse(ctx, formValue); nil != err { | ||||
| 			// 格式化验证错误的信息 | ||||
| 			err = GetValidateErr(formValue, err) | ||||
| 		if formValue, err = s.getFormInitValue(ctx, uriCfg); nil != err { | ||||
| 			e = exception.NewFromError(400, err) | ||||
| 			response.SendWithException(ctx, e, &define.ResponseOption{ | ||||
| 				ContentType: "application/json;charset=utf-8", | ||||
| 				ContentType: consts.MimeTypeJson, | ||||
| 			}) | ||||
| 			ctx.Abort() | ||||
| 			return | ||||
| 		} | ||||
| 		// 表单数据 | ||||
| 		inputValue := reflect.ValueOf(formValue) | ||||
| 		// 注入公共参数 | ||||
| 		if err = s.injectCommonParam(ctx, inputValue); nil != err { | ||||
| 			e = exception.NewFromError(500, err) | ||||
| 			response.SendWithException(ctx, e, &define.ResponseOption{ | ||||
| 				ContentType: consts.MimeTypeJson, | ||||
| 			}) | ||||
| 			ctx.Abort() | ||||
| 			return | ||||
| @ -84,11 +106,9 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | ||||
| 			}() | ||||
| 		}() | ||||
| 		// 执行逻辑 | ||||
| 		inputValue := reflect.ValueOf(formValue) | ||||
| 		if uriCfg.FormDataType.Kind() != reflect.Ptr { | ||||
| 			inputValue = inputValue.Elem() | ||||
| 		} | ||||
| 		var firstParam reflect.Value | ||||
| 		if uriCfg.CtxType == CustomContextType { | ||||
| 			customCtx := ctx.MustGet(define.CustomContextKey) | ||||
| 			firstParam = reflect.ValueOf(customCtx) | ||||
| @ -99,7 +119,7 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | ||||
| 		if resList[1].IsNil() { | ||||
| 			// 请求成功 | ||||
| 			isSuccess = true | ||||
| 			response.SuccessWithExtension(ctx, resList[0].Interface(), &define.ResponseOption{ContentType: "application/json;charset=utf-8"}) | ||||
| 			response.SuccessWithExtension(ctx, resList[0].Interface(), &define.ResponseOption{ContentType: consts.MimeTypeJson}) | ||||
| 			return | ||||
| 		} | ||||
| 		// 请求失败 | ||||
| @ -113,7 +133,7 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | ||||
| 			}) | ||||
| 		} | ||||
| 		response.SendWithException(ctx, e, &define.ResponseOption{ | ||||
| 			ContentType: "application/json;charset=utf-8", | ||||
| 			ContentType: consts.MimeTypeJson, | ||||
| 		}) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| @ -11,6 +11,7 @@ import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"git.zhangdeman.cn/zhangdeman/graceful" | ||||
|  | ||||
| @ -125,18 +126,22 @@ func NewServer(port int, optionList ...SetServerOptionFunc) *server { | ||||
| 		pprof.Register(r) | ||||
| 	} | ||||
| 	return &server{ | ||||
| 		router:     r, | ||||
| 		uiInstance: apiDoc.NewSwaggerUI(option.serverInfo, option.serverList, apiDocEnum.SwaggerUITheme(option.swaggerUiTheme)), | ||||
| 		port:       port, | ||||
| 		option:     option, | ||||
| 		router:      r, | ||||
| 		uiInstance:  apiDoc.NewSwaggerUI(option.serverInfo, option.serverList, apiDocEnum.SwaggerUITheme(option.swaggerUiTheme)), | ||||
| 		port:        port, | ||||
| 		option:      option, | ||||
| 		lock:        &sync.RWMutex{}, | ||||
| 		commonParam: map[string]GetCommonParam{}, | ||||
| 	} | ||||
| } | ||||
|  | ||||
| type server struct { | ||||
| 	router     *gin.Engine | ||||
| 	port       int | ||||
| 	uiInstance *apiDoc.SwaggerUI | ||||
| 	option     *serverOption | ||||
| 	router      *gin.Engine | ||||
| 	port        int | ||||
| 	uiInstance  *apiDoc.SwaggerUI | ||||
| 	option      *serverOption | ||||
| 	commonParam map[string]GetCommonParam // 结构体字段名, 注意, 不是TAG | ||||
| 	lock        *sync.RWMutex | ||||
| } | ||||
|  | ||||
| // Start 启动服务 | ||||
| @ -201,21 +206,22 @@ func (s *server) Group(routerPrefix string, middlewareList []gin.HandlerFunc, cL | ||||
| 		for _, itemUriCfg := range urlTable { | ||||
| 			_ = s.uiInstance.DocInstance().AddApiFromInAndOut(routerPrefix, itemUriCfg.FormDataType, itemUriCfg.ResultDataType) | ||||
| 			method := strings.ToUpper(itemUriCfg.RequestMethod) | ||||
| 			handleFunc := s.RequestHandler(itemUriCfg) | ||||
| 			switch method { | ||||
| 			case http.MethodGet: | ||||
| 				g.GET(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.GET(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodHead: | ||||
| 				g.HEAD(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.HEAD(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodPost: | ||||
| 				g.POST(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.POST(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodPut: | ||||
| 				g.PUT(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.PUT(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodPatch: | ||||
| 				g.PATCH(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.PATCH(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodDelete: | ||||
| 				g.DELETE(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.DELETE(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodOptions: | ||||
| 				g.OPTIONS(itemUriCfg.Path, RequestHandler(itemUriCfg)) | ||||
| 				g.OPTIONS(itemUriCfg.Path, handleFunc) | ||||
| 			case http.MethodTrace: | ||||
| 				panic(`method Trace is not supported`) | ||||
| 			default: | ||||
|  | ||||
| @ -13,8 +13,28 @@ import ( | ||||
| 	"github.com/gin-gonic/gin" | ||||
| ) | ||||
|  | ||||
| type testCommon struct { | ||||
| 	UserID uint `json:"user_id"` | ||||
| } | ||||
|  | ||||
| type testForm struct { | ||||
| 	Meta `json:"-" method:"get" path:"test"` | ||||
| 	testCommon | ||||
| 	Name string `json:"name"` | ||||
| } | ||||
|  | ||||
| func TestNewServer(t *testing.T) { | ||||
| 	s := NewServer(9087) | ||||
| 	s.Router().GET("/ping", func(c *gin.Context) {}) | ||||
| 	s.AddCommonParamRule("UserID", func(ctx *gin.Context) (any, error) { | ||||
| 		return uint(123456), nil | ||||
| 	}) | ||||
| 	s.Group("", nil, testController{}) | ||||
| 	s.Start() | ||||
| } | ||||
|  | ||||
| type testController struct { | ||||
| } | ||||
|  | ||||
| func (tc testController) Test(ctx *gin.Context, requestData *testForm) (*testCommon, error) { | ||||
| 	return &testCommon{UserID: requestData.UserID}, nil | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user