-
+
- - - {{ article.title }} - - - {% empty %} -
- 暂无文章 +
暂无文章
+diff --git a/core/admin_extended.py b/core/admin_extended.py index 02daa0d..bb5dae1 100644 --- a/core/admin_extended.py +++ b/core/admin_extended.py @@ -16,7 +16,7 @@ from django.utils import timezone from django.db.models import Count, Q from django.core.cache import cache -from .models import Website, Article, CrawlTask +from .models import Website, Article, CrawlTask, SiteConfig from .tasks import crawl_website, crawl_all_websites, cleanup_old_articles from .distributed_crawler import distributed_crawler from .task_executor import task_executor @@ -911,7 +911,36 @@ class CrawlTaskAdmin(admin.ModelAdmin): # return super().changelist_view(request, extra_context) # +class SiteConfigAdmin(admin.ModelAdmin): + """网站配置管理""" + list_display = ['site_title', 'show_title', 'header_background_color', 'header_background_size', 'header_background_position', 'header_height', 'created_at', 'updated_at'] + readonly_fields = ['created_at', 'updated_at'] + + fieldsets = ( + ('基本信息', { + 'fields': ('site_title', 'show_title') + }), + ('版头设置', { + 'fields': ('header_background_image', 'header_background_color', 'header_background_size', 'header_background_position', 'header_height'), + 'description': '上传背景图片后,可以调整图片的显示大小、位置和版头高度' + }), + ('时间信息', { + 'fields': ('created_at', 'updated_at'), + 'classes': ('collapse',) + }), + ) + + def has_add_permission(self, request): + """只允许有一个配置实例""" + return not SiteConfig.objects.exists() + + def has_delete_permission(self, request, obj=None): + """不允许删除配置""" + return False + + # 注册管理类 +admin.site.register(SiteConfig, SiteConfigAdmin) admin.site.register(Website, WebsiteAdmin) admin.site.register(Article, ArticleAdmin) admin.site.register(CrawlTask, CrawlTaskAdmin) diff --git a/core/migrations/0005_siteconfig.py b/core/migrations/0005_siteconfig.py new file mode 100644 index 0000000..84a0e41 --- /dev/null +++ b/core/migrations/0005_siteconfig.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1 on 2025-10-28 01:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0004_crawltask_execution_count_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='SiteConfig', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('site_title', models.CharField(default='绿美泉烟绿色课堂', max_length=200, verbose_name='网站标题')), + ('header_background_image', models.ImageField(blank=True, null=True, upload_to='site_config/', verbose_name='版头背景图片')), + ('header_background_color', models.CharField(default='#667eea', max_length=7, verbose_name='版头背景颜色')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '网站配置', + 'verbose_name_plural': '网站配置', + }, + ), + ] diff --git a/core/migrations/0006_siteconfig_header_background_position_and_more.py b/core/migrations/0006_siteconfig_header_background_position_and_more.py new file mode 100644 index 0000000..ec4a9b3 --- /dev/null +++ b/core/migrations/0006_siteconfig_header_background_position_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 5.1 on 2025-10-28 02:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0005_siteconfig'), + ] + + operations = [ + migrations.AddField( + model_name='siteconfig', + name='header_background_position', + field=models.CharField(choices=[('center', '居中'), ('top', '顶部'), ('bottom', '底部'), ('left', '左侧'), ('right', '右侧'), ('top left', '左上角'), ('top right', '右上角'), ('bottom left', '左下角'), ('bottom right', '右下角')], default='center', max_length=20, verbose_name='背景图片位置'), + ), + migrations.AddField( + model_name='siteconfig', + name='header_background_size', + field=models.CharField(choices=[('cover', '覆盖整个区域'), ('contain', '完整显示图片'), ('100% 100%', '拉伸填满'), ('auto', '原始大小')], default='cover', max_length=20, verbose_name='背景图片大小'), + ), + migrations.AddField( + model_name='siteconfig', + name='header_height', + field=models.IntegerField(default=200, verbose_name='版头高度(像素)'), + ), + ] diff --git a/core/migrations/0007_siteconfig_show_title.py b/core/migrations/0007_siteconfig_show_title.py new file mode 100644 index 0000000..83b711b --- /dev/null +++ b/core/migrations/0007_siteconfig_show_title.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1 on 2025-10-28 02:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0006_siteconfig_header_background_position_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='siteconfig', + name='show_title', + field=models.BooleanField(default=True, verbose_name='前台显示标题'), + ), + ] diff --git a/core/models.py b/core/models.py index c969c81..a924464 100644 --- a/core/models.py +++ b/core/models.py @@ -3,6 +3,78 @@ from django.utils import timezone import json +class SiteConfig(models.Model): + """网站配置模型""" + BACKGROUND_SIZE_CHOICES = [ + ('cover', '覆盖整个区域'), + ('contain', '完整显示图片'), + ('100% 100%', '拉伸填满'), + ('auto', '原始大小'), + ] + + BACKGROUND_POSITION_CHOICES = [ + ('center', '居中'), + ('top', '顶部'), + ('bottom', '底部'), + ('left', '左侧'), + ('right', '右侧'), + ('top left', '左上角'), + ('top right', '右上角'), + ('bottom left', '左下角'), + ('bottom right', '右下角'), + ] + + site_title = models.CharField(max_length=200, default="绿美泉烟绿色课堂", verbose_name="网站标题") + show_title = models.BooleanField(default=True, verbose_name="前台显示标题") + header_background_image = models.ImageField( + upload_to='site_config/', + blank=True, + null=True, + verbose_name="版头背景图片" + ) + header_background_color = models.CharField( + max_length=7, + default="#667eea", + verbose_name="版头背景颜色" + ) + header_background_size = models.CharField( + max_length=20, + choices=BACKGROUND_SIZE_CHOICES, + default='cover', + verbose_name="背景图片大小" + ) + header_background_position = models.CharField( + max_length=20, + choices=BACKGROUND_POSITION_CHOICES, + default='center', + verbose_name="背景图片位置" + ) + header_height = models.IntegerField( + default=200, + verbose_name="版头高度(像素)" + ) + created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") + + class Meta: + verbose_name = "网站配置" + verbose_name_plural = "网站配置" + + def __str__(self): + return f"网站配置 - {self.site_title}" + + @classmethod + def get_config(cls): + """获取网站配置,如果不存在则创建默认配置""" + config, created = cls.objects.get_or_create( + defaults={ + 'site_title': '绿美泉烟绿色课堂', + 'header_background_color': '#667eea' + } + ) + return config + + class Website(models.Model): name = models.CharField(max_length=100, unique=True) base_url = models.URLField() diff --git a/core/templates/core/article_list.html b/core/templates/core/article_list.html index 4033457..3eb24fe 100644 --- a/core/templates/core/article_list.html +++ b/core/templates/core/article_list.html @@ -2,36 +2,62 @@
-