コード例 #1
0
    def get(self, request, course_id):
        course = Course.objects.get(id=int(course_id))
        # 查询用户是否已经学习了该课程
        user_courses = UserCourse.objects.filter(user=request.user,
                                                 course=course)
        if not user_courses:
            # 如果没有学习该门课程就关联起来
            user_course = UserCourse(user=request.user, course=course)
            user_course.save()

        # 相关课程推荐
        # 找到学习这门课的所有用户
        user_courses = UserCourse.objects.filter(course=course)
        # 找到学习这门课的所有用户的id
        user_ids = [user_course.user_id for user_course in user_courses]
        # 通过所有用户的id,找到所有用户学习过的所有课程
        all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
        # 取出所有课程id
        course_ids = [
            all_user_course.course_id for all_user_course in all_user_courses
        ]
        course_ids.remove(course.id)
        # 通过所有课程的id,找到所有的课程,按点击量去五个
        relate_courses = Course.objects.filter(
            id__in=course_ids).order_by("-click_nums")[:5]

        all_resources = CourseResource.objects.filter(course=course)
        all_comments = CourseComments.objects.filter(
            course=course).order_by("-id")
        return render(
            request, "course-comment.html", {
                "course": course,
                "all_resources": all_resources,
                'all_comments': all_comments,
                'relate_courses': relate_courses,
            })
コード例 #2
0
ファイル: views.py プロジェクト: qiao-7/qqOnline
    def get(self, request, video_id):
        video = Video.objects.get(id=int(video_id))
        #通过外键找到章节在找到视频对应的课程
        course = video.lesson.course
        course.students += 1
        course.save()

        #查询用户是否已经学习了该课程
        user_courses = UserCourse.objects.filter(user=request.user,
                                                 course=course)
        if not user_courses:
            #如果没有学习该门课程就关联起来
            user_course = UserCourse(user=request.user, course=course)
            user_course.save()
        #相关课程推荐
        #找到学习这门课的所有用户id
        user_course = UserCourse.objects.filter(course=course)
        #找到学习这门课的所有用户id
        user_ids = [user_course.user_id for user_course in user_course]
        #通过所有用户的Id,找到所有用户学习过的所有课程
        all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
        #取出所有课程
        course_ids = [
            all_user_course.course_id for all_user_course in all_user_courses
        ]
        relate_courses = Course.objects.filter(
            id__in=course_ids).order_by("-click_nums")[:5]
        # 资源
        all_resources = CourseResource.objects.filter(course=course)
        context = {
            'course': course,
            'all_resources': all_resources,
            'relate_courses': relate_courses,
            'video': video
        }
        return render(request, 'course/course-play.html', context)
コード例 #3
0
    def get(self, request, course_id):
        course = Course.objects.get(id=int(course_id))
        # 查询用户是否开始学习了该课,如果还未学习则,加入用户课程表
        user_courses = UserCourse.objects.filter(user=request.user,
                                                 course=course)

        if not user_courses:
            user_course = UserCourse(user=request.user, course=course)
            course.students += 1
            course.save()
            user_course.save()

        # 从关系中取出user_id
        user_ids = [user_course.user_id for user_course in user_courses]
        # 这些用户学了的课程,外键会自动有id,取到字段
        all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
        # 取出所有课程id
        course_ids = [
            user_course.course_id for user_course in all_user_courses
        ]
        # 获取学过该课程用户学过的其他课程
        # .exclude(id=course.id)表示剔除
        relate_courses = Course.objects.filter(
            id__in=course_ids).order_by("-click_nums").exclude(
                id=course.id)[:4]
        # 是否收藏课程

        all_resources = CourseResource.objects.filter(course=course)
        all_comments = CourseComments.objects.all()
        return render(
            request, 'course-comment.html', {
                'course': course,
                'all_resources': all_resources,
                'all_comments': all_comments,
                "relate_courses": relate_courses,
            })
コード例 #4
0
ファイル: views.py プロジェクト: leerumor/arolsweb
    def get(self, request, lesson_id):
        lesson = Lesson.objects.get(id=int(lesson_id))
        course = lesson.course

        # 查询用户是否已经学习了该课程
        user_courses = UserCourse.objects.filter(user=request.user,
                                                 course=course)
        if not user_courses:
            # 这里不用
            # user_courses.user = request.user
            # user_courses.course = course
            # 因为 user,course 是外键,在 UserCourse 实际上存储的是 id ,这些 id 是已经存在的
            user_courses = UserCourse(user=request.user, course=course)
            user_courses.save()

        # 记录用户行为日志
        course_lesson = UserLesson()
        course_lesson.lesson = lesson
        course_lesson.user = request.user
        course_lesson.save()

        # lstm-arols
        #seq = ['882617','883092','882609','882617','882537']
        log_seq = UserLesson.objects.filter(
            user=request.user).order_by('-add_time')[:5]
        #print(log_seq)
        pred_lessons = list()

        try:
            tmp = list()
            for item in log_seq:
                item_id = str(item.lesson.arols_id)
                #print(item_id)
                if item_id in word_vectors.vocab:
                    tmp.append(word_vectors[item_id])
            tmp = np.asarray(tmp)
            if len(tmp) == window_size:
                pred_vec = lstm_model.predict(
                    tmp.reshape(1, window_size, vector_size))
                pred_set = word_vectors.most_similar(positive=pred_vec, topn=5)
                for rmd_lesson in pred_set:
                    pred_lessons.append(rmd_lesson[0])
        except Exception as e:
            print(e)

        # 得出学过该课程的同学还学过的课程
        user_courses = UserCourse.objects.filter(course=course)
        user_ids = [user_course.user.id for user_course in user_courses]
        all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)
        course_ids = [
            user_course.course.id for user_course in all_user_courses
        ]

        relate_courses = Course.objects.filter(
            id__in=course_ids).order_by('-click_nums')[:5]

        all_resources = CourseResource.objects.filter(course=course)
        return render(
            request, 'course-lesson.html', {
                'lesson': lesson,
                'course': course,
                'all_resources': all_resources,
                'relate_courses': relate_courses,
                'pred_lessons': pred_lessons,
            })
コード例 #5
0
    def post(self, request):
        course_id = request.POST.get("course_id", "")
        course = Course.objects.get(id=int(course_id))

        course.students += 1
        course.save()

        user_name = request.POST.get("username", "")
        pass_word = request.POST.get("password", "")

        print("user_name = %s, pass_word = %s" % (user_name, pass_word))
        user = authenticate(username=user_name, password=pass_word)

        # 查询用户是否已经关联了该课程
        user_cs = UserCourse.objects.filter(user=user, course=course)
        print(user_cs)
        if not user_cs:
            user_course = UserCourse(user=user, course=course)
            user_course.save()

        user_courses = UserCourse.objects.filter(course=course)

        user_ids = [user_course.user.id for user_course in user_courses]

        all_user_courses = UserCourse.objects.filter(
            user_id__in=user_ids)  # user_in在列表里面
        # 所有课程id
        course_ids = [
            user_course.course.id for user_course in all_user_courses
        ]
        # 获取最近学过该课程的用户的其他课程
        relate_courses = Course.objects.filter(
            id__in=course_ids).order_by('-click_nums')[:5]

        all_resources = CourseResourse.objects.filter(course=course)
        # 转换为courselist

        courses = []
        courses.append({
            "org_name": course.course_org.name,
            'teacher': course.teacher.name,
            'name': course.name,
            'desc': course.desc,
            'degree': course.detail,
            'learn_times': course.learn_times,
            'students': course.students,
            'fav_nums': course.fav_nums,
            'image': str(course.image),
            'click_nums': course.click_nums,
            'category': course.category,
            'is_banner': course.is_banner,
            'youneed_know': course.youneed_know,
            'teacher_tell': course.teacher_tell,
            'tag': course.tag,
            'add_time': course.add_time
        })

        all_resources = course_Resourse_list(all_resources)
        relate_courses = course_list(relate_courses)

        return JsonResponse(
            {
                "status": 200,
                'data': {
                    'course': courses,
                    'all_resources': all_resources,
                    'relate_courses': relate_courses,
                }
            },
            json_dumps_params={'ensure_ascii': False})
コード例 #6
0
    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.filter(course=course).order_by('-add_time')

        # 查询用户是否已经关联了该课程
        user_courses = UserCourse.objects.filter(user=request.user, course=course)
        if not user_courses:
            user_course = UserCourse(user=request.user, course=course)
            user_course.save()


        # 该用户评分的所有课程的关联
        all_currentuser_courses = CourseScores.objects.filter(user=request.user)
        # 用户已评分课程的id
        all_currentuser_courses_ids = [all_currentuser_course.course.id for all_currentuser_course in all_currentuser_courses]
        # 所有课程
        all_courses = Course.objects.all()
        # 所有课程的id
        all_courses_ids = [all_course.id for all_course in all_courses]
        # 该用户没有评分的课程的id,差集
        all_currentuser_notcourses_ids = list(set(all_courses_ids).difference(set(all_currentuser_courses_ids)))

        # 建立一个双重列表
        if len(all_currentuser_courses_ids) > 0 and len(all_currentuser_notcourses_ids) > 0:
            xx = max(all_currentuser_courses_ids) + 1
            yy = max(all_currentuser_notcourses_ids) + 1
            # 计算 R(ij)
            R = []
            # 统计同时对i和j评分的用户数量
            N = []
            for x in range(xx):
                RY = []
                NY = []
                for y in range(yy):
                    RY.append(0)
                    NY.append(0)
                R.append(RY)
                N.append(NY)

            for i in all_currentuser_courses_ids:
                for j in all_currentuser_notcourses_ids:
                    # i是已评分,j是没评分
                    # 对i评分过的用户
                    scores_is = CourseScores.objects.filter(course_id=i)
                    # 这些用户的id
                    scores_i_ids = [scores_i.user.id for scores_i in scores_is]
                    # 对j评分过的用户
                    scores_js = CourseScores.objects.filter(course_id=j)
                    # 这些用户的id
                    scores_j_ids = [scores_j.user.id for scores_j in scores_js]
                    # 两者的交集就是同时给i和j评分的用户的id
                    scores_ij_ids = list(set(scores_i_ids).intersection(set(scores_j_ids)))

                    # 统计这些用户的数量,得到分母
                    count_scores_ij = len(scores_ij_ids)
                    N[i][j] = count_scores_ij

                    # 计算分子
                    count = 0
                    # 遍历对i和j都评分过的用户
                    for id in scores_ij_ids:
                        # 用户对i的评分
                        rui = CourseScores.objects.get(user_id=id, course_id=i).scores
                        # 用户对j的评分
                        ruj = CourseScores.objects.get(user_id=id, course_id=j).scores
                        # 得到分子
                        count = count + (rui - ruj)

                    # 相除得到 R(ij)
                    if count_scores_ij != 0:
                        R[i][j] = count/count_scores_ij
                    else:
                        R[i][j] = count

            # 计算预测评分 P(ij)
            P = []
            for y in range(yy):
                P.append(0)
            # 此时的用户是request.user,要对每个j进行预测评分
            for j in all_currentuser_notcourses_ids:
                # 分母是累加得到的
                count_all_users = 0
                # 分子同样是累加得到的
                count_all_users_scores = 0
                for i in all_currentuser_courses_ids:
                    # 累加得到分母
                    count_all_users = count_all_users + N[i][j]

                    # 计算分子
                    # 先取得 ri
                    ri = CourseScores.objects.get(user=request.user, course_id=i).scores
                    count_all_users_scores = count_all_users_scores + N[i][j] * (ri - R[i][j])

                # 通过累加后的分子除以累加后的分母,得到关于j的预测评分
                if count_all_users != 0:
                    P[j] = count_all_users_scores/count_all_users
                else:
                    P[j] = count_all_users_scores

            P_arr = np.array(P)
            P_Big = np.argsort(-P_arr)[:5]  # 逆序输出前5位
            relate_courses = Course.objects.filter(id__in=P_Big)

        else:
            user_courses = UserCourse.objects.filter(course=course)
            # 学习该课程的所有用户id
            user_ids = [user_course.user.id for user_course in user_courses]
            # 通过所有的用户id,取出这些id相关联的所有课程,此时每个课程都包含了一堆信息,例如:课程名,添加时间等等
            all_user_courses = UserCourse.objects.filter(user_id__in=user_ids)  # _id是通过user这个外键取id,__in是因为传进去的是一个list
            # 取出所有课程的id
            course_ids = [user_course.course.id for user_course in all_user_courses]
            # 排序取出点击数排在前5的课程
            relate_courses = Course.objects.filter(Q(id__in=course_ids)&~Q(id=course.id)).order_by('-click_nums')[:5]

        return render(request, 'course-comment.html', {
            'course': course,
            'course_resources': all_resources,
            'all_comments': all_comments,
            'relate_courses': relate_courses
        })