三十七、Gin完成登陆功能
目录
一、完成dao
二、services包下新建login.go
三、路由绑定
一、完成dao
这个方法意思是通过这个userid查询数据
func (a *AccountDao) Fist(UserID string) (*model.Account, error) {
var account model.Account
err := a.db.Where("user_id = ?", UserID).First(&account).Error
if err != nil {
fmt.Printf("AccountDao Fist = [%v]", err)
return nil, err
}
return &account, nil
}
二、services包下新建login.go
package services
import (
"ContentSystem/internal/dao"
"github.com/gin-gonic/gin"
"golang.org/x/crypto/bcrypt"
"net/http"
)
// 入参
type LoginReq struct {
UserID string `json:"user_id" binding:"required"`
Password string `json:"password" binding:"required"`
}
// 回包
type LoginRsp struct {
SessionID string `json:"session_id"`
UserID string `json:"user_id"`
Nickname string `json:"nickname"`
}
// 登陆方法
func (c *CmsApp) Login(ctx *gin.Context) {
//入参声明
var req LoginReq
//入参绑定结构体
if err := ctx.ShouldBindJSON(&req); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
//声明数据,不写需要频繁调用req.UserID ...
var (
userID = req.UserID
password = req.Password
)
//实例化dao赋值accountDao
accountDao := dao.NewAccountDao(c.db)
//调用查询方法
account, err := accountDao.Fist(userID)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{"error": "账号输入错误"})
return
}
//密码校验 比较数据库中密码与传递进来的密码,不报错则验证通过,报错则验证失败
if err := bcrypt.CompareHashAndPassword(
[]byte(account.Password),
[]byte(password)); err != nil {
ctx.JSON(http.StatusBadRequest, gin.H{"error": "密码输入错误"})
return
}
//todo 生成sessionid方法待完善
sessionID := generateSessionID()
//回报填值
ctx.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"msg": "登陆成功",
"data": &LoginRsp{
SessionID: sessionID,
UserID: account.UserID,
Nickname: account.Nickname,
},
})
return
}
func generateSessionID() string {
//todo 生成sessionID
//todo 保存sessionID
return "session-id"
}
三、路由绑定
noAuth.POST("cms/login", cmsApp.Login)