From 258e1474ee9e291a44778772b5f0e82cf465206d Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Sat, 14 Jun 2025 16:48:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=99=E7=A8=8B=E7=9A=84AP?= =?UTF-8?q?I?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/dev_settings.py | 8 ++------ oj/settings.py | 11 ++++++----- oj/urls.py | 2 ++ tutorial/__init__.py | 1 + tutorial/models.py | 17 +++++++++++++++++ tutorial/serializers.py | 12 ++++++++++++ tutorial/urls/__init__.py | 1 + tutorial/urls/admin.py | 10 ++++++++++ tutorial/urls/tutorial.py | 10 ++++++++++ tutorial/views/admin.py | 17 +++++++++++++++++ tutorial/views/tutorial.py | 8 ++++++++ 11 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 tutorial/__init__.py create mode 100644 tutorial/models.py create mode 100644 tutorial/serializers.py create mode 100644 tutorial/urls/__init__.py create mode 100644 tutorial/urls/admin.py create mode 100644 tutorial/urls/tutorial.py create mode 100644 tutorial/views/admin.py create mode 100644 tutorial/views/tutorial.py diff --git a/oj/dev_settings.py b/oj/dev_settings.py index d83921c..6dba915 100644 --- a/oj/dev_settings.py +++ b/oj/dev_settings.py @@ -6,12 +6,8 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DATABASES = { "default": { - "ENGINE": "django.db.backends.postgresql", - "HOST": get_env("POSTGRES_HOST", "127.0.0.1"), - "PORT": get_env("POSTGRES_PORT", "5432"), - "NAME": get_env("POSTGRES_DB", "onlinejudge"), - "USER": get_env("POSTGRES_USER", "onlinejudge"), - "PASSWORD": get_env("POSTGRES_PASSWORD", "onlinejudge"), + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), } } diff --git a/oj/settings.py b/oj/settings.py index ce2b90a..cc3ac48 100644 --- a/oj/settings.py +++ b/oj/settings.py @@ -52,7 +52,8 @@ LOCAL_APPS = [ 'options', 'judge', 'message', - 'comment' + 'comment', + 'tutorial', ] INSTALLED_APPS = VENDOR_APPS + LOCAL_APPS @@ -209,10 +210,10 @@ def redis_config(db): "KEY_FUNCTION": make_key } - -CACHES = { - "default": redis_config(db=1) -} +if production_env: + CACHES = { + "default": redis_config(db=1) + } SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default" diff --git a/oj/urls.py b/oj/urls.py index 82e2f60..cab61bf 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -17,4 +17,6 @@ urlpatterns = [ path("api/", include("message.urls.oj")), path("api/", include("comment.urls.oj")), path("api/admin/", include("comment.urls.admin")), + path("api/", include("tutorial.urls.tutorial")), + path("api/admin/", include("tutorial.urls.admin")), ] diff --git a/tutorial/__init__.py b/tutorial/__init__.py new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/tutorial/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tutorial/models.py b/tutorial/models.py new file mode 100644 index 0000000..2178742 --- /dev/null +++ b/tutorial/models.py @@ -0,0 +1,17 @@ +from django.db import models +from account.models import User + +class Tutorial(models.Model): + title = models.CharField(max_length=128) + content = models.TextField() + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + is_public = models.BooleanField(default=False) + order = models.IntegerField(default=0) + + class Meta: + ordering = ['order', '-created_at'] + + def __str__(self): + return self.title \ No newline at end of file diff --git a/tutorial/serializers.py b/tutorial/serializers.py new file mode 100644 index 0000000..81895a7 --- /dev/null +++ b/tutorial/serializers.py @@ -0,0 +1,12 @@ +from rest_framework import serializers +from .models import Tutorial +from account.serializers import UserSerializer + +class TutorialSerializer(serializers.ModelSerializer): + created_by = UserSerializer(read_only=True) + + class Meta: + model = Tutorial + fields = ['id', 'title', 'content', 'created_by', 'created_at', + 'updated_at', 'is_public', 'order'] + read_only_fields = ['created_by', 'created_at', 'updated_at'] \ No newline at end of file diff --git a/tutorial/urls/__init__.py b/tutorial/urls/__init__.py new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/tutorial/urls/__init__.py @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tutorial/urls/admin.py b/tutorial/urls/admin.py new file mode 100644 index 0000000..c23011b --- /dev/null +++ b/tutorial/urls/admin.py @@ -0,0 +1,10 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from ..views.admin import AdminTutorialViewSet + +router = DefaultRouter() +router.register(r'tutorials', AdminTutorialViewSet) + +urlpatterns = [ + path('', include(router.urls)), +] \ No newline at end of file diff --git a/tutorial/urls/tutorial.py b/tutorial/urls/tutorial.py new file mode 100644 index 0000000..1b3964b --- /dev/null +++ b/tutorial/urls/tutorial.py @@ -0,0 +1,10 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from ..views.tutorial import TutorialViewSet + +router = DefaultRouter() +router.register(r'tutorials', TutorialViewSet) + +urlpatterns = [ + path('', include(router.urls)), +] \ No newline at end of file diff --git a/tutorial/views/admin.py b/tutorial/views/admin.py new file mode 100644 index 0000000..13df52a --- /dev/null +++ b/tutorial/views/admin.py @@ -0,0 +1,17 @@ +from rest_framework import viewsets, permissions +from account.decorators import super_admin_required +from ..models import Tutorial +from ..serializers import TutorialSerializer + +class AdminTutorialViewSet(viewsets.ModelViewSet): + queryset = Tutorial.objects.all() + serializer_class = TutorialSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_permissions(self): + if self.action in ['create', 'update', 'partial_update', 'destroy']: + return [super_admin_required()] + return [permissions.AllowAny()] + + def perform_create(self, serializer): + serializer.save(created_by=self.request.user) \ No newline at end of file diff --git a/tutorial/views/tutorial.py b/tutorial/views/tutorial.py new file mode 100644 index 0000000..2e4d5f8 --- /dev/null +++ b/tutorial/views/tutorial.py @@ -0,0 +1,8 @@ +from rest_framework import viewsets, permissions +from ..models import Tutorial +from ..serializers import TutorialSerializer + +class TutorialViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Tutorial.objects.filter(is_public=True) + serializer_class = TutorialSerializer + permission_classes = [permissions.AllowAny] \ No newline at end of file