from django.db import models from django.conf import settings from django.utils import timezone class Article(models.Model): """文章内容表""" CONTENT_TYPE_CHOICES = [ ('city_info', '城市信息'), ('history', '历史'), ('culture', '文化'), ('practical', '实用信息'), ('life', '生活指南'), ] AUDIT_STATUS_CHOICES = [ ('pending', '待审核'), ('approved', '通过'), ('rejected', '拒绝'), ] PUBLISH_STATUS_CHOICES = [ ('draft', '未发布'), ('published', '已发布'), ] title = models.CharField('标题', max_length=200) content = models.TextField('内容') region = models.ForeignKey( 'regions.Region', on_delete=models.CASCADE, related_name='articles', verbose_name='所属区域' ) content_type = models.CharField('内容类型', max_length=20, choices=CONTENT_TYPE_CHOICES) author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='articles', verbose_name='作者' ) # 版主审核 moderator_reviewer = models.ForeignKey( settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL, related_name='reviewed_articles', verbose_name='版主审核人' ) moderator_reviewed_at = models.DateTimeField('版主审核时间', null=True, blank=True) moderator_status = models.CharField('版主审核状态', max_length=20, choices=AUDIT_STATUS_CHOICES, default='pending') moderator_comment = models.TextField('版主审核意见', blank=True) # AI 审核 ai_status = models.CharField('AI 审核状态', max_length=20, choices=AUDIT_STATUS_CHOICES, default='pending') ai_reviewed_at = models.DateTimeField('AI 审核时间', null=True, blank=True) ai_comment = models.TextField('AI 审核意见', blank=True) # 发布状态 publish_status = models.CharField('发布状态', max_length=20, choices=PUBLISH_STATUS_CHOICES, default='draft') created_at = models.DateTimeField('创建时间', auto_now_add=True) updated_at = models.DateTimeField('更新时间', auto_now=True) class Meta: verbose_name = '文章' verbose_name_plural = '文章' ordering = ['-created_at'] def __str__(self): return self.title def submit_for_moderator_review(self): """提交版主审核""" self.moderator_status = 'pending' self.save() def approve_by_moderator(self, moderator, comment=''): """版主审核通过""" self.moderator_reviewer = moderator self.moderator_status = 'approved' self.moderator_comment = comment self.moderator_reviewed_at = timezone.now() self.save() # 自动提交到 AI 审核 self.submit_for_ai_review() def reject_by_moderator(self, moderator, comment=''): """版主审核拒绝""" self.moderator_reviewer = moderator self.moderator_status = 'rejected' self.moderator_comment = comment self.moderator_reviewed_at = timezone.now() self.publish_status = 'draft' self.save() def submit_for_ai_review(self): """提交 AI 审核(版主通过后自动调用)""" if self.moderator_status == 'approved': self.ai_status = 'pending' self.save() def approve_by_ai(self, comment=''): """AI 审核通过""" self.ai_status = 'approved' self.ai_comment = comment self.ai_reviewed_at = timezone.now() self.publish_status = 'published' self.save() def reject_by_ai(self, comment=''): """AI 审核拒绝""" self.ai_status = 'rejected' self.ai_comment = comment self.ai_reviewed_at = timezone.now() self.publish_status = 'draft' self.save() class Comment(models.Model): """评论表""" AUDIT_STATUS_CHOICES = [ ('pending', '待审核'), ('approved', '通过'), ('rejected', '拒绝'), ] content = models.TextField('评论内容') article = models.ForeignKey( Article, on_delete=models.CASCADE, related_name='comments', verbose_name='文章', null=True, blank=True ) service = models.ForeignKey( 'services.FeaturedService', on_delete=models.CASCADE, related_name='comments', verbose_name='特色服务', null=True, blank=True ) author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='comments', verbose_name='评论者' ) ai_status = models.CharField('AI 审核状态', max_length=20, choices=AUDIT_STATUS_CHOICES, default='pending') ai_reviewed_at = models.DateTimeField('AI 审核时间', null=True, blank=True) is_visible = models.BooleanField('是否显示', default=False) created_at = models.DateTimeField('创建时间', auto_now_add=True) class Meta: verbose_name = '评论' verbose_name_plural = '评论' ordering = ['-created_at'] def __str__(self): return f"{self.author.username} 的评论" def approve_by_ai(self): """AI 审核通过""" self.ai_status = 'approved' self.ai_reviewed_at = timezone.now() self.is_visible = True self.save() def reject_by_ai(self): """AI 审核拒绝""" self.ai_status = 'rejected' self.ai_reviewed_at = timezone.now() self.is_visible = False self.save() class Like(models.Model): """点赞表""" user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='likes' ) article = models.ForeignKey( Article, on_delete=models.CASCADE, related_name='likes', null=True, blank=True ) service = models.ForeignKey( 'services.FeaturedService', on_delete=models.CASCADE, related_name='likes', null=True, blank=True ) created_at = models.DateTimeField('创建时间', auto_now_add=True) class Meta: verbose_name = '点赞' verbose_name_plural = '点赞' unique_together = ['user', 'article', 'service'] def __str__(self): return f"{self.user.username} 点赞" class Rating(models.Model): """评分表""" user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='ratings' ) region = models.ForeignKey( 'regions.Region', on_delete=models.CASCADE, related_name='ratings', null=True, blank=True ) service = models.ForeignKey( 'services.FeaturedService', on_delete=models.CASCADE, related_name='ratings', null=True, blank=True ) score = models.PositiveSmallIntegerField('评分', choices=[(i, f'{i}星') for i in range(1, 6)]) comment = models.TextField('评价', blank=True) created_at = models.DateTimeField('创建时间', auto_now_add=True) class Meta: verbose_name = '评分' verbose_name_plural = '评分' unique_together = ['user', 'region', 'service'] def __str__(self): return f"{self.user.username} 评分 {self.score}星" class Favorite(models.Model): """收藏表""" user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='favorites' ) region = models.ForeignKey( 'regions.Region', on_delete=models.CASCADE, related_name='favorited_by', null=True, blank=True ) service = models.ForeignKey( 'services.FeaturedService', on_delete=models.CASCADE, related_name='favorited_by', null=True, blank=True ) created_at = models.DateTimeField('创建时间', auto_now_add=True) class Meta: verbose_name = '收藏' verbose_name_plural = '收藏' unique_together = ['user', 'region', 'service'] def __str__(self): return f"{self.user.username} 收藏"