From 71db15bacd88dfab8d65b4bdc28c0a68d55813b1 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 18 Nov 2024 10:42:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0cms=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=88=9B=E5=BB=BAarticle=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cms/__init__.py | 0 apps/cms/admin.py | 3 +++ apps/cms/apps.py | 6 +++++ apps/cms/migrations/0001_initial.py | 38 +++++++++++++++++++++++++++++ apps/cms/migrations/__init__.py | 0 apps/cms/models.py | 11 +++++++++ apps/cms/serializers.py | 9 +++++++ apps/cms/tests.py | 3 +++ apps/cms/urls.py | 12 +++++++++ apps/cms/views.py | 23 +++++++++++++++++ apps/wpm/views.py | 4 +-- server/settings.py | 3 ++- server/urls.py | 1 + 13 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 apps/cms/__init__.py create mode 100644 apps/cms/admin.py create mode 100644 apps/cms/apps.py create mode 100644 apps/cms/migrations/0001_initial.py create mode 100644 apps/cms/migrations/__init__.py create mode 100644 apps/cms/models.py create mode 100644 apps/cms/serializers.py create mode 100644 apps/cms/tests.py create mode 100644 apps/cms/urls.py create mode 100644 apps/cms/views.py diff --git a/apps/cms/__init__.py b/apps/cms/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/cms/admin.py b/apps/cms/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/cms/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/cms/apps.py b/apps/cms/apps.py new file mode 100644 index 00000000..e93b0c91 --- /dev/null +++ b/apps/cms/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CmsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.cms' diff --git a/apps/cms/migrations/0001_initial.py b/apps/cms/migrations/0001_initial.py new file mode 100644 index 00000000..7f1a2ae3 --- /dev/null +++ b/apps/cms/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.12 on 2024-11-18 02:41 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Article', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('title', models.CharField(max_length=200, verbose_name='标题')), + ('poster', models.TextField(blank=True, null=True, verbose_name='封面地址')), + ('video', models.TextField(blank=True, null=True, verbose_name='视频地址')), + ('content', models.TextField(blank=True, null=True, verbose_name='内容')), + ('is_top', models.BooleanField(default=False, verbose_name='是否置顶')), + ('read_num', models.IntegerField(default=0, verbose_name='阅读数')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='article_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='article_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/cms/migrations/__init__.py b/apps/cms/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/cms/models.py b/apps/cms/models.py new file mode 100644 index 00000000..2518f658 --- /dev/null +++ b/apps/cms/models.py @@ -0,0 +1,11 @@ +from django.db import models +from apps.utils.models import CommonADModel + +# Create your models here. +class Article(CommonADModel): + title = models.CharField(max_length=200, verbose_name="标题") + poster = models.TextField(verbose_name="封面地址", null=True, blank=True) + video = models.TextField(verbose_name="视频地址", null=True, blank=True) + content = models.TextField(verbose_name="内容", null=True, blank=True) + is_top = models.BooleanField(default=False, verbose_name="是否置顶") + read_num = models.IntegerField(default=0, verbose_name="阅读数") \ No newline at end of file diff --git a/apps/cms/serializers.py b/apps/cms/serializers.py new file mode 100644 index 00000000..79f181e0 --- /dev/null +++ b/apps/cms/serializers.py @@ -0,0 +1,9 @@ +from apps.utils.serializers import CustomModelSerializer +from apps.cms.models import Article +from apps.utils.constants import EXCLUDE_FIELDS_BASE + +class ArticleSerializer(CustomModelSerializer): + class Meta: + model = Article + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS_BASE + ["is_top"] \ No newline at end of file diff --git a/apps/cms/tests.py b/apps/cms/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/cms/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/cms/urls.py b/apps/cms/urls.py new file mode 100644 index 00000000..bbf55994 --- /dev/null +++ b/apps/cms/urls.py @@ -0,0 +1,12 @@ +from apps.cms.views import ArticleViewSet +from django.urls import path, include +from rest_framework.routers import DefaultRouter + +API_BASE_URL = 'api/cms/' +HTML_BASE_URL = 'cms/' + +router = DefaultRouter() +router.register('article', ArticleViewSet, basename='article') +urlpatterns = [ + path(API_BASE_URL, include(router.urls)), +] \ No newline at end of file diff --git a/apps/cms/views.py b/apps/cms/views.py new file mode 100644 index 00000000..4d8f188d --- /dev/null +++ b/apps/cms/views.py @@ -0,0 +1,23 @@ +from apps.utils.viewsets import CustomModelViewSet +from apps.cms.models import Article +from apps.cms.serializers import ArticleSerializer +from rest_framework.decorators import action +from rest_framework.serializers import Serializer +from rest_framework.response import Response +# Create your views here. + +class ArticleViewSet(CustomModelViewSet): + queryset = Article.objects.all() + serializer_class = ArticleSerializer + ordering = ["is_top", "-create_time"] + + @action(methods=['put'], detail=True, serializer_class=Serializer, perms_map={"put": "article.update"}) + def toggle_top(self, request, pk=None): + """文章置顶/取消 + + 文章置顶/取消 + """ + ins:Article = self.get_object() + ins.is_top = False if ins.is_top else True + ins.save() + return Response({"id": ins.id}) \ No newline at end of file diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 5c1456e8..48fbc8a2 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -149,10 +149,10 @@ class MlogViewSet(CustomModelViewSet): """ queryset = Mlog.objects.all() serializer_class = MlogSerializer - select_related_fields = ['create_by', 'update_by', 'mtask', + select_related_fields = ['create_by', 'update_by', 'mtask', 'mtaskb' 'handle_user', 'handle_user_2', 'equipment', 'equipment_2', 'material_in', 'material_out', 'route__routepack', - 'supplier', 'ticket', 'mgroup__process', 'test_user'] + 'supplier', 'ticket', 'mgroup__process', 'test_user', 'belong_dept'] prefetch_related_fields = ['handle_users', 'material_outs', 'b_mlog', 'equipments'] filterset_class = MlogFilter diff --git a/server/settings.py b/server/settings.py index 0874cbaf..46fcc310 100755 --- a/server/settings.py +++ b/server/settings.py @@ -79,7 +79,8 @@ INSTALLED_APPS = [ 'apps.enp', 'apps.edu', 'apps.dpm', - 'apps.cm' + 'apps.cm', + 'apps.cms' ] MIDDLEWARE = [ diff --git a/server/urls.py b/server/urls.py index e1e58a59..acbf5766 100755 --- a/server/urls.py +++ b/server/urls.py @@ -69,6 +69,7 @@ urlpatterns = [ path('', include('apps.edu.urls')), path('', include('apps.dpm.urls')), path('', include('apps.cm.urls')), + path('', include('apps.cms.urls')), # 前端页面入口 path('', TemplateView.as_view(template_name="index.html")),