|
|
|
|
|
from django.db import models
|
|
|
|
|
|
from apps.base.models import BaseModel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProblemType(models.IntegerChoices):
|
|
|
|
|
|
ACM = 0
|
|
|
|
|
|
OI = 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProblemAuth(models.IntegerChoices):
|
|
|
|
|
|
PUBLIC = 0
|
|
|
|
|
|
PRIVATE = 1
|
|
|
|
|
|
CONTEST = 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Degree(models.IntegerChoices):
|
|
|
|
|
|
EASY = 0
|
|
|
|
|
|
BASE = 1
|
|
|
|
|
|
MEDIUM = 2
|
|
|
|
|
|
HARD = 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VideoStatus(models.IntegerChoices):
|
|
|
|
|
|
PRIVATE = 0
|
|
|
|
|
|
UPLOADING = 1
|
|
|
|
|
|
PUBLIC = 2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CourseLevel(models.IntegerChoices):
|
|
|
|
|
|
EASY = 0
|
|
|
|
|
|
BASE = 1
|
|
|
|
|
|
Advanced = 2
|
|
|
|
|
|
PRO = 3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JudgeType(models.TextChoices):
|
|
|
|
|
|
SPJ = "spj"
|
|
|
|
|
|
COMMON = "common"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ChapterIndex(models.TextChoices):
|
|
|
|
|
|
ONE = "第一章"
|
|
|
|
|
|
TWO = "第二章"
|
|
|
|
|
|
THREE = "第三章"
|
|
|
|
|
|
FOUR = "第四章"
|
|
|
|
|
|
FIVE = "第五章"
|
|
|
|
|
|
SIX = "第六章"
|
|
|
|
|
|
SEVEN = "第七章"
|
|
|
|
|
|
EIGHT = "第八章"
|
|
|
|
|
|
NINE = "第九章"
|
|
|
|
|
|
TEN = "第十章"
|
|
|
|
|
|
ELEVEN = "第十一章"
|
|
|
|
|
|
TWELVE = "第十二章"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Course(BaseModel):
|
|
|
|
|
|
"""课程模型
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
title = models.CharField(max_length=50)
|
|
|
|
|
|
description = models.TextField(null=True)
|
|
|
|
|
|
price = models.FloatField(default=0)
|
|
|
|
|
|
cover_img_url = models.CharField(max_length=255)
|
|
|
|
|
|
view_count = models.IntegerField(default=0)
|
|
|
|
|
|
sale_count = models.IntegerField(default=0)
|
|
|
|
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
|
|
# 课程分类,默认为基础
|
|
|
|
|
|
level = models.IntegerField(
|
|
|
|
|
|
choices=CourseLevel.choices, default=CourseLevel.BASE)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Chapter(BaseModel):
|
|
|
|
|
|
"""章节模型
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
index = models.CharField(choices=ChapterIndex.choices,max_length=50)
|
|
|
|
|
|
title = models.CharField(max_length=100)
|
|
|
|
|
|
description = models.TextField(null=True)
|
|
|
|
|
|
cover_img_url = models.CharField(max_length=255, default=None)
|
|
|
|
|
|
view_count = models.IntegerField(default=0)
|
|
|
|
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
|
|
|
|
|
|
|
|
course_id = models.ForeignKey(
|
|
|
|
|
|
Course, on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Lession(BaseModel):
|
|
|
|
|
|
"""节模型
|
|
|
|
|
|
"""
|
|
|
|
|
|
index = models.IntegerField()
|
|
|
|
|
|
title = models.CharField(max_length=100)
|
|
|
|
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
|
|
# 一个章节有多节课,one to many
|
|
|
|
|
|
chapter_id = models.ForeignKey(
|
|
|
|
|
|
Chapter, on_delete=models.CASCADE)
|
|
|
|
|
|
# 一节课一个视频,一个视频多节课,one to many
|
|
|
|
|
|
# 一节课有多个问题,一个问题有多节课 ,many to many
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Video(BaseModel):
|
|
|
|
|
|
"""视频模型
|
|
|
|
|
|
"""
|
|
|
|
|
|
title = models.CharField(max_length=100)
|
|
|
|
|
|
img_url = models.CharField(max_length=255)
|
|
|
|
|
|
video_url = models.CharField(max_length=255)
|
|
|
|
|
|
count = models.IntegerField(default=0)
|
|
|
|
|
|
is_free = models.BooleanField(default=False)
|
|
|
|
|
|
duration = models.IntegerField() # s
|
|
|
|
|
|
size = models.IntegerField() # kb
|
|
|
|
|
|
status = models.IntegerField(choices=VideoStatus.choices, default=VideoStatus.PUBLIC)
|
|
|
|
|
|
description = models.CharField(max_length=255, null=True)
|
|
|
|
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
|
|
lession = models.OneToOneField(
|
|
|
|
|
|
Lession, on_delete=models.DO_NOTHING)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Problem(BaseModel):
|
|
|
|
|
|
"""问题模型"""
|
|
|
|
|
|
judge_type = models.CharField(choices=JudgeType.choices, max_length=10, default=JudgeType.COMMON)
|
|
|
|
|
|
problem_id = models.CharField(max_length=20, unique=True)
|
|
|
|
|
|
title = models.CharField(max_length=100)
|
|
|
|
|
|
type = models.IntegerField(choices=ProblemType.choices, default=ProblemType.OI)
|
|
|
|
|
|
time_limit = models.IntegerField(default=1000) # 1000ms
|
|
|
|
|
|
memory_limit = models.IntegerField(default=128) # 128mb
|
|
|
|
|
|
start_limit = models.IntegerField(default=128) # 128mb
|
|
|
|
|
|
description = models.TextField()
|
|
|
|
|
|
input_description = models.TextField()
|
|
|
|
|
|
output_description = models.TextField()
|
|
|
|
|
|
examples = models.TextField()
|
|
|
|
|
|
degree = models.IntegerField(choices=Degree.choices, default=Degree.BASE)
|
|
|
|
|
|
hint = models.TextField(null=True)
|
|
|
|
|
|
auth = models.IntegerField(choices=ProblemAuth.choices, default=ProblemAuth.PUBLIC)
|
|
|
|
|
|
io_score = models.IntegerField(default=100) # 满分100
|
|
|
|
|
|
code_share = models.BooleanField(default=True)
|
|
|
|
|
|
spj_code = models.TextField(null=True)
|
|
|
|
|
|
spj_language = models.CharField(max_length=50, null=True)
|
|
|
|
|
|
is_remove_end_blank = models.BooleanField(default=True)
|
|
|
|
|
|
is_open_case = models.BooleanField(default=True)
|
|
|
|
|
|
is_upload_case = models.BooleanField(default=True)
|
|
|
|
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
|
|
lession_id = models.ForeignKey(Lession, on_delete=models.DO_NOTHING)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Tag(BaseModel):
|
|
|
|
|
|
"""标签模型"""
|
|
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
|
|
status = models.BooleanField(default=True)
|
|
|
|
|
|
# 问题,标签 多对多
|
|
|
|
|
|
problems = models.ManyToManyField(Problem)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Case(BaseModel):
|
|
|
|
|
|
input = models.TextField()
|
|
|
|
|
|
output = models.TextField()
|
|
|
|
|
|
status = models.BooleanField(default=True)
|
|
|
|
|
|
problem_id = models.ForeignKey(Problem, on_delete=models.CASCADE)
|
|
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
|
db_table = "case"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Language(BaseModel):
|
|
|
|
|
|
content_type = models.CharField(max_length=50)
|
|
|
|
|
|
description = models.TextField()
|
|
|
|
|
|
name = models.CharField(max_length=50)
|
|
|
|
|
|
compile_command = models.TextField()
|
|
|
|
|
|
is_spj = models.BooleanField()
|