Python+Django实战|在线音乐分享平台:音乐上传、歌手专辑管理、在线播放、自定义歌单、收藏点赞、评论互动

一、项目背景与痛点

日常娱乐、校园社团、企业内网休闲场景中,音乐播放与分享是高频需求。目前主流使用方式分为本地音乐播放器商业在线音乐平台,两类方案均存在明显短板,同时私人音乐库、小众曲目分享场景也缺少适配工具,具体痛点如下:

  • 本地音乐跨设备使用不便:音乐文件仅存于单台设备,手机、电脑无法同步,外出、换设备时无法快速调取收藏曲目;
  • 商业平台限制繁多:主流音乐平台充斥广告,大量曲目需要会员、付费收听,小众原创、本地曲目无法上架;
  • 缺少个性化歌单体系:第三方平台歌单功能受平台规则限制,无法完全按照个人喜好自由分类、整理专属曲目;
  • 音乐分享渠道割裂:好友、社团之间分享音乐只能通过文件传输,无法在线一键试听、批量分享;
  • 无独立评论互动场景:小众音乐、校园原创曲目缺少专属评论区,乐友之间无法交流感受;
  • 隐私与版权顾虑:个人收藏、原创音乐上传至公共平台存在泄露、侵权风险,内网场景无法使用外网音乐服务。

针对以上问题,本次基于Python+Django4.2+HTML5音频组件+MySQL 搭建轻量化私有化在线音乐分享平台,实现歌手专辑维护、音乐上传、在线播放、自定义歌单、收藏点赞、评论互动、数据统计全套能力。本项目开辟音视频内容分享 全新赛道,和日志、天气、智能在线考试、智能图书、考勤、物业、固定资产、问卷、会议室、进销存、租赁等往期所有项目业务、功能、代码完全无重复

二、核心目标与定位

本项目核心目标:搭建私有化无广告在线音乐平台,实现歌手&专辑建档→音乐上传审核→在线流式播放→创建个性化歌单→曲目收藏点赞→乐友评论互动→权限管控→播放数据统计完整闭环,打造专属音乐库,满足个人、校园、内网环境下音乐收听与分享需求,告别付费广告与跨设备难题

项目精准定位:轻量化Web音乐平台,采用Django原生MVT架构,部署简单、服务器资源占用低;划分超级管理员、普通注册用户两类角色,管理员负责内容审核与基础数据维护,用户可自主上传曲目、创建歌单、互动交流;适配校园社团、企业内网、个人私有音乐站、小众音乐圈子等场景,主打私有化部署、无广告、播放流畅、歌单自由定制。

核心设计理念:内容规范化、播放轻量化、歌单个性化、互动常态化、部署私有化,解决传统音乐工具跨设备难、收费广告多、分享不便的核心问题。


三、整体技术方案

项目基于Django原生MVT分层架构开发,MySQL存储歌手、专辑、曲目、歌单、互动数据,Django Media统一托管音频文件,前端使用HTML5原生音频标签实现在线播放,Ajax完成点赞、评论无刷新交互,自定义中间件实现登录与权限拦截,结合ORM聚合查询与ECharts完成播放量统计。整体分层架构流程图如下:

plain 复制代码
┌─────────────┐     ┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ 歌手专辑层  │────▶│ 音乐上传层  │────▶│ 内容审核层  │────▶│ 在线播放层  │
│ 歌手信息、专辑分类维护 │ 音频文件上传、信息填写 │ 管理员审核违规曲目 │ HTML5流式播放、进度控制 │
       │                    │                    │                    │
       ▼                    ▼                    ▼                    ▼
┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│ 歌单管理层  │────▶│ 收藏点赞层  │────▶│ 评论互动层  │
│ 自定义歌单、曲目增删 │ 单曲收藏、一键点赞 │ 曲目评论、回复互动 │
       │                    │                    │
       ▼                    ▼
┌─────────────┐
│ 数据统计层  │
│ 播放量、热门曲目、歌手排行图表统计 │
       │
       ▼
┌─────────────────────────────────────────────────────────────────────────┐
│                          底层技术底座                                      │
│  - 后端框架:Python3.11 + Django4.2 原生MVT架构                            │
│  - 数据存储:MySQL 存储歌手、专辑、音乐、歌单、互动全业务数据              │
│  文件托管:Django Media 存储音频文件、专辑封面图片                         │
│  播放能力:前端HTML5 Audio标签实现原生在线播放                              │
│  前端交互:Ajax 实现点赞、评论、歌单操作无刷新                             │
│  权限体系:自定义中间件,区分管理员与普通用户权限                          │
│  状态管理:曲目审核、歌单状态全流程枚举管控                                │
│  数据可视化:ECharts 实现播放热度、排行统计图表                            │
└─────────────────────────────────────────────────────────────────────────

完整技术栈清单

  • Web后端:Python 3.11、Django 4.2 原生MVT轻量化架构
  • 数据库:MySQL 8.0,结构化存储音乐平台全量业务数据
  • 文件管理:Django Media 托管音频、封面图片,限制音频格式与大小
  • 在线播放:HTML5 原生Audio组件,支持播放、暂停、进度拖拽
  • 异步交互:Ajax 完成点赞、评论、歌单操作无刷新
  • 权限控制:自定义中间件,拦截未登录访问与越权操作
  • 状态管控:枚举类管理曲目审核、歌单公开/私密状态
  • 数据统计:ORM聚合查询 + ECharts 完成热度排行与可视化

四、核心能力模块详解

1. 歌手与专辑管理模块

搭建音乐基础分类体系,统一管理歌手与专辑信息,规范内容结构:

  • 歌手档案:录入歌手姓名、简介、头像、风格分类,支持新增、编辑、停用歌手信息;
  • 专辑维护:绑定对应歌手,设置专辑名称、封面、发行时间、专辑简介;
  • 分类筛选:按音乐风格(流行、民谣、纯音乐等)、歌手快速检索专辑;
  • 数据联动:删除歌手时联动提示处理关联专辑与曲目。

2. 音乐上传与审核模块(核心亮点)

规范音频上传流程,通过前置审核过滤违规内容,保障平台内容安全:

  • 格式限制:仅允许MP3、WAV等主流音频格式,限制单文件大小;
  • 曲目信息填写:设置曲名、所属歌手、所属专辑、歌词、时长;
  • 上传审核:用户提交曲目后进入待审核状态,管理员审核通过方可公开播放;
  • 违规处理:拦截低俗、侵权曲目,驳回并标注驳回原因。

3. 在线播放模块

基于HTML5实现原生播放功能,无需第三方插件,播放体验流畅:

  • 基础播放:支持播放、暂停、进度拖拽、音量调节;
  • 播放列表:专辑、歌单内曲目连续播放,自动切歌;
  • 播放记录:自动记录用户近期播放曲目,支持历史回放;
  • 页面适配:播放组件适配PC端不同分辨率。

4. 自定义歌单模块

满足个性化整理需求,区分公开与私密歌单:

  • 歌单创建:用户自定义歌单名称、简介、封面,选择公开/私密类型;
  • 曲目管理:支持向歌单添加、移除单曲,批量整理曲目;
  • 歌单浏览:公开歌单可被其他用户查看、收藏,私密歌单仅本人可见;
  • 歌单排序:按创建时间、播放量对歌单排序展示。

5. 收藏与点赞模块

轻量化互动功能,标记喜爱曲目与歌单:

  • 单曲收藏:一键收藏喜欢的音乐,个人中心统一查看收藏列表;
  • 曲目点赞:对单曲、歌单进行点赞,实时更新点赞数量;
  • 去重限制:防止重复点赞、重复收藏,保证数据准确性;
  • 快速跳转:从收藏列表直接进入播放页面。

6. 评论互动模块

打造乐友交流社区,围绕曲目开展互动讨论:

  • 一级评论:用户可对曲目发表观后感、听歌心得;
  • 回复功能:支持对他人评论进行二级回复,形成互动对话;
  • 评论管理:管理员可删除违规言论,维护社区氛围;
  • 时间排序:评论按发布时间倒序展示,最新评论置顶。

7. 权限与个人中心模块

区分角色权限,整合个人所有操作数据:

  • 角色权限:管理员拥有全量内容管理、审核权限;普通用户仅可上传、播放、互动;
  • 个人主页:集中展示我的上传、我的歌、我的收藏、我的评论;
  • 资料编辑:用户可修改头像、昵称、个人简介;
  • 访问拦截:未登录用户仅可浏览播放,无法上传与互动。

8. 播放数据统计模块

量化平台热度,分析热门曲目与歌手:

  • 基础统计:全站总播放量、曲目总数、用户总数;
  • 热度排行:按播放量生成热门歌曲、热门歌手、热门歌单榜单;
  • 风格分析:统计不同音乐风格的播放占比;
  • 趋势图表:按日/周展示播放量变化趋势。

五、创新价值与亮点

  1. 私有化无广告部署 区别于商业音乐平台,无弹窗广告、无会员付费,内网/个人部署数据完全自主管控;
  2. 全格式音频兼容 支持主流音频格式,小众曲目、原创音乐均可自由上传上架;
  3. 公私分离歌单 兼顾个人私密整理与公开分享两种场景,灵活性极强;
  4. 原生轻量化播放 基于HTML5原生播放器,无需插件,加载速度快、资源占用低;
  5. 前置内容审核 从源头过滤违规内容,保证平台内容合规、社区氛围健康。

六、应用前景与落地场景

  • 校园音乐平台 高校音乐社团、校园广播站使用,分享校园原创音乐、校园金曲;
  • 企业内网娱乐 企业办公内网搭建,供员工休闲听歌,隔绝外网广告与版权问题;
  • 个人私有音乐库 个人搭建专属云端音乐库,实现多设备同步收听;
  • 小众音乐圈子
  • 独立音乐人、小众乐迷社群使用,分享原创与冷门曲目;
  • 毕业设计/求职项目 音视频类Web项目,区别于常规管理系统,业务新颖、技术点丰富。

七、完整代码结构示例

1. 项目整体目录结构

python 复制代码
django-music-platform/
├── manage.py
├── music_project/           # 项目全局配置
│   ├── settings.py          # 数据库、音频格式、文件大小、权限配置
│   ├── urls.py              # 全局路由分发
│   └── middleware.py         # 登录、权限拦截中间件
├── apps/                    # 模块化业务拆分
│   ├── user_account/        # 用户账号、个人中心、权限模块
│   ├── singer_album/        # 歌手、专辑管理模块
│   ├── music_upload/        # 音乐上传、内容审核模块
│   ├── music_play/          # 在线播放、播放记录模块
│   ├── music_list/          # 自定义歌单模块
│   ├── collect_like/        # 收藏、点赞互动模块
│   ├── comment_area/        # 评论、回复模块
│   └── data_rank/           # 播放排行、数据统计模块
├── core/                    # 公共工具类
│   ├── file_check.py        # 音频格式、大小校验工具
│   ├── time_format.py       # 时长、时间格式化工具
│   ├── data_calc.py         # 播放量、排行计算工具
│   └── content_filter.py    # 违规内容简单过滤工具
├── static/                  # 播放组件、页面样式、前端脚本
├── templates/               # 播放页、列表页、后台模板
├── media/                   # 音频文件、歌手/专辑封面存储
├── requirements.txt         # 项目依赖包
└── readme.md                # 部署、使用文档
</pre>

### 2. 核心可运行代码片段
#### 示例1:歌手、专辑、音乐、歌单核心数据模型
```python
from django.db import models
from django.contrib.auth.models

# 音乐风格枚举
MUSIC_STYLE = (
    ("pop", "流行"),
    ("folk", "民谣"),
    ("rock", "摇滚"),
    ("pure", "纯音乐"),
    ("other", "其他"),
)
# 曲目审核状态
AUDIT_STATUS = (
    ("wait", "待审核"),
    ("pass", "审核通过"),
    ("reject", "审核驳回"),
)
# 歌单类型
LIST_TYPE = (
    ("public", "公开歌单"),
    ("private", "私密歌单"),
)

class Singer(models.Model):
    """歌手模型"""
    singer_name = models.CharField(max=50, verbose_name="歌手名称")
    singer_avatar = models.ImageField(upload="singer/", blank=True, verbose_name="歌手头像")
    style = models.CharField(max=10, choices=MUSIC_STYLE, verbose_name="音乐风格")
    intro = models.TextField(blank=True, verbose_name="歌手简介")
    create_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.singer_name

class Album(models.Model):
    """专辑模型"""
    singer = models.ForeignKey(Singer, on_delete=models.CASCADE, verbose_name="所属歌手")
    album_name = models.CharField(max=50, verbose_name="专辑名称")
    album_cover = models.ImageField(upload="album/", blank=True, verbose_name="专辑封面")
    release_time = models.DateField(verbose_name="发行时间")
    album_intro = models.TextField(blank=True, verbose_name="专辑简介")
    create_time = models.DateTimeField(auto_now_add=True)

class Music(models.Model):
    """音乐曲目模型"""
    upload_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="上传用户")
    singer = models.ForeignKey(Singer, on_delete=models.CASCADE, verbose_name="歌手")
    album = models.ForeignKey(Album, null=True, blank=True, on_delete=models.SET_NULL, verbose_name="所属专辑")
    music_name = models.CharField(max=100, verbose_name="曲目名称")
    music_file = models.FileField(upload="music/", verbose_name="音频文件")
    duration = models.CharField(max=20, verbose_name="播放时长")
    lyric = models.TextField(blank=True, verbose_name="歌词")
    play_count = models.IntegerField(default=0, verbose_name="播放次数")
    like_count = models.IntegerField(default=0, verbose_name="点赞数")
    audit_status = models.CharField(max=10, choices=AUDIT_STATUS, default="wait", verbose_name="审核状态")
    create_time = models.DateTimeField(auto_now_add=True)

class MusicList(models.Model):
    """自定义歌单模型"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="创建用户")
    list_name = models.CharField(max=50, verbose_name="歌单名称")
    list_cover = models.ImageField(upload="list/", blank=True, verbose_name="歌单封面")
    list_type = models.CharField(max=10, choices=LIST_TYPE, default="private", verbose_name="歌单类型")
    list_intro = models.TextField(blank=True, verbose_name="歌单简介")
    create_time = models.DateTimeField(auto_now_add=True)

class ListMusicRel(models.Model):
    """歌单与曲目关联表"""
    music_list = models.ForeignKey(MusicList, on_delete=models.CASCADE)
    music = models.ForeignKey(Music, on_delete=models.CASCADE)
    create_time = models.DateTimeField(auto_now_add=True)
示例2:音频文件校验工具类(core/file_check.py)
python 复制代码
class AudioFileCheck:
    """音频格式、大小校验工具"""
    # 允许的音频后缀
    ALLOW_SUFFIX = ["mp3", "wav"]
    # 最大文件 50MB
    MAX_SIZE = 50 * 1024 * 1024

    @classmethod
    def get_suffix(cls, filename):
        """获取文件后缀"""
        return filename.split(".")[-1].lower() if "." in filename else ""

    @classmethod
    def check_audio(cls, file_obj):
        """综合校验音频文件"""
        suffix = cls.get_suffix(file_obj.name)
        if suffix not in cls.ALLOW_SUFFIX:
            return False, "仅支持 mp3、w 格式音频文件"
        if file_obj.size > cls.MAX_SIZE:
            return False, "音频文件大小不能超过50MB"
        return True, "文件校验通过"
示例3:音乐上传核心视图
python 复制代码
from django.views import View
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.shortcuts import redirect
from django.contrib import messages
from apps.singer_album.models import Singer, Album
from apps.music_upload.models import Music
from core.file_check import AudioFile

@method_decorator(login_required, name="dispatch")
class MusicUploadView(View):
    def get(self, request):
        singer_list = Singer.objects.all()
        album_list = Album.objects.all()
        return render(request, "music_upload.html", locals())

    def post(self, request):
        singer_id = request.POST.get("singer_id")
        album_id = request.POST.get("album_id")
        music_name = request.POST.get("music_name")
        duration = request.POST.get("duration")
        lyric = request.POST.get("lyric")
        audio_file = request.FILES.get("music_file")

        # 文件校验
        flag, msg = AudioFile.check_audio(audio_file)
        if not flag:
            messages.error(request, msg)
            return redirect("music_upload")

        # 基础信息保存
        Music.objects.create(
            upload_user=request.user,
            singer_id=singer_id,
            album_id=album_id if album_id else None,
            music_name=music_name,
            music_file=audio_file,
            duration=duration,
            lyric=lyric
        )
        messages.success(request, "音乐上传成功,等待管理员审核!")
        return redirect("music_list_all")

八、总结与展望

本篇博客聚焦在线音乐分享平台 全新赛道,基于Python+Django结合HTML5音频能力打造完整音乐Web应用,和日志、天气、在线考试、智能图书、物业、固定资产、问卷、会议室、进销存、租赁、考勤等所有往期项目完全独立。项目融合音频文件处理、文件校验、状态审核、Ajax互动、多表关联、数据排行等核心技术,覆盖音乐上传、播放、歌单、互动、统计全流程,适配校园、企业内网、个人私有音乐库等多个真实场景。

项目代码规范、部署简单,既可以学习Django文件处理、多对多关联模型、前端音视频交互等知识点,也是毕业设计、求职简历中辨识度很高的音视频类实战项目。

后续迭代规划

  1. 新增歌词同步滚动功能,播放时自动匹配歌词进度;
  2. 新增随机播放、循环播放、上/下一曲完整播放控制;
  3. 新增音乐分享链接功能,支持外链分享曲目与歌单;
  4. 增加用户等级与积分体系,根据上传、互动行为累计积分。

相关推荐
lzjava20241 小时前
Python的数据结构,推导式、迭代器和生成器
数据结构·windows·python
小糯米6011 小时前
JavaScript表达式与运算符
开发语言·javascript·ecmascript
北极星日淘1 小时前
煤炉自动代拍功能开发 | Python 异步任务实现批量下单
开发语言·python·自动化
光之后裔1 小时前
用自定义数据集微调PP-OCRv5文本检测、识别模型
python·机器学习·ocr
体验家2 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
2301_764441332 小时前
基于AI的本地文件归档智能管理工具梳理
人工智能·python·算法·目标检测·交互
二十七剑2 小时前
LangGraph 源码深度解析:Node 节点 Protocol 与 StateNodeSpec 核心机制
开发语言·python
AC赳赳老秦2 小时前
OpenClaw + 云数据库运维:自动备份、扩容、迁移 RDS/MySQL 云数据库
运维·开发语言·数据库·人工智能·python·mysql·openclaw