from django.db import models from django.conf import settings MSG_TYPE_CHOICES = [ ('reply', '回复'), ('at_me', '@我'), ('like', '点赞'), ] TARGET_TYPE_CHOICES = [ ('comment', '评论'), ('article', '文章'), ] SYSTEM_CATEGORY_CHOICES = [ ('system', '系统通知'), ('activity', '活动通知'), ('security', '安全提醒'), ('update', '功能更新'), ] class Message(models.Model): recipient = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='messages', verbose_name='接收者' ) sender = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, related_name='sent_messages', verbose_name='发送者', null=True, blank=True ) msg_type = models.CharField(max_length=20, choices=MSG_TYPE_CHOICES, verbose_name='消息类型') title = models.CharField(max_length=200, verbose_name='标题') content = models.TextField(verbose_name='内容') extra_info = models.CharField(max_length=500, blank=True, default='', verbose_name='附加信息') target_link = models.CharField(max_length=500, blank=True, default='', verbose_name='跳转链接') target_type = models.CharField(max_length=20, blank=True, default='', choices=TARGET_TYPE_CHOICES, verbose_name='目标类型') target_id = models.PositiveIntegerField(null=True, blank=True, verbose_name='目标ID') is_read = models.BooleanField(default=False, verbose_name='是否已读') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '消息' verbose_name_plural = '消息' ordering = ['-created_at'] def __str__(self): return f'{self.get_msg_type_display()} - {self.title}' class SystemMessage(models.Model): title = models.CharField(max_length=200, verbose_name='标题') content = models.TextField(verbose_name='摘要') detail = models.TextField(verbose_name='详情正文') category = models.CharField(max_length=20, choices=SYSTEM_CATEGORY_CHOICES, verbose_name='分类') icon_name = models.CharField(max_length=50, blank=True, default='', verbose_name='图标名称') icon_color = models.CharField(max_length=20, blank=True, default='#1890ff', verbose_name='图标颜色') is_global = models.BooleanField(default=True, verbose_name='是否全局广播') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '系统消息' verbose_name_plural = '系统消息' ordering = ['-created_at'] def __str__(self): return self.title class SystemMessageRead(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='system_message_reads', verbose_name='用户' ) system_message = models.ForeignKey( SystemMessage, on_delete=models.CASCADE, related_name='read_records', verbose_name='系统消息' ) read_at = models.DateTimeField(auto_now_add=True, verbose_name='阅读时间') class Meta: verbose_name = '系统消息已读' verbose_name_plural = '系统消息已读' unique_together = ['user', 'system_message'] def __str__(self): return f'{self.user} read {self.system_message}'