ソースを参照

计划删除allauth,allauth无法匹配react

Shellmiao 4 年 前
コミット
1cc8e46409

+ 14 - 3
CrawKeywords/admin.py

@@ -1,10 +1,10 @@
 from django.contrib import admin
-from .models import KeywordMission, DateMission, TimeMission
+from .models import KeywordMission, DateMission, TimeMission, PageMission, ArticleMission
 
 
 # Register your models here.
 class KeywordMissionAdmin(admin.ModelAdmin):
-    list_display = ["keyword_mission_id", "keyword"]
+    list_display = ["keyword_mission_id", "keyword", "publisher"]
 
 
 class DateMissionAdmin(admin.ModelAdmin):
@@ -12,9 +12,20 @@ class DateMissionAdmin(admin.ModelAdmin):
 
 
 class TimeMissionAdmin(admin.ModelAdmin):
-    list_display = ["time_mission_id", "time", "is_time_finished", "keyword_mission", "date_mission"]
+    list_display = ["time_mission_id", "time", "is_time_finished", "date_mission"]
+
+
+class PageMissionAdmin(admin.ModelAdmin):
+    list_display = ["page_mission_id", "page", "time_mission", "finisher"]
+
+
+class ArticleMissionAdmin(admin.ModelAdmin):
+    list_display = ["article_mission_id", "page_mission", "article_id", "publish_time", "content", "like_count",
+                    "comment_count"]
 
 
 admin.site.register(KeywordMission, KeywordMissionAdmin)
 admin.site.register(DateMission, DateMissionAdmin)
 admin.site.register(TimeMission, TimeMissionAdmin)
+admin.site.register(PageMission, PageMissionAdmin)
+admin.site.register(ArticleMission, ArticleMissionAdmin)

+ 2 - 0
CrawKeywords/form.py

@@ -0,0 +1,2 @@
+from django import forms
+

+ 32 - 9
CrawKeywords/migrations/0001_initial.py

@@ -1,5 +1,6 @@
-# Generated by Django 3.2.5 on 2021-07-30 16:07
+# Generated by Django 3.2.5 on 2021-08-07 09:49
 
+from django.conf import settings
 from django.db import migrations, models
 import django.db.models.deletion
 
@@ -9,6 +10,7 @@ class Migration(migrations.Migration):
     initial = True
 
     dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
     ]
 
     operations = [
@@ -20,13 +22,6 @@ class Migration(migrations.Migration):
                 ('is_date_finished', models.BooleanField(default=False)),
             ],
         ),
-        migrations.CreateModel(
-            name='KeywordMission',
-            fields=[
-                ('keyword_mission_id', models.AutoField(primary_key=True, serialize=False)),
-                ('keyword', models.CharField(max_length=256)),
-            ],
-        ),
         migrations.CreateModel(
             name='TimeMission',
             fields=[
@@ -34,7 +29,23 @@ class Migration(migrations.Migration):
                 ('time', models.DateTimeField()),
                 ('is_time_finished', models.BooleanField(default=False)),
                 ('date_mission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='TimeMission', to='CrawKeywords.datemission')),
-                ('keyword_mission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='TimeMission', to='CrawKeywords.keywordmission')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='PageMission',
+            fields=[
+                ('page_mission_id', models.AutoField(primary_key=True, serialize=False)),
+                ('page', models.BigIntegerField()),
+                ('finisher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='PageMission', to=settings.AUTH_USER_MODEL)),
+                ('time_mission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='PageMission', to='CrawKeywords.timemission')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='KeywordMission',
+            fields=[
+                ('keyword_mission_id', models.AutoField(primary_key=True, serialize=False)),
+                ('keyword', models.CharField(max_length=256)),
+                ('publisher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='publisher', to=settings.AUTH_USER_MODEL)),
             ],
         ),
         migrations.AddField(
@@ -42,4 +53,16 @@ class Migration(migrations.Migration):
             name='keyword_mission',
             field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='DateMission', to='CrawKeywords.keywordmission'),
         ),
+        migrations.CreateModel(
+            name='ArticleMission',
+            fields=[
+                ('article_mission_id', models.AutoField(primary_key=True, serialize=False)),
+                ('article_id', models.CharField(max_length=100)),
+                ('publish_time', models.DateTimeField()),
+                ('content', models.TextField()),
+                ('like_count', models.IntegerField()),
+                ('comment_count', models.IntegerField()),
+                ('page_mission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ArticleMission', to='CrawKeywords.pagemission')),
+            ],
+        ),
     ]

+ 46 - 3
CrawKeywords/models.py

@@ -1,4 +1,5 @@
 from django.db import models
+from django.contrib.auth.models import User
 
 
 #  关键词任务表
@@ -6,7 +7,9 @@ class KeywordMission(models.Model):
     # 关键词任务id
     keyword_mission_id = models.AutoField(primary_key=True)
     # 关键词
-    keyword = models.CharField(max_length=256)
+    keyword = models.CharField(max_length=256, unique=True)
+    # 发起者
+    publisher = models.ForeignKey(User, on_delete=models.CASCADE, related_name='publisher')
 
 
 #  日期任务表
@@ -20,6 +23,9 @@ class DateMission(models.Model):
     # 关键词任务
     keyword_mission = models.ForeignKey(KeywordMission, on_delete=models.CASCADE, related_name='DateMission')
 
+    class Meta:
+        unique_together = ('date', 'keyword_mission',)
+
 
 #  时间任务表
 class TimeMission(models.Model):
@@ -29,7 +35,44 @@ class TimeMission(models.Model):
     time = models.DateTimeField()
     # 是否已完成
     is_time_finished = models.BooleanField(default=False)
-    # 关键词任务
-    keyword_mission = models.ForeignKey(KeywordMission, on_delete=models.CASCADE, related_name='TimeMission')
     # 日期任务
     date_mission = models.ForeignKey(DateMission, on_delete=models.CASCADE, related_name='TimeMission')
+
+    class Meta:
+        unique_together = ('time', 'date_mission',)
+
+
+#  页面任务表
+class PageMission(models.Model):
+    # 页面任务id
+    page_mission_id = models.AutoField(primary_key=True)
+    # 页码
+    page = models.BigIntegerField()
+    # 时间任务
+    time_mission = models.ForeignKey(TimeMission, on_delete=models.CASCADE, related_name='PageMission')
+    # 完成者
+    finisher = models.ForeignKey(User, on_delete=models.CASCADE, related_name='PageMission')
+
+    class Meta:
+        unique_together = ('page', 'time_mission',)
+
+
+# 微博文章
+class ArticleMission(models.Model):
+    # 文章任务id
+    article_mission_id = models.AutoField(primary_key=True)
+    # 文章任务
+    page_mission = models.ForeignKey(PageMission, on_delete=models.CASCADE, related_name='ArticleMission')
+    # 文章ID
+    article_id = models.CharField(max_length=100)
+    # 发表时间
+    publish_time = models.DateTimeField()
+    # 内容
+    content = models.TextField()
+    # 点赞数
+    like_count = models.IntegerField()
+    # 评论数
+    comment_count = models.IntegerField()
+
+    class Meta:
+        unique_together = ('article_id', 'page_mission',)

+ 50 - 0
CrawKeywords/serializers.py

@@ -0,0 +1,50 @@
+from .models import KeywordMission, DateMission, TimeMission, PageMission
+from rest_framework import serializers
+from django.contrib.auth.models import User
+
+
+class KeywordMissionSerializer(serializers.HyperlinkedModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name="CrawKeywords:keywordmission-detail")
+    publisher = serializers.HyperlinkedRelatedField(view_name='CrawKeywords:user-detail', queryset=User.objects.all())
+
+    class Meta:
+        model = KeywordMission
+        fields = ('url', 'keyword_mission_id', 'keyword', 'publisher')
+
+
+class UserSerializer(serializers.HyperlinkedModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name="CrawKeywords:user-detail")
+
+    class Meta:
+        model = User
+        fields = ('url', 'username', 'email')
+
+
+class DateMissionSerializer(serializers.HyperlinkedModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name="CrawKeywords:datemission-detail")
+    keyword_mission = serializers.HyperlinkedRelatedField(view_name='CrawKeywords:keywordmission-detail',
+                                                          queryset=KeywordMission.objects.all())
+
+    class Meta:
+        model = DateMission
+        fields = ('url', 'date', 'is_date_finished', 'keyword_mission')
+
+
+class TimeMissionSerializer(serializers.HyperlinkedModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name="CrawKeywords:timemission-detail")
+    date_mission = serializers.HyperlinkedRelatedField(view_name='CrawKeywords:datemission-detail',
+                                                       queryset=DateMission.objects.all())
+
+    class Meta:
+        model = TimeMission
+        fields = ('url', 'time', 'is_time_finished', 'date_mission')
+
+
+class PageMissionSerializer(serializers.HyperlinkedModelSerializer):
+    url = serializers.HyperlinkedIdentityField(view_name="CrawKeywords:pagemission-detail")
+    time_mission = serializers.HyperlinkedRelatedField(view_name='CrawKeywords:timemission-detail',
+                                                       queryset=TimeMission.objects.all())
+
+    class Meta:
+        model = TimeMission
+        fields = ('url', 'page', 'time_mission', 'finisher')

+ 17 - 0
CrawKeywords/urls.py

@@ -0,0 +1,17 @@
+from django.conf.urls import url, include
+from rest_framework import routers
+from .views import KeywordMissionViewSet, DateMissionViewSet, TimeMissionViewSet, PageMissionViewSet, UserViewSet
+
+router = routers.DefaultRouter()
+router.register(r'keyword_mission', KeywordMissionViewSet, basename="keywordmission")
+router.register(r'user', UserViewSet, basename="user")
+router.register(r'date_mission', DateMissionViewSet, basename="datemission")
+router.register(r'time_mission', TimeMissionViewSet, basename="timemission")
+router.register(r'page_mission', PageMissionViewSet, basename="pagemission")
+
+# 使用自动URL路由连接API。
+# 另外,我们还包括支持浏览器浏览API的登录URL。
+urlpatterns = [
+    url(r'^', include(router.urls)),
+    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
+]

+ 45 - 2
CrawKeywords/views.py

@@ -1,3 +1,46 @@
-from django.shortcuts import render
+from .models import KeywordMission, DateMission, TimeMission, PageMission
+from rest_framework.parsers import JSONParser
+from rest_framework import viewsets
+from .serializers import UserSerializer, KeywordMissionSerializer, DateMissionSerializer, TimeMissionSerializer, \
+    PageMissionSerializer
+from django.contrib.auth.models import User
 
-# Create your views here.
+
+class KeywordMissionViewSet(viewsets.ModelViewSet):
+    """
+    允许用户查看或编辑的API路径。
+    """
+    queryset = KeywordMission.objects.all()
+    serializer_class = KeywordMissionSerializer
+
+
+class UserViewSet(viewsets.ModelViewSet):
+    """
+    允许用户查看或编辑的API路径。
+    """
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
+
+
+class DateMissionViewSet(viewsets.ModelViewSet):
+    """
+    允许用户查看或编辑的API路径。
+    """
+    queryset = DateMission.objects.all()
+    serializer_class = DateMissionSerializer
+
+
+class TimeMissionViewSet(viewsets.ModelViewSet):
+    """
+    允许用户查看或编辑的API路径。
+    """
+    queryset = TimeMission.objects.all()
+    serializer_class = TimeMissionSerializer
+
+
+class PageMissionViewSet(viewsets.ModelViewSet):
+    """
+    允许用户查看或编辑的API路径。
+    """
+    queryset = PageMission.objects.all()
+    serializer_class = PageMissionSerializer

+ 1 - 1
Profile/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 3.2.5 on 2021-07-30 16:21
+# Generated by Django 3.2.5 on 2021-08-07 09:49
 
 from django.conf import settings
 from django.db import migrations, models

+ 23 - 0
WeiBoCrawler/settings.py

@@ -35,6 +35,7 @@ INSTALLED_APPS = [
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'rest_framework',
     'CrawKeywords',
     'Profile',
     # The following apps are required:
@@ -42,6 +43,8 @@ INSTALLED_APPS = [
     'allauth',
     'allauth.account',
     'allauth.socialaccount',
+    'corsheaders',
+
 ]
 
 MIDDLEWARE = [
@@ -52,6 +55,7 @@ MIDDLEWARE = [
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
+    'corsheaders.middleware.CorsMiddleware',
 ]
 
 ROOT_URLCONF = 'WeiBoCrawler.urls'
@@ -168,3 +172,22 @@ USE_TZ = True
 # https://docs.djangoproject.com/en/2.0/howto/static-files/
 
 STATIC_URL = '/static/'
+
+REST_FRAMEWORK = {
+    'DEFAULT_RENDERER_CLASSES': (
+        'rest_framework.renderers.BrowsableAPIRenderer',
+        'rest_framework.renderers.JSONRenderer',
+    )
+}
+
+# 凡是出现在白名单中的域名,都可以访问后端接口
+# 添加 django-cors-headers 的白名单, 使白名单中的 host 可以进行跨域请求
+# CORS_ORIGIN_WHITELIST = (
+#     # 白名单:
+#     "127.0.0.1:3000"
+# )
+
+CORS_ORIGIN_ALLOW_ALL = True  # 所有人
+
+# 允许白名单中的 host 跨域请求时携带 cookie
+CORS_ALLOW_CREDENTIALS = True

+ 1 - 1
WeiBoCrawler/urls.py

@@ -18,6 +18,6 @@ from django.urls import path, include
 
 urlpatterns = [
     path('admin/', admin.site.urls),
-#    path('craw_keywords/', include(('CrawKeywords.urls', "CrawKeywords"), namespace='CrawKeywords')),
+    path('craw_keywords/', include(('CrawKeywords.urls', "CrawKeywords"), namespace='CrawKeywords')),
     path('accounts/', include('allauth.urls')),
 ]

BIN
设计原型图/数据库结构.ngm


BIN
设计原型图/数据库结构.png