三十五、Gin注册功能实战

目录

一、创建请求组

二、service下创建register.go文件

三、实现密码加密功能

四、在register方法中使用encryptPassword函数


一、创建请求组

复制代码
const (
	rootPath   = "/api/"
	noAuthPath = "/out/api/"
)

	//创建请求组
	noAuth := r.Group(noAuthPath)
	//注册功能路由绑定
	noAuth.POST("cms/register", cmsApp.Register)

二、service下创建register.go文件

复制代码
package services

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)
//入参校验
type RegisterReq struct {
	UserID   string `json:"user_id" binding:"required"`
	Password string `json:"password" binding:"required"`
	Nickname string `json:"nickname" binding:"required"`
}
//返回校验
type RegisterRsp struct {
	Message string `json:"message" binding:"required"`
}

func (c *CmsApp) Register(ctx *gin.Context) {
	var req RegisterReq
    //当入参时错误返回
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}
	//todo 密码加密
	//todo 账号校验是否存在
	//todo 保存
    
    //入参没有错误时返回
	ctx.JSON(http.StatusOK, gin.H{
		"msg":  "ok",
		"code": http.StatusOK,
		"data": RegisterRsp{
			Message: fmt.Sprintf("注册成功"),
		},
	})
}

三、实现密码加密功能

使用

复制代码
bcrypt.GenerateFromPassword 进行密码加密,完成encryptPassword函数
复制代码
func encryptPassword(password string) (string, error) {
	//因为GenerateFromPassword(password []byte, cost int) ([]byte, error) {
	//入参为byte所以要把password转化一下
	//cost 一般用默认10 这里的越大计算的复杂度就越高
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		fmt.Printf("bcrypt failed, err:%v\n", err)
	}
	//再转回string返回
	return string(hashedPassword), nil
}

四、在register方法中使用encryptPassword函数

复制代码
//todo 密码加密
	hashedPassword, err := encryptPassword(req.Password)
	if err != nil {
		ctx.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
	}
	fmt.Printf("this is hashedPassword %v", hashedPassword)

打印结果:

复制代码
$2a$10$4jvJs03CwJLXbHWhCeCWOuiwVk/PR3aEb771iJoPTF3hLQBXwTdqe

若多次打印会发现结果是不一样的

相关推荐
金金计较.5 小时前
Go语言-4
开发语言·golang
打工仔折腾 AI5 小时前
用 Shell 脚本自动部署 mysqld_exporter 并接入 Prometheus 远程抓取
人工智能·后端·python·性能优化·ai agent 实战
毅炼5 小时前
不写多语言 SDK,怎么让 Python、Go、Node 服务接入注册中心?
java·后端·系统架构·gateway
Methy5 小时前
IoTHub半个月崩了五次?都是裸rethrow惹的祸
服务器·c++·后端
泡海椒5 小时前
jquick-pdf 表格行列尺寸控制实战:单元格合并的可行边界
java·开发语言·pdf
我不会起名字3226 小时前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
纪念 2296 小时前
c++类和对象(四)
开发语言·c++
回家路上绕了弯6 小时前
AI 编程助手为什么反复读取同一份上下文?如何减少无效重复
后端
Lost of 程序猿6 小时前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
名字还没想好☜6 小时前
Spring Boot 优雅停机实战:等在途请求处理完再退出,配合 K8s preStop 别丢请求
java·后端·spring