package handler import ( "crypto/md5" "encoding/hex" "fmt" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" "github.com/google/uuid" "time" "videoplayer/service" "videoplayer/worker" ) var signingKey = []byte("aadafcvretmoi9") func SetUpUserGroup(router *gin.Engine) { userGroup := router.Group("/user") userGroup.POST("/register", registerHandler) userGroup.POST("/login", loginHandler) userGroup.POST("/uuid", ScanUUID) userGroup.POST("/gqr", GetQRStatus) userGroup.POST("/sqr", SetQRStatus) userGroup.POST("/confirm", ConfirmQRLogin) } type RLReq struct { User string `json:"username" form:"username"` Email string `json:"email" form:"email"` Password string `json:"password" form:"password"` Age int `json:"age" form:"age"` Gender string `json:"gender" form:"gender"` } type QRReq struct { UUID string `json:"uuid" form:"uuid"` } func ScanUUID(c *gin.Context) { id := uuid.New() worker.SetRedisWithExpire(id.String(), "0", time.Minute*3) c.JSON(200, gin.H{"code": 0, "message": "success", "data": id.String()}) } func SetQRStatus(c *gin.Context) { var qrsetReq QRReq if err := c.ShouldBind(&qrsetReq); err == nil { res := worker.SetRedis(qrsetReq.UUID, "1") if res { c.JSON(200, gin.H{"code": 0, "message": "success", "data": "1"}) } else { c.JSON(200, gin.H{"code": 1, "message": "该二维码数据无效", "data": "1"}) } } else { c.JSON(200, gin.H{"code": 1, "message": err, "data": "2"}) } } // 确认返回token数据 func ConfirmQRLogin(c *gin.Context) { var qrsetReq QRReq if err := c.ShouldBind(&qrsetReq); err == nil { //user_id, _ := c.Get("id") user_name, _ := c.Get("username") if user_name != "" { key := "user_" + user_name.(string) token := worker.GetRedis(key) if worker.SetRedis(qrsetReq.UUID, token) { c.JSON(200, gin.H{"code": 0, "message": "success", "data": "1"}) } else { c.JSON(200, gin.H{"code": 1, "message": "设置Token失败", "data": "3"}) } } else { c.JSON(200, gin.H{"code": 1, "message": "failed", "data": "2"}) } } else { c.JSON(200, gin.H{"code": 1, "message": err, "data": "3"}) } } func GetQRStatus(c *gin.Context) { var qrReq QRReq if err := c.ShouldBind(&qrReq); err == nil { str := worker.GetRedis(qrReq.UUID) switch str { case "0": c.JSON(200, gin.H{"code": 0, "message": "success", "data": "0"}) //空值 case "1": c.JSON(200, gin.H{"code": 0, "message": "success", "data": "1"}) //已扫描待确认 default: // 解析 JWT 令牌 token, err := jwt.Parse(str, func(token *jwt.Token) (interface{}, error) { return signingKey, nil }) if err != nil { c.JSON(200, gin.H{"error": err.Error(), "code": 1, "message": "error"}) return } // 返回令牌 data := make(map[string]interface{}) data["id"] = token.Claims.(jwt.MapClaims)["id"] data["username"] = token.Claims.(jwt.MapClaims)["username"] data["email"] = token.Claims.(jwt.MapClaims)["email"] data["token"] = str c.JSON(200, gin.H{"code": 0, "message": "success", "data": data}) //确认返回token数据 } } else { c.JSON(200, gin.H{"error": err.Error(), "code": 1, "message": "error"}) } } func loginHandler(c *gin.Context) { var req_data RLReq tokenString := "" if err := c.ShouldBind(&req_data); err == nil { if len(req_data.Password) < 32 { hasher := md5.New() hasher.Write([]byte(req_data.Password)) // 生成密码的 MD5 散列值 req_data.Password = hex.EncodeToString(hasher.Sum(nil)) // 生成密码的 MD5 散列值 } user := service.GetUser(req_data.User, req_data.Password, req_data.Password) if user.ID != 0 { key := "user_" + user.Name redis_token := worker.GetRedis(string(key)) if redis_token == "" { // 生成 JWT 令牌 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "username": user.Name, "id": user.ID, "exp": time.Now().Add(time.Hour * 10).Unix(), // 令牌过期时间, 10小时后过期 }) tokenString, err = token.SignedString(signingKey) if err != nil { c.JSON(200, gin.H{"error": err.Error(), "code": 1, "message": "error"}) return } worker.SetRedisWithExpire("user_"+user.Name, tokenString, time.Hour*10) // 将用户信息存入 worker.SetRedisWithExpire(tokenString, tokenString, time.Hour*10) // 设置过期时间为10分钟 worker.SetHash(tokenString, int(user.ID), user.Name, user.Email) // 将用户信息存入 } else { tokenString = redis_token } // 返回令牌 data := make(map[string]interface{}) data["id"] = user.ID data["username"] = user.Name data["email"] = user.Email data["token"] = tokenString c.JSON(200, gin.H{"code": 0, "message": "success", "data": data}) } else { //用户名或密码错误 c.JSON(200, gin.H{"error": "用户名或密码错误", "code": 1, "message": "error"}) } } else { c.JSON(200, gin.H{"error": err.Error(), "code": 1, "message": "error"}) } } func registerHandler(c *gin.Context) { var req_data RLReq tokenString := "" if err := c.ShouldBindJSON(&req_data); err == nil { if len(req_data.Password) < 32 { hasher := md5.New() hasher.Write([]byte(req_data.Password)) // 生成密码的 MD5 散列值 req_data.Password = hex.EncodeToString(hasher.Sum(nil)) // 生成密码的 MD5 散列值 } if service.ContainsUser(req_data.User, req_data.Email) == true { c.JSON(200, gin.H{"error": "user already exists", "code": 1, "message": "error"}) return } id := service.CreateUser(req_data.User, req_data.Password, req_data.Email) // 生成 JWT 令牌 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "username": req_data.User, "id": id, "exp": time.Now().Add(time.Hour * 10).Unix(), // 令牌过期时间, 1分钟后过期 }) tokenString, err = token.SignedString(signingKey) if err != nil { c.JSON(200, gin.H{"error": err.Error()}) } } else { c.JSON(200, gin.H{"error": err.Error()}) } fmt.Println(req_data) worker.SetRedisWithExpire(tokenString, tokenString, time.Hour*10) // 设置过期时间为10分钟 // 返回令牌 c.JSON(200, gin.H{"token": tokenString, "username": req_data.User}) }