from django.contrib.auth.models import AbstractUser from django.db import models from django.utils import timezone import random import string class VerificationCode(models.Model): """邮箱验证码模型""" email = models.EmailField() code = models.CharField(max_length=6) created_at = models.DateTimeField(auto_now_add=True) is_verified = models.BooleanField(default=False) attempts = models.IntegerField(default=0) locked_until = models.DateTimeField(null=True, blank=True) class Meta: verbose_name = '验证码' verbose_name_plural = '验证码' unique_together = [['email', 'code']] def is_valid(self): """检查验证码是否有效""" if self.is_verified: return False if self.locked_until and timezone.now() < self.locked_until: return False # 检查10分钟内有效 if (timezone.now() - self.created_at).total_seconds() > 600: return False return True def increment_attempts(self): """增加失败尝试次数,5次后锁定""" self.attempts += 1 if self.attempts >= 5: self.locked_until = timezone.now() + timezone.timedelta(minutes=10) self.save() def mark_as_verified(self): """标记为已使用""" self.is_verified = True self.save() @staticmethod def generate_code(): """生成6位数字验证码""" return ''.join(random.choices(string.digits, k=6)) class User(AbstractUser): ROLE_CHOICES = [ ('superadmin', '超级管理员'), ('admin', '公司管理员'), ('seeker', '求职者'), ] email = models.EmailField(unique=True) # 设置邮箱为唯一且必填 role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='seeker') phone = models.CharField(max_length=20) organization = models.ForeignKey( 'organizations.Organization', null=True, blank=True, on_delete=models.SET_NULL, related_name='admins' ) @property def is_superadmin(self): return self.role == 'superadmin' @property def is_admin(self): return self.role == 'admin' @property def is_seeker(self): return self.role == 'seeker' class Meta: verbose_name = '用户' verbose_name_plural = '用户'