From 4c3197f56c9c56ba1da87d43bacdb89e6d117208 Mon Sep 17 00:00:00 2001 From: = <=> Date: Thu, 30 Mar 2023 14:37:50 +0800 Subject: [PATCH] update: update construction: --- .gitignore | 2 + requirements.txt | 1 + requirements/common.txt | 1 - xxmweb/apps/__init__.py | 0 xxmweb/apps/account/__init__.py | 0 xxmweb/apps/account/admin.py | 3 + xxmweb/apps/account/apps.py | 7 ++ xxmweb/apps/account/migrations/__init__.py | 0 xxmweb/apps/account/models.py | 81 ++++++++++++++++++++ xxmweb/apps/account/tests.py | 3 + xxmweb/apps/account/views.py | 3 + xxmweb/apps/course/__init__.py | 0 xxmweb/apps/course/admin.py | 3 + xxmweb/apps/course/apps.py | 6 ++ xxmweb/apps/course/migrations/__init__.py | 0 xxmweb/apps/course/models.py | 86 ++++++++++++++++++++++ xxmweb/apps/course/tests.py | 3 + xxmweb/apps/course/views.py | 3 + xxmweb/libs/__init__.py | 0 xxmweb/settings.py | 25 +++++-- 20 files changed, 219 insertions(+), 8 deletions(-) delete mode 100644 requirements/common.txt create mode 100644 xxmweb/apps/__init__.py create mode 100644 xxmweb/apps/account/__init__.py create mode 100644 xxmweb/apps/account/admin.py create mode 100644 xxmweb/apps/account/apps.py create mode 100644 xxmweb/apps/account/migrations/__init__.py create mode 100644 xxmweb/apps/account/models.py create mode 100644 xxmweb/apps/account/tests.py create mode 100644 xxmweb/apps/account/views.py create mode 100644 xxmweb/apps/course/__init__.py create mode 100644 xxmweb/apps/course/admin.py create mode 100644 xxmweb/apps/course/apps.py create mode 100644 xxmweb/apps/course/migrations/__init__.py create mode 100644 xxmweb/apps/course/models.py create mode 100644 xxmweb/apps/course/tests.py create mode 100644 xxmweb/apps/course/views.py create mode 100644 xxmweb/libs/__init__.py diff --git a/.gitignore b/.gitignore index e69de29..82195aa 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,2 @@ +venv +.idea \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e69de29..4f9c041 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1 @@ +Django==3.2.18 \ No newline at end of file diff --git a/requirements/common.txt b/requirements/common.txt deleted file mode 100644 index 4f9c041..0000000 --- a/requirements/common.txt +++ /dev/null @@ -1 +0,0 @@ -Django==3.2.18 \ No newline at end of file diff --git a/xxmweb/apps/__init__.py b/xxmweb/apps/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xxmweb/apps/account/__init__.py b/xxmweb/apps/account/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xxmweb/apps/account/admin.py b/xxmweb/apps/account/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/xxmweb/apps/account/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/xxmweb/apps/account/apps.py b/xxmweb/apps/account/apps.py new file mode 100644 index 0000000..e5d5b19 --- /dev/null +++ b/xxmweb/apps/account/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + + +class AccountConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'account' diff --git a/xxmweb/apps/account/migrations/__init__.py b/xxmweb/apps/account/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xxmweb/apps/account/models.py b/xxmweb/apps/account/models.py new file mode 100644 index 0000000..43f38b6 --- /dev/null +++ b/xxmweb/apps/account/models.py @@ -0,0 +1,81 @@ +from django.contrib.auth.base_user import AbstractBaseUser +from django.db import models + + +# Create your models here. +class AccountType(object): + REGULAR_USER = "Regular User" + TEACHER = "Teacher" + ADMIN = "Admin" + SUPER_ADMIN = "Super Admin" + + +class Account(models.Model): + # id = models.CharField(primary_key=True) + username = models.TextField(unique=True) + real_name = models.TextField() + password = models.CharField(null=False) + email = models.EmailField(null=True) + create_time = models.DateTimeField(auto_now_add=True, null=True) + gender = models.TextField() + # One of UserType + account_type = models.TextField(default=AccountType.REGULAR_USER) + is_active = models.BooleanField(default=True) + avatar = models.TextField() + signature = models.TextField() + + def is_role(self): + return self.account_type + + def is_admin(self): + return self.account_type == AccountType.ADMIN + + def is_super_admin(self): + return self.account_type == AccountType.SUPER_ADMIN + + def is_admin_role(self): + return self.account_type in [AccountType.ADMIN, AccountType.SUPER_ADMIN] + + +class AccountProfile(Account): + blog = models.URLField(null=True) + mood = models.TextField(null=True) + github = models.TextField(null=True) + school = models.TextField(null=True) + major = models.TextField(null=True) + language = models.TextField(null=True) + # for acm + accepted_number = models.IntegerField(default=0) + # for OI + total_score = models.BigIntegerField(default=0) + submission_number = models.IntegerField(default=0) + + def add_accepted_problem_number(self): + self.accepted_number = models.F("accepted_number") + 1 + self.save() + + def add_submission_number(self): + self.submission_number = models.F("submission_number") + 1 + self.save() + + # 计算总分时, 应先减掉上次该题所得分数, 然后再加上本次所得分数 + def add_score(self, this_time_score, last_time_score=None): + last_time_score = last_time_score or 0 + self.total_score = models.F("total_score") - last_time_score + this_time_score + self.save() + + class Meta: + db_table = "user_profile" + + +class Teacher(Account): + account_type = models.TextField(default=AccountType.TEACHER) + + def is_teacher(self): + return self.account_type == AccountType.TEACHER + +class Student(Account): + account_type = models.TextField(default=AccountType.TEACHER) + + def is_teacher(self): + return self.account_type == AccountType.TEACHER diff --git a/xxmweb/apps/account/tests.py b/xxmweb/apps/account/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/xxmweb/apps/account/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/xxmweb/apps/account/views.py b/xxmweb/apps/account/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/xxmweb/apps/account/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/xxmweb/apps/course/__init__.py b/xxmweb/apps/course/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xxmweb/apps/course/admin.py b/xxmweb/apps/course/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/xxmweb/apps/course/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/xxmweb/apps/course/apps.py b/xxmweb/apps/course/apps.py new file mode 100644 index 0000000..25f0187 --- /dev/null +++ b/xxmweb/apps/course/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CourseConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'course' diff --git a/xxmweb/apps/course/migrations/__init__.py b/xxmweb/apps/course/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xxmweb/apps/course/models.py b/xxmweb/apps/course/models.py new file mode 100644 index 0000000..da46489 --- /dev/null +++ b/xxmweb/apps/course/models.py @@ -0,0 +1,86 @@ +from enum import Enum + +from django.db import models +from xxmweb.apps.account.models import Teacher, Student + + +# Create your models here. + +class HardType(str, Enum): + EASY = '入门' + BASE = '基础' + MEDIUM = '提高' + HARD = '进阶' + Course_HardType_Choices = [ + ('EASY', EASY), + ('BASE', BASE), + ('MEDIUM', MEDIUM), + ('HARD', HARD) + ] + + +class Category(models.Model): + id = models.CharField(primary_key=True, auto_created=True) + + +class Course(models.Model): + id = models.CharField(primary_key=True, auto_created=True) + title = models.CharField(max_length=255, null=False, verbose_name="课程标题") + introduction = models.CharField( + max_length=255, default="", verbose_name="课程介绍") + img = models.ImageField(upload_to="Lesson_img", verbose_name="课程图片") + banner = models.ImageField(upload_to="Lesson_banner", verbose_name="课程Banner") + price = models.IntegerField(default=0, verbose_name="课程价格") + is_discount = models.BooleanField(verbose_name="是否打折") + discount_Price = models.IntegerField(default=0, verbose_name="打折后价格") + create_time = models.DateTimeField( + auto_now=True, max_length=255, verbose_name="课程创建时间") + persons = models.IntegerField(default=0, verbose_name="学习人数") + hard = models.CharField(choices=HardType.Course_HardType_Choices) + + # 课程分类 + category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name="课程分类", default="", + blank=True, db_constraint=False) + + # 课程老师 + teacher = models.OneToOneField(Teacher, on_delete=models.DO_NOTHING, verbose_name="课程讲师", default="", + blank=True, db_constraint=False) + + # 参加学生 + student = models.ManyToManyField(Student,db_constraint=False,blank=True,) + class Meta: + verbose_name = '课程' + verbose_name_plural = verbose_name + +class Chapter(models.Model): + id = models.CharField(primary_key=True, auto_created=True) + title = models.CharField(max_length=255, null=False, verbose_name="课程标题") + introduction = models.CharField( + max_length=255, default="", verbose_name="课程介绍") + course = models.ForeignKey(Course,on_delete=models.DO_NOTHING,verbose_name="章节") + +class Catalog(models.Model): + lessonid = models.CharField(max_length=255, verbose_name="课程id") + introduction = models.CharField( + max_length=255, default="", verbose_name="课程介绍") + isComplete = models.BooleanField(verbose_name="是否完结") + + class Meta: + verbose_name = '课程目录信息' + verbose_name_plural = verbose_name + + +class Lesson(models.Model): + title = models.CharField(max_length=255, verbose_name="课程标题", unique=True) + introduction = models.CharField( + max_length=255, default="", verbose_name="课程介绍") + img = models.ImageField(upload_to="Lesson_img", + max_length=255, verbose_name="课程图片") + create_time = models.DateTimeField( + auto_now=True, max_length=255, verbose_name="课程添加时间") + click_count = models.IntegerField(default=0, verbose_name="学习人数") + # comments = models.IntegerField(default=0, verbose_name="评论数") + # video = models.OneToOneField() + class Meta: + verbose_name = '课程' + verbose_name_plural = verbose_name diff --git a/xxmweb/apps/course/tests.py b/xxmweb/apps/course/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/xxmweb/apps/course/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/xxmweb/apps/course/views.py b/xxmweb/apps/course/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/xxmweb/apps/course/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/xxmweb/libs/__init__.py b/xxmweb/libs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/xxmweb/settings.py b/xxmweb/settings.py index 171bb2a..2445cea 100644 --- a/xxmweb/settings.py +++ b/xxmweb/settings.py @@ -31,6 +31,7 @@ ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ + 'xxmweb.apps.account.apps.AccountConfig' 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -73,14 +74,24 @@ WSGI_APPLICATION = 'xxmweb.wsgi.application' # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': BASE_DIR / 'db.sqlite3', +# } +# } DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'xxm_oj', + 'USER': 'root', + 'PASSWORD': 'root', + 'HOST': '127.0.0.1', + 'PORT': '3306', + 'DEFAULT-CHARACTER-SET': 'utf8', } } - # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators @@ -103,16 +114,16 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/3.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = 'zh-hans' -TIME_ZONE = 'UTC' +TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True -USE_TZ = True - +# USE_TZ = True +USE_TZ = False # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.2/howto/static-files/