赞
踩
项目名称:基于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
函数:User.objects.get(username=username)
通过用户名获取用户的详细信息。Songs.objects.all()
。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
函数:Songs.objects.all()
。dict1
和 dict2
字典中,并将统计结果转换成适合图表展示的格式。songDistribute.html
页面。songScore
函数:songs1
和 songs2
列表中。songwordcloud
函数:这个函数的目的是生成歌曲标题和标签的词云图,用于展示歌曲标题和标签的热门关键词。在实际应用中,可以在页面上展示这些词云图,以便用户更直观地了解歌曲的热门主题和标签。
导入必要的模块和库,包括 Songs
模型、matplotlib
绘图库、jieba
中文分词库以及 WordCloud
词云库。
从数据库中获取所有歌曲数据,使用 Songs.objects.all()
。
遍历每首歌曲,将歌曲标题和标签(tag)拼接成一个长字符串,并使用 jieba
分词库对其进行分词处理。
从文件中读取停用词(stopwords),这些词通常是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉的词语,如“的”、“了”、“是”等。
对分词后的结果进行处理,去除停用词,并统计词频,将其保存在 word_dict
字典中。
使用 WordCloud
词云库生成词云图,设置字体、背景颜色和尺寸等参数,并调用 generate_from_frequencies
方法根据词频生成词云图。
使用 matplotlib
绘制词云图,并将其保存为静态文件(如 JPEG 格式的图片)。
重复以上步骤,分别生成歌曲标签的词云图,并保存为另一个静态文件。
songtyperank
函数:type1songs
、type2songs
和 type3songs
列表中。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。