项目介绍:
项目名称:基于Django的网易云热评歌单数据可视化分析;项目实现功能:用户登陆注册,用户个人信息编辑修改,数据总览以及实现歌单的收藏,针对歌单的点赞量,评论量,收藏量,歌曲量,歌单类型等系列数据参数对数据进行可视化分析。
项目技术简介:
登陆注册:
# 01用户登录
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
if request.method == 'POST':
name = request.POST.get('name')
password = request.POST.get('password')
if User.objects.filter(username=name, password=password):
user=User.objects.get(username=name, password=password)
username=request.session['username'] = {'username':user.username,'avatar':str(user.avatar)}
return redirect('index')
else:
msg = '信息错误!'
return render(request, 'login.html', {"msg": msg})
# 02用户注册
def register(request):
if request.method == 'POST':
name = request.POST.get('name')
password = request.POST.get('password')
phone = request.POST.get('phone')
email = request.POST.get('email')
avatar = request.FILES.get('avatar')
stu = User.objects.filter(username=name)
if stu:
msg = '用户已存在!'
return render(request, 'register.html', {"msg": msg})
else:
User.objects.create(username=name,password=password,phone=phone,email=email,avatar=avatar)
msg = "注册成功!"
return render(request, 'login.html', {"msg": msg})
if request.method == 'GET':
return render(request,'register.html')
用户登录 (login
函数)
-
GET
请求:当用户访问登录页面时,视图函数会返回登录页面模板。 -
POST
请求:当用户提交登录表单时,视图函数会获取表单中提交的用户名和密码。 -
使用
User.objects.filter(username=name, password=password)
进行用户名和密码的验证。这里使用了filter()
方法而不是get()
方法,因为filter()
方法会返回一个 QuerySet,即使没有匹配项也不会引发异常。 -
如果存在匹配的用户,则将用户对象赋值给
user
变量,并将用户名和头像信息存储在会话(session)中,然后重定向到首页。 -
如果用户名或密码错误,视图函数将返回登录页面,并在页面上显示错误信息。
用户注册 (register
函数)
-
POST
请求:当用户提交注册表单时,视图函数会获取表单中提交的用户名、密码、电话、邮箱和头像信息。 -
使用
User.objects.filter(username=name)
检查用户名是否已经存在于数据库中。 -
如果用户名已经存在,则返回注册页面,并在页面上显示错误信息。
-
如果用户名不存在,使用
User.objects.create()
创建新用户,并将用户信息存储到数据库中。 -
注册成功后,返回登录页面,并在页面上显示注册成功的消息。
def tableData(request): username = request.session.get("username").get('username') useravatar = request.session.get("username").get('avatar') userInfo = User.objects.get(username=username) tableData = Songs.objects.all() paginator = Paginator(tableData, 10) # 根据请求地址的信息来跳转页码数据 cur_page = 1 if request.GET.get("page"): cur_page = int(request.GET.get("page")) if cur_page: c_page = paginator.page(cur_page) else: c_page = paginator.page(1) page_range = [] visibleNumber = 10 min = int(cur_page - visibleNumber / 2) if min < 1: min = 1 max = min + visibleNumber if max > paginator.page_range[-1]: max = paginator.page_range[-1] for i in range(min,max): page_range.append(i) return render(request, 'tableData.html',{ 'username': username, 'useravatar': useravatar, 'userInfo': userInfo, 'tableData':tableData, "pagination":paginator, "c_page":c_page, 'page_range':page_range }) def historyTableData(request): username = request.session.get("username").get('username') userInfo = User.objects.get(username=username) historyData = Histroy.objects.all() return render(request,'historyTableData.html',{ 'userInfo': userInfo, 'historyData':historyData }) def addHistory(request,songId): username = request.session.get("username").get('username') userInfo = User.objects.get(username=username) getHistoryTableData.addHistory(userInfo,songId) return redirect('historyTableData')
tableData
函数:
- 从会话(session)中获取当前登录用户的用户名和头像信息。
- 使用
User.objects.get(username=username)
通过用户名获取用户的详细信息。 - 获取所有歌曲数据,使用
Songs.objects.all()
。 - 使用 Django 的
Paginator
对歌曲数据进行分页处理,每页显示 10 条记录。 - 通过
request.GET.get("page")
获取当前请求的页码,然后通过paginator.page(cur_page)
获取当前页的记录。 - 计算页码范围(
page_range
),用于在页面上显示页码导航。页码范围根据当前页码和一个固定的可见页码数量(visibleNumber
)来计算。 - 将收集到的所有信息通过上下文传递给
tableData.html
模板并渲染页面。
historyTableData
函数:
- 类似于
tableData
函数,从会话中获取当前登录用户的用户名,并获取用户的详细信息。 - 获取所有历史记录数据,使用
History.objects.all()
。 - 将用户信息和历史记录数据通过上下文传递给
historyTableData.html
模板并渲染页面。
addHistory
函数:
- 从会话中获取当前登录用户的用户名,并获取用户的详细信息。
addHistory(userInfo, songId)
似乎是一个尝试将指定歌曲 ID 与当前用户的历史记录关联的操作。但是,代码中没有提供getHistoryTableData.addHistory
的实现细节,因此无法具体解释其功能。假设它是用来添加一个新的历史记录项到数据库中。- 完成添加历史记录后,通过
redirect('historyTableData')
重定向到历史记录页面。
def songDistribute(request):
username = request.session.get("username").get('username')
useravatar = request.session.get("username").get('avatar')
songs = Songs.objects.all();dict1={};result1=[];dict2={};result2=[];
for i in songs:
if dict1.get(i.tag,-1)==-1:
dict1[i.tag]=1
else:
dict1[i.tag]+=1
for k,v in dict1.items():
result1.append({
'value': v,
"name":k
})
for i in songs:
if dict2.get(datetime.strptime(str(i.time), '%Y-%m-%d').year,-1)==-1:
dict2[datetime.strptime(str(i.time), '%Y-%m-%d').year]=1
else:
dict2[datetime.strptime(str(i.time), '%Y-%m-%d').year]+=1
for k,v in dict2.items():
result2.append({
'value': v,
"name":k
})
context={'result1':result1,'result2':result2,'username':username,'useravatar':useravatar}
return render(request,'songDistribute.html',context)
def songScore(request):
username = request.session.get("username").get('username')
useravatar = request.session.get("username").get('avatar')
songs1=Songs.objects.all().order_by('-playcount')[0:10]
songs2=Songs.objects.all().order_by('-commentcount')[0:10]
data1=['收藏量','分享量','评论量'];data2=['收藏量','播放量','分享量']
list1=[];list2=[];list3=[];list4=[];list5=[];list6=[];list7=[];list8=[];
# 取得评分前10的景点名称
for p in songs1:
list1.append(p.collectcount);list2.append(p.sharecount);list3.append(p.commentcount);list4.append(p.title)
for p in songs2:
list5.append(p.playcount);list6.append(p.collectcount);list7.append(p.sharecount);list8.append(p.title)
context={'data1':data1,'data2':data2,'list1':list1,'list2':list2,'list3':list3,'list4':list4,'list5':list5,'list6':list6,'list7':list7,'list8':list8,'username':username,'useravatar':useravatar}
return render(request,'songScore.html',context)
def songwordcloud(request):
username = request.session.get("username").get('username')
useravatar = request.session.get("username").get('avatar')
# wouldCloud.wouldCloudMain()
context = {'username':username,'useravatar':useravatar}
return render(request,'songwordcloud.html',context)
def songtyperank(request):
username = request.session.get("username").get('username')
useravatar = request.session.get("username").get('avatar')
list1_legend=[];list1=[];list2_legend=[];list2=[];list3_legend=[];list3=[]
type1songs=Songs.objects.all().filter(tag='华语').order_by('-playcount')[:10]
type2songs=Songs.objects.all().filter(tag='欧美').order_by('-playcount')[:10]
type3songs=Songs.objects.all().filter(tag='日语').order_by('-playcount')[:10]
for p in type1songs:
list1_legend.append(p.title)
list1.append({'value':p.playcount,'name':p.title})
for p in type2songs:
list2_legend.append(p.title)
list2.append({'value':p.playcount,'name':p.title})
for p in type3songs:
list3_legend.append(p.title)
list3.append({'value':p.playcount,'name':p.title})
context={'username':username,'useravatar':useravatar,'list1_legend':list1_legend,'list1':list1,'list2_legend':list2_legend,'list2':list2,'list3_legend':list3_legend,'list3':list3}
return render(request, 'songtyperank.html', context)
songDistribute
函数:
- 从会话(session)中获取当前登录用户的用户名和头像信息。
- 获取所有歌曲数据,使用
Songs.objects.all()
。 - 统计歌曲的标签(tag)和年份信息,分别存储在
dict1
和dict2
字典中,并将统计结果转换成适合图表展示的格式。 - 将处理后的数据传递给模板,并渲染
songDistribute.html
页面。
songScore
函数:
- 从会话(session)中获取当前登录用户的用户名和头像信息。
- 获取收藏量、分享量、评论量和播放量排名前 10 的歌曲数据,并将其存储在
songs1
和songs2
列表中。 - 将数据组织成适合图表展示的格式,并传递给模板,以便在页面上显示歌曲的评分情况。
songwordcloud
函数:
这个函数的目的是生成歌曲标题和标签的词云图,用于展示歌曲标题和标签的热门关键词。在实际应用中,可以在页面上展示这些词云图,以便用户更直观地了解歌曲的热门主题和标签。
- 从会话(session)中获取当前登录用户的用户名和头像信息。
-
导入必要的模块和库,包括
Songs
模型、matplotlib
绘图库、jieba
中文分词库以及WordCloud
词云库。 -
从数据库中获取所有歌曲数据,使用
Songs.objects.all()
。 -
遍历每首歌曲,将歌曲标题和标签(tag)拼接成一个长字符串,并使用
jieba
分词库对其进行分词处理。 -
从文件中读取停用词(stopwords),这些词通常是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉的词语,如“的”、“了”、“是”等。
-
对分词后的结果进行处理,去除停用词,并统计词频,将其保存在
word_dict
字典中。 -
使用
WordCloud
词云库生成词云图,设置字体、背景颜色和尺寸等参数,并调用generate_from_frequencies
方法根据词频生成词云图。 -
使用
matplotlib
绘制词云图,并将其保存为静态文件(如 JPEG 格式的图片)。 -
重复以上步骤,分别生成歌曲标签的词云图,并保存为另一个静态文件。
- 将用户信息传递给模板,以便在页面上显示。
songtyperank
函数:
- 从会话(session)中获取当前登录用户的用户名和头像信息。
- 获取华语、欧美和日语歌曲的播放量排名前 10 的数据,并将其存储在
type1songs
、type2songs
和type3songs
列表中。 - 将数据组织成适合图表展示的格式,并传递给模板,以便在页面上显示不同类型歌曲的播放排行。