Hello,我是 Alex 007,一個熱愛計算機編程和硬件設計的小白,爲啥是007呢?因爲叫 Alex 的人太多了,再加上每天007的生活,Alex 007就誕生了。
有一段時間沒好好寫文章了,可不是出去浪了,而是要做一個在線教育平臺的項目,模仿着路飛學城,結果正好還趕上學校有一些課程要結課,忙裏忙外的,今天也得交了,雖然不是很完善。
三、數據表結構設計
課程 Course
課程分類:
主要分爲免費課、實戰課和就業班課程三種。
class Category(models.Model):
"""課程分類表"""
title = models.CharField(max_length=32, verbose_name="課程的分類")
categoryType = models.SmallIntegerField(choices=((0, "免費課"), (1, "實戰課")))
def __str__(self):
return self.title + str(self.categoryType)
基本課程數據:
免費課和實戰課的課程基本數據,在元類abstract=True設置爲基類。
這樣,該模型將不會用於創建任何數據庫表,相反,當將其用作其他模型的基類時,會將其字段添加到子類的字段中。
class BaseCourse(models.Model):
# 列表+詳情頁面數據
title = models.CharField(max_length=128, verbose_name="課程的名稱")
courseImage = models.ImageField(upload_to="course/%Y-%m", verbose_name='課程的圖片')
studyNumber = models.IntegerField(verbose_name="學習人數")
hours = models.IntegerField(verbose_name="時長")
# 列表頁面數據
slogan = models.CharField(verbose_name="課程概述", max_length=1024)
level = models.SmallIntegerField(choices=((0, '初級'), (1, '中級'), (2, '高級')), default=1)
# 其它數據
category = models.ForeignKey(to="Category", verbose_name="課程的分類", on_delete=models.PROTECT)
courseType = models.SmallIntegerField(choices=((0, "免費課"), (1, "實戰課"), (2, "輕課"), (3, "就業班")))
courseDetail = models.OneToOneField(to="CourseDetail", on_delete=models.CASCADE)
chapter = models.ManyToManyField(to="CourseChapter")
def __str__(self):
return self.title
class Meta:
abstract = True
免費課程和實戰課:
class FreeCourse(BaseCourse):
pass
class PracticalCourse(BaseCourse):
price = models.IntegerField(verbose_name="價格", default=99)
就業班課程:
class EmploymentCourse(models.Model):
title = models.CharField(max_length=128, verbose_name="課程的名稱")
courseImage = models.ImageField(upload_to="course/%Y-%m", verbose_name='課程的圖片')
studyNumber = models.IntegerField(verbose_name="學習人數")
hours = models.IntegerField(verbose_name="時長")
slogan = models.CharField(verbose_name="課程概述", max_length=1024)
courseType = models.SmallIntegerField(choices=((0, "免費課"), (1, "實戰課"), (2, "輕課"), (3, "就業班")))
courseDetail = models.OneToOneField(to="CourseDetail", on_delete=models.CASCADE)
price = models.IntegerField(verbose_name="價格", default=99)
salary = models.CharField(max_length=128, verbose_name="就業薪資")
employmentRate = models.FloatField(verbose_name="就業率")
def __str__(self):
return self.title
針對不同的課程,都對應一個課程詳情頁面,詳細介紹課程的信息,以及有一些添加購物車等功能。
課程詳情表 & 課程章節表:
class CourseDetail(models.Model):
teachers = models.ManyToManyField("Teacher", verbose_name="課程講師")
brief = models.TextField(verbose_name="課程簡介")
number = models.IntegerField(verbose_name="課程小節", default=0)
qqGroup = models.CharField(max_length=11, null=True, blank=True)
def __str__(self):
return self.brief
class GoLearn(models.Model):
title = models.CharField(verbose_name="將會學到的內容", max_length=256)
courseDetail = models.ForeignKey(to="CourseDetail", on_delete=models.PROTECT)
class CourseChapter(models.Model):
"""課程章節表"""
chapter = models.SmallIntegerField(verbose_name="第幾章")
title = models.CharField(max_length=32, verbose_name="課程章節名稱")
def __str__(self):
return self.title
class CourseSection(models.Model):
"""課時表"""
chapter = models.ForeignKey(to="CourseChapter", on_delete=models.CASCADE)
name = models.CharField(max_length=32, verbose_name="課時名稱")
freeTrail = models.BooleanField(default=False, help_text="是否可試看")
sectionType = models.SmallIntegerField(default=2, choices=((0, '文檔'), (1, '練習'), (2, '視頻')))
用戶 User
針對用戶也是分爲三種:學員、老師和管理員。
用戶信息表:
class Account(AbstractUser):
"""用戶"""
avatar = models.ImageField(upload_to='avatars/', default='avatars/default.png')
telephone = models.CharField(max_length=11, null=True, blank=True, unique=True)
balance = models.IntegerField(verbose_name="貝里餘額", default=0)
identity = models.IntegerField(verbose_name="身份", choices=[(1, "管理員"), (2, "導師"), (3, "學員")], default=3)
def __str__(self):
return self.username
學生表:
class Student(models.Model):
"""學生表"""
student = models.OneToOneField(verbose_name="學生信息", to="Account.Account", on_delete=models.PROTECT)
QQ = models.CharField(verbose_name="學生QQ", max_length=32, null=True, blank=True)
telephone = models.CharField(verbose_name="學生手機號", max_length=32, null=True, blank=True)
teacher = models.ForeignKey(to='Teacher', related_name='studentTeacher', on_delete=models.PROTECT, null=True, blank=True)
courses = models.ManyToManyField(to='Course.EmploymentCourse', related_name='userCourse')
completeSection = models.ManyToManyField(to='Course.CourseSection')
def __str__(self):
return "%s" % self.student.username
教師表:
class Teacher(models.Model):
name = models.CharField(max_length=32, verbose_name="講師名字")
brief = models.TextField(max_length=1024, verbose_name="講師介紹")
avatar = models.ImageField(upload_to='avatars/', default='avatars/default.png')
def __str__(self):
return self.name
作業和提問 Homework & Questions
學生可以向自己的導師發起提問和提交作業,因此需要一張提問表和唾液表:
class Question(models.Model):
"""提問表"""
student = models.ForeignKey(to='Account.Student', on_delete=models.CASCADE, unique=False)
teacher = models.ForeignKey(to='Account.Teacher', on_delete=models.CASCADE, unique=False)
title = models.CharField(verbose_name='提問標題', max_length=255)
content = models.TextField(verbose_name='提問內容')
solve = models.TextField(verbose_name='解決內容', null=True, blank=True)
environment = models.CharField(verbose_name='環境', max_length=255)
situation = models.IntegerField(verbose_name="情況", choices=[(0, "一般"), (1, "緊急"), (2, "十萬火急")], default=1)
state = models.IntegerField(verbose_name="進度", choices=[(0, "未處理"), (1, "已回覆")], default=0)
def __str__(self):
return self.student.student.username + self.teacher.teacher.username + self.title
class Task(models.Model):
"""作業表"""
student = models.ForeignKey(verbose_name="學生", to="Account.Account", on_delete=models.PROTECT)
teacher = models.ForeignKey(verbose_name="導師", to="Account.Teacher", on_delete=models.PROTECT)
chapter = models.ForeignKey(verbose_name="章節", to='Course.CourseChapter', on_delete=models.PROTECT)
file = models.FileField(verbose_name="作業內容", upload_to="media/task/")
date = models.DateTimeField(verbose_name="提交時間", default=timezone.now)
achievement = models.IntegerField(verbose_name="成績", validators=[MaxValueValidator(100), MinValueValidator(1)],
null=True, blank=True)
comment = models.TextField(verbose_name="老師點評", null=True, blank=True)
state = models.IntegerField(verbose_name="進度", choices=[(0, "未批改"), (1, "已批改")], default=0)
def __str__(self):
return "%s-%s" % (self.student.username, self.chapter.homeworkTitle)
四、接口定義
登錄 Login
Request
Request URL: /api/account/login
Request Method: POST
Content-Type: application/json
Form Data: username=***********&password=*********
Response
{
"error_no": 0,
"data": {
"access_token": "Bearer uPJafPI21zIfVgwEvhD9KaBYCehn93",
"username": "********",
"expires_in": 604800,
"avatar": "//hcdn1.luffycity.com/static/frontend/head_portrait/qYBYXa4JqwH8OtUp5xq7RBdp.png",
"shop_cart_num": 1,
"notice_num": 9,
"redirect_url": null,
"phone": 188******07,
"is_bind": true,
"has_openid": true,
"has_password": true,
"balance": 3648,
"is_new": true,
"uid": "d2019c68c9a0a21f554060de775df301",
"is_cash": false
}
}
退出 Logout
Request
Request URL: /api/account/logout
Request Method: GET
Content-Type: application/json
Response
{
"error_no": 0,
"data": {
"status": "logout success"
}
}
免費課程 FreeLessons
分類列表 Category
Request
Request URL: /api/free/category
Request Method: GET
content-type: application/json
Response
[
{
"id": 1,
"title": "python開發"
},
{
"id": 2,
"title": "Linux雲計算"
},
{
"id": 3,
"title": "web前端"
},
{
"id": 4,
"title": "Java"
},
{
"id": 5,
"title": "Go語言&C語言"
}
]
課程列表 CourseList
Request
Request URL: /api/free/course/${id}
Request Method: GET
content-type: application/json
Response
[
{
"id": 1,
"title": "Python21天入門",
"slogan": "跟隨Alex金角大王3週上手Python開發",
"courseImage": "media/course/2020-05/Python21%E5%A4%A9%E5%85%A5%E9%97%A8_VqfILZI.png",
"level": "初級",
"studyNumber": 79640
},
]
課程詳情 CourseDetail
Request
Request URL: /api/free/${id}/detail
Request Method: GET
content-type: application/json
Response
{
"id": 1,
"title": "Python21天入門",
"brief": "即使之前你從未寫過1行代碼,也能在學完本課程後,達到Python入門水平,能開發300-500行代碼的小程序,掌握基本的編程思維、軟件設計方法。無論你日後想做人工智能、數據分析,還是WEB開發、爬蟲、大數據等,都應該先把這部分基礎掌握。",
"courseImage": "media/course/2020-05/Python21%E5%A4%A9%E5%85%A5%E9%97%A8_VqfILZI.png",
"studyNumber": 79640,
"hours": 19,
"qqGroup": "701031800",
"teacher": {
"id": 1,
"name": "Alex",
"brief": "10年+IT行業技術經驗, 8年Python開發經驗,6年教學經驗,業內最早的的Python語言佈道者之一。 51CTO學院2016/2017年度最受學員喜愛10大講師之一,多款開源軟件作者,fork me on git,triaquae 曾任職飛信、中金公司、NOKIA研究院、ADVENT金融、汽車之家,從底層網管一路走來,先後做過Linux運維、自動化開發、Python開發、架構師、教學總監職位。同時愛好讀書、電影、音樂、旅行、潛水、姑娘,生活明朗,萬物可期。",
"avatar": "avatars/alex_vrVpRNI.png"
},
"get": [
{
"id": 1,
"title": "學會Python基礎語法"
},
{
"id": 2,
"title": "掌握Python字符編碼&數據類型"
},
{
"id": 3,
"title": "通過Python操作文件"
},
{
"id": 4,
"title": "通過函數減少重複代碼,提高代碼可擴展性"
},
{
"id": 5,
"title": "開發300行代碼的股票查詢程序"
}
],
"chapter": [
{
"id": 1,
"chapter": 1,
"title": "基本語法",
"section": [
{
"id": 1,
"name": "編程語言是如何演變過來的",
"freeTrail": true,
"sectionType": 2
}
]
}
]
}
實戰課程 PracticalLessons
分類列表 practicalcategory
Request
Request URL: /api/practical/practicalcategory
Request Method: GET
content-type: application/json
Response
[
{
"id": 6,
"title": "Python開發"
},
{
"id": 7,
"title": "Linux雲計算"
},
{
"id": 8,
"title": "Web前端"
},
{
"id": 9,
"title": "Go語言"
},
{
"id": 10,
"title": "機器學習&數據分析"
},
{
"id": 11,
"title": "Java&網絡安全"
},
{
"id": 12,
"title": "技術生涯"
}
]
課程列表 CourseList
Request
Request URL: /api/free/practicalcourse/${id}
Request Method: GET
content-type: application/json
Response
[
{
"id": 1,
"title": "基於Django開發輕量級Bug管理平臺",
"courseImage": "media/course/2020-05/%E5%9F%BA%E4%BA%8EDjango%E5%BC%80%E5%8F%91%E8%BD%BB%E9%87%8F%E7%BA%A7Bug%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0_cNpfjUN.png",
"studyNumber": 304,
"number": 250,
"price": 69,
"simpleChapter": [
{
"id": 215,
"title": "sass項目介紹",
"freeTrail": true
},
{
"id": 216,
"title": "sass項目演示",
"freeTrail": true
},
{
"id": 217,
"title": "項目講解和學習提醒",
"freeTrail": true
},
{
"id": 218,
"title": "階段項目涉及知識點",
"freeTrail": false
}
]
},
]
課程詳情 CourseDetail
Request
Request URL: /api/practical/${id}/payment_info
Request Method: GET
content-type: application/json
Response
{
"id": 1,
"title": "基於Django開發輕量級Bug管理平臺",
"price": 69,
"brief": "基於django開發的Bug管理平臺,爲用戶提供理想的工作雲平臺,涵蓋了衆多企業級功能,便捷的團隊協作,輕量的項目管理, 完備的問題系統,大容量的文件存儲等,大大提升了工作效率。",
"courseImage": "media/course/2020-05/%E5%9F%BA%E4%BA%8EDjango%E5%BC%80%E5%8F%91%E8%BD%BB%E9%87%8F%E7%BA%A7Bug%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0_cNpfjUN.png",
"studyNumber": 304,
"hours": 63,
"qqGroup": "701031800",
"teacher": {
"id": 7,
"name": "武Sir 銀角大王",
"brief": "多年開發實戰經驗,先後任職於汽車之家、好大夫在線等多家大型互聯網公司。 擅長C#,Python,PHP等一大堆語言開發,現任某大型互聯網公司高級自動化開發工程師,已精讀多個開源軟件源碼,自行開發過改進版的Tornado WEB框架,講課風趣幽默。",
"avatar": "avatars/peiqi_pukWeh5.png"
},
"isBuy": false,
"number": 250,
"chapter": [
{
"id": 15,
"chapter": 1,
"title": "用戶認證模塊開發",
"section": [
{
"id": 215,
"name": "sass項目介紹",
"freeTrail": true,
"sectionType": 2
}
]
}
]
}
我的教室 Classroom
學生頁面列表內容
Request
Request URL: /api/enroll/degree Request Method:
GETcontent-type:
application/json`
Response
{
"id": 2,
"modules": [
{
"id": 1,
"index": 1,
"title": "開發基礎",
"count": 9,
"completeCount": 1,
"chapters": [
{
"id": 37,
"index": 1,
"title": "Python基礎語法入門",
"homeworkTitle": "雙色球選購",
"homeworkContent": "作業:雙色球選購\r\n1 雙色球(假設一共八個球,6個紅球,球號1-32、2個藍球,球號1-16)\r\n2 確保用戶不能重複選擇,不能超出範圍\r\n3 用戶輸入有誤時有相應的錯誤提示\r\n4 最後展示用戶選擇的雙色球的號碼\r\n效果圖:雙色球作業展示\r\n升級需求:\r\n1 一個while循環",
"homeworkPrice": 300,
"sections": [
{
"id": 281,
"name": "LuffyX學位課程合同,請認真閱讀。",
"videoUrl": "//player.bilibili.com/player.html?aid=82861347&bvid=BV1aJ411H7Ej&cid=141761157&page=1",
"complete": false,
"sectionType": 0
}
]
}
]
}
]
}
老師頁面列表內容
Request
Request URL: /api/enroll/teacher
Request Method: GET
content-type: application/json
Response
{
"id": 1,
"teacherName": "wupeiqi",
"studentList": [
{
"studentId": 2,
"studentName": "koking",
"studentAvatar": "avatars/icon22x.png"
}
],
"questionList": [
{
"questionId": 1,
"questionTitle": "title",
"questionContent": "content",
"questionEnvironment": "Windows"
}
],
"taskList": [
{
"taskId": 2,
"taskStudent": "koking",
"taskTitle": "8大排序&查找算法",
"taskFilePath": "media/task/redis-server.exe",
"taskDate": "2020-05-18T06:35:39Z",
"taskAchievement": null,
"taskComment": ""
}
]
}