62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
from datetime import datetime, timedelta
|
|
from config.database import db
|
|
import random
|
|
import string
|
|
|
|
|
|
class EmailVerification(db.Model):
|
|
__tablename__ = 'email_verifications'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
email = db.Column(db.String(100), nullable=False, index=True)
|
|
code = db.Column(db.String(6), nullable=False)
|
|
type = db.Column(db.SmallInteger, nullable=False) # 1-注册 2-登录 3-找回密码
|
|
is_used = db.Column(db.SmallInteger, default=0) # 0-未使用 1-已使用
|
|
expired_at = db.Column(db.DateTime, nullable=False)
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
|
@staticmethod
|
|
def generate_code():
|
|
"""生成6位数字验证码"""
|
|
return ''.join(random.choices(string.digits, k=6))
|
|
|
|
@classmethod
|
|
def create_verification(cls, email, code_type, expire_minutes=10):
|
|
"""创建验证码记录"""
|
|
code = cls.generate_code()
|
|
expired_at = datetime.utcnow() + timedelta(minutes=expire_minutes)
|
|
|
|
verification = cls(
|
|
email=email,
|
|
code=code,
|
|
type=code_type,
|
|
expired_at=expired_at
|
|
)
|
|
|
|
db.session.add(verification)
|
|
db.session.commit()
|
|
|
|
return verification
|
|
|
|
@classmethod
|
|
def verify_code(cls, email, code, code_type):
|
|
"""验证验证码"""
|
|
verification = cls.query.filter_by(
|
|
email=email,
|
|
code=code,
|
|
type=code_type,
|
|
is_used=0
|
|
).filter(
|
|
cls.expired_at > datetime.utcnow()
|
|
).first()
|
|
|
|
if verification:
|
|
verification.is_used = 1
|
|
db.session.commit()
|
|
return True
|
|
return False
|
|
|
|
def is_expired(self):
|
|
"""检查是否过期"""
|
|
return datetime.utcnow() > self.expired_at
|