Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >gin学习——邮箱发送验证码注册用户

gin学习——邮箱发送验证码注册用户

作者头像
传说之下的花儿
发布于 2023-04-16 07:06:25
发布于 2023-04-16 07:06:25
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

qq邮箱-设置-账户

安装 go get -u github.com/jordan-wright/email go get -u github.com/garyburd/redigo/redis

dao/user_dao.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func SendEmailValidate(em []string) (string,error) {
	e:=email.NewEmail()
	e.From = fmt.Sprintf("发件人笔名 <发件人邮箱>")
	e.To = em
	// 生成6位随机验证码
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	vCode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
	t := time.Now().Format("2006-01-02 15:04:05")
	//设置文件发送的内容
	content := fmt.Sprintf(`
	<div>
		<div>
			尊敬的%s,您好!
		</div>
		<div style="padding: 8px 40px 8px 50px;">
			<p>您于 %s 提交的邮箱验证,本次验证码为<u><strong>%s</strong></u>,为了保证账号安全,验证码有效期为5分钟。请确认为本人操作,切勿向他人泄露,感谢您的理解与使用。</p>
		</div>
		<div>
			<p>此邮箱为系统邮箱,请勿回复。</p>
		</div>
	</div>
	`, em[0], t, vCode)
	e.Text = []byte(content)
	//设置服务器相关的配置
	err := e.Send("smtp.qq.com:25", smtp.PlainAuth("", "发件人邮箱", "发件人邮箱授权码", "smtp.qq.com"))
	return vCode,err
}

controller/user_controller.go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// GetValidateCode
// @Title GetValidateCode
// @Description  发送邮箱验证码 并存入redis(5分钟有效时间)
// @Author hyy 2022-03-05 18:18:47
// @Param c type description
func GetValidateCode(c *gin.Context) {
	// 获取目的邮箱
	em := []string{c.Param("email")}
	vCode, err := dao.SendEmailValidate(em)
	if err != nil {
		log.Println(err)
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "验证码发送失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	// 验证码存入redis 并设置过期时间5分钟
	_, err = util.RedisCont.Do("set", "vCode", vCode)
	_, _ = util.RedisCont.Do("expire", "vCode", 300)
	if err != nil {
		log.Println(err.Error())
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "验证码存储失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	c.JSON(http.StatusOK, gin.H{
		"msg":    "验证码发送成功",
		"status": 200,
		"vCode":  vCode,
	})
	return
}

// ValidateEmailCode
// @Title ValidateEmailCode
// @Description  验证邮箱验证码,并注册用户。
// @Author hyy 2022-03-05 18:19:18
// @Param c type description
func ValidateEmailCode(c *gin.Context) {
	vCode := c.Param("vCode")
	var user model.User
	err := c.ShouldBindJSON(&user)
	if err != nil {
		log.Println(err.Error())
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "注册失败,json解析失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	// 默认用户权限为2
	if user.Level == 0 {
		user.Level = 2
	}
	user.CreatAt = time.Now().Format("2006-01-02 15:04:05")
	// 设置默认头像
	if user.HandPortrait == "" {
		user.HandPortrait = "https://gin-study-1308216693.cos.ap-nanjing.myqcloud.com/handportrait.png"
	}
	// 验证结构体字段
	if err := util.Validate.Struct(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"status":         400,
			"msg":            "注册失败,非法字段!",
			"ERROR-VALIDATE": util.GetErr(err),
		})
		return
	}
	// 对密码进行加密
	user.Password = util.Md5Encrypt(user.Password)
	// 获取存储在redis中的验证码
	vCodeRaw, err := util.RedisCont.Do("get", "vCode")
	if err != nil {
		log.Println(err.Error())
		c.JSON(http.StatusBadRequest, gin.H{
			"status":           400,
			"msg":              "Redis获取vCode失败",
			"ERROR-CONTROLLER": err.Error(),
		})
		return
	}
	if string(vCodeRaw.([]byte)) != "" && vCode == string(vCodeRaw.([]byte)) {
		result := service.InsertUser(&user)
		if result["result"].(bool) {
			result["msg"] = "注册成功!"
			c.JSON(http.StatusOK, result)
			return
		} else {
			c.JSON(http.StatusBadRequest, result)
			return
		}
	} else {
		c.JSON(http.StatusBadRequest, gin.H{
			"status": 400,
			"msg":    "验证码已失效",
		})
		return
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go语言中gin的用法
在这个示例中,我们使用了gin框架来创建一个简单的HTTP服务。我们定义了四个路由:
周辰晨
2024/03/18
1810
Gin 框架怎么使用自定义验证器?
阅读上面这段代码,我们定义一个 validator.Func 类型的函数变量,参数入参的类型是 validator.FieldLevel,返回结果是一个 bool 类型的变量。
frank.
2024/11/19
870
Gin 框架怎么使用自定义验证器?
gin 源码阅读(4) - 友好的请求参数处理
通过 gin 的路由,已经把请求分配到具体的函数里面里面了,下面就要开始处理具体的业务逻辑了。
haohongfan
2021/10/20
1K0
Gin 11
使用 model binding 来将请求中的数据绑定到一个 model 中,形成一个结构体,Gin 目前支持绑定 JSON XML 和标准的表单数据 (foo=bar&boo=baz)
franket
2021/08/10
4680
Go 和 Gin 打造一个带图库功能的随机图片 API?让我们一起走进 Go Web 开发的奇妙世界!
今日推荐:Spring AI再更新:如何借助全局参数实现智能数据库操作与个性化待办管理
繁依Fanyi
2024/11/15
1040
gin——使用腾讯云存储图片
一、腾讯云对象存储COS 1. 创建储存桶 然后直接下一步-创建即可。 2. API密钥创建 3. 查看代码中需要的东西 储存桶名称Bucket、所属地域Region 密钥APPID、SecretId、SecretKey 二、代码 1. 配置文件conf.toml 这里读取配置文件的第三方库是Viper,学习可以查看:viper库快速使用 将上面查看的几个值写入配置文件对应位置即可 [tencentCOS] # TencentCloud 腾讯云
传说之下的花儿
2023/04/16
9.3K1
gin——使用腾讯云存储图片
使用go实现邮箱验证接口
本文将带你了解一个项目如何实现一个邮箱验证接口,即一个可用的发送邮箱验证码API和验证验证码是否正确功能。
陈杪秋
2024/06/10
3530
Go: Gin框架中的binding验证器使用指南
在Gin框架中,数据绑定和验证是开发API时不可或缺的部分。Gin提供了强大的binding功能,允许我们将请求的数据绑定到结构体,并通过标签进行数据验证。本文将详细讲解如何在Gin中使用binding验证器进行数据验证,并提供代码示例帮助理解。
运维开发王义杰
2024/05/31
1.2K0
Go: Gin框架中的binding验证器使用指南
Gin-Web-Framework官方指南中文(下篇)
ShouldBind,ShouldBindJSON,ShouldBindXML,ShouldBindQuery,ShouldBindYAML
小诚信驿站
2019/10/31
2.4K0
Gin-Web-Framework官方指南中文(下篇)
使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐
这篇文章,我们继续聊聊,如何折腾 AI 应用,把不 AI 的东西,“AI 起来”。在不折腾复杂的检索系统的前提下,快速完成轻量的 RAG 实践。
soulteary
2024/05/29
1.2K0
使用 Dify、Meilisearch、零一万物模型实现最简单的 RAG 应用(三):AI 电影推荐
gin框架之集成验证码(captcha)
在开发的过程中,我们有些接口为了防止被恶意调用,我们会采用加验证码的方式,例如:发送短信的接口,为了防止短信接口被频繁调用造成损失;注册的接口,为了防止恶意注册。在这里为大家推荐一个验证码的类库,方便大家学习使用。
大话swift
2020/03/16
3.2K0
gin框架之集成验证码(captcha)
boss: 这小子还不会使用validator库进行数据校验,开了~~~
哈喽,大家好,我是asong。这是我的第十篇原创文章。这周在公司做项目,在做API部分开发时,需要对请求参数的校验,防止用户的恶意请求。例如日期格式,用户年龄,性别等必须是正常的值,不能随意设置。最开始在做这一部分的时候,我采用老方法,自己编写参数检验方法,统一进行参数验证。后来在同事CR的时候,说GIN有更好的参数检验方法,gin框架使用github.com/go-playground/validator进行参数校验,我们只需要在定义结构体时使用binding或validatetag标识相关校验规则,就可以进行参数校验了,很方便。相信也有很多小伙伴不知道这个功能,今天就来介绍一下这部分。
Golang梦工厂
2022/07/07
7440
RTSP协议视频平台EasyNVR如何将静态广告位修改为动态广告位?
TSINGSEE青犀视频全线产品进行改版之后,新增了广告位功能(EasyDSS登录页如何实现插入产品广告位),EasyNVR视频平台中也融入了这样显示,相信大家都已经有所了解了。
EasyNVR
2020/10/19
6210
RTSP协议视频平台EasyNVR如何将静态广告位修改为动态广告位?
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
之前做项目基本上公司是用 gRPC 和 echo 这两个框架的组合,后来 Gin 框架在Go圈越来越流行,陆续我在公司接触到的项目也开始有人用 Gin 框架开发了。
KevinYan
2023/01/03
3.2K0
Go Gin框架请求自动验证和数据绑定,看完这篇就会用了
基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学。作为一名后端Java开发,在最初入门时,最熟悉的莫过于MVC分层结构,可以简单归纳成controller层,model层,dao层,而在SpringBoot框架里,大概也经常看到以下的分层结构——
朱季谦
2021/08/05
9.9K2
基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
gin操作MySQL和Redis
go这些基础的东西,看起来很舒服,最起码对于写习惯java的人来讲,go真的很舒服,所以近一段时间可能一直连更,gin并没有直接封装操作MySQL的工具类,所以还是使用开源的工具
是小张啊喂
2021/08/10
2.8K0
初学gin
已经放弃goframe框架,对待新手不是很友好,社区圈子也很小。因为我自身的话是没有go语言的编程基础的,所以导致了我看不太懂那个框架,不过看很多人都说goframe封装的很好,有人吐槽有人夸,开源的框架嘛,这些都是在所难免的。
是小张啊喂
2021/08/09
7590
Go: Gin框架中的Bind()方法技术解析
Gin框架的Bind()方法是Go开发者在Web开发中经常使用的一个功能,它支持自动地识别和转换多种数据类型。这一功能的实现显著提高了Web应用开发的效率和可维护性。本文将深入探讨Bind()方法背后的技术实现,解析它是如何处理不同数据类型的。
运维开发王义杰
2024/05/10
3230
Go: Gin框架中的Bind()方法技术解析
Go: gin转换器深度解析
在Go语言的众多Web框架中,Gin是因其高效和简洁而备受开发者欢迎的一个。作为一个HTTP Web框架,Gin提供了丰富的功能,以支持快速开发高性能的Web应用。本文旨在深入探讨Gin框架中的转换器(converters),这些转换器在处理HTTP请求和响应时起着关键的桥梁作用,确保数据格式和类型能够正确转换,满足业务逻辑的需求。
运维开发王义杰
2024/05/10
1470
Go: gin转换器深度解析
【Golang】golang实现发送微信服务号模板消息
在我自己的在线客服系统项目(唯一客服)中,实现了对接微信公众号的功能,并且可以调用发送模板消息接口
唯一Chat
2022/07/24
1.3K0
推荐阅读
相关推荐
go语言中gin的用法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验