今天开始,我们就用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)
用于存放歌曲文件、歌曲图片、歌词文件等资源文件,这类资源文件的变动频率较高,因此与静态资源分开不同的存储路径。在 media 文件夹中分别创建 songFile、songLyric和songImg文件夹,每个文件夹说明如下;
-
songFile存放歌曲的文件
-
songLyric存放歌词的文件
-
songImg存放歌曲封面的文件
2、静态资源文件夹(publicStatic)
存放网页的CSS样式文件、JavaScript脚本文件和网页图片文件等静态资源。
由于项目创建了多个应用,如果在每个应用里面单独创建静态文件夹,当更新或修改网页布局时,就不利于日后的维护和管理。
在 publicStatic 文件夹中分别创建css、font、image、js文件夹和favicon.ico文件,说明如下:
-
css文件夹存放网站的CSS样式文件
-
js文件夹存放网站的JavaScript脚本文件
-
font文件夹存放网站字体的文件
-
image文件夹存放网站设计的图片
-
favicon.ico文件是网站的图标
3、模板文件夹(templates)
存放模板文件,本项目一共使用9个模板文件,每个模板文件的说明如下:
-
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',
]
项目的数据存储采用MySQL数据库,我们在MySQL中创建数据库music_db,并在配置属性DATABASES中设置MySQL的链接方式。
配置代码如下:
# 设置数据库连接信息
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'
到这里,音乐网站的开发环境基本上已搭建完毕。在整个项目搭建过程中,可以总结出Django开发环境的搭建流程,说明如下:
(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 | 歌曲的分类标签 |
3、歌曲动态表
项目需求涉及歌曲的动态信息,因此延申出了歌曲动态表。
歌曲动态表用于记录歌曲的播放次数、搜索次数个下载次数,并且与歌曲信息表实现一对一的数据关系,也就是一首歌曲只有一条动态信息。将歌曲动态表命名为dynamic。
表字段 | 字段类型 | 含义 |
---|---|---|
id | Int类型,长度为11 | 主键 |
plays | Int类型,长度为11 | 歌曲的播放次数 |
search | Int类型,长度为11 | 歌曲的搜索次数 |
download | Int类型,长度为11 | 歌曲的下载次数 |
song_id | Int类型,长度为11 | 外键,关联歌曲信息表 |
4、歌曲点评表
该表主要用于歌曲点评页面。
从歌曲点评页面知道,一首歌可以有多条点评的信息,说明歌曲信息表和歌曲点评表存在一对多的数据关系。
将歌曲点评表命名为comment。
表字段 | 字段类型 | 含义 |
---|---|---|
id | Int类型,长度为11 | 主键 |
text | Varchar类型,长度为500 | 歌曲的点评内容 |
user | Varchar类型,长度为20 | 用户名 |
date | Date类型 | 点评日期 |
song_id | Int类型,长度为11 | 外键,关联歌曲信息表 |
5、用户表
还有网站的用户管理功能需要实现。
由用户表提供用户信息。用户表由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中。
打开项目应用index的models.py,分别定义模型Label、Song、Dynamic和Comment。
代码如下:
# 歌曲分类表
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 = '歌曲评论'
用户表由Django内置模型User扩展而成,它与歌曲信息表并无数据关联,因此将用户表的模型定义在项目应用user的models.py中。
代码如下:
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
最后对定义好的模型执行数据迁移。
我们使用数据库可视化工具查看所有关于歌曲信息的数据表,数据表之间的数据关系如下所示:
本节就音乐项目的前期准备已经完成,主要是项目架构设计、功能配置、数据架构表设计和定义模型类四点。其中最为核心的点是数据架构表设计,这个在实现时一定要特别注意,不然后续再改动表结构就会很难受。待后续....
标签:音乐网站,Varchar,name,项目,models,Django,歌曲,类型,长度 From: https://www.cnblogs.com/LoLong/p/17392466.html