aifeilong 13b1ca2b9b Namespace API routes by app and flatten package layout.
Move Django apps out of apps/ and mount them under auth/, common/, content/, and cms/ so endpoint paths map directly to the owning app.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 08:42:37 +08:00

188 lines
7.2 KiB
Python

from django.db import models
from common.models import SoftDeleteModel
class News(SoftDeleteModel):
"""新闻。"""
title = models.CharField(max_length=500, verbose_name="标题")
content = models.TextField(blank=True, default="", verbose_name="正文")
publication_time = models.CharField(
max_length=32, blank=True, default="", verbose_name="发布时间"
)
rank = models.IntegerField(null=True, blank=True, verbose_name="排序")
read_num = models.PositiveIntegerField(default=0, verbose_name="阅读数")
collect_num = models.PositiveIntegerField(default=0, verbose_name="收藏数")
like_num = models.PositiveIntegerField(default=0, verbose_name="点赞数")
share_num = models.PositiveIntegerField(default=0, verbose_name="分享数")
is_disabled = models.BooleanField(default=False, verbose_name="禁用")
class Meta:
ordering = ["rank", "-id"]
verbose_name = "新闻"
verbose_name_plural = verbose_name
def __str__(self):
return self.title
class Publication(SoftDeleteModel):
"""最新发表 / 资源。"""
title = models.CharField(max_length=500, verbose_name="标题")
content = models.TextField(blank=True, default="", verbose_name="正文")
url = models.URLField(blank=True, default="", verbose_name="链接")
publication_time = models.CharField(
max_length=32, blank=True, default="", verbose_name="发布时间"
)
rank = models.IntegerField(null=True, blank=True, verbose_name="排序")
read_num = models.PositiveIntegerField(default=0, verbose_name="阅读数")
collect_num = models.PositiveIntegerField(default=0, verbose_name="收藏数")
like_num = models.PositiveIntegerField(default=0, verbose_name="点赞数")
share_num = models.PositiveIntegerField(default=0, verbose_name="分享数")
is_disabled = models.BooleanField(default=False, verbose_name="禁用")
class Meta:
ordering = ["rank", "-id"]
verbose_name = "发表资源"
verbose_name_plural = verbose_name
def __str__(self):
return self.title
class Report(SoftDeleteModel):
"""年度报告。"""
name = models.CharField(max_length=200, verbose_name="名称")
year = models.IntegerField(verbose_name="年份")
logo = models.URLField(blank=True, default="", verbose_name="封面")
file_path = models.URLField(blank=True, default="", verbose_name="文件地址")
is_disabled = models.BooleanField(default=False, verbose_name="禁用")
class Meta:
ordering = ["-year", "id"]
verbose_name = "年度报告"
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.name} ({self.year})"
class AboutInfo(SoftDeleteModel):
"""关于我们(单例式配置,可多条取最新)。"""
introduction = models.TextField(blank=True, default="", verbose_name="简介")
work_group = models.JSONField(default=list, blank=True, verbose_name="工作组")
product = models.JSONField(default=list, blank=True, verbose_name="产品")
growing_path = models.TextField(blank=True, default="", verbose_name="成长路径")
img_path = models.URLField(blank=True, default="", verbose_name="图片")
rating_method = models.TextField(blank=True, default="", verbose_name="评价方法")
class Meta:
ordering = ["-id"]
verbose_name = "关于我们"
verbose_name_plural = verbose_name
def __str__(self):
return f"About#{self.pk}"
class CopyrightInfo(SoftDeleteModel):
"""版权声明。"""
copyright = models.TextField(blank=True, default="", verbose_name="版权")
responsibility = models.TextField(blank=True, default="", verbose_name="免责")
email = models.EmailField(blank=True, default="", verbose_name="邮箱")
remark = models.TextField(blank=True, default="", verbose_name="备注")
class Meta:
ordering = ["-id"]
verbose_name = "版权声明"
verbose_name_plural = verbose_name
def __str__(self):
return f"Copyright#{self.pk}"
class ContactUs(SoftDeleteModel):
"""联系我们。"""
serve_icon = models.URLField(blank=True, default="", verbose_name="服务图标")
serve_desc = models.TextField(blank=True, default="", verbose_name="服务说明")
serve_phone = models.CharField(max_length=100, blank=True, default="", verbose_name="服务电话")
serve_email = models.EmailField(blank=True, default="", verbose_name="服务邮箱")
serve_address = models.CharField(max_length=500, blank=True, default="", verbose_name="服务地址")
media_icon = models.URLField(blank=True, default="", verbose_name="媒体图标")
media_desc = models.TextField(blank=True, default="", verbose_name="媒体说明")
media_phone = models.CharField(max_length=100, blank=True, default="", verbose_name="媒体电话")
media_email = models.EmailField(blank=True, default="", verbose_name="媒体邮箱")
media_address = models.CharField(max_length=500, blank=True, default="", verbose_name="媒体地址")
star_icon = models.URLField(blank=True, default="", verbose_name="STAR 图标")
star_desc = models.TextField(blank=True, default="", verbose_name="STAR 说明")
star_phone = models.CharField(max_length=100, blank=True, default="", verbose_name="STAR 电话")
star_email = models.EmailField(blank=True, default="", verbose_name="STAR 邮箱")
star_address = models.CharField(max_length=500, blank=True, default="", verbose_name="STAR 地址")
class Meta:
ordering = ["-id"]
verbose_name = "联系我们"
verbose_name_plural = verbose_name
def __str__(self):
return f"Contact#{self.pk}"
class ExtendLink(SoftDeleteModel):
"""外部链接。"""
name = models.CharField(max_length=200, verbose_name="名称")
link_url = models.URLField(verbose_name="链接")
sort = models.IntegerField(default=0, verbose_name="排序")
is_disabled = models.BooleanField(default=False, verbose_name="禁用")
class Meta:
ordering = ["sort", "id"]
verbose_name = "外链"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class HomeBanner(SoftDeleteModel):
"""首页轮播 / 图片位。"""
title = models.CharField(max_length=200, blank=True, default="", verbose_name="标题")
image_url = models.CharField(max_length=500, verbose_name="图片地址")
link_url = models.CharField(max_length=500, blank=True, default="", verbose_name="跳转链接")
sort = models.IntegerField(default=0, verbose_name="排序")
is_disabled = models.BooleanField(default=False, verbose_name="禁用")
class Meta:
ordering = ["sort", "id"]
verbose_name = "首页轮播"
verbose_name_plural = verbose_name
def __str__(self):
return self.title or self.image_url
class Keyword(SoftDeleteModel):
"""热搜词。"""
name = models.CharField(max_length=200, verbose_name="关键词")
search_hot = models.PositiveIntegerField(default=0, verbose_name="热度")
is_show = models.BooleanField(default=True, verbose_name="展示")
class Meta:
ordering = ["-search_hot", "id"]
verbose_name = "热搜词"
verbose_name_plural = verbose_name
def __str__(self):
return self.name