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 h1:QiqETEQx2PBv2fF3UwPS11dsbVDcF3WNCmRRA8zrqAk= | ||||||
| git.zhangdeman.cn/zhangdeman/api-doc v1.0.3-0.20251013152001-868ee8955623/go.mod h1:ryyMI2gPgotFD1lZC50p2vRyX8bf3MRwO9tos41z4WU= | 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 h1:Yo1ur3LnDF5s7F7tpJsNrdUSF8LwYKnN9TdQU32F3eU= | ||||||
| git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250916024308-d378e6c57772/go.mod h1:5p8CEKGBxi7qPtTXDI3HDmqKAfIm5i/aBWdrbkbdNjc= | 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-20251013092857-dcf591d4e8a8 h1:Pw981jG3hH9ZHrB3s1xPpsZafgX3USuMAjnGi2GEP9Y= | ||||||
| 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/go.mod h1:xtCw3om5DRrG30EfQd/lfQPXgptfK7l9oBSt4Kdhjok= | 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 h1:bMD6r9gjRy7cO+T4zRQVYAesgIblBdTnhzT1vN5wjvI= | ||||||
| git.zhangdeman.cn/zhangdeman/easylock v0.0.0-20230731062340-983985c12eda/go.mod h1:dT0rmHcJ9Z9IqWeMIt7YzR88nKkNV2V3dfG0j9Q6lK0= | 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/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 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/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 h1:+ca511XlP+HoBa2zB/ERSIE6yTiqiXpsgqvs64kRAZA= | ||||||
| git.zhangdeman.cn/zhangdeman/logger v0.0.0-20251031042950-416e962cbf3b/go.mod h1:tlQR2nfdP291Lug+b3BSu0q+kTPoSVNRL5dPq2nv9zQ= | 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 h1:+3zIOditaUwzSpl2ybM1PYN4OYTIKiemMBt+pNv3Yko= | ||||||
| git.zhangdeman.cn/zhangdeman/network v0.0.0-20251013095944-5b89fff39bde/go.mod h1:Ewh0UYOqXxEh0khgHj9bDz1rbnd7cCCsJrcOTFX/8wg= | 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 h1:VjYrb4adud7FHeiYS9XA0B/tOaJjfRejzQAlwimrrDc= | ||||||
| git.zhangdeman.cn/zhangdeman/op_type v0.0.0-20251013024601-da007da2fb42/go.mod h1:VHb9qmhaPDAQDcS6vUiDCamYjZ4R5lD1XtVsh55KsMI= | 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 h1:kTZOpR8iHx27sUufMWVYhDZx9Q4h80j7RWlaR8GIBiU= | ||||||
| git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20251013044511-86c1a4a3a9dd/go.mod h1:pLrQ63JICi81/3w2BrD26QZiu+IpddvEVfMJ6No3Xb4= | 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 h1:Y1GME5dg3jFmoURKvuujK07VUNMpsuRR4FkhinfBQIs= | ||||||
| git.zhangdeman.cn/zhangdeman/trace v0.0.0-20251013092356-b7b9fb5f8a76/go.mod h1:avN/muzbNjUM2qamRZeY4fuLEmA9cmfslk1dkdtRQBE= | 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 h1:Q973S6CcWr1ICZhFI1STFOJ+KUImCl2BaIXm6YppBqI= | ||||||
| git.zhangdeman.cn/zhangdeman/util v0.0.0-20240618042405-6ee2c904644e/go.mod h1:VpPjBlwz8U+OxZuxzHQBv1aEEZ3pStH6bZvT21ADEbI= | 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 h1:InxNoLPHBLwCLblW0lsL2P1ZBYoUEzw9Yh+KNLt4Xmg= | ||||||
| git.zhangdeman.cn/zhangdeman/websocket v0.0.0-20251013144324-313024336a6f/go.mod h1:Pbs7tusW6RNcqrNCVcLE2zrM8JfPaO7lBJQuRiAzzLs= | 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 h1:ym1Qs4diJe27CK/0K6vy7RvgH90mXgslWA++L8mXaKE= | ||||||
| git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20251014035305-c0ec06fa6dff/go.mod h1:mBvTwcdqHRF3QIkAh92j/JRhru2LzyJ2LBqolxjzzKE= | 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= | 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/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 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= | ||||||
| github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= | 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 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= | ||||||
| github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= | 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 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= | ||||||
| github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= | github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= | ||||||
| github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= | 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.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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | 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 h1:CaO/zOnF8VvUfEbhRatPcwKVWamvbYd8tQGRWacE9kU= | ||||||
| github.com/dgrijalva/jwt-go/v4 v4.0.0-preview1/go.mod h1:+hnT3ywWDTAFrW5aE+u2Sa/wT555ZqwoCS+pk3p6ry4= | 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 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik= | ||||||
| github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= | github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= | ||||||
| github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= | 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.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.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.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.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.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||||
| github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= | 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/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 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= | ||||||
| github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= | 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 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= | ||||||
| github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= | 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= | 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" | 	"reflect" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
|  | 	"git.zhangdeman.cn/zhangdeman/consts" | ||||||
| 	"git.zhangdeman.cn/zhangdeman/exception" | 	"git.zhangdeman.cn/zhangdeman/exception" | ||||||
| 	"git.zhangdeman.cn/zhangdeman/gin/define" | 	"git.zhangdeman.cn/zhangdeman/gin/define" | ||||||
| 	"git.zhangdeman.cn/zhangdeman/gin/request" | 	"git.zhangdeman.cn/zhangdeman/gin/request" | ||||||
| @ -19,33 +20,54 @@ import ( | |||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // RequestHandler 获取请求处理方法 | func (s *server) getFormInitValue(ctx *gin.Context, uriCfg UriConfig) (any, error) { | ||||||
| // |  | ||||||
| // Author : go_developer@163.com<白茶清欢> |  | ||||||
| // |  | ||||||
| // Date : 19:44 2025/1/27 |  | ||||||
| func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { |  | ||||||
| 	return func(ctx *gin.Context) { |  | ||||||
| 	var ( | 	var ( | ||||||
|  | 		formParam reflect.Value | ||||||
|  | 		formValue any | ||||||
| 		err       error | 		err       error | ||||||
| 			ok  bool |  | ||||||
| 			e   exception.IException |  | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 		var formParam reflect.Value |  | ||||||
| 	if uriCfg.FormDataType.Kind() == reflect.Ptr { | 	if uriCfg.FormDataType.Kind() == reflect.Ptr { | ||||||
| 		formParam = reflect.New(uriCfg.FormDataType.Elem()) | 		formParam = reflect.New(uriCfg.FormDataType.Elem()) | ||||||
| 	} else { | 	} else { | ||||||
| 		// 表单解析 | 		// 表单解析 | ||||||
| 		formParam = reflect.New(uriCfg.FormDataType) | 		formParam = reflect.New(uriCfg.FormDataType) | ||||||
| 	} | 	} | ||||||
| 		formValue := formParam.Interface() | 	formValue = formParam.Interface() | ||||||
| 	if err = request.Form.Parse(ctx, formValue); nil != err { | 	if err = request.Form.Parse(ctx, formValue); nil != err { | ||||||
| 		// 格式化验证错误的信息 | 		// 格式化验证错误的信息 | ||||||
| 		err = GetValidateErr(formValue, err) | 		err = GetValidateErr(formValue, err) | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return formValue, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // RequestHandler 获取请求处理方法 | ||||||
|  | func (s *server) RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | ||||||
|  | 	return func(ctx *gin.Context) { | ||||||
|  | 		var ( | ||||||
|  | 			err        error | ||||||
|  | 			ok         bool | ||||||
|  | 			e          exception.IException | ||||||
|  | 			formValue  any | ||||||
|  | 			firstParam reflect.Value | ||||||
|  | 		) | ||||||
|  |  | ||||||
|  | 		if formValue, err = s.getFormInitValue(ctx, uriCfg); nil != err { | ||||||
| 			e = exception.NewFromError(400, err) | 			e = exception.NewFromError(400, err) | ||||||
| 			response.SendWithException(ctx, e, &define.ResponseOption{ | 			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() | 			ctx.Abort() | ||||||
| 			return | 			return | ||||||
| @ -84,11 +106,9 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | |||||||
| 			}() | 			}() | ||||||
| 		}() | 		}() | ||||||
| 		// 执行逻辑 | 		// 执行逻辑 | ||||||
| 		inputValue := reflect.ValueOf(formValue) |  | ||||||
| 		if uriCfg.FormDataType.Kind() != reflect.Ptr { | 		if uriCfg.FormDataType.Kind() != reflect.Ptr { | ||||||
| 			inputValue = inputValue.Elem() | 			inputValue = inputValue.Elem() | ||||||
| 		} | 		} | ||||||
| 		var firstParam reflect.Value |  | ||||||
| 		if uriCfg.CtxType == CustomContextType { | 		if uriCfg.CtxType == CustomContextType { | ||||||
| 			customCtx := ctx.MustGet(define.CustomContextKey) | 			customCtx := ctx.MustGet(define.CustomContextKey) | ||||||
| 			firstParam = reflect.ValueOf(customCtx) | 			firstParam = reflect.ValueOf(customCtx) | ||||||
| @ -99,7 +119,7 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | |||||||
| 		if resList[1].IsNil() { | 		if resList[1].IsNil() { | ||||||
| 			// 请求成功 | 			// 请求成功 | ||||||
| 			isSuccess = true | 			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 | 			return | ||||||
| 		} | 		} | ||||||
| 		// 请求失败 | 		// 请求失败 | ||||||
| @ -113,7 +133,7 @@ func RequestHandler(uriCfg UriConfig) gin.HandlerFunc { | |||||||
| 			}) | 			}) | ||||||
| 		} | 		} | ||||||
| 		response.SendWithException(ctx, e, &define.ResponseOption{ | 		response.SendWithException(ctx, e, &define.ResponseOption{ | ||||||
| 			ContentType: "application/json;charset=utf-8", | 			ContentType: consts.MimeTypeJson, | ||||||
| 		}) | 		}) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | 	"sync" | ||||||
|  |  | ||||||
| 	"git.zhangdeman.cn/zhangdeman/graceful" | 	"git.zhangdeman.cn/zhangdeman/graceful" | ||||||
|  |  | ||||||
| @ -129,6 +130,8 @@ func NewServer(port int, optionList ...SetServerOptionFunc) *server { | |||||||
| 		uiInstance:  apiDoc.NewSwaggerUI(option.serverInfo, option.serverList, apiDocEnum.SwaggerUITheme(option.swaggerUiTheme)), | 		uiInstance:  apiDoc.NewSwaggerUI(option.serverInfo, option.serverList, apiDocEnum.SwaggerUITheme(option.swaggerUiTheme)), | ||||||
| 		port:        port, | 		port:        port, | ||||||
| 		option:      option, | 		option:      option, | ||||||
|  | 		lock:        &sync.RWMutex{}, | ||||||
|  | 		commonParam: map[string]GetCommonParam{}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -137,6 +140,8 @@ type server struct { | |||||||
| 	port        int | 	port        int | ||||||
| 	uiInstance  *apiDoc.SwaggerUI | 	uiInstance  *apiDoc.SwaggerUI | ||||||
| 	option      *serverOption | 	option      *serverOption | ||||||
|  | 	commonParam map[string]GetCommonParam // 结构体字段名, 注意, 不是TAG | ||||||
|  | 	lock        *sync.RWMutex | ||||||
| } | } | ||||||
|  |  | ||||||
| // Start 启动服务 | // Start 启动服务 | ||||||
| @ -201,21 +206,22 @@ func (s *server) Group(routerPrefix string, middlewareList []gin.HandlerFunc, cL | |||||||
| 		for _, itemUriCfg := range urlTable { | 		for _, itemUriCfg := range urlTable { | ||||||
| 			_ = s.uiInstance.DocInstance().AddApiFromInAndOut(routerPrefix, itemUriCfg.FormDataType, itemUriCfg.ResultDataType) | 			_ = s.uiInstance.DocInstance().AddApiFromInAndOut(routerPrefix, itemUriCfg.FormDataType, itemUriCfg.ResultDataType) | ||||||
| 			method := strings.ToUpper(itemUriCfg.RequestMethod) | 			method := strings.ToUpper(itemUriCfg.RequestMethod) | ||||||
|  | 			handleFunc := s.RequestHandler(itemUriCfg) | ||||||
| 			switch method { | 			switch method { | ||||||
| 			case http.MethodGet: | 			case http.MethodGet: | ||||||
| 				g.GET(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.GET(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodHead: | 			case http.MethodHead: | ||||||
| 				g.HEAD(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.HEAD(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodPost: | 			case http.MethodPost: | ||||||
| 				g.POST(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.POST(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodPut: | 			case http.MethodPut: | ||||||
| 				g.PUT(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.PUT(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodPatch: | 			case http.MethodPatch: | ||||||
| 				g.PATCH(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.PATCH(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodDelete: | 			case http.MethodDelete: | ||||||
| 				g.DELETE(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.DELETE(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodOptions: | 			case http.MethodOptions: | ||||||
| 				g.OPTIONS(itemUriCfg.Path, RequestHandler(itemUriCfg)) | 				g.OPTIONS(itemUriCfg.Path, handleFunc) | ||||||
| 			case http.MethodTrace: | 			case http.MethodTrace: | ||||||
| 				panic(`method Trace is not supported`) | 				panic(`method Trace is not supported`) | ||||||
| 			default: | 			default: | ||||||
|  | |||||||
| @ -13,8 +13,28 @@ import ( | |||||||
| 	"github.com/gin-gonic/gin" | 	"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) { | func TestNewServer(t *testing.T) { | ||||||
| 	s := NewServer(9087) | 	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() | 	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