在線(xiàn)視頻采用,視頻上傳到百度云VOD進(jìn)行存儲(chǔ),然后在html中調(diào)用接口進(jìn)行播放,具體見(jiàn)幫助文檔
在線(xiàn)視頻播放處理和在線(xiàn)文檔下載處理差不多,就多一個(gè)調(diào)用百度云VOD的處理接口。
Teacher表
字段名 | 字段類(lèi)型 | 關(guān)聯(lián)表 | 關(guān)聯(lián)類(lèi)型 | 關(guān)聯(lián)操作 |
---|---|---|---|---|
id | int | |||
name | char | |||
position | char | |||
brief | text | |||
saying | char | |||
avatar | url | |||
create_time | datatime | |||
update_time | datatime | |||
is_delete | boolean |
CourseCategory表
字段名 | 字段類(lèi)型 | 關(guān)聯(lián)表 | 關(guān)聯(lián)類(lèi)型 | 關(guān)聯(lián)操作 |
---|---|---|---|---|
id | int | |||
name | char | |||
create_time | datatime | |||
update_time | datatime | |||
is_delete | boolean |
Course表
字段名 | 字段類(lèi)型 | 關(guān)聯(lián)表 | 關(guān)聯(lián)類(lèi)型 | 關(guān)聯(lián)操作 |
---|---|---|---|---|
id | int | |||
name | char | |||
time | char | |||
brief | text | |||
outline | char | |||
clicks | integer | |||
cover_url | url | |||
video_url | url | |||
teacher | ForeignKey | Teacher | ManyToOne | SET_NULL |
category | ForeignKey | CourseCategory | ManyToOne | SET_NULL |
create_time | datatime | |||
update_time | datatime | |||
is_delete | boolean |
業(yè)務(wù)流程
請(qǐng)求方式:GET
請(qǐng)求地址:/course/<int:course_id>/
請(qǐng)求參數(shù):
參數(shù) | 類(lèi)型 | 前端是否必須傳 | 描述 |
---|---|---|---|
course_id | int | 是 | 路徑參數(shù) |
course/models.py
from django.db import modelsfrom utils.models.models import BaseModelclass Teacher(BaseModel): """ create teacher model field: 姓名 name CharField 職銜 position CharField 簡(jiǎn)介 brief TextField 名言 saying CharField 頭像 avatar URLField """ name = models.CharField(max_length=20, verbose_name="姓名", help_text="姓名") position = models.CharField(max_length=30, verbose_name="職位", help_text="職位") brief = models.TextField(verbose_name="簡(jiǎn)介", help_text="簡(jiǎn)介") saying = models.CharField(max_length=150, verbose_name="個(gè)性簽名", help_text="個(gè)性簽名") avatar = models.URLField(default="", verbose_name="姓名", help_text="姓名") class Meta: db_table = "tb_teacher" verbose_name = "講師" verbose_name_plural = verbose_name def __str__(self): return "姓名:{}".format(self.name)class CourseCategory(BaseModel): """ create course category model field: 課程名 name CharField """ name = models.CharField(max_length=30, verbose_name="課程分類(lèi)名", help_text="課程分類(lèi)名") class Meta: db_table = "tb_coursecategory" verbose_name = "課程分類(lèi)" verbose_name_plural = verbose_name def __str__(self): return "課程分類(lèi):{}".format(self.name)class Course(BaseModel): """ create course model field: 名字 name CharField 封面url cover_url URLField 鏈接url video_url URLField 時(shí)長(zhǎng) time FloatField 簡(jiǎn)介 brief TextField 課程大綱 outline TextField 點(diǎn)擊量 clicks IntegerField 講師 teacher ManyToOne 類(lèi)型 category ManyToOne """ name = models.CharField(max_length=150, verbose_name="課程名", help_text="課程名") time = models.FloatField(default=0.0, verbose_name="時(shí)長(zhǎng)", help_text="時(shí)長(zhǎng)") brief = models.TextField(verbose_name="簡(jiǎn)介", help_text="簡(jiǎn)介") outline = models.TextField(verbose_name="大綱", help_text="大綱") clicks = models.IntegerField(default=0, verbose_name="觀看量", help_text="觀看量") cover_url = models.URLField(null=True, blank=True, verbose_name="封面url", help_text="封面url") video_url = models.URLField(null=True, blank=True, verbose_name="視頻url", help_text="視頻url") teacher = models.ForeignKey("Teacher", on_delete=models.SET_NULL, null=True, blank=True) category = models.ForeignKey("CourseCategory", on_delete=models.SET_NULL, null=True, blank=True) class Meta: db_table = "tb_course" verbose_name = "課程" verbose_name_plural = verbose_name def __str__(self): return "課程:{}".format(self.name)
course/urls.py
from django.urls import pathfrom course import viewsapp_name = "course"urlpatterns = [ path("index/", views.CourseIndexView.as_view(), name="index"),]
course/views.py
from django.views import Viewfrom django.shortcuts import renderfrom course import modelsclass CourseIndexView(View): """ course index view """ def get(self, request): # 獲取課程列表中需要的數(shù)據(jù):課程標(biāo)題,講師姓名,講師職位 course_list = models.Course.objects.select_related("teacher").only("name", "teacher__name", "teacher__position").filter(is_delete=False) return render(request, 'course/course.html', locals())
course/course.html
<main id="course-container"> <div class="w1200"> <ul class="course-list"> {% for course in course_list %} <li class="course-item"> <a href="{% url 'course:course_detail' course.id %}"> <img class="course-img" src="{{ course.cover_url }}" alt="{{ course.category.name }}"> <div class="course-content"> <p class="course-info">{{ course.name }}</p> <p class="course-author">{{ course.teacher.name }}({{ course.teacher.position }})</p> <p class="course-price free">免費(fèi)</p> {# 后面寫(xiě)成動(dòng)態(tài)的 #} </div> </a> </li> {% endfor %} </ul> </div></main>
course/urls.py
from django.urls import pathfrom course import viewsapp_name = "course"urlpatterns = [ path("<int:course_id>/", views.CourseDetailView.as_view(), name="course_detail"),]
course/views.py
from django.views import Viewfrom django.http import Http404from django.shortcuts import renderfrom course import modelsclass CourseDetailView(View): """ course detail view """ # 1. 從數(shù)據(jù)庫(kù)中獲取到需要的課程播放信息:課程名字,教師名字,教師頭像,教師簡(jiǎn)介,教師名言,課程簡(jiǎn)介,課程大綱,視頻url,視頻封面url def get(self, request, course_id): course_detail = models.Course.objects.select_related("teacher").only("name", "brief", "outline", "video_url", "cover_url","teacher__name","teacher__brief", "teacher__avatar","teacher__saying").filter( is_delete=False, id=course_id).first() if course_detail: return render(request,'course/course_detail.html', locals()) else: raise Http404("課程不存在")
course/course_detail.html
<div class="course-video" id="course-video"> {# 百度VOD視頻接口 #} <span class="course-data" style="display: none;" data-video-url="{{ course_detail.video_url }}" data-cover-url="{{ course_detail.cover_url }}"> </span></div><script src="https://cdn.bdstatic.com/jwplayer/latest/cyberplayer.js"></script> {# 百度VOD視頻功能 #}<script src="{% static 'js/course/BDVideoPlayer.js' %}"></script> {# 接口調(diào)用 #}
js/course/BDVideoPlayer.js
$(function () { let $courseData = $(".course-data"); //百度云VOD API接口標(biāo)簽 let $videoUrl = $courseData.data('video-url'); //視頻url let $coverUrl = $courseData.data('cover-url'); //封面url let player = cyberplayer('course-video').setup({ width: '100%',// 寬度百分比(父元素寬度要有),可以是固定寬度 height: 650, // 高度 file: $videoUrl, // 視頻url image: $coverUrl, // 封面url autostart: false, //是否自動(dòng)播放 stretching: "uniform", //拉伸設(shè)置 repeat: false, // 是否重復(fù)播放 volume: 100, //音量大?。?-100) controls: true, //控制是否顯示 ak: '自己的百度云VOD安全認(rèn)真的AK', })});
聯(lián)系客服