Python打造在线教学平台 —— 周报 6

业务逻辑开发

		                    ——————  学习周报 2018.12.23


在这里插入图片描述

完成情况:

  • 1.课程详情页
  • 2.课程章节信息
  • 3.课程评论功能
  • 4.相关课程推荐
  • 5.视频播放页面
  • 6.讲师列表页
  • 7.讲师详情页


笔记:

1、课程详情页

  • 导入course-detail.HTML文件,并改写
  • urls.pyviews.py编写
#  views.py编写

class CourseDetailView(View):
    """
    课程详情页
    """
    def get(self, request, course_id):
        course = Course.objects.get(id=int(course_id))

        # 增加课程点击数
        course.click_nums += 1
        course.save()

        # 是否收藏课程
        has_fav_course = False

        # 是否收藏机构
        has_fav_org = False

        if request.user.is_authenticated():
            if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1):
                has_fav_course = True

            if UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2):
                has_fav_org = True

        tag = course.tag
        if tag:
            relate_coures = Course.objects.filter(tag=tag)[:1]
        else:
            relate_coures = []

        return render(request, "course-detail.html", {
            "course": course,
            "relate_coures": relate_coures,
            "has_fav_course": has_fav_course,
            "has_fav_org": has_fav_org
        })

在这里插入图片描述

  • 功能1:增加课程推荐
<div class="head">相关课程推荐</div>
 <div class="group_recommend">
       {% for relate_course in relate_coures %}
           <dl>
               <dt>
                   <a target="_blank" href="">
                       <img width="240" height="220" class="scrollLoading" src="{{ MEDIA_URL }}{{ relate_course.image }}"/>
                   </a>
               </dt>
               <dd>
                   <a target="_blank" href=""><h2> {{ relate_course.name }}</h2></a>
                   <span class="fl">学习时长:<i class="key">{{ relate_course.learn_times }}</i></span>
               </dd>
           </dl>
       {% endfor %}

在这里插入图片描述

  • 功能2: 课程详情页增加收藏功能
    在这里插入图片描述

2、课程章节信息

  • 导入course-video.html文件,进行继承更改
  • 配置urls.py文件和views.py文件
  • 进入后台数据库,增加课程章节信息
    在这里插入图片描述
  • 点击开始学习,进入章节信息页:
    在这里插入图片描述
  • 功能: 课程资源下载
    进入后台上传课程资源,页面点击下载,弹出下载框
    在这里插入图片描述

3、课程评论功能

  • 导入前端页面course-comment.html,继承base.html等进行修改,views.py中写入实现“课程评论”的方法。
  • 配置urls.py
  • video.html文件与comment.html文件中要进行页面跳转的配置。
  • 点击评论,进入评论页面
    在这里插入图片描述

具体实现评论功能:

功能1:发表评论
  • 添加评论前,首先还是得判断“用户是否登录”。这样才符合逻辑。
  • course/view.py编写“添加评论方法 ”:
class AddComentsView(View):
    """
    用户添加课程评论
    """
    def post(self, request):
        if not request.user.is_authenticated():
            # 判断用户登录状态
            return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')

        course_id = request.POST.get("course_id", 0)
        comments = request.POST.get("comments", "")
        if int(course_id) > 0 and comments:
            course_comments = CourseComments()
            course = Course.objects.get(id=int(course_id))
            course_comments.course = course
            course_comments.comments = comments
            course_comments.user = request.user
            course_comments.save()
            return HttpResponse('{"status":"success", "msg":"添加成功"}', content_type='application/json')
        else:
            return HttpResponse('{"status":"fail", "msg":"添加失败"}', content_type='application/json')
 


辨析:get()方法与filter()的具体不同用法:

  • get(): 如果有数据,返回一条数据;如果没有数据,抛出异常。
  • filter():如果有数据,返回一个request,类似一个可以遍历的数组;如果没有数据,返回一个空的request,不会抛出异常。


  • 配置urls.py,建立一个访问地址:
    #  添加课程评论
    url(r'^add_comment/$', AddComentsView.as_view(), name="add_comment"),
  • course-comment.html中增加实现评论的js代码:
{% block custom_js %}
    <script type="text/javascript">
    //添加评论
    $('#js-pl-submit').on('click', function(){
        var comments = $("#js-pl-textarea").val()
        if(comments == ""){
            alert("评论不能为空")
            return
        }
        $.ajax({
            cache: false,
            type: "POST",
            url:"{% url 'course:add_comment' %}",
            data:{'course_id':{{ course.id }}, 'comments':comments},
            async: true,
            beforeSend:function(xhr, settings){
                xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
            },
            success: function(data) {
                if(data.status == 'fail'){
                    if(data.msg == '用户未登录'){
                        window.location.href="/login/";
                    }else{
                        alert(data.msg)
                    }

                }else if(data.status == 'success'){
                    window.location.reload();//刷新当前页面.
                }
            },
        });
    });

</script>
{% endblock %}

4、相关课程推荐

  • views.py中的方法进行添加;
  • html文件进行修改;
<ul class="other-list">
    {% for relate_course in relate_courses %}
        <li class="curr">
            <a href="{% url 'course:course_detail' relate_course.id %}" target="_blank">
                <img src="{{ MEDIA_URL }}{{ relate_course.image }}" alt="{{ relate_course.name }}">
                <span class="name autowrap">{{ relate_course.name }}</span>
            </a>
        </li>
    {% endfor %}
  • 展示课程推荐:
    在这里插入图片描述

5、视频播放页面

  • 导入video-play.html文件,继承base.html,进行修改;
  • views.py中编写VideoPlayView(View)方法;
  • urls.py中进行配置;
  • course-video.html文件中添加访问跳转id
  • 点击章节,跳转入播放页面
    在这里插入图片描述
    对于上传视频问题: 可在"七牛云"进行,上传视频资源后,它会自动生成一个访问地址。

6、讲师列表页与详情页

  • 导入teacher-list.htmlteacher-detail.html文件,进行配置修改;
  • 配置urls.py
  • views.py中编写讲师列表页方法TeacherListView()
class TeacherListView(View):
    """
    课程讲师列表页
    """
    def get(self, request):
        all_teachers = Teacher.objects.all()

        # 课程讲师搜索
        search_keywords = request.GET.get('keywords', "")
        if search_keywords:
            all_teachers = all_teachers.filter(Q(name__icontains=search_keywords)|
                                               Q(work_company__icontains=search_keywords)|
                                               Q(work_position__icontains=search_keywords))

        sort = request.GET.get('sort', "")
        if sort:
            if sort == "hot":
                all_teachers = all_teachers.order_by("-click_nums")

        sorted_teacher = Teacher.objects.all().order_by("-click_nums")[:3]

        # 对讲师进行分页
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1

        p = Paginator(all_teachers, 3, request=request)

        teachers = p.page(page)
        return render(request, "teachers-list.html", {
            "all_teachers": teachers,
            "sorted_teacher": sorted_teacher,
            "sort": sort,
        })
  • 讲师详情页方法TeacherDetailView();
class TeacherDetailView(View):
    def get(self, request, teacher_id):
        teacher = Teacher.objects.get(id=int(teacher_id))
        teacher.click_nums += 1
        teacher.save()
        all_courses = Course.objects.filter(teacher=teacher)

        has_teacher_faved = False
        if request.user.is_authenticated():
            if UserFavorite.objects.filter(user=request.user, fav_type=3, fav_id=teacher.id):
                has_teacher_faved = True

        has_org_faved = False
        if request.user.is_authenticated():
            if UserFavorite.objects.filter(user=request.user, fav_type=2, fav_id=teacher.org.id):
                has_org_faved = True

        #讲师排行
        sorted_teacher = Teacher.objects.all().order_by("-click_nums")[:3]
        return render(request, "teacher-detail.html", {
            "teacher":teacher,
            "all_courses":all_courses,
            "sorted_teacher":sorted_teacher,
            "has_teacher_faved": has_teacher_faved,
            "has_org_faved":has_org_faved
        })
  • 列表页展示:
    在这里插入图片描述
  • 排行榜展示:
    在这里插入图片描述
  • 讲师详情页展示:
    在这里插入图片描述


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值