三十五、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

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

相关推荐
用户0207422017515 分钟前
从零构建一个现代化的 Node.js 脚手架工具:不只是生成文件
后端
用户0207422017516 分钟前
从零到一:构建一个现代化的 React 组件库
后端
用户0207422017518 分钟前
从零到一:用 Rust 和 WebAssembly 构建高性能前端应用
后端
用户0207422017518 分钟前
从零到一:构建你的第一个智能合约并部署到以太坊测试网
后端
掘金者阿豪34 分钟前
数据库的第一道防线:从金仓KES看企业级身份验证体系的设计逻辑
后端
颜酱42 分钟前
从0到1实现LFU缓存:思路拆解+代码落地
javascript·后端·算法
武子康1 小时前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
SimonKing1 小时前
JetBrains 用户狂喜!这个 AI 插件让 IDE 原地进化成「智能编码助手」
java·后端·程序员
茶杯梦轩1 小时前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试