恢复并更新src文件夹内容

main
HanJun27 5 months ago
parent e9fac53a27
commit 55eec800c4

@ -0,0 +1,53 @@
## Django简易音乐网站
首先:
在确保计算机环境已经安装好python3以上版本以及虚拟环境的情况下执行
mkvirtualenv 虚拟环境名称 -p python3
然后:
打开项目配置好对应环境的解释器后
pip3 install requirements.txt
如果下载报错就手动单个包安装,主要的包也没几个
然后:
```
创建本地mysql数据库
注意此处数据库名称需要与setting中配置一样建议自行修改setting配置信息
create database music charset=utf8mb4;
```
然后:
```
数据库迁移完成后,可以本地查看是否成功,若成功无误后,执行:
python manage.py createsuperuser
创建超级管理员账户, 此账户用于admin管理系统的使用
```
然后:
```
终端定位到music项目目录执行
python manage.py migrate
数据库迁移版本信息已经生成,这里直接迁移就好, 注意django2.2.5迁移可能会出现报错,解决方法见:
https://www.cnblogs.com/huiyichanmian/p/12142671.html
```
最后:
```
项目迁移完成后可以执行python manage.py runserver本地测试运行项目中我个人利用爬虫爬取了一百首歌曲
相关歌曲存放位置static/songFile,
相关歌曲图片存放位置static/songImg,
相关歌曲歌词存放位置static/songLyric
这三个文件夹是静态文件寻址的默认位置在使用admin管理平台进行添加音乐时只需要填写 音乐.mp3 图片.jpg 歌词.txt文件名称即可
注意歌词文件只准备了一首歌的测试文件只支持lrc文本格式。
```
## 如果想要给自己的音乐网站搬运更多的歌曲详情请见我个人的另外一个网易云音乐爬虫项目,支持批量导入喔!!!

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class CommentConfig(AppConfig):
name = 'comment'

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

@ -0,0 +1,124 @@
{% extends "title_base.html" %}
{% load staticfiles %}
{% block header_extends %}
<link type="image/x-icon" rel="shortcut icon" href="{% static 'favicon.ico' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/common.css' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/comment.css' %}">
{% endblock %}
{% block content %}
<body class="review">
<div class="header">
<a href="/" class="logo" title="首页"><img alt="易点音乐" src="{% static 'image/logo.png' %}"></a>
<div class="search-box">
<form id="searchForm" action="{% url 'search' 1 %}" method="post" target="_blank">
{% csrf_token %}
<div class="search-keyword">
<input id="kword" name="kword" type="text" class="keyword" maxlength="120" placeholder="音乐节" />
</div>
<input id="subSerch" type="submit" class="search-button" value="搜 索" />
</form>
<div id="suggest" class="search-suggest"></div>
<div class="search-hot-words">
{% for song in search_song %}
<a target="play" href="{% url 'play' song.song.song_id %}" >{{ song.song.song_name }}</a>
{% endfor %}
</div>
</div>
</div><!--end header-->
<div class="nav-box">
<div class="nav-box-inner">
<ul class="nav clearfix">
<li><a href="/">首页</a></li>
<li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li>
<li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li>
</ul>
</div>
</div><!--end nav-box-->
<div class="wrapper">
<div class="breadcrumb">
<a href="/">首页</a> &gt;
<a href="{% url 'play' song_id %}" target="_self">{{song_name}}</a> &gt;
<span>点评</span>
</div>
<div class="page-title" id="currentSong"></div>
</div>
<div class="wrapper">
<div class="section">
<div class="section-header"><h3 class="section-title">网友点评</h3></div>
<div class="section-content comments-score-new review-comments-score clearfix">
<div class="clearfix">
<!--点评框-->
<div class="comments-box">
<div class="comments-box-title">我要点评<<{{ song_name }}>></div>
<div class="comments-default-score clearfix"></div>
<form action="" method="post" id="usrform">
{% csrf_token %}
<div class="writebox">
<textarea name="comment" form="usrform"></textarea>
</div>
<div class="comments-box-button clearfix">
<input type="submit" value="发布" class="_j_cc_post_entry cc-post-entry" id="scoreBtn">
<div data-role="user-login" class="_j_cc_post_login"></div>
</div>
<div id="scoreTips2" style="padding-top:10px;"></div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="wrapper clearfix">
<div class="content">
<div id="J_CommentList">
<ul class="comment-list">
{% for item in contacts.object_list %}
<li class="comment-item ">
<div class="comments-user">
<span class="face">
<img src="{% static 'image/user.jpg' %}" width="60" height="60">
</span>
</div>
<div class="comments-list-content">
<div class="single-score clearfix">
<span class="date">{{ item.comment_date }}</span>
<div><span class="score">{{ item.comment_user }}</span></div>
</div>
<!--comments-content-->
<div class="comments-content">
<div class="J_CommentContent comment-height-limit">
<div class="content-inner">
<div class="comments-words">
<p>{{ item.comment_text }}</p>
</div>
</div>
</div>
</div>
</div>
</li>
{% endfor %}
</ul>
<div class="page-box">
<div class="pagebar" id="pageBar">
{% if contacts.has_previous %}
<a href="{% url 'comment' song_id %}?page={{ contacts.previous_page_number }}" class="prev" target="_self"><i></i>上一页</a>
{% endif %}
{% for page in contacts.paginator.page_range %}
{% if contacts.number == page %}
<span class="sel">{{ page }}</span>
{% else %}
<a href="{% url 'comment' song_id %}?page={{ page }}" target="_self">{{ page }}</a>
{% endif %}
{% endfor %}
{% if contacts.has_next %}
<a href="{% url 'comment' song_id %}?page={{ contacts.next_page_number }}" class="next" target="_self">下一页<i></i></a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,22 @@
"""music URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from comment.views import CommentView
urlpatterns = [
path('<int:song_id>', CommentView.as_view(), name='comment'),
]

@ -0,0 +1,41 @@
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render, redirect
from django.http import Http404
from django.views import View
from index.models import *
import time
class CommentView(View):
def post(self, request, song_id):
# 点评提交处理
comment_text = request.POST.get('comment', '')
comment_user = request.user.username if request.user.username else '匿名用户'
if comment_text:
comment = Comment()
comment.comment_text = comment_text
comment.comment_user = comment_user
comment.comment_date = time.strftime('%Y-%m-%d', time.localtime(time.time()))
comment.song_id = song_id
comment.save()
return redirect('/comment/%s' % song_id)
def get(self, request, song_id):
# 热搜歌曲
search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:6]
song_info = Song.objects.filter(song_id=song_id).first()
# 歌曲不存在抛出404异常
if not song_info:
raise Http404
comment_all = Comment.objects.filter(song_id=song_id).order_by('comment_date')
song_name = song_info.song_name
page = int(request.GET.get('page', 1))
paginator = Paginator(comment_all, 2)
try:
contacts = paginator.page(page)
except PageNotAnInteger:
contacts = paginator.page(1)
except EmptyPage:
contacts = paginator.page(paginator.num_pages)
return render(request, 'comment.html', locals())

@ -0,0 +1,16 @@
from django.apps import AppConfig
import os
import pymysql
pymysql.install_as_MySQLdb()
# 修改app在Admin后台显示名称
# default_app_config的值来自apps.py的类名
default_app_config = 'index.IndexConfig'
# 获取当前app的命名
def get_current_app_name(_file):
return os.path.split(os.path.dirname(_file))[-1]
# 重写类IndexConfig
class IndexConfig(AppConfig):
name = get_current_app_name(__file__)
verbose_name = '网站首页'

@ -0,0 +1,53 @@
from django.contrib import admin
from .models import *
# 修改title和header
admin.site.site_title = '我的音乐后台管理系统'
admin.site.site_header = '我的音乐'
@admin.register(Label)
class LabelAdmin(admin.ModelAdmin):
# 设置模型字段用于Admin后台数据的表头设置
list_display = ['label_id', 'label_name']
# 设置可搜索的字段并在Admin后台数据生成搜索框如有外键应使用双下划线连接两个模型的字段
search_fields = ['label_name']
# 设置排序方式
ordering = ['label_id']
@admin.register(Song)
class SongAdmin(admin.ModelAdmin):
# 设置模型字段用于Admin后台数据的表头设置
list_display = ['song_id', 'song_name', 'song_singer', 'song_album', 'song_languages', 'song_release']
# 设置可搜索的字段并在Admin后台数据生成搜索框如有外键应使用双下划线连接两个模型的字段
search_fields = ['song_name', 'song_singer', 'song_album', 'song_languages']
# 设置过滤器,在后台数据的右侧生成导航栏,如有外键应使用双下划线连接两个模型的字段
list_filter = ['song_singer', 'song_album', 'song_languages']
# 设置排序方式
ordering = ['song_id']
@admin.register(Dynamic)
class DynamicAdmin(admin.ModelAdmin):
# 设置模型字段用于Admin后台数据的表头设置
list_display = ['dynamic_id', 'song', 'dynamic_plays', 'dynamic_search', 'dynamic_down']
# 设置可搜索的字段并在Admin后台数据生成搜索框如有外键应使用双下划线连接两个模型的字段
search_fields = ['song']
# 设置过滤器,在后台数据的右侧生成导航栏,如有外键应使用双下划线连接两个模型的字段
list_filter = ['dynamic_plays', 'dynamic_search', 'dynamic_down']
# 设置排序方式
ordering = ['dynamic_id']
@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
# 设置模型字段用于Admin后台数据的表头设置
list_display = ['comment_id', 'comment_text', 'comment_user', 'song', 'comment_date']
# 设置可搜索的字段并在Admin后台数据生成搜索框如有外键应使用双下划线连接两个模型的字段
search_fields = ['comment_user', 'song', 'comment_date']
# 设置过滤器,在后台数据的右侧生成导航栏,如有外键应使用双下划线连接两个模型的字段
list_filter = ['song', 'comment_date']
# 设置排序方式
ordering = ['comment_id']
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class IndexConfig(AppConfig):
name = 'index'

@ -0,0 +1,75 @@
# Generated by Django 2.2.5 on 2019-09-11 07:37
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Label',
fields=[
('label_id', models.AutoField(primary_key=True, serialize=False, verbose_name='序号')),
('label_name', models.CharField(max_length=10, verbose_name='分类标签')),
],
options={
'verbose_name': '歌曲分类',
'verbose_name_plural': '歌曲分类',
},
),
migrations.CreateModel(
name='Song',
fields=[
('song_id', models.AutoField(primary_key=True, serialize=False, verbose_name='序号')),
('song_name', models.CharField(max_length=50, verbose_name='歌名')),
('song_singer', models.CharField(max_length=50, verbose_name='歌手')),
('song_time', models.CharField(max_length=10, verbose_name='时长')),
('song_album', models.CharField(max_length=100, verbose_name='专辑')),
('song_languages', models.CharField(max_length=20, verbose_name='语种')),
('song_company', models.CharField(max_length=50, verbose_name='唱片公司')),
('song_release', models.CharField(max_length=20, verbose_name='发行时间')),
('song_img', models.CharField(max_length=20, verbose_name='歌曲图片')),
('song_lyrics', models.CharField(default='暂无歌词', max_length=50, verbose_name='歌词')),
('song_file', models.CharField(max_length=50, verbose_name='歌曲文件')),
('label', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='index.Label', verbose_name='歌名分类')),
],
options={
'verbose_name': '歌曲信息',
'verbose_name_plural': '歌曲信息',
},
),
migrations.CreateModel(
name='Dynamic',
fields=[
('dynamic_id', models.AutoField(primary_key=True, serialize=False, verbose_name='序号')),
('dynamic_plays', models.IntegerField(verbose_name='播放次数')),
('dynamic_search', models.IntegerField(verbose_name='搜索次数')),
('dynamic_down', models.IntegerField(verbose_name='下载次数')),
('song', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='index.Song', verbose_name='歌名')),
],
options={
'verbose_name': '歌曲动态',
'verbose_name_plural': '歌曲动态',
},
),
migrations.CreateModel(
name='Comment',
fields=[
('comment_id', models.AutoField(primary_key=True, serialize=False, verbose_name='序号')),
('comment_text', models.CharField(max_length=500, verbose_name='内容')),
('comment_user', models.CharField(max_length=20, verbose_name='用户')),
('comment_date', models.CharField(max_length=50, verbose_name='日期')),
('song', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='index.Song', verbose_name='歌名')),
],
options={
'verbose_name': '歌曲评论',
'verbose_name_plural': '歌曲评论',
},
),
]

@ -0,0 +1,68 @@
from django.db import models
# 歌曲分类表label
class Label(models.Model):
label_id = models.AutoField('序号', primary_key=True)
label_name = models.CharField('分类标签', max_length=10)
def __str__(self):
return self.label_name
class Meta:
# 设置Admin界面的显示内容
verbose_name = '歌曲分类'
verbose_name_plural = '歌曲分类'
# 歌曲信息表song
class Song(models.Model):
song_id = models.AutoField('序号', primary_key=True)
song_name = models.CharField('歌名', max_length=50)
song_singer = models.CharField('歌手', max_length=50)
song_time = models.CharField('时长', max_length=10)
song_album = models.CharField('专辑', max_length=100)
song_languages = models.CharField('语种', max_length=20)
song_company = models.CharField('唱片公司', max_length=50)
song_release = models.CharField('发行时间', max_length=20)
song_img = models.CharField('歌曲图片', max_length=20)
song_lyrics = models.CharField('歌词', max_length=50, default='暂无歌词')
song_file = models.CharField('歌曲文件', max_length=50)
label = models.ForeignKey(Label, on_delete=models.CASCADE, verbose_name='歌名分类')
def __str__(self):
return self.song_name
class Meta:
# 设置Admin界面的显示内容
verbose_name = '歌曲信息'
verbose_name_plural = '歌曲信息'
# 歌曲动态表dynamic
class Dynamic(models.Model):
dynamic_id = models.AutoField('序号', primary_key=True)
song = models.ForeignKey(Song, on_delete=models.CASCADE, verbose_name='歌名')
dynamic_plays = models.IntegerField('播放次数')
dynamic_search = models.IntegerField('搜索次数')
dynamic_down = models.IntegerField('下载次数')
class Meta:
# 设置Admin界面的显示内容
verbose_name = '歌曲动态'
verbose_name_plural = '歌曲动态'
# 歌曲点评表comment
class Comment(models.Model):
comment_id = models.AutoField('序号', primary_key=True)
comment_text = models.CharField('内容', max_length=500)
comment_user = models.CharField('用户', max_length=20)
song = models.ForeignKey(Song, on_delete=models.CASCADE, verbose_name='歌名')
comment_date = models.CharField('日期', max_length=50)
class Meta:
# 设置Admin界面的显示内容
verbose_name = '歌曲评论'
verbose_name_plural = '歌曲评论'
# Create your models here.

@ -0,0 +1,191 @@
{% extends "title_base.html" %}<!-- extends引用统一的模板文件 -->
{% load staticfiles %}
{% block header_extends %}<!-- 第一个块 -->
<link type="image/x-icon" rel="shortcut icon" href="{% static 'favicon.ico' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/common.css' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/index.css' %}">
<!-- <link type="text/css" rel="stylesheet" href="{% static 'css/index.css' %}"> -->
{% endblock %}
{% block content %}<!-- 第二个块在block里面填充页面内容 -->
<body class="index">
<!-- 最顶部的导航栏 -->
<div class="header">
<a href="/" class="logo" title="首页"><img alt="我的音乐" src="../static/image/logo.png"></a>
<div class="search-box">
<!-- html的表单 -->
<form id="searchForm" action="{% url 'search' 1 %}" method="post" target="_blank">
{% csrf_token %}
<div class="search-keyword">
<input name="kword" type="text" class="keyword" maxlength="120" placeholder="音乐节" />
</div>
<input id="subSerch" type="submit" class="search-button" value="搜 索" />
</form>
<div id="suggest" class="search-suggest"></div>
<!-- 在搜索框下面显示热门歌曲 -->
<div class="search-hot-words">
{% for song in search_song %}
<a target="play" href="{% url 'play' song.song.song_id %}" >{{ song.song.song_name }}</a>
{% endfor %}
</div>
</div>
</div>
<!-- 搜索框下面的导航栏 -->
<div class="nav-box">
<div class="nav-box-inner">
<ul class="nav clearfix">
<li><a href="/">首页</a></li>
<li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li>
<li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li>
</ul>
</div>
</div><!--end nav-box-->
<!-- 最左侧的音乐分类导航栏,中间的大图片,右侧栏热门歌曲模块 -->
<div class="wrapper clearfix">
<div class="category-nav">
<div class="category-nav-header">
<strong><a href="javascript:;" title="">音乐分类</a></strong>
</div>
<div class="category-nav-body">
<div id="J_CategoryItems" class="category-items">
{% for label in label_list %}
<div class="item" data-index="1">
<h3><a href="javascript:;">{{ label.label_name }}</a></h3>
</div>
{% endfor %}
</div>
</div>
</div>
<div class="main">
<div id="J_FocusSlider" class="focus">
<div id="bannerLeftBtn" class="banner_btn"></div>
<ul class="focus-list f_w">
<li class="f_s"><a target="play" href="{% url 'play' 2 %}" class="layz_load" >
<img data-src="{% static '/image/tu3.png' %}" width="750" height="275"></a>
</li>
<li class="f_s"><a target="play" href="{% url 'play' 4 %}" class="layz_load" >
<img data-src="{% static '/image/datu-1.jpg' %}" width="750" height="275"></a>
</li>
<li class="f_s"><a target="play" href="{% url 'play' 25 %}" class="layz_load" >
<img data-src="{% static '/image/datu-2.jpg' %}" width="750" height="275"></a>
</li>
<li class="f_s"><a target="play" href="{% url 'play' 14 %}" class="layz_load" >
<img data-src="{% static '/image/tu2.png' %}" width="750" height="275"></a>
</li>
</ul>
<div id="bannerRightBtn" class="banner_btn"></div>
</div>
</div>
<div class="aside">
<h2>热门歌曲</h2>
<ul>
{% for song in play_hot_song %}
<li>
<span>{{ forloop.counter }}</span>
<a target="play" href="{% url 'play' song.song.song_id %}" >{{ song.song.song_name }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
<!-- 新歌推荐模块 -->
<div class="today clearfix">
<div class="today-header">
<i></i>
<h2>新歌推荐</h2>
</div>
<div class="today-list-box slide">
<div id="J_TodayRec" class="today-list">
<ul>
{% for list in daily_recommendation %}
{% if forloop.first %}
<li class="first">
{% else %}
<li>
{% endif %}
<a class="pic layz_load pic_po" target="play" href="{% url 'play' list.song_id %}" >
<img data-src="../static/songImg/{{ list.song_img }}" ></a>
<div class="name">
<h3><a target="play" href="{% url 'play' list.song_id %}" >{{ list.song_name }}</a></h3>
<div class="singer"><span>{{ list.song_singer }}</span></div>
<div class="times">发行时间:<span>{{ list.song_release }}</span></div>
</div>
<a target="play" href="{% url 'play' list.song_id %}" class="today-buy-button" >去听听></a>
{% endfor %}
</ul>
</div>
</div>
</div><!--end today-->
<!-- 最底部的热门搜索、热门下载的功能模块 -->
<div class="section">
<ul id="J_Tab" class="tab-trigger">
<li data-cur="0" id='tag_search' class="current t_c active">热门搜索</li>
<li data-cur="1" id="tag_down" class="t_c">热门下载</li>
</ul>
<div class="tab-container" id="tab_search">
<div id="J_Tab_Con" class="tab-container-cell">
{% for list in all_ranking %}
{% if forloop.first %}
<ul class="product-list clearfix t_s current">
{% else %}
<ul class="product-list clearfix t_s" style="display:none;">
{% endif %}
{% for songs in list %}
<li>
<a target="play" href="{% url 'play' songs.song.song_id %}" class="pic layz_load pic_po" >
<img data-src="../static/songImg/{{ songs.song.song_img }}" ></a>
<h3><a target="play" href="{% url 'play' songs.song.song_id %}" >{{ songs.song.song_name }}</a></h3>
<div class="singer"><span>{{ songs.song.song_singer }}</span></div>
<div class="times">搜索次数:<span>{{ songs.dynamic_search }}</span></div>
</li>
{% endfor %}
</ul>
{% endfor %}
</div>
</div>
<div class="tab-container" id="tab_down" style="display: none;">
<div id="J_Tab_Con" class="tab-container-cell">
{% for list in all_ranking %}
{% if forloop.first %}
<ul class="product-list clearfix t_s current">
{% else %}
<ul class="product-list clearfix t_s" style="display:none;">
{% endif %}
{% for songs in list %}
<li>
<a class="pic layz_load pic_po" target="play" href="{% url 'play' songs.song.song_id %}" >
<img data-src="../static/songImg/{{ songs.song.song_img }}" ></a>
<h3><a target="play" href="{% url 'play' songs.song.song_id %}" >{{ songs.song.song_name }}</a></h3>
<div class="singer"><span>{{ songs.song.song_singer }}</span></div>
<div class="times">下载次数:<span>{{ songs.dynamic_down }}</span></div>
</li>
{% endfor %}
</ul>
{% endfor %}
</div>
</div>
</div><!--end section-->
<script data-main="{% static 'js/index.js' %}"></script>
<script src="../static/js/require.js"></script>
<script type="text/javascript" src="{% static 'js/jquery-1.12.4.min.js' %}"></script>
<script type="text/javascript">
$('#tag_search').click(function () {
$('#tag_down').removeClass('active');
$(this).addClass('active');
$('#tab_search').show();
$('#tab_down').hide();
});
$('#tag_down').click(function () {
$('#tag_search').removeClass('active');
$(this).addClass('active');
$('#tab_search').hide();
$('#tab_down').show();
});
</script>
{% endblock %}

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,31 @@
"""music URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from . import views
# 设置首页的URL地址信息
'''
urlpatterns:
整个项目的URL集合每个元素代表一条URL信息
path('', views.index):
URL为空代表为网站的域名http://127.0.0.1:8000/通常是网站的首页还寄给上面我们导入了views这个文件吗
该文件用于编写视图函数处理URL请求信息并返回网页给用户views.index表示我们调用了views文件中的index函数
换句话说当用户访问首页是就会触发views.index函数的执行因此我们在这里指定后需要在views这个文件里编写对应的
index函数
'''
urlpatterns = [
path('', views.IndexView, name='index'),
]

@ -0,0 +1,24 @@
from django.shortcuts import render
from .models import *
def IndexView(request):
# 热搜歌曲
search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:8]
# 音乐分类
label_list = Label.objects.all()
# 热门歌曲
play_hot_song = Dynamic.objects.select_related('song').order_by('-dynamic_plays').all()[:10]
# 新歌推荐
daily_recommendation = Song.objects.order_by('-song_release').all()[:3]
# 热门搜索、热门下载
search_ranking = search_song[:6]
down_ranking = Dynamic.objects.select_related('song').order_by('-dynamic_down').all()[:6]
all_ranking = [search_ranking, down_ranking]
return render(request, 'index.html', locals())
# 自定义404和500的错误页面
def page_not_found(request):
return render(request, 'error404.html', status=404)
# Create your views here.

File diff suppressed because it is too large Load Diff

@ -0,0 +1,21 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'music.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

@ -0,0 +1,2 @@
import pymysql
pymysql.install_as_MySQLdb()

@ -0,0 +1,177 @@
"""
Django settings for music project.
Generated by 'django-admin startproject' using Django 2.2.5.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'hv(uoh%o6ll4=7&%h3(7u-%57wniu2&8937j_cf#nm!zw9+%@1'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
# Application definition
# 添加新增的项目应用index、ranking、play、comment、search、user
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'index',
'ranking',
'user',
'play',
'search',
'comment',
]
# 中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'music.urls'
# 设置模板路径在每个App中分别创建模板文件夹templates
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'), # 定义全局模板文件路径
os.path.join(BASE_DIR, 'index/templates'),
os.path.join(BASE_DIR, 'ranking/templates'),
os.path.join(BASE_DIR, 'user/templates'),
os.path.join(BASE_DIR, 'play/templates'),
os.path.join(BASE_DIR, 'comment/templates'),
os.path.join(BASE_DIR, 'search/templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'music.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
# 设置数据库连接信息项目使用的数据库为music
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'music',
'USER': 'root',
'PASSWORD': 'yao950724',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 是否禁用已经存在的日志器
'formatters': { # 日志信息显示的格式
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
'filters': { # 对日志进行过滤
'require_debug_true': { # django在debug模式下才输出日志
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 日志处理方法
'console': { # 向终端中输出日志
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': { # 向文件中输出日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/music.log'), # 日志文件的位置
'maxBytes': 300 * 1024 * 1024,
'backupCount': 10,
'formatter': 'verbose'
},
},
'loggers': { # 日志器
'django': { # 定义了一个名为django的日志器
'handlers': ['console', 'file'], # 可以同时向终端与文件中输出日志
'propagate': True, # 是否继续传递日志信息
'level': 'INFO', # 日志器接收的最低日志级别
},
}
}
# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/
AUTH_USER_MODEL = 'user.MyUser'
STATIC_URL = '/static/'
STATIC_ROOT = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]

@ -0,0 +1,43 @@
"""music URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
# 配置URL地址信息
from music import settings
'''
urlpatterns:
整个项目的URL集合每个元素代表一条URL信息
path('admin/', admin.site.urls)
设定Admin的URL'admin/'代表http://127.0.0.1:8000/admin地址信息'admin'后面的斜杠是路径分隔符
admin.site.urls是URL的处理函数也称为视图函数
path('',include('index.urls')):
URL为空代表为网站的域名http://127.0.0.1:8000/通常是网站的首页include是将该URL分发给index的urls.py处理
'''
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('index.urls')), #
path('ranking', include('ranking.urls')),
path('play/', include('play.urls')),
path('comment/', include('comment.urls')),
path('search/', include('search.urls')),
path('user/', include('user.urls')),
]

@ -0,0 +1,16 @@
"""
WSGI config for music project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'music.settings')
application = get_wsgi_application()

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class PlayConfig(AppConfig):
name = 'play'

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

@ -0,0 +1,183 @@
{% extends "title_base.html" %}
{% load staticfiles %}
{% block header_extends %}
<link type="image/x-icon" rel="shortcut icon" href="{% static 'favicon.ico' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/common.css' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/play.css' %}">
{% endblock %}
{% block content %}
<body>
<div class="header">
<a href="/" class="logo" title="首页"><img src="{% static 'image/logo.png' %}"></a>
<div class="search-box">
<!-- 歌曲查询 -->
<form id="searchForm" action="{% url 'search' 1 %}" method="post" target="_blank">
{% csrf_token %}
<div class="search-keyword">
<input id="kword" name="kword" type="text" class="keyword" maxlength="120" placeholder="音乐节" />
</div>
<input id="subSerch" type="submit" class="search-button" value="搜 索" />
</form>
<div id="suggest" class="search-suggest"></div>
<div class="search-hot-words">
{% for song in search_song %}
<a target="play" href="{% url 'play' song.song.song_id %}" >{{ song.song.song_name }}</a>
{% endfor %}
</div>
</div>
</div><!--end header-->
<div class="nav-box">
<div class="nav-box-inner">
<ul class="nav clearfix">
<li><a href="/">首页</a></li>
<li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li>
<li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li>
</ul>
</div>
</div><!--end nav-box-->
<!--后期修改-->
<div class="wrapper clearfix">
<div class="content">
<div class="product-detail-box clearfix">
<div class="product-pics">
<div class="music_box">
<!-- 歌曲播放播放功能由JavaScript实现Django只需提供歌曲文件即可实现在线试听-->
<div id="jquery_jplayer_1" class="jp-jplayer"
data-url="{% static 'songFile/' %}{{ song_info.song_file }}">
</div>
<!-- 歌曲封面 -->
<div class="jp_img layz_load pic_po" title="点击播放">
<img data-src="{% static 'songImg/' %}{{ song_info.song_img }}">
</div>
<div id="jp_container_1" class="jp-audio">
<div class="jp-gui jp-interface">
<div class="jp-time-holder clearfix">
<div class="jp-progress">
<div class="jp-seek-bar">
<div class="jp-play-bar"></div>
</div>
</div>
<div class="jp-time">
<span class="jp-current-time"></span> /
<span class="jp-duration"></span>
</div>
</div>
<div class="song_error_corr" id="songCorr">
<b class="err_btn">纠错</b>
<ul>
<li><span>歌词文本错误</span></li>
<li><span>歌词时间错误</span></li>
<li><span>歌曲错误</span></li>
</ul>
</div>
<div class="jp-volume-bar">
<div class="jp-volume-bar-value"></div>
</div>
<ul class="jp-controls clearfix">
<li><a class="jp-play" tabindex="1" title="play"></a><a class="jp-pause" tabindex="1" title="pause"></a></li>
<li><a class="jp-stop" tabindex="1" title="stop"></a></li>
<li><a class="jp-repeat" tabindex="1" title="repeat"></a><a class="jp-repeat-off" tabindex="1" title="repeat off"></a></li>
<li class="sound"><a class="jp-mute" tabindex="1" title="mute"></a><a class="jp-unmute" tabindex="1" title="unmute"></a></li>
</ul>
</div>
</div>
<div class="jplayer_content">
<ul id="lrc_list" class="lrc_list"></ul>
</div>
</div><!--end music_box-->
<!-- 歌词-->
<textarea id="lrc_content" style="display: none;">
{{ song_lyrics }}
</textarea>
</div><!--end product-pics-->
<div class="product-detail-main">
<!-- 歌曲信息 -->
<div class="product-price">
<h1 id="currentSong" >{{ song_info.song_name }}</h1>
<div class="product-price-info">
<span>歌手:{{ song_info.song_singer }}</span>
</div>
<div class="product-price-info">
<span>专辑:{{ song_info.song_album }}</span>
<span>语种:{{ song_info.song_languages }}</span>
</div>
<div class="product-price-info">
<span>流派:{{ song_info.song_type }}</span>
<span>发行时间:{{ song_info.song_release }}</span>
</div>
</div><!--end product-price-->
<div class="product-comment">
<div class="links clearfix">
<a class="minimum-link-A click_down" href="{% url 'download' song_info.song_id %}">下载</a>
<a class="minimum-link-A" href="{% url 'comment' song_info.song_id %}" >歌曲点评</a>
</div><!-- end links-->
<h3 class="list_title">当前播放列表</h3>
<!--播放列表-->
<ul class="playing-li" id="songlist">
{% for list in play_list %}
<!--设置当前歌曲的样式-->
{%if list.song_id == song_info.song_id %}
<li data-id="{{list.song_id}}" class="current">
{%else %}
<li data-id="{{list.song_id}}">
{%endif %}
<!--设置歌曲列表序号、歌名和歌手-->
<span class="num">{{forloop.counter}}</span>
<a class="name" href="{% url 'play' list.song_id %}" target="play" >{{list.song_name}}</a>
<a class="singer" href="javascript:;" target="_blank" >{{list.song_singer}}</a>
</li>
{%endfor %}
</ul>
<div class="nplayL-btns" id="playleixin">
<ul>
<li class="order current" data-run="order">
<a class="icon" href="javascript:void(0)" title="顺序播放"></a>
</li>
<li class="single" data-run="single">
<a class="icon" title="单曲循环" href="javascript:void(0)"></a>
</li>
<li class="random" data-run="random">
<a class="icon" title="随机播放" href="javascript:void(0)"></a>
</li>
<li class="next" data-run="next">
<a href="javascript:void(0)"><i></i>播放下一首</a>
</li>
</ul>
</div><!--end nplayL-btns-->
</div><!-- end product-comment -->
</div><!-- end product-detail-main -->
</div><!-- end product-detail-box -->
<div class="section">
<div class="section-header">
<h3>相关歌曲</h3>
</div>
<div class="section-content">
<div class="parts-box">
<a href="javascript:;" target="_self" id="J_PartsPrev" class="prev-btn"><i></i></a>
<div class="parts-slider" id="J_PartsList">
<div class="parts-list-wrap f_w">
<ul id="" class="parts-list clearfix f_s">
{% for item in song_relevant %}
<li>
{% if item.song.song_id != song_info.song_id %}
<a class="pic layz_load pic_po" href="{% url 'play' item.song.song_id %}" target="play" >
<img data-src="../static/songImg/{{ item.song.song_img }}">
</a>
<h4><a href="{% url 'play' item.song.song_id %}" target="play" >{{ item.song.song_name}}</a></h4>
<a href="javascript:;" class="J_MoreParts accessories-more">{{ item.song.song_singer }}</a>
{% endif %}
</li>
{% endfor %}
</ul>
</div>
</div>
<a href="javascript:;" target="_self" id="J_PartsNext" class="next-btn"><i></i></a>
</div>
</div>
</div>
</div>
</div>
<script data-main="{% static 'js/play.js' %}" src="{% static 'js/require.js' %}"></script>
{% endblock %}

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,24 @@
"""music URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from . import views
urlpatterns = [
# 歌曲播放页面
path('<int:song_id>', views.playView, name='play'),
# 歌曲下载
path('download/<int:song_id>.mp3', views.downloadView, name='download')
]

@ -0,0 +1,86 @@
from urllib.parse import quote
from django.shortcuts import render
from django.http import StreamingHttpResponse
from index.models import *
# 歌曲播放页面
def playView(request, song_id):
# 热搜歌曲
search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]
# 歌曲信息
song_info = Song.objects.get(song_id=int(song_id))
# 播放列表
play_list = request.session.get('play_list', [])
song_exist = False
if play_list:
for i in play_list:
if int(song_id) == i['song_id']:
song_exist = True
if song_exist == False:
play_list.append(
{'song_id': int(song_id), 'song_singer': song_info.song_singer, 'song_name': song_info.song_name,
'song_time': song_info.song_time})
request.session['play_list'] = play_list
# 歌词
if song_info.song_lyrics != '暂无歌词':
f = open('/static/songLyric/' + song_info.song_lyrics, 'r', encoding='utf-8')
song_lyrics = f.read()
f.close()
# 相关歌曲
song_company = Song.objects.values('song_company').get(song_id=song_id)['song_company']
song_relevant = Dynamic.objects.select_related('song').filter(song__song_company=song_company).order_by(
'-dynamic_plays').all()[:6]
# 添加播放次数
# 扩展功能可使用session实现每天只添加一次播放次数
dynamic_info = Dynamic.objects.filter(song_id=int(song_id)).first()
# 判断歌曲动态信息是否存在存在就在原来基础上加1
if dynamic_info:
dynamic_info.dynamic_plays += 1
dynamic_info.save()
# 动态信息不存在则创建新的动态信息
else:
dynamic_info = Dynamic(dynamic_plays=1, dynamic_search=0, dynamic_down=0, song_id=song_id)
dynamic_info.save()
response = render(request, 'play.html', locals())
return response
# 歌曲下载
def downloadView(request, song_id):
# 根据song_id查找歌曲信息
song_info = Song.objects.get(song_id=int(song_id))
print(song_id)
# 添加下载次数
dynamic_info = Dynamic.objects.filter(song=int(song_id)).first()
# 判断歌曲动态信息是否存在存在就在原来基础上加1
if dynamic_info:
dynamic_info.dynamic_down += 1
dynamic_info.save()
# 动态信息不存在则创建新的动态信息
else:
dynamic_info = Dynamic(dynamic_plays=0, dynamic_search=0, dynamic_down=1, song_id=song_id)
dynamic_info.save()
# 读取文件内容
file = 'static/songFile/' + song_info.song_file
def file_iterator(file, chunk_size=512):
with open(file, 'rb') as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
# 将文件内容写入StreamingHttpResponse对象并以字节流方式返回给用户实现文件下载
filename = song_info.song_name + '.mp3'
print(filename)
response = StreamingHttpResponse(file_iterator(file))
response['Content-Type'] = 'application/octet-stream'
# response['Content-Disposition'] = 'attachment; filename={}'.format(filename)
response['Content-Disposition'] = 'attachment; {}'.format("filename*=utf-8''{}".format(quote(filename))) # quote确保中文格式不乱码
print(response['Content-Disposition'])
return response

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class RankingConfig(AppConfig):
name = 'ranking'

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

@ -0,0 +1,99 @@
{% extends "title_base.html" %}
{% load staticfiles %}
{% block header_extends %}
<link type="image/x-icon" rel="shortcut icon" href="{% static 'favicon.ico' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/common.css' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/ranking.css' %}">
{% endblock %}
{% block content %}
<body>
<div class="header">
<a href="/" class="logo" title="首页"><img alt="我的音乐" src="{% static 'image/logo.png' %}"></a>
<div class="search-box">
<form id="searchForm" action="{% url 'search' 1 %}" method="post" target="_blank">
{% csrf_token %}
<div class="search-keyword">
<input name="kword" type="text" class="keyword" maxlength="120" placeholder="音乐节" />
</div>
<input id="subSerch" type="submit" class="search-button" value="搜 索" />
</form>
<div id="suggest" class="search-suggest"></div>
<div class="search-hot-words">
{% for song in search_song %}
<a target="play" href="{% url 'play' song.song.song_id %}" >{{ song.song.song_name }}</a>
{% endfor %}
</div>
</div>
</div><!--end header-->
<div class="nav-box">
<div class="nav-box-inner">
<ul class="nav clearfix">
<li><a href="/">首页</a></li>
<li><a href="{% url 'ranking' %}">歌曲排行</a></li>
<li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li>
</ul>
</div>
</div><!--end nav-box-->
<div class="wrapper clearfix">
<!-- 左侧列表 -->
<div class="side">
<!-- 子类分类排行导航 -->
<div class="side-nav">
<div class="nav-head">
<a href="{% url 'ranking' %}">所有歌曲分类</a>
</div>
<ul id="sideNav" class="cate-item">
{% for item in All_list %}
<li class="computer">
<div class="main-cate">
<a href="{% url 'ranking' %}?type={{ item.song_company }}" class="main-title">{{ item.song_company }}</a>
</div>
</li>
{% endfor %}
</ul>
</div>
</div><!-- 左侧列表 end -->
<div class="main">
<div class="main-head-box clearfix">
<div class="main-head"><h1>歌曲排行榜</h1></div>
</div>
<table class="rank-list-table">
<tr>
<th class="cell-1">排名</th>
<th class="cell-2">图片</th>
<th class="cell-3">歌名</th>
<th class="cell-4">专辑</th>
<th class="cell-5">下载量</th>
<th class="cell-6">播放量</th>
</tr>
{% for item in song_info %}
<tr>
{%if forloop.counter < 4 %}
<td><span class="n1">{{forloop.counter}}</span></td>
{%else %}
<td><span class="n2">{{forloop.counter}}</span></td>
{%endif %}
<td>
<a href="{% url 'play' item.song.song_id %}" class="pic" target="play"><img src="{% static 'songImg/' %}{{ item.song.song_img }}" width="80" height="80"></a>
</td>
<td class="name-cell">
<h3><a href="{% url 'play' item.song.song_id %}" target="play" >{{item.song.song_name}}</a></h3>
<div class="desc">
<a href="javascript:;" target="_blank" class="type" >{{item.song.song_singer}}</a>
</div>
</td>
<td>
<div style="text-align:center;">{{item.song.song_album}}</div>
</td>
<td>
<div style="text-align:center;">{{item.dynamic_down}}</div>
</td>
<td class="num-cell">{{item.dynamic_plays}}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
<script data-main="{% static 'js/ranking.js' %}" src="{% static 'js/require.js' %}"></script>
{% endblock %}

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,22 @@
"""music URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from . import views
urlpatterns = [
path('', views.rankingView, name='ranking'),
# 通用视图
# path('.list', views.RankingList.as_view(), name='rankingList'),
]

@ -0,0 +1,49 @@
from django.shortcuts import render
from index.models import *
def rankingView(request):
# 搜索歌曲
search_song = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]
# 歌曲分类列表
All_list = Song.objects.values('song_company').distinct()
# 歌曲列表信息
song_company = request.GET.get('type', '')
if song_company:
song_info = Dynamic.objects.select_related('song').filter(song__song_company=song_company).order_by(
'-dynamic_plays').all()[:10]
else:
song_info = Dynamic.objects.select_related('song').order_by('-dynamic_plays').all()[:10]
return render(request, 'ranking.html', locals())
# #通用视图
# from django.views.generic import ListView
#
#
# class RankingList(ListView):
# # context_object_name设置Html模版的某一个变量名称
# context_object_name = 'song_info'
# # 设定模版文件
# template_name = 'ranking.html'
#
# # 查询变量song_info的数据
# def get_queryset(self):
# # 获取请求参数
# song_company = self.request.GET.get('type', '')
# if song_company:
# song_info = Dynamic.objects.select_related('song').filter(song__song_company=song_company).order_by(
# '-dynamic_plays').all()[:10]
# else:
# song_info = Dynamic.objects.select_related('song').order_by('-dynamic_plays').all()[:10]
# return song_info
#
# # 添加其他变量
# def get_context_data(self, **kwargs):
# context = super().get_context_data(**kwargs)
# # 搜索歌曲
# context['search_song'] = Dynamic.objects.select_related('song').order_by('-dynamic_search').all()[:4]
# # 所有歌曲分类
# context['All_list'] = Song.objects.values('song_company').distinct()
# return context
# # Create your views here.

@ -0,0 +1,7 @@
Django==2.2.5
lxml==4.0.0
PyMySQL==0.9.3
requests==2.23.0
sqlparse==0.3.1
urllib3==1.25.9
uWSGI==2.0.18

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

@ -0,0 +1,5 @@
from django.apps import AppConfig
class SearchConfig(AppConfig):
name = 'search'

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

@ -0,0 +1,85 @@
{% extends "title_base.html" %}
{% load staticfiles %}
{% block header_extends %}
<link type="image/x-icon" rel="shortcut icon" href="{% static 'favicon.ico' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/common.css' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/search.css' %}">
{% endblock %}
{% block content %}
<body>
<div class="header">
<a href="/" class="logo" title="首页"><img alt="我的音乐" src="{% static 'image/logo.png' %}"></a>
<div class="search-box">
<form id="searchForm" action="{% url 'search' 1 %}" method="post" target="_blank">
{% csrf_token %}
<div class="search-keyword">
<input id="kword" name="kword" type="text" class="keyword" maxlength="120" placeholder="音乐节" />
</div>
<input id="subSerch" type="submit" class="search-button" value="搜 索" />
</form>
<div id="suggest" class="search-suggest"></div>
<div class="search-hot-words">
{% for song in search_song %}
<a target="play" href="{% url 'play' song.song.song_id %}" >{{ song.song.song_name }}</a>
{% endfor %}
</div>
</div>
</div><!--end header-->
<div class="nav-box">
<div class="nav-box-inner">
<ul class="nav clearfix">
<li><a href="/">首页</a></li>
<li><a href="{% url 'ranking' %}" target="_blank">歌曲排行</a></li>
<li><a href="{% url 'home' 1 %}" target="_blank">用户中心</a></li>
</ul>
</div>
</div><!--end nav-box-->
<!--wrapper-->
<div class="wrapper clearfix" id="wrapper">
<div class="mod_songlist">
<ul class="songlist__header">
<li class="songlist__header_name">歌曲</li>
<li class="songlist__header_author">歌手</li>
<li class="songlist__header_time">时长</li>
</ul>
<ul class="songlist__list">
{%for list in contacts.object_list %}
<li class="js_songlist__child">
<div class="songlist__item">
<div class="songlist__songname">
<span class="songlist__songname_txt">
<a href="{% url 'play' list.song_id %}" class="js_song" target="play" >{{list.song_name}}</a>
</span>
</div>
<div class="songlist__artist">
<a href="javascript:;" class="singer_name" >{{list.song_singer}}</a>
</div>
<div class="songlist__time">{{list.song_time}}</div>
</div>
</li>
{%endfor %}
</ul>
<div class="page-box">
<div class="pagebar" id="pageBar">
{% if contacts.has_previous %}
<a href="{% url 'search' contacts.previous_page_number %}" class="prev" target="_self"><i></i>上一页</a>
{% endif %}
{% for page in contacts.paginator.page_range %}
{% if contacts.number == page %}
<span class="sel">{{ page }}</span>
{% else %}
<a href="{% url 'search' page %}" target="_self">{{ page }}</a>
{% endif %}
{% endfor %}
{% if contacts.has_next %}
<a href="{% url 'search' contacts.next_page_number %}" class="next" target="_self">下一页<i></i></a>
{% endif %}
</div>
</div>
</div><!--end mod_songlist-->
</div><!--end wrapper-->
<!--footer-->
{% endblock %}

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save