1、项目介绍

技术栈:
python语言、django框架、Echarts可视化、requests爬虫技术、HTML、深度学习、TensorFlow、推荐算法、千千音乐网站、音乐播放功能

首页:展示了数据概况,包括统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析等,帮助用户了解平台的整体情况和音乐趋势。
音乐推荐:根据用户的听歌历史和偏好,智能推荐歌曲,提升用户体验。
歌曲列表:展示了平台上的所有歌曲,用户可以通过搜索或浏览的方式找到自己喜欢的歌曲。
歌单歌曲列表:用户可以根据自己的喜好创建或加入歌单,方便管理和分享歌曲。
音乐播放:提供了音乐播放功能,用户可以在线收听歌曲,享受音乐带来的愉悦。
音乐评论:用户可以对歌曲进行评论和打分,与其他用户分享听歌感受。
歌曲评分:用户可以对歌曲进行打分,系统会根据打分情况对歌曲进行排序和推荐。
我的收藏:用户可以收藏自己喜欢的歌曲或歌单,方便以后再次收听。
音乐类型选择分析:通过图表的形式展示了不同音乐类型的分布情况,帮助用户了解平台的音乐类型偏好。
歌曲词云图分析:利用词云图展示了歌曲中的关键词和热门词汇,帮助用户了解歌曲的主题和情感。
历史播放记录:记录了用户的播放历史,方便用户回顾和继续收听之前的歌曲。
注册登录:提供了用户注册和登录功能,保护用户数据安全,同时方便用户管理自己的个人信息和偏好。
后台数据管理:管理员可以通过后台管理系统对平台上的数据进行管理和维护,包括歌曲信息、用户信息、评论数据等。

2、项目界面

(1)首页—数据概况(统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析)

3、项目说明

一、技术栈
前端:使用了HTML进行页面布局和设计,同时结合了Echarts进行数据可视化,使得统计数据和分析结果能够以图表的形式直观展现。
后端:基于Python语言和Django框架开发,Django提供了强大的路由管理、模板渲染和用户认证等功能,使得后端开发更加高效和稳定。
爬虫技术:利用requests库进行数据抓取,可以从千千音乐网站等音乐平台上获取歌曲信息、歌词等数据,为系统的音乐库提供丰富的资源。
深度学习:通过TensorFlow等深度学习框架,实现了智能音乐推荐功能,能够根据用户的听歌历史和偏好,为其推荐相似的歌曲。
推荐算法:除了深度学习外,还可能结合了其他推荐算法,如协同过滤、基于内容的推荐等,以进一步提升推荐的准确性和多样性。

二、功能模块

首页:展示了数据概况,包括统计数据、音乐类型分析、歌曲发布时间分析、歌曲时长分析等,帮助用户了解平台的整体情况和音乐趋势。
音乐推荐:根据用户的听歌历史和偏好,智能推荐歌曲,提升用户体验。
歌曲列表:展示了平台上的所有歌曲,用户可以通过搜索或浏览的方式找到自己喜欢的歌曲。
歌单歌曲列表:用户可以根据自己的喜好创建或加入歌单,方便管理和分享歌曲。
音乐播放:提供了音乐播放功能,用户可以在线收听歌曲,享受音乐带来的愉悦。
音乐评论:用户可以对歌曲进行评论和打分,与其他用户分享听歌感受。
歌曲评分:用户可以对歌曲进行打分,系统会根据打分情况对歌曲进行排序和推荐。
我的收藏:用户可以收藏自己喜欢的歌曲或歌单,方便以后再次收听。
音乐类型选择分析:通过图表的形式展示了不同音乐类型的分布情况,帮助用户了解平台的音乐类型偏好。
歌曲词云图分析:利用词云图展示了歌曲中的关键词和热门词汇,帮助用户了解歌曲的主题和情感。
历史播放记录:记录了用户的播放历史,方便用户回顾和继续收听之前的歌曲。
注册登录:提供了用户注册和登录功能,保护用户数据安全,同时方便用户管理自己的个人信息和偏好。
后台数据管理:管理员可以通过后台管理系统对平台上的数据进行管理和维护,包括歌曲信息、用户信息、评论数据等。

三、总结
该系统是一个集音乐播放、数据分析、智能推荐和用户互动于一体的综合性音乐平台。通过先进的技术栈和丰富的功能模块,为用户提供了优质的听歌体验和便捷的数据分析服务。同时,后台管理系统的引入也保证了平台数据的稳定性和安全性。无论是音乐爱好者还是数据分析师,都能在该系统中找到属于自己的乐趣和价值。

4、核心代码



from django.shortcuts import render
import json

from user.models import User, CollectSong, HistorySong, RateSong, CommentSong
from music.models import Song, SongSheet, SongType
from utils import homeUtilsFn, recommendationTensorflow


# Create your views here.

def home(request):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)
    typeList = homeUtilsFn.getSongTypeList()
    HotSongSheetList = homeUtilsFn.getHotSongSheetData()[:8]
    TopData10 = homeUtilsFn.getTopData10()
    a = 0
    for i in TopData10:
        a += 1
        i.num = a
    # print(recommentList)

    recommendList = homeUtilsFn.get_default_recommend()
    # print(recommendList)
    try:
        computeList = recommendationTensorflow.predict(userInfo.id)
        recommendList = computeList + recommendList[len(computeList):]
        # print(computeList)
    except:
        pass

    return render(request, 'index.html', {
        'userInfo': userInfo,
        'typeList': typeList,
        'recommendList': recommendList,
        'HotSongSheetList': HotSongSheetList,
        'TopData10': TopData10,
    })


def music(request, id):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)
    # print(id)
    # 获取指定ID的歌曲信息
    musicInfo = Song.objects.get(songId=id)
    # 初始化标志位,假设用户未收藏该歌曲
    flag = True
    # 获取当前用户的历史歌曲收藏记录
    userHistoryList = HistorySong.objects.filter(user=userInfo)
    # 遍历用户的历史收藏记录
    for collect in userHistoryList:
        # 如果用户已经收藏了这首歌曲
        if collect.song.songId == int(id):
            flag = False
            break
        # 如果用户没有收藏这首歌曲,flag保持为True
    # 如果标志位为True,说明用户未收藏该歌曲,创建新的收藏记录
    if flag:
        HistorySong.objects.create(user=userInfo, song_id=int(id))

    if request.method == 'POST':
        # 创建新的评论对象
        CommentSong.objects.create(
            user=userInfo,  # 假设userInfo是已经定义的用户实例
            song=musicInfo,  # musicInfo是歌曲的实例
            content=request.POST.get('content')  # 从POST请求中获取评论内容
        )
    # 获取该歌曲的所有评论
    CommentList = CommentSong.objects.filter(song=musicInfo)

    return render(request, 'music.html', {
        'userInfo': userInfo,
        'musicInfo': musicInfo,
        'songId': id,
        'CommentList': CommentList,
    })


# 歌单类型
def songSheetList(request):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)
    typeList = homeUtilsFn.getSongTypeList()
    defaultType = int(typeList[0].SongTypeId)
    if request.GET.get('defaultType'):
        defaultType = int(request.GET.get('defaultType'))
    typeId = homeUtilsFn.getSongTypeList(defaultType)
    # print(typeId)
    songSheet = SongSheet.objects.filter(song_type=typeId)[::-1]
    # print(songSheet)
    return render(request, 'songSheetList.html', {
        'userInfo': userInfo,
        'songSheetList': songSheet,
        'typeList': typeList,
        'defaultType': defaultType,
    })


# 歌曲
def songSheetDetail(request, id):
    # 从session中获取当前登录的用户名
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)  # 获取用户信息
    songSheet = SongSheet.objects.get(sheetId=id)  # 获取歌单信息

    # 获取当前歌单的类型,并转换标签列表
    song_type = songSheet.song_type
    tagList = json.loads(song_type.tagList)  # 将标签列表转换为Python字典

    # 获取该歌单的歌曲列表
    songList = homeUtilsFn.getSongBysheet(id)
    # print(songList)
    userCollectList = CollectSong.objects.filter(user=userInfo)  # 获取用户收藏的歌曲列表

    def map_fn(item):
        item.status = False
        for i in userCollectList:
            if i.song.songId == item.songId:
                item.status = True
                break
        return item

    songList = list(map(map_fn, songList))

    # 渲染模板,并传递变量
    return render(request, 'songSheetDetail.html', {
        'userInfo': userInfo,
        'songList': songList,
        'songSheet': songSheet,
        'userCollectList': userCollectList,
        'tagList': tagList,
    })


# 搜索
def search(request):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)

    if request.method == 'POST':
        searchWord = request.POST.get('searchWord')
        resultData = Song.objects.filter(title__icontains=searchWord)
        return render(request, 'search.html', {
            'userInfo': userInfo,
            'resultData': resultData
        })
    else:
        return render(request, 'search.html', {
            'userInfo': userInfo
        })


# 歌曲基础数据
def basicData(request):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)
    sumMusic, sumUser, maxSinger, maxType = homeUtilsFn.gerOrdinary()
    lineX, lineY, x2Data, y2Data = homeUtilsFn.getSongType()
    timeList = homeUtilsFn.getMusicTime()
    durationX, durationY = homeUtilsFn.getSquareData()
    return render(request, 'basicData.html', {
        'userInfo': userInfo,
        'sumMusic': sumMusic,
        'sumUser': sumUser,
        'maxSinger': maxSinger,
        'maxType': maxType,
        'lineX': lineX,
        'lineY': lineY,
        'timeList': timeList,
        'durationX': durationX,
        'durationY': durationY,
    })


# 歌曲类型查歌手
def typeData(request):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)
    lineX, lineY, x2Data, y2Data = homeUtilsFn.getSongType()
    defaultType = x2Data[0]
    if request.method == 'POST':
        defaultType = request.POST.get('type')
    singerX, singerY = homeUtilsFn.getsingerNum(defaultType)
    # print(defaultType)
    return render(request, 'typeData.html', {
        'userInfo': userInfo,
        'x2Data': x2Data,
        'singerX': singerX,
        'singerY': singerY
    })


# 歌曲标题词云图
def titleCloud(request):
    username = request.session.get('username')

    userInfo = User.objects.get(username=username)

    return render(request, 'titleCloud.html', {
        'userInfo': userInfo,
    })


# 歌曲标题词云图
def singerCloud(request):
    username = request.session.get('username')
    userInfo = User.objects.get(username=username)

    return render(request, 'singerCloud.html', {
        'userInfo': userInfo,
    })

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐