feat: 添加cms模块创建article表

This commit is contained in:
caoqianming 2024-11-18 10:42:33 +08:00
parent 4518344fa6
commit 71db15bacd
13 changed files with 110 additions and 3 deletions

0
apps/cms/__init__.py Normal file
View File

3
apps/cms/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
apps/cms/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class CmsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.cms'

View File

@ -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,
},
),
]

View File

11
apps/cms/models.py Normal file
View File

@ -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="阅读数")

9
apps/cms/serializers.py Normal file
View File

@ -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"]

3
apps/cms/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

12
apps/cms/urls.py Normal file
View File

@ -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)),
]

23
apps/cms/views.py Normal file
View File

@ -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})

View File

@ -149,10 +149,10 @@ class MlogViewSet(CustomModelViewSet):
""" """
queryset = Mlog.objects.all() queryset = Mlog.objects.all()
serializer_class = MlogSerializer 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', 'handle_user', 'handle_user_2', 'equipment',
'equipment_2', 'material_in', 'material_out', 'route__routepack', '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', prefetch_related_fields = ['handle_users',
'material_outs', 'b_mlog', 'equipments'] 'material_outs', 'b_mlog', 'equipments']
filterset_class = MlogFilter filterset_class = MlogFilter

View File

@ -79,7 +79,8 @@ INSTALLED_APPS = [
'apps.enp', 'apps.enp',
'apps.edu', 'apps.edu',
'apps.dpm', 'apps.dpm',
'apps.cm' 'apps.cm',
'apps.cms'
] ]
MIDDLEWARE = [ MIDDLEWARE = [

View File

@ -69,6 +69,7 @@ urlpatterns = [
path('', include('apps.edu.urls')), path('', include('apps.edu.urls')),
path('', include('apps.dpm.urls')), path('', include('apps.dpm.urls')),
path('', include('apps.cm.urls')), path('', include('apps.cm.urls')),
path('', include('apps.cms.urls')),
# 前端页面入口 # 前端页面入口
path('', TemplateView.as_view(template_name="index.html")), path('', TemplateView.as_view(template_name="index.html")),