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