项目1实现登录功能day5

136 阅读2分钟

实现图片验证码后半部分,验证码核验

// 图片验证码验证操作:用户传入图片id(唯一标识符发送图片信息时给的),+验证码
func Verifypiccode(db *sql.DB, id string, code string) error {
	var created_at time.Time
	err := db.QueryRow("SELECT created_at FROM verification_codes WHERE id = ? AND code = ?", id, code).Scan(&created_at)
	if err != nil {
		return err
	}
	// 删除验证码
	db.Exec("DELETE FROM verification_codes WHERE id = ?", id)
	if time.Now().Unix() > created_at.Unix()+5*60 { //时效5分钟
		return fmt.Errorf("验证码过期")
	}
	return nil
}

配置邮件发送服务(gomail)

使用第三方gomail库实现邮件的发送,
我们这里使用QQ邮箱的SMTP来发送邮箱\

首先开启SMTP/IMAP服务

去QQ邮箱的设置中的账号设置中开启,然后获取一个授权码,就可以用了.

// 使用gomail库创建SMTP客户端
func CreatDialer() *gomail.Dialer{
	return gomail.NewDialer("smtpHost", smtpPort, "Email", "AuthCode") //smtpHost负责发送邮件的服务器地址,smtpPort端口,授权的邮箱账号,AuthCode为邮箱的授权码,
}

搭建发送邮件服务

func SendEmail(dialer *gomail.Dialer, to, subject, body string) error {
	// 发送邮件的QQ邮箱地址
	qqEmail := "Email"

	// 创建邮件消息
	message := gomail.NewMessage()
	message.SetHeader("From", qqEmail)
	message.SetHeader("To", to)
	message.SetHeader("Subject", subject)
	message.SetBody("text/plain", body)

	// 发送邮件消息
	err := dialer.DialAndSend(message)
	if err != nil {
		panic(err)
	}
	return nil
}

参考文档:配置QQ邮箱SMTP/IMAP服务

注册功能实现:

定义简单的输入检验函数:

// 用于检验用户传入的数据是否合理
func Validatedata(data string) bool {
	// 正则表达式,匹配长度为 8-20 的 ASCII 字符串
	regex := regexp.MustCompile(`^[[:ascii:]]{8,30}$`)
	return regex.MatchString(data)
}

//注册1,1. 图片验证,;2. 发送邮件验证码
	r.POST("/login1", func(ctx *gee7.Context) {
		data := funcmod.Login1data{}
		//读取用户传入的json数据
		err = ctx.Getjson(&data)
		if funcmod.Validatedata(data.Email) {
			ctx.FailJson(402, "email不合理,请规划填写数据")
		}
		if err != nil {
			ctx.FailJson(410, "解析数据错误"+err.Error())
			return
		}
		//验证验证码是否正确
		err = funcmod.Verifypiccode(db, data.ID, data.Code)
		if err != nil {
			ctx.FailJson(401, "验证码错误"+err.Error())
			return
		}

		rand.Seed(time.Now().UnixNano())
		// 生成100000到999999之间的随机数,作为验证码
		verification := rand.Intn(899999) + 100000
		//储存验证码到数据库
		err = funcmod.InsertVerification(db, &funcmod.EmailVerificationCode{
			Email:        data.Email,
			Verification: verification})
		if err != nil {
			ctx.FailJson(401, "发送失败,稍后再试"+err.Error())
			return
		}
		//发送验证码
		err := funcmod.SendEmail(dailer, data.Email, verification)
		err = funcmod.Verifypiccode(db, data.ID, data.Code)
		if err != nil {
			ctx.FailJson(401, "邮箱错误"+err.Error())
			return
		}
		ctx.JSON(200, gee7.H{
			"msg": "ok",
		})
	})
	//login2:1.验证验证码,;2. 向用户列表插入数据
	r.POST("/login2", func(ctx *gee7.Context) {
		data := funcmod.Logindata{}
		//读取用户传入的json数据
		err = ctx.Getjson(&data)
		if err != nil {
			ctx.FailJson(410, "解析数据错误"+err.Error())
			return
		}
		if funcmod.Validatedata(data.Name) {
			ctx.FailJson(402, "name不合理,请规划填写数据")
		}
		if funcmod.Validatedata(data.Password) {
			ctx.FailJson(402, "password不合理,请规划填写数据")
		}
		//验证用户验证码是否正确
		err = funcmod.Verify(db, data.Email, data.Verification)
		if err != nil {
			ctx.FailJson(401, "验证码错误"+err.Error())
			return
		}
		//插入用户数据
		err = funcmod.AddLogindata(db, &data)
		if err != nil {
			ctx.FailJson(401, err.Error())
		} else {
			ctx.JSON(200, gee7.H{
				"msg": "成功",
			})
		}
	})

本文由mdnice多平台发布