目录
1 介绍
Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点
对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错
借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范.
2 练习
本次练习主要争对上一次任务进行了改善,
上一次发放的token是一个固定的11,
没有起到token的作用,
这次改良它。
具体实现函数如下,
func Login(ctx *gin.Context) {
//获取参数
DB := common.GetDB()
telephone := ctx.PostForm("telephone")
password := ctx.PostForm("password")
//数据验证
if len(telephone) != 11 {
ctx.JSON(http.StatusUnprocessableEntity,
gin.H{"code": 422, "msg": "手机号必须为11位"})
return
}
if len(password) < 6 || len(password) > 11 {
ctx.JSON(http.StatusUnprocessableEntity,
gin.H{"code": 422, "msg": "密码必须大于6位且小于11位"})
return
}
//手机号判断
var user Model.User
DB.Where("telephone=?", telephone).First(&user)
if user.ID == 0 {
ctx.JSON(http.StatusUnprocessableEntity, gin.H{
"code": 422,
"msg": "用户不存在"})
return
}
//判断密码正确?
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"code": 400, "msg": "密码错误"})
return
}
//发放token
token, err := common.ReleaseToken(user)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"code": 500,
"msg": "系统异常"})
log.Printf("token generate error:%v", err)
return
}
本次代码主要修改工作,
主体部分,就是调用common里的releasetoken函数,
获得token。
package common
import (
"GINVUE/Model"
"time"
"github.com/dgrijalva/jwt-go"
)
var jwtKey = []byte("a_secret_crect")
type Claims struct {
UserId uint
jwt.StandardClaims
}
func ReleaseToken(user Model.User) (string, error) {
expirationTime := time.Now().Add(1 * 24 * time.Hour)
claims := &Claims{
UserId: user.ID,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expirationTime.Unix(),
IssuedAt: time.Now().Unix(),
Issuer: "GIN01",
Subject: "user token",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtKey)
if err != nil {
return " ", err
}
return tokenString, nil
}
上面是token的生成函数,主题部分调用了,jwt相关函数生成相应代码。
友情援助
有问题的可以关注公众号,博主会在24小时内回复。