在线教育项目(五)之课程功能实现

功能:

  1. 课程列表(分页,排序,课程推荐)
  2. 课程详情页(收藏,章节展示,资源展示,评论)

url配置:

urlpatterns = [
    # 课程列表
    url(r'^list/', CourseListView.as_view(), name='course_list'),
    # 课程详情
    url(r'^detail/(?P<course_id>\d+)/', CourseDetailView.as_view(), name='course_detail'),
    # 课程章节信息页
    url(r'^info/(?P<course_id>\d+)/', CourseInfoView.as_view(), name='course_info'),
    # 课程视频播放
    url(r'^video/(?P<video_id>\d+)/', VideoPlayView.as_view(), name='video_play'),
    # 评论
    url(r'^comments/(?P<course_id>\d+)/', CommentsView.as_view(), name='course_comments'),
    #添加评论
    url(r'^add_comment/', AddCommentsView.as_view(), name='add_comment'),
]

课程列表页面

class CourseListView(View):
    def get(self, request):
        # 获取所有课程,默认以时间排序
        all_courses = Course.objects.all().order_by('-add_time')
        # 热门课程推荐
        hot_courses = all_courses.order_by('-click_nums')[:3]
        # 搜索
        keyword = request.GET.get('keywords', '')
        if keyword:
            # i表示忽略大小写
            all_courses = all_courses.filter(
                Q(name__icontains=keyword) | Q(detail__icontains=keyword) | Q(desc__icontains=keyword))

        # 按最热门与参与人数排序
        sort = request.GET.get('sort', '')
        if sort:
            if sort == 'hot':
                all_courses = all_courses.order_by('-click_nums')
            elif sort == 'students':
                all_courses = all_courses.order_by('-students')

        # 分页处理,每页两个
        try:
            page = request.GET.get('page', 1)
        except PageNotAnInteger:
            page = 1
        p = Paginator(all_courses, 2, request=request)
        courses = p.page(page)

        return render(request, 'course-list.html', {'all_courses': courses,
                                                    'sort': sort, 'hot_courses': hot_courses})

 

 课程详情页面,有推荐课程的功能

 

 

class CourseDetailView(View):
    def get(self, request, course_id):
        course = Course.objects.get(id=int(course_id))
        # 根据标签推荐课程
        tag = course.tag
        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
            elif UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2):
                has_fav_org = True
        if tag:
            relate_courses = Course.objects.filter(tag=tag)[:2]
        else:
            relate_courses = []
        return render(request, 'course-detail.html', {'course': course,
                                                      'relate_courses': relate_courses,
                                                      'has_fav_course': has_fav_course,
                                                      'has_fav_org': has_fav_org})

 章节页面

 

class CourseInfoView(View):
    def get(self, request, course_id):
        course = Course.objects.get(id=int(course_id))
        # 用户点击开始学习,查询用户是否已经学过这个课程,如果没有,就关联起来,在个人中心用到
        user_course = UserCourse.objects.filter(user=request.user, course=course)
        if not user_course:
            UserCourse.objects.create(user=request.user, course=course)  # 关联

        # 推荐其他人学习的课程
        # 找到学习这门课的所有人
        user_courses = UserCourse.objects.filter(course=course)
        # 获取这些人的id
        user_ids = [user_course.user_id for user_course in user_courses]
        # 获取他们所学的所有课程
        all_courses_ids = UserCourse.objects.filter(user_id__in=user_ids)
        # 按课程id获取课程,并按点击量取前五个
        relate_courses = Course.objects.filter(id__in=all_courses_ids).order_by('-click_nums')[:5]

        all_resources = CourseResource.objects.filter(course=course)
        return render(request, 'course-video.html', {'relate_courses': relate_courses,
                                                     'course': course,
                                                     'all_resources': all_resources})

 视频播放页面:

 

# 视频播放
class VideoPlayView(LoginRequiredMixin, View):
    def get(self, request, video_id):
        video = Video.objects.get(id=int(video_id))
        course = video.lesson.course
        # 查询用户是否已经学过这个课程,如果没有,就关联起来
        user_course = UserCourse.objects.filter(user=request.user, course=course)
        if not user_course:
            UserCourse.objects.create(user=request.user, course=course)  # 关联

        # 推荐其他人学习的课程
        # 找到学习这门课的所有人
        user_courses = UserCourse.objects.filter(course=course)
        # 获取这些人的id
        user_ids = [user_course.user_id for user_course in user_courses]
        # 获取他们所学的所有课程
        all_courses_ids = UserCourse.objects.filter(user_id__in=user_ids)
        # 按课程id获取课程,并按点击量取前五个
        relate_courses = Course.objects.filter(id__in=all_courses_ids).order_by('-click_nums')[:5]

        all_resources = CourseResource.objects.filter(course=course)
        return render(request, 'course-play.html', {'relate_courses': relate_courses,
                                                    'course': course,
                                                    'all_resources': all_resources,
                                                    'video': video})

 评论页面:
 

#获取评论
class CommentsView(LoginRequiredMixin, View):
    def get(self, request, course_id):
        # 由课程获取评论
        course = Course.objects.get(id=int(course_id))
        all_resources = CourseResource.objects.filter(course=course)
        all_comments = CourseComments.objects.all()

        # 推荐其他人学习的课程
        # 找到学习这门课的所有人
        user_courses = UserCourse.objects.filter(course=course)
        # 获取这些人的id
        user_ids = [user_course.user_id for user_course in user_courses]
        # 获取他们所学的所有课程
        all_courses_ids = UserCourse.objects.filter(user_id__in=user_ids)
        # 按课程id获取课程,并按点击量取前五个
        relate_courses = Course.objects.filter(id__in=all_courses_ids).order_by('-click_nums')[:5]
        return render(request, 'course-comment.html',
                      {'relate_courses': relate_courses, 'course': course, 'all_resources': all_resources,
                       'all_comments': all_comments})

#添加评论
class AddCommentsView(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) and comments:
            # 获取评论的哪门课程
            course = Course.objects.get(id=int(course_id))
            CourseComments.objects.create(user=request.user, course=course, comments=comments)
            return HttpResponse({"status": "success", "msg": "评论成功"}, content_type='application/json')
        else:
            return HttpResponse({"status": "fail", "msg": "评论失败"}, content_type='application/json')

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值