毕业设计源码:Python个性化音乐推荐系统 Django+协同过滤算法+Echarts可视化打造优质体验 人工智能 大数据(建议收藏)✅

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机大数据专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈
Python语言、Django框架、基于用户的协同过滤推荐算法、Echarts可视化、HTML、CSS、JavaScript、MySQL/PostgreSQL数据库

功能模块

  • 可视化界面
  • 首页
  • 音乐播放与信息展示
  • 音乐详情页
  • 音乐推荐
  • 后台数据管理
  • 音乐数据管理

项目介绍
本音乐推荐系统基于Python和Django开发,融合协同过滤推荐算法与Echarts可视化技术,打造了功能完善的音乐服务平台。系统前端以HTML、CSS、JS构建交互界面,后端依托Django处理业务逻辑,采用MySQL/PostgreSQL存储数据。平台为用户提供音乐分类浏览、播放、评分评论、个性化推荐等功能,同时通过可视化图表呈现音乐数据趋势;管理员可在后台完成音乐、用户、评论等数据的全流程管理,保障数据安全与平台运营,为用户带来个性化、便捷的音乐体验。

2、项目界面

(1)可视化
该页面是音乐推荐系统中的音乐浏览量可视化分析页面,可展示音乐浏览量的柱状图,同时系统还具备音乐推荐、数据可视化、我的收藏、个人信息、后台管理等相关功能模块,支持用户进行音乐浏览与系统管理等操作。

在这里插入图片描述

(2)首页–类型选择、热门音乐
该页面是音乐推荐系统的首页,包含轮播图展示、热门音乐列表展示、音乐分类筛选功能,同时系统还具备音乐推荐、数据可视化、我的收藏、个人信息、后台管理等导航功能,支持用户浏览热门音乐、按分类筛选音乐以及进行系统相关操作。

在这里插入图片描述

(3)音乐信息、播放、查看详情
该页面是音乐推荐系统的音乐信息页面,可展示音乐名称、浏览量、封面图片,支持在线播放、音量调节、查看音乐详情等操作,同时系统还具备首页、音乐推荐、数据可视化、我的收藏、个人信息、后台管理等导航功能,方便用户进行相关操作。

在这里插入图片描述

(4)可视化分析–音乐浏览量
该页面是音乐推荐系统的数据可视化页面,可通过柱状图展示音乐浏览量的可视化分析,同时系统还具备首页、音乐推荐、我的收藏、个人信息、后台管理等导航功能,方便用户进行相关操作。

在这里插入图片描述

(5)音乐详情页—-评分、评论、点赞收藏

该页面是音乐推荐系统的音乐详情页面,可展示音乐基础信息、封面、歌词,支持在线播放音乐和对音乐进行评分操作,同时系统还具备首页、音乐推荐、数据可视化、我的收藏、个人信息、后台管理等导航功能,便于用户开展相关操作。

在这里插入图片描述

(6)音乐推荐—协同过滤推荐算法

该页面是音乐推荐系统的音乐推荐页面,依托协同过滤算法实现个性化音乐推荐,可展示推荐音乐的名称、封面,支持在线播放和查看音乐详情操作,同时系统还具备首页、数据可视化、我的收藏、个人信息、后台管理等导航功能,方便用户进行相关操作。

在这里插入图片描述

(7)后台数据管理

该页面是音乐推荐系统的后台管理页面,可进行收藏信息、热门音乐、用户信息、类别信息、评分信息、评论信息、音乐信息等快捷操作,还能查看最近操作动作,同时系统还具备信息管理、认证和授权等导航功能,方便管理员开展相关管理操作。

在这里插入图片描述

(8)音乐数据管理
该页面是音乐推荐系统后台管理中的音乐信息管理页面,可展示音乐名称、作者、封面及创建时间,支持对音乐信息进行增加和删除操作,同时系统后台还具备收藏信息、热门音乐、用户信息、类别信息、评分信息、评论信息等管理模块,方便管理员开展各类数据管理操作。

在这里插入图片描述

3、项目说明

一、技术栈
本个性化音乐推荐系统以Python为核心开发语言,基于Django框架搭建后端服务,融合基于用户的协同过滤推荐算法实现个性化推荐,前端采用HTML、CSS、JavaScript构建交互界面,并结合Echarts库完成数据可视化呈现,数据库选用MySQL或PostgreSQL存储各类业务数据,整体技术架构稳定且具备良好的扩展性。

二、功能模块

  • 可视化界面:依托Echarts库实现音乐浏览量、用户行为分析等数据的可视化展示,以柱状图等形式直观呈现音乐流行趋势与用户喜好,同时关联音乐推荐、后台管理等功能模块,支撑用户数据查看与系统管理操作。
  • 首页:设置轮播图、音乐分类筛选区与热门音乐推荐列表,用户可按类型筛选音乐、浏览热门曲目,页面还集成音乐推荐、数据可视化、个人信息等导航入口,便捷用户操作。
  • 音乐播放与信息展示:用户点击音乐后可进入专属播放页面,查看音乐名称、浏览量、封面等基础信息,支持在线播放、音量调节,还可跳转至详情页,搭配多模块导航功能提升操作流畅度。
  • 音乐详情页:展示音乐的歌手、专辑、歌词等完整信息,支持用户完成评分、评论、点赞、收藏等互动操作,多维度满足用户参与需求,增强平台社区属性。
  • 音乐推荐:基于用户协同过滤算法,结合用户历史行为与相似用户偏好,为用户推送个性化音乐,推荐页面展示音乐名称、封面,支持播放与查看详情,提升用户发现新音乐的效率。
  • 后台数据管理:管理员可在此完成收藏信息、用户信息、评分评论信息等多类数据的快捷操作,查看最近操作记录,依托信息管理、认证授权等功能,保障系统数据管理的规范性。
  • 音乐数据管理:作为后台核心模块,可展示音乐名称、作者、创建时间等信息,支持音乐数据的新增、删除操作,联动其他后台管理模块,实现音乐库的全流程维护。

三、项目总结
本音乐推荐系统围绕用户个性化音乐需求搭建,技术层面整合Python、Django、协同过滤算法与Echarts可视化技术,构建了前端交互友好、后端逻辑完善的服务平台。功能上覆盖用户侧的音乐浏览、播放、互动、个性化推荐,以及管理侧的全维度数据管控,既通过可视化让数据趋势更直观,又依托推荐算法提升用户体验。系统不仅满足普通用户发现、聆听音乐的核心需求,也为管理员提供了高效的运营管理工具,整体架构清晰、功能完备,具备较高的实用价值与拓展潜力。

4、核心代码


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]  # 显示30条数据
        name_list = []
        count_list = []
        for music in musics:
            name_list.append(music.name)
            count_list.append(music.view_number)
            # count_list.sort(reverse=True)
        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):
    # 将用户1的音乐评分存入字典,键为音乐ID,值为评分
    item_ratings1 = {rating.item_id: rating.score for rating in user_ratings1}
    # 将用户2的音乐评分存入字典,键为音乐ID,值为评分
    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  # 无共同评价的音乐,相似度为0
    # 提取共同评价音乐的评分,存入NumPy数组
    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 not in target_user_ratings.values_list('item', flat=True):
                    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)
    # 获取排名靠前的推荐音乐的ID
    top_recommended_items = [item_id for item_id, _ in sorted_recommended_items[:10]]  # 前5
    # 构建响应数据
    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
        })
    print(response_data)
    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})

5、源码获取方式

© 版权声明

相关文章