j

jaryue

V1

2023/04/22阅读:15主题:默认主题

项目1实现登录功能day5

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

// 图片验证码验证操作:用户传入图片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""成功",
   })
  }
 })

分类:

后端

标签:

后端

作者介绍

j
jaryue
V1