Django音乐网站项目(1)
今天开始,我们就用Django试着搭建一个音乐类的网站。首先,我们需要对项目进行设计,最好手绘画出草图。本节主要以项目架构设计、功能配置、数据架构表设计和定义模型类四点为主,为项目的开发做一些准备。
一、项目架构设计
我们对音乐网站的需求与设计有了大概了解,下一步根据需求搭建项目的目录结构。
-
首先在命令提示符窗口或者pyCharm中创建Django项目,项目命名为music
-
然后在项目中分别创建项目应用index、ranking、play、comment、search和user(配置文件记得添加)
-
并在每个项目应用中创建子路由文件urls.py
-
最后在项目的根目录中创建media、publicStatic和templates文件夹
整个项目的目录结构如图所示:
在settings.py配置文件添加app
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',
]
新建的项目应用和文件夹说明如下:
1、媒体资源文件夹(media)
-
songFile存放歌曲的文件
-
songLyric存放歌词的文件
-
songImg存放歌曲封面的文件
2、静态资源文件夹(publicStatic)
由于项目创建了多个应用,如果在每个应用里面单独创建静态文件夹,当更新或修改网页布局时,就不利于日后的维护和管理。
在 publicStatic 文件夹中分别创建css、font、image、js文件夹和favicon.ico文件,说明如下:
-
css文件夹存放网站的CSS样式文件
-
js文件夹存放网站的JavaScript脚本文件
-
font文件夹存放网站字体的文件
-
image文件夹存放网站设计的图片
-
favicon.ico文件是网站的图标
3、
-
base.html:定义项目的公用模板文件
-
index.html:实现音乐网站首页
-
ranking.html:实现榜单排行页面
-
play.html:实现歌曲播放页面
-
comment.html:实现歌曲点评页面
-
search.html:实现歌曲搜索页面
-
user.html:实现用户注册和登录页面
-
home.html:实现用户中心页面
-
404.html:实现404和500异常页面
下一步对项目进行相关配置,配置信息主要在配置文件settings.py中完成。
首先确保新建的项目应用index、ranking、paly、comment、search和user写入配置属性INSTALLED_APPS里面,然后在配置属性MIDDLEWARE中添加中LocaleMiddleware,使Admin后台系统支持中文语言。
配置代码如下:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 添加中间键 LocaleMiddleware
'django.middleware.locale.LocaleMiddleware',
]
配置代码如下:
# 设置数据库连接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'music_db',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
最后将静态资源文件夹publicStatic和媒体资源文件夹media引入Django的运行环境,同时将Django内置用户模型User改为项目应用user的自定义模型MyUser,配置代码如下:
# 配置自定义用户表MyUser
AUTH_USER_MODEL = 'user.MyUser'
# 静态资源文件路径
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'publicStatic']
STATIC_ROOT = BASE_DIR / 'static'
# 媒体资源的保存路径
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
(1)创建Django项目,根据开发需求创建相应的项目应用、静态资源文件夹、媒体资源文件夹和模板文件夹。
(2)在项目的settings.py中设置功能配置,常用的配置属性有INSTALLED_APPS、MIDDLEWARE、TEMPLATES、DATABASES、STATICFILES_DIRS、MEDIA_URL和MEDIA_ROOT等。
三、数据架构表设计
因此,设计网站的数据结构时,应以歌曲信息为核心数据,逐步向外扩展相关的数据信息。我们将歌曲信息的数据表命名为song。
1、歌曲信息表
字段类型 | 含义 | |
---|---|---|
id | Int类型,长度为11 | 主键 |
name | Varchar类型,长度为50 | 歌曲名称 |
singer | Varchar类型,长度为50 | 歌曲的演唱歌手 |
time | Varchar类型,长度为50 | 歌曲的播放时长 |
album | Varchar类型,长度为50 | 歌曲所属专辑 |
languages | Varchar类型,长度为50 | 歌曲的语种 |
type | Varchar类型,长度为50 | 歌曲的风格类型 |
release | Date类型 | 歌曲的发行时间 |
img | Varchar类型,长度为100 | 歌曲封面图片路径 |
lyrics | Varchar类型,长度为100 | 歌曲的歌词文件路径 |
file | Varchar类型,长度为100 | 歌曲的文件路径 |
label_id | Int类型,长度为11 |
歌曲信息表记录了歌曲的基本信息,如歌名、歌手、时长、专辑等等,其中歌曲封面、歌词和歌曲文件是以文件路径的形式记录在数据库中的,一般来说如果网站中涉及文件的存储和使用,那么数据库最好记录文件的路径地址。若将文件内容以二进制的数据格式写入数据库,则会对数据库造成一定的压力,从而降低网站的响应速度。
2、歌曲分类表
歌曲信息表关联歌曲分类表,我们将歌曲分类表命名为label,歌曲分类表主要实现排行榜的歌曲筛选功能。
字段类型 | 含义 | |
---|---|---|
id | Int类型,长度为11 | 主键 |
name | Varchar类型,长度为10 |
项目需求涉及歌曲的动态信息,因此延申出了歌曲动态表。
字段类型 | 含义 | |
---|---|---|
id | Int类型,长度为11 | 主键 |
plays | Int类型,长度为11 | 歌曲的播放次数 |
search | Int类型,长度为11 | 歌曲的搜索次数 |
download | Int类型,长度为11 | 歌曲的下载次数 |
song_id | Int类型,长度为11 |
该表主要用于歌曲点评页面。
将歌曲点评表命名为comment。
字段类型 | 含义 | |
---|---|---|
id | Int类型,长度为11 | 主键 |
text | Varchar类型,长度为500 | 歌曲的点评内容 |
user | Varchar类型,长度为20 | 用户名 |
date | Date类型 | 点评日期 |
song_id | Int类型,长度为11 |
由用户表提供用户信息。用户表由Django内置模型User扩展而成。
字段类型 | 含义 | |
---|---|---|
id | Int类型,长度为11 | 主键 |
password | Varchar类型,长度为128 | 用户密码 |
last_login | Datetime类型,长度为6 | 上次登录的时间 |
is_superuser | Tinyint类型,长度为1 | 超级用户 |
username | Varchar类型,长度为150 | 用户名 |
first_name | Varchar类型,长度为30 | 用户的名字 |
last_name | Varchar类型,长度为150 | 用户的姓氏 |
Varchar类型,长度为254 | 邮箱地址 | |
is_staff | Tinyint类型,长度为1 | 登录Admin权限 |
is_active | Tinyint类型,长度为1 | 用户的激活状态 |
date_joined | Datetime类型,长度为6 | 用户创建的时间 |
Varchar类型,长度为20 | 用户的QQ号码 | |
Varchar类型,长度为20 | 用户的微信号码 | |
mobile | Varchar类型,长度为11 |
我们根据数据表的数据关系定义项目的模型对象,由于项目所有的项目应用都使用这些模型生成网页内容,而且模型之间存在外键关联,因此将所有关于歌曲信息的模型都定义在项目应用index中。
代码如下:
# 歌曲分类表
class Label(models.Model):
id = models.AutoField('序号', primary_key=True)
name = models.CharField('分类标签', max_length=10)
def __str__(self):
return self.name
class Meta:
# 设置Admin的显示内容
verbose_name = '歌曲分类'
verbose_name_plural = '歌曲分类'
# 歌曲信息表
class Song(models.Model):
id = models.AutoField('序号', primary_key=True)
name = models.CharField('歌名', max_length=50)
singer = models.CharField('歌手', max_length=50)
time = models.CharField('时长', max_length=10)
album = models.CharField('专辑', max_length=50)
languages = models.CharField('语种', max_length=20)
type = models.CharField('类型', max_length=20)
release = models.DateField('发行时间')
img = models.FileField('歌曲图片', upload_to='songImg/')
lyrics = models.FileField('歌词', upload_to='songLyric/', default='暂无歌词', blank=True)
file = models.FileField('歌曲文件', upload_to='songFile/')
label = models.ForeignKey(Label, on_delete=models.CASCADE, verbose_name='歌名分类')
def __str__(self):
return self.name
class Meta:
# 设置Admin的显示内容
verbose_name = '歌曲信息'
verbose_name_plural = '歌曲信息'
# 歌曲动态表
class Dynamic(models.Model):
id = models.AutoField('序号', primary_key=True)
song = models.ForeignKey(Song, on_delete=models.CASCADE, verbose_name='歌名')
plays = models.IntegerField('播放次数', default=0)
search = models.IntegerField('搜索次数', default=0)
download = models.IntegerField('下载次数', default=0)
class Meta:
# 设置Admin的显示内容
verbose_name = '歌曲动态'
verbose_name_plural = '歌曲动态'
# 歌曲点评表
class Comment(models.Model):
id = models.AutoField('序号', primary_key=True)
text = models.CharField('内容', max_length=500)
user = models.CharField('用户', max_length=20)
date = models.DateField('日期', auto_now=True)
song = models.ForeignKey(Song, on_delete=models.CASCADE, verbose_name='歌名')
class Meta:
# 设置Admin的显示内容
verbose_name = '歌曲评论'
verbose_name_plural = '歌曲评论'
代码如下:
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
qq = models.CharField('QQ号码', max_length=20)
weChat = models.CharField('微信账号', max_length=20)
mobile = models.CharField('手机号码', max_length=11, unique=True)
# 设置返回值
def __str__(self):
return self.username
最后对定义好的模型执行数据迁移。
本节就音乐项目的前期准备已经完成,主要是项目架构设计、功能配置、数据架构表设计和定义模型类四点。其中最为核心的点是数据架构表设计,这个在实现时一定要特别注意,不然后续再改动表结构就会很难受。待后续....