三十七、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)
相关推荐
快手技术4 分钟前
快手广告系统全面迈入生成式推荐时代!GR4AD:从Token到Revenue的全链路重构
前端·后端
Nyarlathotep01139 分钟前
ThreadLocal
java·后端
Jasmine_llq20 分钟前
《B3840 [GESP202306 二级] 找素数》
开发语言·c++·试除法·顺序输入输出算法·素数判定算法·枚举遍历算法·布尔标记算法
梁山好汉(Ls_man)30 分钟前
鸿蒙_ArkTS解决Duplicate function implementation错误
开发语言·华为·typescript·harmonyos·鸿蒙
xiaoshuaishuai833 分钟前
Git二分法定位Bug
开发语言·python
so2F32hj240 分钟前
一款Go语言Gin框架DDD脚手架,适合快速搭建项目
开发语言·golang·gin
GetcharZp1 小时前
还在用 Python 爬虫?Go 语言这款神器 Colly,性能直接拉满!
后端
LJianK11 小时前
Java中的类、普通类,抽象类,接口的区别
java·开发语言
Dev7z1 小时前
基于MATLAB的5G物理层文本传输系统仿真与性能分析
开发语言·5g·matlab
小智社群1 小时前
贝壳获取小区的名称
开发语言·前端·javascript