from django.shortcuts import render, redirect
from .models import MarkModel, CommentModel, HotModel, LikeModel, MusicModel, CategoryModel, UserInfoModel
from django.http import JsonResponse
import numpy as np
def index(request):
hots = HotModel.objects.all()
categories = CategoryModel.objects.all()
context = {'hots': hots, 'categories': categories}
return render(request, 'index.html', context=context)
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
username = request.POST.get('username')
password = request.POST.get('password')
if not (username or password):
return JsonResponse({'code': 400, 'message': '缺少必传的参数'})
user = UserInfoModel.objects.filter(username=username, password=password).first()
if not user:
return JsonResponse({'code': 400, 'message': '账号或密码错误'})
request.session['login_in'] = True
request.session['username'] = user.username
request.session['user_id'] = user.id
return JsonResponse({'code': 200})
def register(request):
if request.method == 'GET':
return render(request, 'register.html')
else:
username = request.POST.get('username')
password1 = request.POST.get('password1')
password2 = request.POST.get('password2')
email = request.POST.get('email')
if not (username or password1 or password2):
return JsonResponse({'code': 400, 'message': '缺少必传的参数'})
if password1 != password2:
return JsonResponse({'code': 400, 'message': '两次输入的密码不一致!'})
flag = UserInfoModel.objects.filter(username=username).first()
if flag:
return JsonResponse({'code': 400, 'message': '该用户名已存在'})
UserInfoModel.objects.create(username=username, password=password1, email=email)
return JsonResponse({'code': 200})
def logout(request):
flag = request.session.clear()
return redirect('/')
def music_detail(request, music_id):
music = MusicModel.objects.get(id=music_id)
comments = CommentModel.objects.filter(music_id=music_id)
user_id = request.session.get('user_id')
if user_id:
flag_mask = MarkModel.objects.filter(item_id=music_id, user_id=user_id).first()
else:
flag_mask = False
music.view_number += 1
music.save()
context = {'music': music, 'comments': comments, 'flag_mask': flag_mask}
return render(request, 'music_detail.html', context=context)
def music_list(request, category_id):
musics = MusicModel.objects.filter(category_id=category_id)
context = {'musics': musics}
return render(request, 'music_list.html', context=context)
def add_like(request):
music_id = request.POST.get('music_id')
user_id = request.session.get('user_id')
flag = LikeModel.objects.filter(music_id=music_id, user_id=user_id).first()
if flag:
return JsonResponse({'code': 400, 'message': '您已添加,请勿重复添加'})
LikeModel.objects.create(user_id=user_id, music_id=music_id)
return JsonResponse({'code': 200})
def my_like(request):
user_id = request.session.get('user_id')
likes = LikeModel.objects.filter(user_id=user_id)
return render(request, 'my_like.html', {'likes': likes})
def delete_like(request):
like_id = request.POST.get('like_id')
LikeModel.objects.get(id=like_id).delete()
return JsonResponse({'code': 200})
def my_info(request):
user_id = request.session.get('user_id')
if request.method == 'GET':
info = UserInfoModel.objects.filter(id=user_id).first()
context = {'info': info}
return render(request, 'my_info.html', context=context)
else:
username = request.POST.get('username')
password = request.POST.get('password')
email = request.POST.get('email')
if not (username or password or email):
return JsonResponse({'code': 400, 'message': '参数不能为空'})
UserInfoModel.objects.filter(id=user_id).update(username=username, password=password, email=email)
return JsonResponse({'code': 200})
def top_view(request):
if request.method == 'GET':
return render(request, 'top_view.html')
else:
musics = MusicModel.objects.all()[:30]
name_list = []
count_list = []
for music in musics:
name_list.append(music.name)
count_list.append(music.view_number)
return JsonResponse({'code': 200, 'name_list': name_list, 'count_list': count_list})
def add_comment(request):
user_id = request.session.get('user_id')
if not user_id:
return JsonResponse({'code': 400, 'message': '请先登录'})
content = request.POST.get('content')
music_id = request.POST.get('music_id')
if not content:
return JsonResponse({'code': 400, 'message': '内容不能为空'})
CommentModel.objects.create(user_id=user_id, content=content, music_id=music_id)
return JsonResponse({'code': 200})
def calculate_cosine_similarity(user_ratings1, user_ratings2):
item_ratings1 = {rating.item_id: rating.score for rating in user_ratings1}
item_ratings2 = {rating.item_id: rating.score for rating in user_ratings2}
common_items = set(item_ratings1.keys()) & set(item_ratings2.keys())
if len(common_items) == 0:
return 0.0
user1_scores = np.array([item_ratings1[item_id] for item_id in common_items])
user2_scores = np.array([item_ratings2[item_id] for item_id in common_items])
cosine_similarity = np.dot(user1_scores, user2_scores) / (np.linalg.norm(user1_scores) * np.linalg.norm(user2_scores))
print(cosine_similarity)
return cosine_similarity
def user_based_recommendation(request, user_id):
try:
target_user = UserInfoModel.objects.get(id=user_id)
except UserInfoModel.DoesNotExist:
return JsonResponse({'code': 400, 'message': '该用户不存在'})
target_user_ratings = MarkModel.objects.filter(user=target_user)
recommended_items = {}
for other_user in UserInfoModel.objects.exclude(pk=user_id):
other_user_ratings = MarkModel.objects.filter(user=other_user)
similarity = calculate_cosine_similarity(target_user_ratings, other_user_ratings)
if similarity > 0:
for item_rating in other_user_ratings:
if item_rating.item.id not in [r.item.id for r in target_user_ratings]:
if item_rating.item.id in recommended_items:
recommended_items[item_rating.item.id]['score'] += similarity * item_rating.score
recommended_items[item_rating.item.id]['similarity'] += similarity
else:
recommended_items[item_rating.item.id] = {'score': similarity * item_rating.score, 'similarity': similarity}
sorted_recommended_items = sorted(recommended_items.items(), key=lambda x: x[1]['score'], reverse=True)
top_recommended_items = [item_id for item_id, _ in sorted_recommended_items[:10]]
response_data = []
for item_id in top_recommended_items:
item = MusicModel.objects.get(pk=item_id)
similarity = recommended_items[item_id]['similarity']
response_data.append({'name': item.name, 'id': item.id, 'image': item.image, 'similarity': similarity, 'file_url': item.file.url})
context = {'response_data': response_data}
print(context)
return render(request, 'music_recommend.html', context=context)
def input_score(request):
user_id = request.session.get('user_id')
if not user_id:
return JsonResponse({'code': 400, 'message': '请先登录'})
score = int(request.POST.get('score'))
item_id = request.POST.get('music_id')
MarkModel.objects.create(item_id=item_id, score=score, user_id=user_id)
return JsonResponse({'code': 200})