在線教育平臺項目——開發文檔

一、需求提出

  1. 前後端完全分離,前端基於Vue框架,後端使用Django, 用restful API交互
  2. 前端展示課程,允許用戶購買
  3. 爲學員、導師、管理員分別設計3個平臺,互不影響
  4. 學員角色功能:
    4.1 註冊、登錄、購買課程、支付寶接入
    4.2 在線視頻播放、評價、提問題、交作業
  5. 導師角色功能(可參照crm中的實現方式):
    5.1 對學員進行跟進、上傳批改作業過程、回覆學員問題
  6. 管理員角色功能(可參照crm中的實現方式):
    6.1 查看用戶註冊趨勢圖、訂單量報表
    6.2 增刪改查課程
    6.3 爲學員分配導師
    6.4 創建、管理資訊文章
    6.5 追蹤學員學習進度
    6.6 導師跟進管理
    6.7 訂單管理
  7. 爲主要的功能開發單元測試

二、需求分析

頂部導航欄 Header

分析:

頂部導航欄分爲四個部分,最左側是Logo,其右是導航菜單,再右爲一個搜索框,再往右是購物車。

最右邊根據登錄情況,未登錄時顯示登錄|註冊,登錄時顯示我的教室和頭像

流程:
在這裏插入圖片描述

設計圖:
在這裏插入圖片描述

首頁 Home

分析:

首頁主要分爲三部分,首先是最上方的輪播圖部分,前端頁面從後端請求得到圖片鏈接並渲染;其次是推薦免費課程、實戰課程和就業班課程,爲了快速開發就直接先在前端寫死吧;最後是一些宣傳介紹的部分,並不是很重要,也是直接在前端寫死,有需求的可以自行實現。

流程:

在這裏插入圖片描述

設計圖:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

免費課 FreeLessons

分析:

免費課程頁面也是包括三部分,頂部一個宣傳Banner圖,然後是免費課程的分類標籤,最後是免費課程列表。根據選擇不同的課程分類標籤顯示不同的分類裏的課程列表。

每一個免費課程對應一個課程詳情頁,所有數據都需要從後端獲取,所以前端寫好模板,然後向後端獲取數據渲染。

流程:
在這裏插入圖片描述
在這裏插入圖片描述

設計圖:
在這裏插入圖片描述

免費課程詳情:
在這裏插入圖片描述

實戰課 PracticalLessons

分析:

實戰課頁面相對於免費課頁面少了一個宣傳Banner圖,只需要獲取實戰課程分類標籤和課程列表即可,只不過排版跟免費課程有所差異罷了。

每一個實戰課程也對應一個課程詳情頁面,同上。

流程:
在這裏插入圖片描述

設計圖:
在這裏插入圖片描述
實戰課程詳情:
在這裏插入圖片描述

輕課 LightClass

分析:

輕課頁面大部分都是介紹輕課形式和宣傳,並沒有什麼新的功能,因此可以直接在前端寫死。

設計圖:
在這裏插入圖片描述

就業班 EmploymentClass

分析:

就業班頁面大部分都是介紹就業班形式和宣傳,並沒有什麼新的功能,因此可以直接在前端寫死。

設計圖:
在這裏插入圖片描述

購物車 ShoppingTrolley

功能:

購物車頁面,直接從後端獲取購物車裏的內容然後渲染到頁面即可,通過單選框選擇不同的商品,可以執行刪除和結算功能。

結算按鈕跳轉到結算頁面自動計算價格,可以選擇使用優惠券或者貝里等折扣,點擊立即支付跳轉到支付寶付款頁面。

分析:

將價格策略+課程id+token認證存入Redis中,查詢時檢驗課程是否存在,價格策略是否合適。

爲什麼選擇Redis?

  1. 臨時狀態,購物車中的內容之後是要刪除的,爲了節省空間,可以用Redis定時刪除。
  2. 價格策略可能經常修改,使用Redis可以避免對數據庫進行重複操作。

流程:

在這裏插入圖片描述

設計圖:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

我的教室 Classroom

分析:

我的教室內容必須用戶登錄才能進入,前端編寫模板,從後端獲取用戶的課程、貝里等信息直接渲染。

流程:

在這裏插入圖片描述

設計圖:
在這裏插入圖片描述

三、數據表結構設計

課程 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 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

課程詳情頁數據:

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, '視頻')))

購物車 ShoppingCar

四、接口定義

登錄 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"
	}
}

認證 Auth

Request

Request URL: /api/auth
Request Method: GET
content-type: application/json

Response

{
	"error_no": 0,
	"data": {
		"username": "********",
		"avatar": "//hcdn1.luffycity.com/static/frontend/head_portrait/qYBYXa4JqwH8OtUp5xq7RBdp.png",
		"phone": "188******07",
		"is_bind": true,
		"is_real": false,
		"has_openid": true,
		"has_password": true,
		"uid": "d2019c68c9a0a21f554060de775df301",
		"is_cash": false,
		"shop_cart_num": 1,
		"notice_num": 9,
		"balance": 3648,
		"coupon": {
			"valid_count": 0,
			"expire_count": 0
		},
		"events": {
			"unpaid_count": 1,
			"will_expire_count": 0
		}
	}
}

免費課程 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
                }
            ]
        }
    ]
}

購物車 ShoppingCar

購物車商品列表 Shopping Car Goods List

Request

Request URL: /api/shopping/list
Request Method: GET
content-type: application/json

Response

商品添加到購物車 Add Goods To Shopping Car

Request

Request URL: /api/shopping/add
Request Method: POST
content-type: application/json

Response

購物車商品更新 Update Goods In Shopping Car

Request

Request URL: /api/shopping/add
Request Method: PUT
content-type: application/json

Response

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章