课程管理

article/2025/8/16 0:07:01

课程管理

  • 121.课程管理-发布课程界面和模型完成
  • 122.课程管理-视频云存储讲解
  • 123.课程管理-发布课程功能完成
  • 124.课程管理-视频加密播放实现
  • 125.购买课程-课程订单页面完成
  • 126.购买课程-支付宝和微信支付功能准备工作
  • 127.购买课程-生成课程订单
  • 128.购买课程-配置pycharm同步代码到服务器
  • 129.购买课程-添加数据(选看)
  • 130.购买课程-支付宝和微信支付功能完成
  • 131.购买课程-购买课程流程补充

课程管理-发布课程界面和模型完成

{% extends 'cms/base.html' %}{% block title %}发布课程
{% endblock %}{% block head %}<script src="{% static 'ueditor/ueditor.config.js' %}"></script><script src="{% static 'ueditor/ueditor.all.min.js' %}"></script><script src="{% static 'js/pub_course.min.js' %}"></script>
{% endblock %}{% block content-header %}
<h1>发布课程</h1>
{% endblock %}{% block content %}
<div class="row">
<div class="col-md-12"><div class="box"><div class="box-header"><div class="form-group"><label for="title-input">标题:</label><input type="text" class="form-control" placeholder="课程标题" name="title" id="title-input"></div><div class="form-group"><label for="category-input">分类:</label><select name="category" class="form-control" id="category-input">{% for category in categories %}<option value="{{ category.pk }}">{{ category.name }}</option>{% endfor %}</select></div><div class="form-group"><label for="teacher-input">讲师:</label><select name="teacher" id="teacher-input" class="form-control">{% for teacher in teachers %}<option value="{{ teacher.pk }}">{{ teacher.username }}</option>{% endfor %}</select></div><div class="form-group"><label for="video-input">视频地址:</label><input type="text" class="form-control" name="video_url" id="video-input" placeholder="视频地址"></div><div class="form-group"><label for="cover-input">封面图:</label><input type="text" class="form-control" name="cover" id="cover-input" placeholder="封面图"></div><div class="form-group"><label for="price-input">价格:</label><input type="text" class="form-control" name="price" id="price-input" placeholder="价格"></div><div class="form-group"><label for="duration-input">时长:</label><input type="text" class="form-control" name="duration" id="duration-input"></div><div class="form-group"><label>简介:</label><script id="editor" type="text/plain"></script></div><div class="form-group"><button class="btn btn-primary pull-right" id="submit-btn">发布课程</button></div></div></div>
</div>
</div>
{% endblock %}
# 这是课程相关的url映射
urlpatterns += [path('pub_course/',course_views.PubCourse.as_view(),name='pub_course')
]
function PubCourse() {}PubCourse.prototype.initUEditor = function () {window.ue = UE.getEditor("editor",{'serverUrl': '/ueditor/upload/'});
};PubCourse.prototype.listenSubmitEvent = function () {var submitBtn = $("#submit-btn");submitBtn.click(function () {var title = $("#title-input").val();var category_id = $("#category-input").val();var teacher_id = $("#teacher-input").val();var video_url = $("#video-input").val();var cover_url = $("#cover-input").val();var price = $("#price-input").val();var duration = $("#duration-input").val();var profile = window.ue.getContent();xfzajax.post({'url': '/cms/pub_course/','data': {'title': title,'video_url': video_url,'cover_url': cover_url,'price': price,'duration': duration,'profile': profile,'category_id': category_id,'teacher_id': teacher_id},'success': function (result) {if(result['code'] === 200){window.location = window.location.href;}}});});
};PubCourse.prototype.run = function () {this.initUEditor();this.listenSubmitEvent();
};$(function () {var course = new PubCourse();course.run();
});
class CourseCategory(models.Model):name = models.CharField(max_length=100)class Teacher(models.Model):username = models.CharField(max_length=100)avatar = models.URLField()jobtitle = models.CharField(max_length=100)profile = models.TextField()class Course(models.Model):title = models.CharField(max_length=200)category = models.ForeignKey('CourseCategory',on_delete=models.DO_NOTHING)teacher = models.ForeignKey("Teacher",on_delete=models.DO_NOTHING)video_url = models.URLField()cover_url = models.URLField()price = models.FloatField()duration = models.IntegerField()profile = models.TextField()pub_time = models.DateTimeField(auto_now_add=True)class CourseOrder(models.Model):uid = ShortUUIDField(primary_key=True)course = models.ForeignKey("Course",on_delete=models.DO_NOTHING)buyer = models.ForeignKey("xfzauth.User",on_delete=models.DO_NOTHING)amount = models.FloatField(default=0)pub_time = models.DateTimeField(auto_now_add=True)# 1:代表的是支付宝支付。2:代表的是微信支付istype = models.SmallIntegerField(default=0)# 1:代表的是未支付。2:代表的是支付成功status = models.SmallIntegerField(default=1)

课程管理-视频云存储讲解

https://cloud.baidu.com/

课程管理-发布课程功能完成

class PubCourseForm(forms.ModelForm,FormMixin):category_id = forms.IntegerField()teacher_id = forms.IntegerField()class Meta:model = Courseexclude = ("category",'teacher')
@method_decorator(permission_required(perm="course.change_course",login_url='/'),name='dispatch')
class PubCourse(View):def get(self,request):context = {'categories': CourseCategory.objects.all(),'teachers': Teacher.objects.all()}return render(request,'cms/pub_course.html',context=context)def post(self,request):form = PubCourseForm(request.POST)if form.is_valid():title = form.cleaned_data.get('title')category_id = form.cleaned_data.get('category_id')video_url = form.cleaned_data.get('video_url')cover_url = form.cleaned_data.get("cover_url")price = form.cleaned_data.get('price')duration = form.cleaned_data.get('duration')profile = form.cleaned_data.get('profile')teacher_id = form.cleaned_data.get('teacher_id')category = CourseCategory.objects.get(pk=category_id)teacher = Teacher.objects.get(pk=teacher_id)Course.objects.create(title=title, video_url=video_url, cover_url=cover_url, price=price, duration=duration,profile=profile, category=category, teacher=teacher)return restful.ok()else:return restful.params_error(message=form.get_errors())
def course_index(request):context = {'courses': Course.objects.all()}return render(request,'course/course_index.html',context=context)def course_detail(request,course_id):course = Course.objects.get(pk=course_id)buyed = CourseOrder.objects.filter(course=course,buyer=request.user,status=2).exists()context = {'course': course,'buyed': buyed}return render(request,'course/course_detail.html',context=context)
{% extends 'base/front_base.html' %}{% block title %}课程列表页
{% endblock %}{% block head %}<link rel="stylesheet" href="{% static 'css/course/course_index.min.css' %}">
{% endblock %}{% block main %}<div class="main"><div class="course-nav"><div class="nav-container"><h3 class="title">在线课堂</h3><ul class="nav-list"><li class="active"><a href="#">最新课堂</a></li><li><a href="#">投资人说</a></li><li><a href="#">明星案例</a></li><li><a href="#">创业知识</a></li></ul></div></div><div class="wrapper"><ul class="course-list">{% for course in courses %}<li><a href="{% url 'course:course_detail' course_id=course.pk %}"><div class="thumbnail-group"><img src="{{ course.cover_url }}" alt="" class="thumbnial"></div><div class="course-info"><p class="title">{{ course.title }}</p><p class="author">{{ course.teacher.username }}</p><p class="price-group">{% if course.price > 0 %}<span class="pay">{{ course.price }}</span>{% else %}<span class="free">免费</span>{% endif %}</p></div></a></li>{% endfor %}</ul></div></div>
{% endblock %}
{% extends 'base/front_base.html' %}{% block title %}课程列表页
{% endblock %}{% block head %}<link rel="stylesheet" href="{% static 'css/course/course_detail.min.css' %}"><script src="{% static 'videojs/video.min.js' %}"></script>
<script src="{% static 'videojs/videojs-contrib-hls.min.js' %}"></script>
<script src="{% static 'videojs/videojs-contrib-quality-levels.min.js' %}"></script>
<script type="text/javascript" src="https://cdn.bdstatic.com/jwplayer/latest/cyberplayer.js"></script><script src="{% static 'js/course_detail.min.js' %}"></script>
{% endblock %}{% block main %}<div class="main"><div class="course-nav"><div class="nav-container"><h3 class="title">在线课堂</h3><ul class="nav-list"><li class="active"><a href="#">最新课堂</a></li><li><a href="#">投资人说</a></li><li><a href="#">明星案例</a></li><li><a href="#">创业知识</a></li></ul></div></div><div class="wrapper"><div class="course-wrapper"><div class="course-info"><p class="course-title">{{ course.title }}</p><div class="price-group"><div class="share-group"><span class="title">分享至:</span></div><div class="buy-group"><!-- <span class="price pay">¥49.0</span><a href="#" class="buy-btn">立即购买</a> -->{% if course.price > 0 %}{% if not buyed %}<span class="price pay">¥{{ course.price }}</span><a href="{% url 'course:course_order' course_id=course.pk %}" class="buy-btn">立即购买</a>{% endif %}{% else %}<span class="price free">免费</span>{% endif %}</div></div></div><div class="video-group"><span id="video-info" hidden data-video-url="{{ course.video_url }}" data-cover-url="{{ course.cover_url }}" data-course-id="{{ course.pk }}"></span><div id="playercontainer"></div></div></div><div class="bottom-wrapper"><div class="course-detail-wrapper"><div class="item-group"><p class="item-title">课程讲师</p><div class="teacher-group"><div class="avatar-group"><img src="{{ course.teacher.avatar }}" alt="" class="avatar"></div><div class="teacher-info"><p class="teacher-name">{{ course.teacher.username }}</p><p class="teacher-desc">{{ course.teacher.jobtitle }}</p></div></div><p class="item-content">{{ course.teacher.profile }}</p></div><div class="item-group"><p class="item-title">课程简介</p><p class="item-content">{{ course.profile|safe }}</p></div><div class="item-group"><p class="item-title">课程大纲</p><p class="item-content">小饭桌在线课堂是小饭桌旗下的线上视频课程产品,汇聚顶级创业大咖导师、行业资深专家,致力于用系统、垂直的知识体系让创业者认知升级、技能进阶。小饭桌在线课堂用知识陪伴创业者从平凡到卓越!</p></div><div class="item-group"><p class="item-title">适宜人群</p><p class="item-content">想学习如何做投资的!</p></div><div class="item-group"><p class="item-title">帮助中心</p><p class="item-content">1. 购买后的课程在线可反复观看学习,视频有效期以具体课程信息为准。 <br>2. 课程暂不支持下载观看,均为在线观看视频。 <br>3. 课程一经购买,不可转让、不可退款;仅限购买账号观看。 <br>4. 如有问题请咨询客服饭桌君: 电话:18618172287   微信:fanzhuojun888 <br></p></div><div class="item-group"><p class="item-title">关于小饭桌在线课堂</p><p class="item-content">小饭桌在线课堂是小饭桌旗下的线上视频课程产品,汇聚顶级创业大咖导师、行业资深专家,致力于用系统、垂直的知识体系让创业者认知升级、技能进阶。小饭桌在线课堂用知识陪伴创业者从平凡到卓越!</p></div></div><div class="recommand-wrapper"><p class="recommand-title">推荐课程</p><ul class="course-list"><li><a href="#"><div class="course-info-group"><p class="course-title">教你制作抓住投资人眼球的商业计划书</p><p class="teacher">知了课堂CEO</p></div><div class="thumbnail-group"><img src="https://static-image.xfz.cn/1526455098_289.png-course.list.small" alt="" class="thumbnail"></div></a></li><li><a href="#"><div class="course-info-group"><p class="course-title">教你制作抓住投资人眼球的商业计划书</p><p class="teacher">知了课堂CEO</p></div><div class="thumbnail-group"><img src="https://static-image.xfz.cn/1526455098_289.png-course.list.small" alt="" class="thumbnail"></div></a></li></ul></div></div></div></div>
{% endblock %}

课程管理-视频加密播放实现

def course_token(request):# video:是视频文件的完整链接file = request.GET.get('video')course_id = request.GET.get('course_id')if not CourseOrder.objects.filter(course_id=course_id,buyer=request.user,status=2).exists():return restful.params_error(message='请先购买课程!')expiration_time = int(time.time()) + 2 * 60 * 60USER_ID = settings.BAIDU_CLOUD_USER_IDUSER_KEY = settings.BAIDU_CLOUD_USER_KEY# file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8extension = os.path.splitext(file)[1]media_id = file.split('/')[-1].replace(extension, '')# unicode->bytes=unicode.encode('utf-8')byteskey = USER_KEY.encode('utf-8')message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8')signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest()token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time)return restful.result(data={'token': token})
function CourseDetail() {
}CourseDetail.prototype.initPlayer = function () {var videoInfoSpan = $("#video-info");var video_url = videoInfoSpan.attr("data-video-url");var cover_url = videoInfoSpan.attr("data-cover-url");var course_id = videoInfoSpan.attr('data-course-id');var player = cyberplayer("playercontainer").setup({width: '100%',height: '100%',file: video_url,image: cover_url,autostart: false,stretching: "uniform",repeat: false,volume: 100,controls: true,tokenEncrypt: true,// AccessKeyak: '42455a8c985649aeaa4ca86b50482d78'});player.on('beforePlay',function (e) {if(!/m3u8/.test(e.file)){return;}xfzajax.get({'url': '/course/course_token/','data': {'video': video_url,'course_id': course_id},'success': function (result) {if(result['code'] === 200){var token = result['data']['token'];player.setToken(e.file,token);}else{window.messageBox.showInfo(result['message']);player.stop();}},'fail': function (error) {console.log(error);}});});
};CourseDetail.prototype.run = function () {this.initPlayer();
};$(function () {var courseDetail = new CourseDetail();courseDetail.run();
});
# 百度云的配置
# 控制台->用户中心->用户ID
BAIDU_CLOUD_USER_ID = '5b8849ddc6504318abcea39fe620948e'
# 点播VOD->全局设置->发布设置->安全设置->UserKey
BAIDU_CLOUD_USER_KEY = 'c228d166497b400d'

购买课程-课程订单页面完成

{% block head %}<link rel="stylesheet" href="{% static 'css/common/header.min.css' %}"><link rel="stylesheet" href="{% static 'css/common/footer.min.css' %}"><link rel="stylesheet" href="{% static 'css/common/body.min.css' %}"><style>.table{width: 100%;border-top: 1px solid #ccc;border-bottom: 1px solid #ccc;background: #eaeaea;text-align: center;}.table{border-spacing: 20px;}.table img{width: 120px;height: 68px;float: left;}.table .title{margin-left: 10px;}.pay-way label{float: right;}.pay-way span{border: 1px solid #ccc;position: relative;top: 20px;}.pay-way .zfb-btn{display: inline-block;width: 139px;height: 48px;cursor: pointer;background: url("http://study.163.com/res/images/pay/payList.png");background-position: -140px 0;background-size: 300% 200%;margin-right:20px;}.pay-way .wx-btn{display: inline-block;width: 139px;height: 48px;position: relative;cursor: pointer;}.pay-way .wx-btn img{top: 12px;left: 16px;position: absolute;}.submit-group{overflow: hidden;padding: 60px 0;}.submit-btn{display: block;text-align: center;width: 136px;height:49px;line-height: 49px;background: url("http://s.stu.126.net/res/images/pay/payBtns.png?c9b6b849b38cca45b160a96802575ac8") no-repeat 4449px 4449px;background-position: 0 -302px;border: none;cursor: pointer;color: #fff;font-size: 16px;float: right;}.submit-btn:hover{background-position: -139px -302px;}</style><script>$(function () {var submitBtn = $("#submit-btn");submitBtn.click(function (event) {event.preventDefault();var goodsname = $("input[name='goodsname']").val();var istype = $("input[name='istype']:checked").val();var notify_url = $("input[name='notify_url']").val();var orderid = $("input[name='orderid']").val();var price = $("input[name='price']").val();var return_url = $("input[name='return_url']").val();xfzajax.post({'url': '/course/course_order_key/','data': {'goodsname': goodsname,'istype': istype,'notify_url': notify_url,'orderid': orderid,'price': price,'return_url': return_url},'success': function (result) {if(result['code'] === 200){var key = result['data']['key'];var keyInput = $("input[name='key']");keyInput.val(key);$("#pay-form").submit();}}});});});</script>
{% endblock %}{% block main %}<div class="main"><div class="wrapper"><table class="table"><thead><tr><th>商品名称</th><th>单价()</th><th>小计(元)</th></tr></thead><tbody><tr><td align="left"><a href="#"><img class="thumbnail" src="{{ goods.thumbnail }}" alt=""><span class="title">{{ goods.title }}</span></a></td><td>{{ goods.price }}</td><td>{{ goods.price }}</td></tr></tbody></table><form action="https://pay.bbbapi.com/" method="post" id="pay-form"><input type="hidden" name="uid" value="49dc532695baa99e16e01bc0"><input type="hidden" name="price" value="{{ goods.price }}"><input type="hidden" name="notify_url" value="{{ notify_url }}"><input type="hidden" name="return_url" value="{{ return_url }}"><input type="hidden" name="orderid" value="{{ order.pk }}"><input type="hidden" name="orderuid" value="{{ request.user.pk }}"><input type="hidden" name="goodsname" value="{{ goods.title }}"><input type="hidden" name="key" value=""><div class="pay-way"><label for="istype-wx"><input id="istype-wx" type="radio" name="istype" value="2"><span class="wx-btn"><img src="http://nos.netease.com/test-edu-image/1BD9F69D6760CE1508D2269864AA54F8.png" alt=""></span></label><label for="istype-zfb"><input id="istype-zfb" type="radio" name="istype" value="1" checked><span class="zfb-btn"></span></label><div style="clear: both;"></div></div><div class="submit-group"><input type="submit" value="去支付" id="submit-btn" class="submit-btn"></div></form></div></div>
{% endblock %}
@xfz_login_required
def course_order(request,course_id):course = Course.objects.get(pk=course_id)order = CourseOrder.objects.create(course=course,buyer=request.user,status=1,amount=course.price)context = {'goods': {'thumbnail': course.cover_url,'title': course.title,'price': course.price},'order': order,# /course/notify_url/'notify_url': request.build_absolute_uri(reverse('course:notify_view')),'return_url': request.build_absolute_uri(reverse('course:course_detail',kwargs={"course_id":course.pk}))}return render(request,'course/course_order.html',context=context)

购买课程-支付宝和微信支付功能准备工作

https://www.paysapi.com/
在这里插入图片描述

class CourseOrder(models.Model):uid = ShortUUIDField(primary_key=True)course = models.ForeignKey("Course",on_delete=models.DO_NOTHING)buyer = models.ForeignKey("xfzauth.User",on_delete=models.DO_NOTHING)amount = models.FloatField(default=0)pub_time = models.DateTimeField(auto_now_add=True)# 1:代表的是支付宝支付。2:代表的是微信支付istype = models.SmallIntegerField(default=0)# 1:代表的是未支付。2:代表的是支付成功status = models.SmallIntegerField(default=1)
@xfz_login_required
def course_order(request,course_id):course = Course.objects.get(pk=course_id)order = CourseOrder.objects.create(course=course,buyer=request.user,status=1,amount=course.price)context = {'goods': {'thumbnail': course.cover_url,'title': course.title,'price': course.price},'order': order,# /course/notify_url/'notify_url': request.build_absolute_uri(reverse('course:notify_view')),'return_url': request.build_absolute_uri(reverse('course:course_detail',kwargs={"course_id":course.pk}))}return render(request,'course/course_order.html',context=context)

购买课程-生成课程订单

购买课程-配置pycharm同步代码到服务器

购买课程-添加数据(选看)

购买课程-支付宝和微信支付功能完成

@xfz_login_required
def course_order_key(request):goodsname = request.POST.get("goodsname")istype = request.POST.get("istype")notify_url = request.POST.get("notify_url")orderid = request.POST.get("orderid")price = request.POST.get("price")return_url = request.POST.get("return_url")token = 'e6110f92abcb11040ba153967847b7a6'uid = '49dc532695baa99e16e01bc0'orderuid = str(request.user.pk)print('goodsname:',goodsname)print('istype:',istype)print('notify_url:',notify_url)print('orderid:',orderid)print('price:',price)print('return_url:',return_url)key = md5((goodsname + istype + notify_url + orderid + orderuid + price + return_url + token + uid).encode("utf-8")).hexdigest()return restful.result(data={"key": key})@csrf_exempt
def notify_view(request):orderid = request.POST.get('orderid')print('='*10)print(orderid)print('='*10)CourseOrder.objects.filter(pk=orderid).update(status=2)return restful.ok()
@xfz_login_required
def course_order(request,course_id):course = Course.objects.get(pk=course_id)order = CourseOrder.objects.create(course=course,buyer=request.user,status=1,amount=course.price)context = {'goods': {'thumbnail': course.cover_url,'title': course.title,'price': course.price},'order': order,# /course/notify_url/'notify_url': request.build_absolute_uri(reverse('course:notify_view')),'return_url': request.build_absolute_uri(reverse('course:course_detail',kwargs={"course_id":course.pk}))}return render(request,'course/course_order.html',context=context)
    <script>$(function () {var submitBtn = $("#submit-btn");submitBtn.click(function (event) {event.preventDefault();var goodsname = $("input[name='goodsname']").val();var istype = $("input[name='istype']:checked").val();var notify_url = $("input[name='notify_url']").val();var orderid = $("input[name='orderid']").val();var price = $("input[name='price']").val();var return_url = $("input[name='return_url']").val();xfzajax.post({'url': '/course/course_order_key/','data': {'goodsname': goodsname,'istype': istype,'notify_url': notify_url,'orderid': orderid,'price': price,'return_url': return_url},'success': function (result) {if(result['code'] === 200){var key = result['data']['key'];var keyInput = $("input[name='key']");keyInput.val(key);$("#pay-form").submit();}}});});});</script>
{% endblock %}{% block main %}<div class="main"><div class="wrapper"><table class="table"><thead><tr><th>商品名称</th><th>单价()</th><th>小计(元)</th></tr></thead><tbody><tr><td align="left"><a href="#"><img class="thumbnail" src="{{ goods.thumbnail }}" alt=""><span class="title">{{ goods.title }}</span></a></td><td>{{ goods.price }}</td><td>{{ goods.price }}</td></tr></tbody></table><form action="https://pay.bbbapi.com/" method="post" id="pay-form"><input type="hidden" name="uid" value="49dc532695baa99e16e01bc0"><input type="hidden" name="price" value="{{ goods.price }}"><input type="hidden" name="notify_url" value="{{ notify_url }}"><input type="hidden" name="return_url" value="{{ return_url }}"><input type="hidden" name="orderid" value="{{ order.pk }}"><input type="hidden" name="orderuid" value="{{ request.user.pk }}"><input type="hidden" name="goodsname" value="{{ goods.title }}"><input type="hidden" name="key" value=""><div class="pay-way"><label for="istype-wx"><input id="istype-wx" type="radio" name="istype" value="2"><span class="wx-btn"><img src="http://nos.netease.com/test-edu-image/1BD9F69D6760CE1508D2269864AA54F8.png" alt=""></span></label><label for="istype-zfb"><input id="istype-zfb" type="radio" name="istype" value="1" checked><span class="zfb-btn"></span></label><div style="clear: both;"></div></div><div class="submit-group"><input type="submit" value="去支付" id="submit-btn" class="submit-btn"></div></form></div></div>
{% endblock %}

购买课程-购买课程流程补充

def course_token(request):# video:是视频文件的完整链接file = request.GET.get('video')course_id = request.GET.get('course_id')if not CourseOrder.objects.filter(course_id=course_id,buyer=request.user,status=2).exists():return restful.params_error(message='请先购买课程!')expiration_time = int(time.time()) + 2 * 60 * 60USER_ID = settings.BAIDU_CLOUD_USER_IDUSER_KEY = settings.BAIDU_CLOUD_USER_KEY# file=http://hemvpc6ui1kef2g0dd2.exp.bcevod.com/mda-igjsr8g7z7zqwnav/mda-igjsr8g7z7zqwnav.m3u8extension = os.path.splitext(file)[1]media_id = file.split('/')[-1].replace(extension, '')# unicode->bytes=unicode.encode('utf-8')byteskey = USER_KEY.encode('utf-8')message = '/{0}/{1}'.format(media_id, expiration_time).encode('utf-8')signature = hmac.new(key, message, digestmod=hashlib.sha256).hexdigest()token = '{0}_{1}_{2}'.format(signature, USER_ID, expiration_time)return restful.result(data={'token': token})
    var player = cyberplayer("playercontainer").setup({width: '100%',height: '100%',file: video_url,image: cover_url,autostart: false,stretching: "uniform",repeat: false,volume: 100,controls: true,tokenEncrypt: true,// AccessKeyak: '42455a8c985649aeaa4ca86b50482d78'});player.on('beforePlay',function (e) {if(!/m3u8/.test(e.file)){return;}xfzajax.get({'url': '/course/course_token/','data': {'video': video_url,'course_id': course_id},'success': function (result) {if(result['code'] === 200){var token = result['data']['token'];player.setToken(e.file,token);}else{window.messageBox.showInfo(result['message']);player.stop();}},'fail': function (error) {console.log(error);}});});
};
def course_detail(request,course_id):course = Course.objects.get(pk=course_id)buyed = CourseOrder.objects.filter(course=course,buyer=request.user,status=2).exists()context = {'course': course,'buyed': buyed}return render(request,'course/course_detail.html',context=context)

http://chatgpt.dhexx.cn/article/r0DEAjtf.shtml

相关文章

视频的上传及购买播放

一、上传视频 1&#xff1a;使用百度云&#xff1a; 登录百度云&#xff1a;https://cloud.baidu.com/ 进入管理控制台&#xff1b;开通 “视频点播VOD” 服务&#xff1b;在后台管理系统 --> 右上角“安全认证” --> 获取 “AccessKey”&#xff1b;在 “视频点播VOD” …

基于SSM bootstrap的JSP MYSQL路路通汽车租赁系统

车辆租赁系统&#xff0c;主要包括对用户的管理&#xff0c;司机的管理&#xff0c;车辆的管理及租赁的管理等四大模块。车辆租用赁系统管理员系统的功能模块设计如图4-1&#xff0c;操作员子系统功能模块图如图4-2所示&#xff1a; 图4-1车辆租赁管理系统管理员操作子系统功能…

PaysApi第三方支付接口的接入与使用 React前端SSM后端

本文实现涉及实现思路以及预期结果 前端React 后端SSM 支付接口PaysApi以及阿里云 正式开始 对比了很多第三方支付接口&#xff0c;选到paysapi也是因为它捕获信息的能力经过测试后还不错&#xff0c;官方接口文档说明的非常清楚 &#xff0c;所以选用&#xff0c;这个demo…

企业微信接入自研小程序流程

一、背景 企业微信是企业内部办公常用的即时通讯工具&#xff0c;可以作为企业内部工作的枢纽&#xff0c;例如&#xff1a;重要内容通知&#xff0c;重要应用的集成等。 二、自研程序接入企业微信配置 1.登录企业微信管理后台https://work.weixin.qq.com/ 2.找到应用管理-…

【微信小程序】小程序发送订阅消息教程

1.订阅消息 订阅消息前身也就是模板消息,使用过模板消息的同学在使用订阅消息的时候就会非常简单了。下面让我们来看一下订阅消息如何使用! 传送门:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html 2.获取模板ID 这个在…

微信小程序的发布流程

当我们开发完小程序后需要做哪些事情才能上线&#xff0c;在小程序搜索到并且可以正常使用呢 首先&#xff0c;需要把http改成https&#xff0c;因为在本地调试的时侯我们在工具不检验合法域名&#xff0c;但是线上的版本必须是https&#xff0c;所以需要后端去申请一下。 然…

发布微信小程序体验版的流程

文章目录 发布微信小程序体验版的流程第一步第二步第三步在微信开发者工具的右上角&#xff0c;点击选择 **上传** ![在这里插入图片描述](https://img-blog.csdnimg.cn/66879544b7ec4cb6ae9c18e84352b79f.png) 第四步第五步总结 发布微信小程序体验版的流程 提示&#xff1a;…

微信小程序发布详细步骤

第一步&#xff1a;检查代码质量 运行微信开发者工具 > 点击详情&#xff0c;选择性能分析&#xff0c;进行代码质量的扫描。 把未通过的部分改改。 第二步&#xff1a;发布体验版 点击上传 > 填写版本号&#xff0c;项目备注 > 点击右下角上传即可 第三步&#xff…

微信小程序发送消息推送

在小程序开发中&#xff0c;如果想实现:用户发给小程序的消息以及开发者需要的事件推送,在小程序项目中&#xff0c;我们想要实现这样一个功能&#xff0c; 比如我们小程序中的客服功能&#xff0c;我不想要使用小程序后台的在线客服功能&#xff0c;但我又想实现客服功能&…

微信小程序订阅消息通过服务通知发送

第一步&#xff1a;申请模板获取模板ID&#xff1a; 登录微信公众平台 -> 功能 -> 订阅消息 -> 对里面的模板进行选用或者自定义 公共模板库里面的模板分为一次性订阅 和永久订阅&#xff0c;这个是根据你创建小程序时选择的行业进行区分的。 https://developers.we…

给微信小程序发送消息

给微信小程序发送消息 所用技术&#xff1a;后台&#xff1a;jeecgboot 数据库&#xff1a;oracle 前台&#xff1a;vue2.0 首先登陆微信公众平台 链接: https://mp.weixin.qq.com/ 1.登陆之后每个公司 都会有自己得相关参数例如 appid之类得 后面代码里时要用到的 2.然后先…

微信小程序通过公众号服务号发送消息

一、基础概念: 准备条件&#xff1a; 1、公众号和小程序必须在同一个公司主体下。 2、在公众号后台需要对小程序进程绑定操作。 公众号提供了两种消息&#xff0c;一种是订阅消息&#xff0c;一种是模板消息。 订阅消息需要用户主动订阅&#xff0c;然后才能接收消息&#x…

六、微信小程序发布流程

目录 1、上传2、提交审核 1、上传 当我们写完代码后 点击微信开发者工具的上传 要么是体验版 要么是1.0.1最新版 直接点击确定或上传即可 【前提是你本人必须是小程序的管理员或项目成员】 上传成功会有提示弹窗 2、提交审核 在版本管理中我们能看到上传的小程序版本 在这里我…

微信小程序发布全流程

1.在微信公众平台注册 我选的是用QQ邮箱注册的&#xff0c;因为我的163邮箱和微信绑定的&#xff0c;不能使用注册。 登陆进来就是这个页面啦。 2.npm打包&#xff08;假设您的电脑已经安装了nodeJS&#xff09; 选中您的项目&#xff0c;然后到项目的根目录下 执行npm ins…

微信小程序申请+开发+发布流程

框架用的Taro&#xff0c;开发工具用的是VSCode微信开发者工具&#xff0c;VSCode主要用来编码&#xff0c;微信开发者工具主要用来看和最后上传那么一下&#xff0c;其他没什么好说的。放张图&#xff0c;大家自行体会&#xff1a; 利用taro发布web程序如下&#xff1a; 过程整…

微信小程序发布流程

1.授权 登录微信公众平台微信公众平台&#xff0c;给相应人员授权&#xff1b;最好同时添加体验成员&#xff08;用于验证测试&#xff09;。 2.开发工具及代码 下载官方的微信开发者工具&#xff0c;使用微信扫一扫登录&#xff1b;同时下载最新的项目代码&#xff0c;导入…

信号与系统(四)

注&#xff1a;本博客是基于奥本海姆的《信号与系统》第二版编写&#xff0c;主要是为了自己考研&#xff0c;准备专业课。 (转载&#xff1a;https://blog.csdn.net/Explorer_day/article/details/77177542) 一、基本系统性质 1、记忆系统与无记忆系统 ①无记忆系统 如果对…

信号与系统 | 信号与系统概述 | 信号的基本概念和分类

文章目录 常见的概念信号的描述信号的分类确定信号和随机信号连续信号和离散信号周期信号和非周期信号能量信号和功率信号一维信号和多维信号因果信号和非因果信号 信号的matlab表示与绘图 常见的概念 消息&#xff0c;来自外界的各种报道统称为消息信息&#xff0c;消息中有意…

城市轨道交通信号系统学习笔记(四)信号机

信号机 <font face"楷体" size5>一、地面信号机的设置</font><font face"楷体" size5>二、信号显示</font> 城市轨道交通采用与铁路相同的色灯信号机&#xff0c;但设置位置和信号显示不同于铁路&#xff0c;信号显示距离也有自己…

信号与系统(一)

注&#xff1a;本博客是基于奥本海姆的《信号与系统》第二版编写&#xff0c;主要是为了自己考研&#xff0c;准备专业课。 (转载&#xff1a;https://blog.csdn.net/Explorer_day/article/details/76910002) 一、连续时间和离散时间信号 1、信号的定义 ①在物理上&#xf…