mirror of
https://github.com/iLoveElysia/openbilibili.git
synced 2026-06-08 05:58:29 -05:00
93 lines
2.4 KiB
Go
93 lines
2.4 KiB
Go
|
|
package dao
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"strconv"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"go-common/library/cache/redis"
|
|||
|
|
"go-common/library/log"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
_expire = 30 * 60 // 30 minutes
|
|||
|
|
_prefixCaptcha = "recovery:ca_"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// SetLinkMailCount set linkMail expire time.
|
|||
|
|
func (d *Dao) SetLinkMailCount(c context.Context, linkMail string) (state int64, err error) {
|
|||
|
|
conn := d.redis.Get(c)
|
|||
|
|
defer conn.Close()
|
|||
|
|
//用时间戳去减去时间 当天0点过期,第二天又可以发送10封邮件
|
|||
|
|
i, _ := redis.Int(conn.Do("incr", linkMail))
|
|||
|
|
conn.Do("expire", linkMail, getSubtime())
|
|||
|
|
if i >= 11 { //第10封邮件之后
|
|||
|
|
state = 10 //当天邮件发送到达最大次数
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func getSubtime() (subtime int64) {
|
|||
|
|
timeStr := time.Now().Format("2006-01-02")
|
|||
|
|
t, _ := time.Parse("2006-01-02", timeStr)
|
|||
|
|
t2 := t.AddDate(0, 0, 1).Unix()
|
|||
|
|
curr := time.Now().Unix() //当前时间
|
|||
|
|
subtime = t2 - curr
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// keyCaptcha
|
|||
|
|
func keyCaptcha(mid int64, linkMail string) string {
|
|||
|
|
return _prefixCaptcha + strconv.FormatInt(mid, 10) + "_" + linkMail
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SetCaptcha set linkMail expire time.
|
|||
|
|
func (d *Dao) SetCaptcha(c context.Context, code string, mid int64, linkMail string) (err error) {
|
|||
|
|
conn := d.redis.Get(c)
|
|||
|
|
defer conn.Close()
|
|||
|
|
key := keyCaptcha(mid, linkMail)
|
|||
|
|
//验证码30分钟内有效
|
|||
|
|
if _, err = conn.Do("SETEX", key, _expire, code); err != nil {
|
|||
|
|
log.Error("conn.Do(SETEX, %d, %v, %s) error(%v)", mid, _expire, code, err)
|
|||
|
|
}
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetEMailCode get captcha from redis
|
|||
|
|
func (d *Dao) GetEMailCode(c context.Context, mid int64, linkMail string) (code string, err error) {
|
|||
|
|
key := keyCaptcha(mid, linkMail)
|
|||
|
|
conn := d.redis.Get(c)
|
|||
|
|
defer conn.Close()
|
|||
|
|
code, err = redis.String(conn.Do("GET", key))
|
|||
|
|
if err != nil {
|
|||
|
|
if err == redis.ErrNil {
|
|||
|
|
err = nil
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
log.Error("conn.Do(GET, %s, ), err (%v)", key, err)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DelEMailCode del captcha from redis 提交:校验验证之后就删除验证码(保证只能提交一次)
|
|||
|
|
func (d *Dao) DelEMailCode(c context.Context, mid int64, linkMail string) (err error) {
|
|||
|
|
key := keyCaptcha(mid, linkMail)
|
|||
|
|
conn := d.redis.Get(c)
|
|||
|
|
defer conn.Close()
|
|||
|
|
if _, err = conn.Do("DEL", key); err != nil {
|
|||
|
|
log.Error("conn.Do(DEL, %s, ), err (%v)", key, err)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// PingRedis check connection success.
|
|||
|
|
func (d *Dao) PingRedis(c context.Context) (err error) {
|
|||
|
|
conn := d.redis.Get(c)
|
|||
|
|
defer conn.Close()
|
|||
|
|
_, err = conn.Do("GET", "PING")
|
|||
|
|
return
|
|||
|
|
}
|