Browse Source

完成了发布文章,草稿箱等功能,接下来做文章列表

Shellmiao 3 years ago
parent
commit
5d3dc051a2

BIN
Design/数据库设计.ngm


+ 1 - 1
ShellmiaoBlog/Account/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 3.2.5 on 2021-09-27 08:56
+# Generated by Django 3.2.5 on 2021-10-04 05:49
 
 from django.conf import settings
 from django.db import migrations, models

+ 0 - 0
ShellmiaoBlog/Article/__init__.py


+ 25 - 0
ShellmiaoBlog/Article/admin.py

@@ -0,0 +1,25 @@
+from django.contrib import admin
+from .models import Article, Tag, ArticleClass, Draft
+
+
+# Register your models here.
+class ArticleAdmin(admin.ModelAdmin):
+    list_display = ["ArticleId", "Publisher", "Title", "Content", "Cover", "Read", "Like", "Publish_Time", "Edit_Time"]
+
+
+class ArticleClassAdmin(admin.ModelAdmin):
+    list_display = ["Name", ]
+
+
+class TagAdmin(admin.ModelAdmin):
+    list_display = ["Name", ]
+
+
+class DraftAdmin(admin.ModelAdmin):
+    list_display = ["DraftId", "Poster", "Title", "Content", "Add_Time", "Edit_Time", ]
+
+
+admin.site.register(Article, ArticleAdmin)
+admin.site.register(Tag, TagAdmin)
+admin.site.register(ArticleClass, ArticleClassAdmin)
+admin.site.register(Draft, DraftAdmin)

+ 6 - 0
ShellmiaoBlog/Article/apps.py

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

+ 46 - 0
ShellmiaoBlog/Article/migrations/0001_initial.py

@@ -0,0 +1,46 @@
+# Generated by Django 3.2.5 on 2021-10-04 05:49
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ArticleClass',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('Name', models.CharField(max_length=50)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Tag',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('Name', models.CharField(max_length=50)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Article',
+            fields=[
+                ('ArticleId', models.AutoField(primary_key=True, serialize=False)),
+                ('Title', models.CharField(max_length=50)),
+                ('Content', models.TextField()),
+                ('Read', models.IntegerField()),
+                ('Like', models.IntegerField()),
+                ('Publish_Time', models.DateTimeField(auto_now_add=True)),
+                ('Edit_Time', models.DateTimeField(auto_now=True)),
+                ('Class', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Article.articleclass')),
+                ('Publisher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='Poster', to=settings.AUTH_USER_MODEL)),
+                ('Tag', models.ManyToManyField(to='Article.Tag')),
+            ],
+        ),
+    ]

+ 0 - 0
ShellmiaoBlog/Article/migrations/__init__.py


+ 33 - 0
ShellmiaoBlog/Article/models.py

@@ -0,0 +1,33 @@
+from django.db import models
+from django.contrib.auth.models import User
+
+
+class Tag(models.Model):
+    Name = models.CharField(blank=False, max_length=50)
+
+
+class ArticleClass(models.Model):
+    Name = models.CharField(blank=False, max_length=50)
+
+
+class Article(models.Model):
+    ArticleId = models.AutoField(primary_key=True)
+    Publisher = models.ForeignKey(User, on_delete=models.CASCADE, related_name='Publisher')
+    Title = models.CharField(blank=False, max_length=50)
+    Content = models.TextField(blank=False)
+    Cover = models.URLField(blank=True, max_length=5000)
+    Read = models.IntegerField()
+    Like = models.IntegerField()
+    Publish_Time = models.DateTimeField(auto_now_add=True)
+    Edit_Time = models.DateTimeField(auto_now=True)
+    Tag = models.ManyToManyField(Tag, blank=True)
+    Class = models.ForeignKey(ArticleClass, on_delete=models.SET_NULL, null=True)
+
+
+class Draft(models.Model):
+    DraftId = models.AutoField(primary_key=True)
+    Poster = models.ForeignKey(User, on_delete=models.CASCADE, related_name='Poster')
+    Title = models.CharField(blank=True, max_length=50)
+    Content = models.TextField(blank=True)
+    Add_Time = models.DateTimeField(auto_now_add=True)
+    Edit_Time = models.DateTimeField(auto_now=True)

+ 3 - 0
ShellmiaoBlog/Article/tests.py

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

+ 9 - 0
ShellmiaoBlog/Article/urls.py

@@ -0,0 +1,9 @@
+from django.urls import path
+from . import views
+
+urlpatterns = [
+    path('post/', views.post_article, name='post'),
+    path('post/classes', views.get_article_classes, name='classes'),
+    path('post/tags', views.get_article_tags, name='tags'),
+    path('post/save', views.save_draft, name='save'),
+]

+ 123 - 0
ShellmiaoBlog/Article/views.py

@@ -0,0 +1,123 @@
+from django.http import JsonResponse
+from django.contrib.auth.decorators import login_required
+from .models import Article, Tag, ArticleClass, Draft
+
+
+@login_required(login_url='/account/login/')
+def post_article(request):
+    if request.method == 'POST':
+        data = request.POST
+        article_class = ArticleClass.objects.filter(Name=data['class'])
+        if article_class:
+            new_article = Article()
+            new_article.Publisher = request.user
+            new_article.Title = data['title']
+            new_article.Content = data['content']
+            new_article.Cover = data['cover']
+            new_article.Class = article_class.get()
+            new_article.Read = 0
+            new_article.Like = 0
+            new_article.save()
+            for i in range(0, 100):
+                try:
+                    tag_name = data['tag[' + str(i) + ']']
+                    tag = Tag.objects.filter(Name=tag_name)
+                    if tag:
+                        new_article.Tag.add(tag.get())
+                    else:
+                        new_article.Tag.create(Name=tag_name)
+                except Exception as e:
+                    break
+            new_article.save()
+            res = {
+                'code': '402',
+                'message': 'Publish Successfully'
+            }
+            return JsonResponse(res)
+        else:
+            res = {
+                'code': '403',
+                'message': 'Invalid data'
+            }
+            return JsonResponse(res)
+    else:
+        # 请求方法错误,请使用POST
+        res = {
+            'code': '401',
+            'message': 'Please Use POST'
+        }
+        return JsonResponse(res)
+
+
+def article_list(request):
+    articles = Article.object.all()
+    res = {
+        'code': '402',
+        'articles': []
+    }
+    for article in articles:
+        res[articles].append({
+            'Id': article.ArticleId,
+            'Title': article.Title,
+            'Content': article.Content,
+            'Publisher': article.Publisher.username,
+            'Read': article.Read,
+            'Like': article.Like,
+            'Publish_Time': article.Publish_Time,
+            'Edit_Time': article.Edit_Time,
+        })
+    return JsonResponse(res, safe=False)
+
+
+@login_required(login_url='/account/login/')
+def get_article_classes(request):
+    aclasses = ArticleClass.objects.all()
+    classes = []
+    for aclass in aclasses:
+        classes.append(aclass.Name)
+    res = {
+        'code': '402',
+        'classes': classes
+    }
+    return JsonResponse(res)
+
+
+@login_required(login_url='/account/login/')
+def get_article_tags(request):
+    tags = []
+    for tag in Tag.objects.all():
+        tags.append(tag.Name)
+    res = {
+        'code': '402',
+        'tags': tags
+    }
+    return JsonResponse(res)
+
+
+@login_required(login_url='/account/login/')
+def save_draft(request):
+    if request.method == 'POST':
+        data = request.POST
+        draft = Draft.objects.filter(Title=data['title'], Poster=request.user)
+        if draft:
+            draft = draft.get()
+            draft.Content = data['content']
+            draft.save()
+        else:
+            new_draft = Draft()
+            new_draft.Title = data['title']
+            new_draft.Content = data['content']
+            new_draft.Poster = request.user
+            new_draft.save()
+        res = {
+            'code': '402',
+            'message': 'Saved Successfully'
+        }
+        return JsonResponse(res)
+    else:
+        # 请求方法错误,请使用POST
+        res = {
+            'code': '401',
+            'message': 'Please Use POST'
+        }
+        return JsonResponse(res)

+ 1 - 0
ShellmiaoBlog/ShellmiaoBlog/settings.py

@@ -36,6 +36,7 @@ INSTALLED_APPS = [
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'Account',
+    'Article',
     'corsheaders',
 ]
 

+ 2 - 1
ShellmiaoBlog/ShellmiaoBlog/urls.py

@@ -18,5 +18,6 @@ from django.urls import path, include
 
 urlpatterns = [
     path('admin/', admin.site.urls),
-    path('account/', include(('Account.urls', 'Account'), namespace='Account'))
+    path('account/', include(('Account.urls', 'Account'), namespace='Account')),
+    path('article/', include(('Article.urls', 'Article'), namespace='Article'))
 ]

BIN
ShellmiaoBlog/db.sqlite3