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
最后对定义好的模型执行数据迁移。
本节就音乐项目的前期准备已经完成,主要是项目架构设计、功能配置、数据架构表设计和定义模型类四点。其中最为核心的点是数据架构表设计,这个在实现时一定要特别注意,不然后续再改动表结构就会很难受。待后续....
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库