From 01b0783df9d576027d2393fb427226df4a5d7650 Mon Sep 17 00:00:00 2001
From: jiangshuai <291802688@qq.com>
Date: 星期一, 06 十一月 2023 10:20:22 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.5.5:10010/r/aps/WMS

---
 constvar/const.go       |    8 +
 request/jwt.go          |   20 ++++
 go.sum                  |    2 
 middleware/utils.go     |   60 ++++++++++++
 middleware/jwt.go       |  101 ++++---------------
 go.mod                  |    1 
 docs/swagger.yaml       |   18 +++
 controllers/location.go |    4 
 docs/docs.go            |   25 ++++
 docs/swagger.json       |   25 ++++
 request/location.go     |    1 
 router/router.go        |    1 
 12 files changed, 183 insertions(+), 83 deletions(-)

diff --git a/constvar/const.go b/constvar/const.go
index a84fd10..ff95383 100644
--- a/constvar/const.go
+++ b/constvar/const.go
@@ -191,3 +191,11 @@
 	RuleType_Product         RuleType = iota + 1 //浜у搧涓婃灦瑙勫垯
 	RuleType_ProductCategory                     //浜у搧绫诲埆涓婃灦瑙勫垯
 )
+
+type UserType int
+
+const (
+	UserTypeSuper   UserType = iota + 1 // 瓒呯骇绠$悊鍛�
+	UserTypePrimary                     // 涓昏处鎴�
+	UserTypeSub                         // 瀛愯处鎴�
+)
diff --git a/controllers/location.go b/controllers/location.go
index 2ef2a95..ff2d5c4 100644
--- a/controllers/location.go
+++ b/controllers/location.go
@@ -54,7 +54,7 @@
 // @Tags      浣嶇疆
 // @Summary   鑾峰彇浣嶇疆鍒楄〃
 // @Produce   application/json
-// @Param     object  body  request.GetProductList true  "鏌ヨ鍙傛暟"
+// @Param     object  body  request.GetLocationList true  "鏌ヨ鍙傛暟"
 // @Success   200 {object} util.ResponseList{data=[]models.Location}	"鎴愬姛"
 // @Router    /api-wms/v1/location/getLocationList [post]
 func (slf LocationController) GetLocationList(c *gin.Context) {
@@ -67,7 +67,7 @@
 	if params.PageInfo.Check() {
 		search.SetPage(params.Page, params.PageSize)
 	}
-	list, total, err := search.SetKeyword(params.KeyWord).SetJointName(params.JointName).SetOrder("created_at desc").Find()
+	list, total, err := search.SetKeyword(params.KeyWord).SetType(params.Type).SetJointName(params.JointName).SetOrder("created_at desc").Find()
 	if err != nil {
 		util.ResponseFormat(c, code.RequestParamError, "鏌ユ壘澶辫触")
 		return
diff --git a/docs/docs.go b/docs/docs.go
index 548c159..3b0d76d 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -543,7 +543,7 @@
                         "in": "body",
                         "required": true,
                         "schema": {
-                            "$ref": "#/definitions/request.GetProductList"
+                            "$ref": "#/definitions/request.GetLocationList"
                         }
                     }
                 ],
@@ -3453,6 +3453,29 @@
                 }
             }
         },
+        "request.GetLocationList": {
+            "type": "object",
+            "properties": {
+                "jointName": {
+                    "description": "鎷兼帴鍚嶇О",
+                    "type": "string"
+                },
+                "keyWord": {
+                    "type": "string"
+                },
+                "page": {
+                    "description": "椤电爜",
+                    "type": "integer"
+                },
+                "pageSize": {
+                    "description": "姣忛〉澶у皬",
+                    "type": "integer"
+                },
+                "type": {
+                    "type": "integer"
+                }
+            }
+        },
         "request.GetProductList": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.json b/docs/swagger.json
index 53621ab..69d5f86 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -531,7 +531,7 @@
                         "in": "body",
                         "required": true,
                         "schema": {
-                            "$ref": "#/definitions/request.GetProductList"
+                            "$ref": "#/definitions/request.GetLocationList"
                         }
                     }
                 ],
@@ -3441,6 +3441,29 @@
                 }
             }
         },
+        "request.GetLocationList": {
+            "type": "object",
+            "properties": {
+                "jointName": {
+                    "description": "鎷兼帴鍚嶇О",
+                    "type": "string"
+                },
+                "keyWord": {
+                    "type": "string"
+                },
+                "page": {
+                    "description": "椤电爜",
+                    "type": "integer"
+                },
+                "pageSize": {
+                    "description": "姣忛〉澶у皬",
+                    "type": "integer"
+                },
+                "type": {
+                    "type": "integer"
+                }
+            }
+        },
         "request.GetProductList": {
             "type": "object",
             "properties": {
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index d15fc23..b2a6ba4 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -924,6 +924,22 @@
       wareHouseCode:
         type: string
     type: object
+  request.GetLocationList:
+    properties:
+      jointName:
+        description: 鎷兼帴鍚嶇О
+        type: string
+      keyWord:
+        type: string
+      page:
+        description: 椤电爜
+        type: integer
+      pageSize:
+        description: 姣忛〉澶у皬
+        type: integer
+      type:
+        type: integer
+    type: object
   request.GetProductList:
     properties:
       categoryId:
@@ -1694,7 +1710,7 @@
         name: object
         required: true
         schema:
-          $ref: '#/definitions/request.GetProductList'
+          $ref: '#/definitions/request.GetLocationList'
       produces:
       - application/json
       responses:
diff --git a/go.mod b/go.mod
index b409b36..371244a 100644
--- a/go.mod
+++ b/go.mod
@@ -6,6 +6,7 @@
 	basic.com/aps/nsqclient.git v0.0.0-20230517072415-37491f4a5d25
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/gin-gonic/gin v1.9.0
+	github.com/golang-jwt/jwt/v4 v4.5.0
 	github.com/google/uuid v1.3.1
 	github.com/nsqio/go-nsq v1.1.0
 	github.com/open-policy-agent/opa v0.57.1
diff --git a/go.sum b/go.sum
index a038626..a602140 100644
--- a/go.sum
+++ b/go.sum
@@ -140,6 +140,8 @@
 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
 github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
+github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
diff --git a/middleware/jwt.go b/middleware/jwt.go
index 48686f2..d9d7dd4 100644
--- a/middleware/jwt.go
+++ b/middleware/jwt.go
@@ -1,94 +1,39 @@
 package middleware
 
 import (
-	"errors"
-	"fmt"
-	"strings"
-	"time"
-	"wms/conf"
-
-	jwt "github.com/dgrijalva/jwt-go"
 	"github.com/gin-gonic/gin"
-	"wms/extend/util"
+	"strings"
+	"wms/pkg/contextx"
+	"wms/pkg/ecode"
 )
 
-func validateToken(tokenString string) (util.JSON, error) {
-	secretKey := []byte(conf.WebConf.JWTSecret)
-
-	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
-		// Don't forget to validate the alg is what you expect:
-		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
-			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
-		}
-
-		return secretKey, nil
-	})
-
-	if err != nil {
-		return util.JSON{}, err
-	}
-
-	if !token.Valid {
-		return util.JSON{}, errors.New("invalid token")
-	}
-
-	return token.Claims.(jwt.MapClaims), nil
-}
-
-// JWTMiddleware parses JWT token from cookie and stores data and expires date to the context
-// JWT Token can be passed as cookie, or Authorization header
-func JWTMiddleware() gin.HandlerFunc {
+func JWTAuth() gin.HandlerFunc {
 	return func(c *gin.Context) {
-		tokenString, err := c.Cookie("token")
-		// failed to read cookie
-		if err != nil {
-			// try reading HTTP Header
-			authorization := c.Request.Header.Get("Authorization")
-			if authorization == "" {
-				c.Next()
-				return
-			}
-			sp := strings.Split(authorization, "Bearer ")
-			// invalid token
-			if len(sp) < 1 {
-				c.Next()
-				return
-			}
-			tokenString = sp[1]
+		ctx := new(contextx.Context).SetCtx(c)
+		// 鎴戜滑杩欓噷jwt閴存潈鍙栧ご閮ㄤ俊鎭� Authorization 鐧诲綍鏃跺洖杩斿洖token淇℃伅 杩欓噷鍓嶇闇�瑕佹妸token瀛樺偍鍒癱ookie鎴栬�呮湰鍦發ocalStorage涓� 涓嶈繃闇�瑕佽窡鍚庣鍗忓晢杩囨湡鏃堕棿 鍙互绾﹀畾鍒锋柊浠ょ墝鎴栬�呴噸鏂扮櫥褰�
+		token := c.Request.Header.Get("Authorization")
+		if token == "" {
+			ctx.Fail(ecode.JWTEmpty)
+			c.Abort()
+			return
 		}
-
-		tokenData, err := validateToken(tokenString)
+		slices := strings.Split(token, " ")
+		if len(slices) == 2 {
+			token = slices[1]
+		}
+		j := NewJWT()
+		// parseToken 瑙f瀽token鍖呭惈鐨勪俊鎭�
+		claims, err := j.ParseToken(token)
 		if err != nil {
-			fmt.Println(err.Error())
+			if err == TokenExpired {
+				c.Next()
+				return
+			}
 			c.Next()
 			return
 		}
 
-		userParentId := tokenData["parentId"].(string)
-		if userParentId == conf.WebConf.NodeId {
-			c.Set("parentId", userParentId)
-		} else {
-			c.Next()
-			return
-		}
-
-		c.Set("token_expire", tokenData["exp"])
+		c.Set("claims", claims)
 		c.Next()
 	}
-}
-
-func GenerateToken(data interface{}) (string, error) {
-	//  token is valid for 1 hour
-	date := time.Now().Add(time.Hour * 12)
-
-	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
-		"user": data,
-		"exp":  date.Unix(),
-	})
-
-	secretKey := []byte(conf.WebConf.JWTSecret)
-
-	tokenString, err := token.SignedString(secretKey)
-
-	return tokenString, err
 }
diff --git a/middleware/utils.go b/middleware/utils.go
new file mode 100644
index 0000000..58defa0
--- /dev/null
+++ b/middleware/utils.go
@@ -0,0 +1,60 @@
+package middleware
+
+import (
+	"errors"
+	"github.com/golang-jwt/jwt/v4"
+	"wms/request"
+)
+
+type JWT struct {
+	SigningKey []byte
+}
+
+var (
+	TokenExpired     = errors.New("Token is expired")
+	TokenNotValidYet = errors.New("Token not active yet")
+	TokenMalformed   = errors.New("That's not even a token")
+	TokenInvalid     = errors.New("Couldn't handle this token:")
+)
+
+func NewJWT() *JWT {
+	return &JWT{
+		[]byte("327a9457-899a-481e-8b30-58cc97e5b808"),
+	}
+}
+
+// CreateToken 鍒涘缓涓�涓猼oken
+func (j *JWT) CreateToken(claims request.CustomClaims) (string, error) {
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
+	return token.SignedString(j.SigningKey)
+}
+
+// ParseToken 瑙f瀽token
+func (j *JWT) ParseToken(tokenString string) (*request.CustomClaims, error) {
+	token, err := jwt.ParseWithClaims(tokenString, &request.CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
+		return j.SigningKey, nil
+	})
+	if err != nil {
+		if ve, ok := err.(*jwt.ValidationError); ok {
+			if ve.Errors&jwt.ValidationErrorMalformed != 0 {
+				return nil, TokenMalformed
+			} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
+				// Token is expired
+				return nil, TokenExpired
+			} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
+				return nil, TokenNotValidYet
+			} else {
+				return nil, TokenInvalid
+			}
+		}
+	}
+	if token != nil {
+		if claims, ok := token.Claims.(*request.CustomClaims); ok && token.Valid {
+			return claims, nil
+		}
+		return nil, TokenInvalid
+
+	} else {
+		return nil, TokenInvalid
+	}
+}
diff --git a/request/jwt.go b/request/jwt.go
new file mode 100644
index 0000000..dece0f1
--- /dev/null
+++ b/request/jwt.go
@@ -0,0 +1,20 @@
+package request
+
+import (
+	"github.com/dgrijalva/jwt-go"
+	"wms/constvar"
+)
+
+// Custom claims structure
+type CustomClaims struct {
+	BaseClaims
+	BufferTime int64
+	jwt.StandardClaims
+}
+
+type BaseClaims struct {
+	UserId   string
+	Username string
+	ParentId string
+	UserType constvar.UserType
+}
diff --git a/request/location.go b/request/location.go
index a762856..b12f724 100644
--- a/request/location.go
+++ b/request/location.go
@@ -9,6 +9,7 @@
 
 type GetLocationList struct {
 	PageInfo
+	Type      int    `json:"type"`
 	KeyWord   string `json:"keyWord"`
 	JointName string `json:"jointName"` //鎷兼帴鍚嶇О
 }
diff --git a/router/router.go b/router/router.go
index 7d527e8..b4dac9f 100644
--- a/router/router.go
+++ b/router/router.go
@@ -20,6 +20,7 @@
 	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
 
 	urlPrefix := "/api-wms/v1"
+	r.Use(middleware.JWTAuth())
 
 	// 缁勭粐绠$悊
 	departmentController := new(controllers.DepartmentController)

--
Gitblit v1.8.0