业务逻辑开发
—————— 学习周报 2018.12.23
完成情况:
- 1.课程详情页
- 2.课程章节信息
- 3.课程评论功能
- 4.相关课程推荐
- 5.视频播放页面
- 6.讲师列表页
- 7.讲师详情页
笔记:
1、课程详情页
- 导入
course-detail.HTML
文件,并改写 urls.py
和views.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.html
和teacher-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
})
- 列表页展示:
- 排行榜展示:
- 讲师详情页展示: