在線教育平臺項目——設計 & 接口定義

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": ""
        }
    ]
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章