2 Incheckningar 8c6699e87a ... 889a49c61c

Upphovsman SHA1 Meddelande Datum
  runningwater 889a49c61c feat: 强制 User-Agent 中间件 3 månader sedan
  runningwater 317a7da81e feat: 裁剪图片 3 månader sedan
7 ändrade filer med 54 tillägg och 6 borttagningar
  1. 1 1
      .air.toml
  2. 1 1
      .gitignore
  3. 21 0
      app/http/middlewares/force_ua.go
  4. 2 0
      bootstrap/route.go
  5. 2 1
      go.mod
  6. 5 2
      go.sum
  7. 22 1
      pkg/file/file.go

+ 1 - 1
.air.toml

@@ -7,7 +7,7 @@ tmp_dir = "tmp"
   bin = "./tmp/gohub"
   cmd = "go build -o ./tmp/gohub ."
   delay = 1000
-  exclude_dir = ["assets", "tmp", "vendor", "testdata","storage"]
+  exclude_dir = ["assets", "tmp", "vendor", "testdata","storage","public"]
   exclude_file = []
   exclude_regex = ["_test.go"]
   exclude_unchanged = false

+ 1 - 1
.gitignore

@@ -4,7 +4,7 @@ gohub
 .DS_Store
 .history
 *.rdb
-
+output
 # Golang #
 ######################
 # `go test -c` 生成的二进制文件

+ 21 - 0
app/http/middlewares/force_ua.go

@@ -0,0 +1,21 @@
+package middlewares
+
+import (
+	"errors"
+
+	"github.com/gin-gonic/gin"
+
+	"github.com/runningwater/gohub/pkg/response"
+)
+
+// ForceUA 强制设置UA, 请求必须附带 User-Agent 标志头
+func ForceUA() gin.HandlerFunc {
+	return func(c *gin.Context) {
+		if c.Request.Header.Get("User-Agent") == "" {
+			response.BadRequest(c, errors.New("User-Agent is required"), "请求必须附带 User-Agent 标志头")
+			return
+		}
+
+		c.Next()
+	}
+}

+ 2 - 0
bootstrap/route.go

@@ -6,6 +6,7 @@ import (
 	"strings"
 
 	"github.com/gin-gonic/gin"
+
 	"github.com/runningwater/gohub/app/http/middlewares"
 	"github.com/runningwater/gohub/routes"
 )
@@ -41,6 +42,7 @@ func registerGlobalMiddleWare(router *gin.Engine) {
 		middlewares.Logger(),
 		middlewares.Recovery(),
 		middlewares.Cors(),
+		middlewares.ForceUA(),
 		// middlewares.LimitIP("1000-H"),
 	)
 }

+ 2 - 1
go.mod

@@ -9,6 +9,7 @@ require (
 	github.com/alibabacloud-go/tea-utils/v2 v2.0.7
 	github.com/aliyun/credentials-go v1.4.6
 	github.com/bxcodec/faker/v4 v4.0.0-beta.3
+	github.com/disintegration/imaging v1.6.2
 	github.com/gertd/go-pluralize v0.2.1
 	github.com/gin-gonic/gin v1.10.1
 	github.com/golang-jwt/jwt/v5 v5.2.2
@@ -27,7 +28,7 @@ require (
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/driver/sqlite v1.5.7
-	gorm.io/gorm v1.30.0
+	gorm.io/gorm v1.30.1
 )
 
 require (

+ 5 - 2
go.sum

@@ -82,6 +82,8 @@ 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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
+github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
@@ -263,6 +265,7 @@ golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5D
 golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
 golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY=
 golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=
 golang.org/x/image v0.27.0/go.mod h1:xbdrClrAUway1MUTEZDq9mz/UpRwYAkFFNUslZtcB+g=
@@ -406,8 +409,8 @@ gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkD
 gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I=
 gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
 gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
-gorm.io/gorm v1.30.0 h1:qbT5aPv1UH8gI99OsRlvDToLxW5zR7FzS9acZDOZcgs=
-gorm.io/gorm v1.30.0/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
+gorm.io/gorm v1.30.1 h1:lSHg33jJTBxs2mgJRfRZeLDG+WZaHYCk3Wtfl6Ngzo4=
+gorm.io/gorm v1.30.1/go.mod h1:8Z33v652h4//uMA76KjeDH8mJXPm1QNCYrMeatR0DOE=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=

+ 22 - 1
pkg/file/file.go

@@ -7,6 +7,7 @@ import (
 	"path/filepath"
 	"strings"
 
+	"github.com/disintegration/imaging"
 	"github.com/gin-gonic/gin"
 
 	"github.com/runningwater/gohub/pkg/app"
@@ -57,7 +58,27 @@ func SaveUploadAvatar(c *gin.Context, file *multipart.FileHeader) (string, error
 		return avatar, err
 	}
 
-	return avatarPath, nil
+	// 剪裁图片
+	img, err := imaging.Open(avatarPath, imaging.AutoOrientation(true))
+	if err != nil {
+		return avatar, err
+	}
+	// 剪裁为 256x256
+	resizeAvatar := imaging.Thumbnail(img, 256, 256, imaging.Lanczos)
+	resizeAvatarName := randomNameFromUploadFile(file)
+	resizeAvatarPath := publicPath + dirName + resizeAvatarName
+	// 保存为 JPEG 格式
+	err = imaging.Save(resizeAvatar, resizeAvatarPath)
+	if err != nil {
+		return avatar, err
+	}
+	// 删除原文件
+	err = os.Remove(avatarPath)
+	if err != nil {
+		return avatar, err
+	}
+
+	return dirName + resizeAvatarName, nil
 }
 
 func randomNameFromUploadFile(file *multipart.FileHeader) string {