from django.db import models from django.utils import timezone from datetime import timedelta from django.contrib.auth.models import AbstractBaseUser, BaseUserManager class UserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('邮箱地址不能为空') email = self.normalize_email(email) user = self.model(email=email, **extra_fields) if password: user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) if extra_fields.get('is_staff') is not True: raise ValueError('超级用户必须设置is_staff=True') if extra_fields.get('is_superuser') is not True: raise ValueError('超级用户必须设置is_superuser=True') return self.create_user(email, password, **extra_fields) class User(AbstractBaseUser): """用户模型,用于登录和账户管理""" email = models.EmailField(max_length=255, unique=True, verbose_name="电子邮箱") password = models.CharField(max_length=255, verbose_name="密码") company = models.CharField(max_length=255, blank=True, null=True, verbose_name="公司名称") name = models.CharField(max_length=255, blank=True, null=True, verbose_name="用户姓名") is_first_login = models.BooleanField(default=True, verbose_name="是否首次登录") last_login = models.DateTimeField(blank=True, null=True, verbose_name="最近登录时间") is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False, verbose_name="超级用户状态") # 时间戳 created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") objects = UserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] class Meta: verbose_name = "用户" verbose_name_plural = verbose_name db_table = "users" def __str__(self): return self.email @property def is_authenticated(self): return True def has_perm(self, perm, obj=None): """用户是否有特定权限""" return self.is_superuser def has_module_perms(self, app_label): """用户是否有访问特定app的权限""" return self.is_superuser class UserToken(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='tokens') token = models.CharField(max_length=40, unique=True) created_at = models.DateTimeField(auto_now_add=True) expired_at = models.DateTimeField() def save(self, *args, **kwargs): if not self.expired_at: # 设置token有效期为30天 self.expired_at = timezone.now() + timedelta(days=30) super().save(*args, **kwargs) def is_expired(self): return timezone.now() > self.expired_at class Meta: db_table = 'user_token'