diff --git a/hb_server/apps/cms/apps.py b/hb_server/apps/cms/apps.py index 7ef3fea..d20462e 100644 --- a/hb_server/apps/cms/apps.py +++ b/hb_server/apps/cms/apps.py @@ -2,4 +2,5 @@ from django.apps import AppConfig class CmsConfig(AppConfig): - name = 'cms' + name = 'apps.cms' + verbose_name = '内容管理' diff --git a/hb_server/apps/cms/migrations/0001_initial.py b/hb_server/apps/cms/migrations/0001_initial.py new file mode 100644 index 0000000..bbfa1ac --- /dev/null +++ b/hb_server/apps/cms/migrations/0001_initial.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.9 on 2022-03-16 02:25 + +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.BigAutoField(auto_created=True, 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=100, verbose_name='标题')), + ('content', models.TextField(verbose_name='内容')), + ('author', models.CharField(blank=True, max_length=100, null=True, verbose_name='作者')), + ('is_top', models.BooleanField(default=False, verbose_name='是否置顶')), + ('is_published', models.BooleanField(default=False, 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/hb_server/apps/cms/models.py b/hb_server/apps/cms/models.py index 71a8362..86964fe 100644 --- a/hb_server/apps/cms/models.py +++ b/hb_server/apps/cms/models.py @@ -1,3 +1,12 @@ from django.db import models - +from apps.system.models import CommonAModel # Create your models here. +class Article(CommonAModel): + """ + 文章 + """ + title = models.CharField('标题', max_length=100) + content = models.TextField('内容') + author = models.CharField('作者', max_length=100, null=True, blank=True) + is_top = models.BooleanField('是否置顶', default=False) + is_published = models.BooleanField('是否发布', default=False) diff --git a/hb_server/apps/cms/serializers.py b/hb_server/apps/cms/serializers.py new file mode 100644 index 0000000..f8a6b8e --- /dev/null +++ b/hb_server/apps/cms/serializers.py @@ -0,0 +1,21 @@ +from rest_framework import serializers +from apps.cms.models import Article +from apps.system.serializers import UserSimpleSerializer + +class ArticleListSerializer(serializers.ModelSerializer): + create_by_ = UserSimpleSerializer(source='create_by', read_only=True) + class Meta: + model = Article + exclude = ['content'] + +class ArticleCreateUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = Article + fields = ['title', 'content', 'author', 'is_published', 'is_top'] + + +class ArticleDetailSerializer(serializers.ModelSerializer): + create_by_ = UserSimpleSerializer(source='create_by', read_only=True) + class Meta: + model = Article + fields = '__all__' \ No newline at end of file diff --git a/hb_server/apps/cms/urls.py b/hb_server/apps/cms/urls.py new file mode 100644 index 0000000..df95a52 --- /dev/null +++ b/hb_server/apps/cms/urls.py @@ -0,0 +1,10 @@ +from rest_framework.routers import DefaultRouter +from django.urls import path, include +from apps.cms.views import ArticleViewSet + +router = DefaultRouter() +router.register('article', ArticleViewSet, basename='article') + +urlpatterns = [ + path('', include(router.urls)), +] \ No newline at end of file diff --git a/hb_server/apps/cms/views.py b/hb_server/apps/cms/views.py index 91ea44a..0d918e9 100644 --- a/hb_server/apps/cms/views.py +++ b/hb_server/apps/cms/views.py @@ -1,3 +1,26 @@ from django.shortcuts import render +from rest_framework.viewsets import ModelViewSet +from apps.cms.models import Article +from apps.cms.serializers import ArticleCreateUpdateSerializer, ArticleDetailSerializer, ArticleListSerializer +from apps.system.mixins import CreateUpdateModelAMixin # Create your views here. + +class ArticleViewSet(CreateUpdateModelAMixin, ModelViewSet): + """ + 文章增删改查 + """ + perms_map = {'get': '*', 'post': 'article_create' + , 'put':'article_update', 'delete':'article_delete'} + queryset = Article.objects.select_related('create_by') + filterset_fields = ['is_top', 'is_published'] + serializer_class = ArticleListSerializer + search_fields = ['title', 'author'] + ordering = ['is_published', 'is_top', 'update_time'] + + def get_serializer_class(self): + if self.action in ['create', 'update']: + return ArticleCreateUpdateSerializer + elif self.action in ['retrieve']: + return ArticleDetailSerializer + return super().get_serializer_class() \ No newline at end of file diff --git a/hb_server/apps/hrm/urls.py b/hb_server/apps/hrm/urls.py index 9db9637..b0ced0c 100644 --- a/hb_server/apps/hrm/urls.py +++ b/hb_server/apps/hrm/urls.py @@ -1,4 +1,4 @@ -from django.db.models import base + from rest_framework import urlpatterns from apps.hrm.views import ClockRecordViewSet, EmployeeViewSet, FaceLogin, NotWorkRemarkViewSet from django.urls import path, include diff --git a/hb_server/apps/srm/views.py b/hb_server/apps/srm/views.py index 158489f..631380b 100644 --- a/hb_server/apps/srm/views.py +++ b/hb_server/apps/srm/views.py @@ -72,7 +72,7 @@ class ProcessNowView(CreateAPIView): 工序当前进度 """ perms_map = {'post':'*'} - serializers_class = serializers.Serializer + serializer_class = serializers.Serializer def create(self, request, *args, **kwargs): objs = SubProductionPlan.objects.filter(production_plan__state__in =[ProductionPlan.PLAN_STATE_WORKING, diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index d0fdffa..32a09e1 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -60,7 +60,8 @@ INSTALLED_APPS = [ 'apps.pm', 'apps.wpm', 'apps.srm', - 'apps.develop' + 'apps.develop', + 'apps.cms' ] X_FRAME_OPTIONS = 'SAMEORIGIN' diff --git a/hb_server/server/urls.py b/hb_server/server/urls.py index 50bc49f..2e95b54 100644 --- a/hb_server/server/urls.py +++ b/hb_server/server/urls.py @@ -72,6 +72,7 @@ urlpatterns = [ path('api/wpm/', include('apps.wpm.urls')), path('api/srm/', include('apps.srm.urls')), path('api/develop/', include('apps.develop.urls')), + path('api/cms/', include('apps.cms.urls')), # 工具 path('api/utils/signature/', GenSignature.as_view()),