一、需求提出
- 前後端完全分離,前端基於Vue框架,後端使用Django, 用restful API交互
- 前端展示課程,允許用戶購買
- 爲學員、導師、管理員分別設計3個平臺,互不影響
- 學員角色功能:
4.1 註冊、登錄、購買課程、支付寶接入
4.2 在線視頻播放、評價、提問題、交作業 - 導師角色功能(可參照crm中的實現方式):
5.1 對學員進行跟進、上傳批改作業過程、回覆學員問題 - 管理員角色功能(可參照crm中的實現方式):
6.1 查看用戶註冊趨勢圖、訂單量報表
6.2 增刪改查課程
6.3 爲學員分配導師
6.4 創建、管理資訊文章
6.5 追蹤學員學習進度
6.6 導師跟進管理
6.7 訂單管理 - 爲主要的功能開發單元測試
二、需求分析
頂部導航欄 Header
分析:
頂部導航欄分爲四個部分,最左側是Logo,其右是導航菜單,再右爲一個搜索框,再往右是購物車。
最右邊根據登錄情況,未登錄時顯示登錄|註冊,登錄時顯示我的教室和頭像。
流程:
設計圖:
首頁 Home
分析:
首頁主要分爲三部分,首先是最上方的輪播圖部分,前端頁面從後端請求得到圖片鏈接並渲染;其次是推薦免費課程、實戰課程和就業班課程,爲了快速開發就直接先在前端寫死吧;最後是一些宣傳介紹的部分,並不是很重要,也是直接在前端寫死,有需求的可以自行實現。
流程:
設計圖:
免費課 FreeLessons
分析:
免費課程頁面也是包括三部分,頂部一個宣傳Banner圖,然後是免費課程的分類標籤,最後是免費課程列表。根據選擇不同的課程分類標籤顯示不同的分類裏的課程列表。
每一個免費課程對應一個課程詳情頁,所有數據都需要從後端獲取,所以前端寫好模板,然後向後端獲取數據渲染。
流程:
設計圖:
免費課程詳情:
實戰課 PracticalLessons
分析:
實戰課頁面相對於免費課頁面少了一個宣傳Banner圖,只需要獲取實戰課程分類標籤和課程列表即可,只不過排版跟免費課程有所差異罷了。
每一個實戰課程也對應一個課程詳情頁面,同上。
流程:
設計圖:
實戰課程詳情:
輕課 LightClass
分析:
輕課頁面大部分都是介紹輕課形式和宣傳,並沒有什麼新的功能,因此可以直接在前端寫死。
設計圖:
就業班 EmploymentClass
分析:
就業班頁面大部分都是介紹就業班形式和宣傳,並沒有什麼新的功能,因此可以直接在前端寫死。
設計圖:
購物車 ShoppingTrolley
功能:
購物車頁面,直接從後端獲取購物車裏的內容然後渲染到頁面即可,通過單選框選擇不同的商品,可以執行刪除和結算功能。
結算按鈕跳轉到結算頁面自動計算價格,可以選擇使用優惠券或者貝里等折扣,點擊立即支付跳轉到支付寶付款頁面。
分析:
將價格策略+課程id+token認證存入Redis中,查詢時檢驗課程是否存在,價格策略是否合適。
爲什麼選擇Redis?
- 臨時狀態,購物車中的內容之後是要刪除的,爲了節省空間,可以用Redis定時刪除。
- 價格策略可能經常修改,使用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