摘要

WebTras 为面向个人用户的轻量化 Web 端音乐资产管理系统,采用前后端分离架构,依托 Vue 3 前端框架、Django 3.2 后端框架、SQLite 嵌入式数据库构建,原生集成 WebDAV 协议服务与客户端能力,实现本地音频文件上传、元数据解析、在线流式播放、歌单管理、远端 WebDAV 存储批量导入等完整业务能力。本文基于项目规划文档与运维文档,系统阐述项目核心特性、架构设计、部署方案、开发规范与迭代路线。

项目地址:WebTras

一、项目特性

1.1 基础音频管理能力

功能模块

能力说明

技术支撑

文件上传

单 / 批量文件上传、拖拽上传;自动解析音频元数据(标题 / 歌手 / 专辑 / 时长 / 封面)

DRF Multipart 上传接口、mutagen 元数据解析库

在线播放

HTML5 音频流式播放、断点续传、播放进度控制、播放队列管理

Django Range 分片文件流、Vue 自定义音频组件

文件分发

单文件下载、本地文件持久化存储

Django Media 文件管理体系

歌单系统

歌单 CRUD、歌曲增删、有序条目存储

多对多中间表PlaylistEntry、RESTful 资源接口

1.2 WebDAV 双向协议支持(核心差异化能力)

服务类型

功能描述

适用场景

WebDAV 服务端

提供/webdav/挂载端点,支持 Windows/macOS/Linux 文件管理器直接挂载音乐库目录

本地文件管理器批量增删音乐文件,自动同步数据库元数据

WebDAV 客户端

远端 WebDAV 目录浏览、批量音频文件拉取导入;支持 SSL 证书校验开关

对接群晖 / 威联通 NAS、Nextcloud、ownCloud 等远端存储批量迁移曲库

1.3 部署轻量化优势

  1. 存储层采用 SQLite 嵌入式数据库,无需独立数据库服务,无额外部署依赖;

  2. 开发环境双服务分离(Vite 前端 + Django 后端),生产环境支持 Docker 容器一键部署;

  3. 前后端完全解耦,开发阶段通过 Vite 代理解决跨域,生产环境可静态资源一体化托管。

1.4 兼容音频格式清单

原生支持:MP3、WAV、FLAC、AAC、OGG、M4A; 不支持:ALAC、APE、DSD 等浏览器原生不兼容格式,可通过文件下载功能本地解码。

二、架构设计

2.1 技术栈分层选型表

分层

技术组件

版本规范

核心职责

前端展示层

Vue 3 + Vite + Vue Router 4

Vue ^3.4.0、Vite ^5.0.0

页面渲染、音频播放控制、API 请求封装、文件上传交互

后端服务层

Django 3.2 + DRF

Django 3.2.25、djangorestframework 3.14.0

REST API、文件存储、数据库 CRUD、音频流分发、权限校验

跨域处理

django-cors-headers

4.3.1

开发环境前后端跨域访问放行

WebDAV 服务端

wsgidav

4.3.1

WSGI 标准 WebDAV 协议实现,文件系统挂载服务

WebDAV 客户端

requests + XML 原生解析

Python 内置标准库

远端存储目录遍历、文件批量下载

音频元数据解析

mutagen

1.47.0

读取音频 ID3 标签,提取歌曲、歌手、专辑信息

持久化存储

SQLite 3

系统内置

业务数据存储,无独立进程

2.2 项目目录分层结构

WebTras/                          # 项目根目录
├── manage.py                     # Django程序入口
├── requirements.txt              # Python后端依赖清单
├── WebTras/                      # Django全局配置模块
│   ├── settings.py               # 全局配置、媒体路径、跨域、应用注册
│   ├── urls.py                   # 全局路由分发
├── music/                        # 核心业务应用(音频/歌单/歌手模型与API)
├── webdav_app/                   # WebDAV服务端路由与视图模块
├── media/music/                  # 音频文件持久化存储目录(运行自动生成)
├── frontend/                     # Vue3前端独立工程
│   ├── vite.config.js            # 开发代理、端口固定配置
│   └── src/                      # 页面、组件、API请求封装
└── db.sqlite3                    # SQLite数据库文件

2.3 数据库模型关系设计

系统采用主模型 + 中间关联表实现实体关系解耦,核心实体:Artist(歌手)、Song(歌曲)、Playlist(歌单)、PlaylistEntry(歌单关联中间表)。

  1. 一对多关系:单个Artist关联多条Song

  2. 多对多关系:SongPlaylist通过PlaylistEntry中间表关联,支持自定义歌曲排序、添加时间记录;

  3. 核心字段约束:音频文件路径采用相对路径存储,时长以浮点秒数记录,文件大小单位为字节。

2.4 API 路由规范

  1. 业务 REST 接口统一前缀:/api/

  2. WebDAV 服务端挂载端点:/webdav/

  3. WebDAV 远端导入客户端接口:/api/webdav/

核心业务 API 清单

请求方法

接口路径

接口能力

GET/POST

/api/songs/

歌曲列表查询、文件上传创建歌曲记录

GET

/api/songs/{id}/stream/

音频分片流输出,前端播放器数据源

GET

/api/songs/{id}/download/

完整音频文件下载

GET/POST/PATCH/DELETE

/api/playlists/

歌单全量 CRUD

POST

/api/playlists/{id}/add/

歌单新增歌曲条目

DELETE

/api/playlists/{id}/remove/

歌单移除指定歌曲

POST

/api/webdav/browse/

远端 WebDAV 目录遍历

POST

/api/webdav/import/

远端音频批量导入本地曲库

三、部署方案

3.1 环境前置依赖要求

部署环境

依赖组件

版本下限

后端 Python 环境

Python

3.8+

前端构建环境

Node.js

18+

Docker 容器部署

Docker Engine、Docker Compose

20.10+、v2+

客户端访问

现代浏览器

Chrome/Firefox/Edge 最新稳定版

3.2 本地开发环境部署(Windows/macOS/Linux 通用)

3.2.1 后端启动流程

# 1. 创建并激活虚拟环境
python -m venv venv
# Windows PowerShell
.\venv\Scripts\Activate.ps1
# macOS/Linux
source venv/bin/activate

# 2. 安装后端依赖
pip install -r requirements.txt

# 3. 数据库初始化迁移
python manage.py makemigrations
python manage.py migrate

# 4. 可选:创建后台管理员账号
python manage.py createsuperuser

# 5. 启动Django开发服务
python manage.py runserver 8000

3.2.2 前端启动流程

cd frontend
npm install
npm run dev

3.2.3 开发环境访问地址

服务

访问地址

前端交互页面

http://localhost:5166

后端 API 服务

http://localhost:8000/api

Django 后台管理

http://localhost:8000/admin

3.3 Docker 容器化生产部署(NAS / 服务器推荐)

# 1. 构建并后台启动容器
docker compose up -d --build

# 2. 查看容器运行状态
docker compose ps

# 3. 查看后端运行日志
docker compose logs -f backend

# 4. 创建后台管理员账号
docker compose exec backend python manage.py createsuperuser

# 5. 项目版本更新流程
git pull
docker compose down
docker compose build --no-cache
docker compose up -d

容器默认对外暴露 8080 端口,访问地址:http://NAS_IP:8080

持久化数据目录映射

宿主机路径

存储内容

备份优先级

./data/db.sqlite3

业务数据库

极高

./media/

全部音频文件、专辑封面

极高

3.4 WebDAV 客户端接入配置规范

远端 WebDAV 导入接口标准请求体:

{
  "url": "https://dav.example.com/remote.php/dav/files/user/Music",
  "username": "user",
  "password": "pass",
  "paths": [
    "Albums/xxx.mp3"
  ],
  "verify_ssl": false
}
  • verify_ssl=false适用于内网 NAS 自签名证书场景,关闭 SSL 校验;

  • Windows 本地挂载 WebDAV 服务端地址格式:\\localhost@8000\webdav\

四、开发规范

4.1 开发阶段划分与优先级

阶段

开发内容

优先级

阶段 1:项目基础搭建

虚拟环境、依赖安装、Django 应用创建、基础配置、数据库初始化

阶段 2:数据层与 API 开发

实体模型、序列化器、REST 接口、后台 Admin 注册

阶段 3:WebDAV 服务端开发

wsgidav 集成、文件系统挂载、基础 HTTP 认证对接 Django 用户

阶段 4:Vue 前端工程开发

Vite 脚手架、路由、API 封装、播放器、上传、歌单页面组件

阶段 5:前后端联调验证

文件上传链路、流式播放、WebDAV 导入、跨域 / 路径 / 权限问题修复

4.2 核心模块关键实现逻辑

4.2.1 音频文件上传流程

  1. 前端通过multipart/form-data提交音频文件;

  2. DRF 解析文件流,存入media/music持久化目录;

  3. mutagen 读取音频标签,自动填充歌手、标题、专辑、时长字段;

  4. 写入Song数据表,返回完整歌曲资源。

4.2.2 音频流式播放实现

  1. 后端识别 HTTP Range 请求头,对音频文件分片读取;

  2. 响应头配置Accept-Ranges: bytes、对应音频 MIME 类型;

  3. 前端 \\ 标签直接绑定流式接口地址,支持拖拽进度、断点续播。

4.2.3 WebDAV 服务端集成逻辑

  1. 全局路由/webdav/转发至 wsgidav WSGI 应用;

  2. 文件存储根目录绑定项目media/music

  3. 对接 Django 用户认证体系,实现访问权限控制。

4.3 代码开发规范

技术栈

编码约束

Python 后端

遵循 PEP8 规范,统一使用单引号字符串,模块分层清晰

Vue 前端

优先<script setup>语法,组件样式添加scoped隔离,全局主题色统一#7c3aed

Git 提交

提交信息采用中文简短描述,明确修改模块与修复内容

资源忽略

.gitignore 默认排除虚拟环境、node_modules、数据库文件、构建产物、IDE 配置

五、迭代规划

5.1 短期迭代(Beta 1.x)

  1. 新增歌手、专辑独立筛选页面;

  2. 完善歌手详情页,展示对应专辑、全部曲目、歌手简介。

5.2 中长期迭代(Beta 3.x+)

扩展功能

实现价值

多用户权限隔离

支持多账号登录,歌单、曲库按用户隔离

整目录批量拖拽上传

前端递归读取本地文件夹,排队上传、断点续传

NCM 加密文件自动解密

兼容网易云加密音频格式,自动转码入库

LRC 歌词解析与展示

匹配歌曲加载本地歌词文件,同步滚动展示

M3U 歌单导入导出

兼容通用播放器歌单格式

前端深色模式

明暗主题一键切换

Nginx+Gunicorn 生产部署模板

高性能线上部署方案

六、常见问题

故障现象

根因定位

解决方案

前端启动端口 5166 占用

Vite 开启 strictPort,端口不可自动变更

关闭占用端口进程后重启前端服务

后端提示模块缺失

Python 虚拟环境未激活或依赖未完整安装

激活 venv,重新执行pip install -r requirements.txt

WebDAV 远端导入 SSL 证书校验失败

内网 NAS 使用自签名证书

请求参数verify_ssl设为 false,前端取消 SSL 校验勾选

部分音频无法浏览器播放

音频格式不支持 HTML5 原生解码

使用文件下载功能本地播放,或扩展后端转码服务

大文件上传请求中断

反向代理限制请求体大小

Nginx 配置client_max_body_size调至 200M 以上

页面静态资源、封面加载空白

浏览器缓存未更新

Ctrl+Shift+R 强制清空缓存刷新页面

结语

WebTras 以轻量化、自主可控为核心设计目标,打通本地文件管理、Web 在线播放、NAS 远端存储批量迁移三类核心场景,前后端分离架构具备良好的可维护性与扩展能力。开发环境适配个人本地调试,Docker 方案适配 NAS、服务器长期稳定运行,可满足个人私有音乐库全生命周期管理需求。

盒盒