功能:
- 课程列表(分页,排序,课程推荐)
- 课程详情页(收藏,章节展示,资源展示,评论)
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')