乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
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)

  用于存放歌曲文件、歌曲图片、歌词文件等资源文件,这类资源文件的变动频率较高,因此与静态资源分开不同的存储路径。在 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 用户的姓氏
email Varchar类型,长度为254 邮箱地址
is_staff Tinyint类型,长度为1 登录Admin权限
is_active Tinyint类型,长度为1 用户的激活状态
date_joined Datetime类型,长度为6 用户创建的时间
qq Varchar类型,长度为20 用户的QQ号码
weChat 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

  最后对定义好的模型执行数据迁移。

  我们使用数据库可视化工具查看所有关于歌曲信息的数据表,数据表之间的数据关系如下所示:

  本节就音乐项目的前期准备已经完成,主要是项目架构设计、功能配置、数据架构表设计和定义模型类四点。其中最为核心的点是数据架构表设计,这个在实现时一定要特别注意,不然后续再改动表结构就会很难受。待后续....

posted on 2023-05-11 22:37  乐之之  阅读(195)  评论(0编辑  收藏  举报