音乐推荐与可视化分析系统
基于 Flask 的音乐推荐与可视化分析系统,包含用户、创作者、管理员三种角色,使用 SQLite 数据库,集成 ECharts 进行数据可视化,采用混合推荐算法。
功能特性
用户端功能
- ✅ 用户注册与登录
- ✅ 音乐浏览与搜索
- ✅ 音乐详情查看
- ✅ 音乐评分(1-5星)
- ✅ 音乐收藏(收藏/取消收藏)
- ✅ 音乐评论(发表评论)
- ✅ 个性化推荐(基于混合推荐算法)
- ✅ 推荐结果可视化
创作者端功能
- ✅ 创作者登录
- ✅ 上传音乐作品(音频+封面)
- ✅ 查看作品统计(上传数量、播放量、平均评分、新增作品)
- ✅ 数据可视化展示
管理员端功能
- ✅ 管理员登录
- ✅ 系统数据可视化(用户分布、音乐流派分布、系统运营数据)
- ✅ 用户管理(查看列表、编辑信息、禁用/启用、删除用户)
- ✅ 音乐管理(新增音乐、编辑音乐、删除音乐)
- ✅ 收藏管理(查看列表、按用户筛选、搜索音乐、删除收藏)
- ✅ 评论管理(查看列表、按用户筛选、搜索音乐、查看详情、删除评论)
数据可视化
- ✅ ECharts图表展示
- ✅ 用户角色分布饼图
- ✅ 音乐流派分布柱状图
- ✅ 创作者上传统计(数量、播放量、评分)
- ✅ 响应式设计,适配不同屏幕
推荐算法说明
系统采用混合推荐算法,结合协同过滤和基于内容的推荐:
协同过滤(权重70%)
基于用户相似度进行推荐:
- 计算用户之间的相似度(余弦相似度)
- 找到与目标用户最相似的K个用户
- 推荐这些相似用户喜欢但目标用户未听过的音乐
基于内容的推荐(权重30%)
根据用户的流派偏好进行推荐:
- 统计用户听过的不同流派音乐
- 计算每个流派的平均评分
- 推荐用户喜爱流派中的高分音乐
混合推荐
将两种推荐结果按照70:30的权重进行融合,最终生成个性化推荐列表。
数据库模型
系统使用SQLite数据库,包含以下数据表:
User(用户表)
id: 用户ID(主键)username: 用户名(唯一)password: 密码(加密存储)email: 邮箱(唯一)role: 角色(user/creator/admin)is_active: 是否激活created_at: 创建时间
Music(音乐表)
id: 音乐ID(主键)title: 歌曲标题artist: 艺术家album: 专辑genre: 流派duration: 时长(秒)release_date: 发布日期file_url: 音乐文件路径cover_url: 封面图片路径description: 描述creator_id: 创作者ID(外键)play_count: 播放次数created_at: 创建时间
Rating(评分表)
id: 评分ID(主键)user_id: 用户ID(外键)music_id: 音乐ID(外键)score: 评分(1-5)created_at: 创建时间
Favorite(收藏表)
id: 收藏ID(主键)user_id: 用户ID(外键)music_id: 音乐ID(外键)created_at: 创建时间
Comment(评论表)
id: 评论ID(主键)user_id: 用户ID(外键)music_id: 音乐ID(外键)content: 评论内容created_at: 创建时间updated_at: 更新时间
Recommendation(推荐表)
id: 推荐ID(主键)user_id: 用户ID(外键)music_id: 音乐ID(外键)score: 推荐分数created_at: 创建时间
技术栈
- 后端:Flask
- 数据库:SQLite
- 前端:HTML + Tailwind CSS
- 可视化:ECharts 5
- 推荐算法:Python(协同过滤 + 内容推荐)
项目结构
.
├── app.py # Flask 主应用
├── models.py # 数据库模型定义
├── recommendation.py # 推荐算法实现
├── init_data.py # 数据初始化脚本
├── requirements.txt # Python 依赖
├── .coze # 项目配置
├── templates/ # HTML 模板
│ ├── base.html
│ ├── index.html
│ ├── login.html
│ ├── register.html
│ ├── user/
│ │ ├── dashboard.html
│ │ ├── music.html
│ │ └── recommendations.html
│ ├── creator/
│ │ ├── dashboard.html
│ │ └── upload.html
│ └── admin/
│ ├── dashboard.html
│ ├── users.html
│ ├── music.html
│ ├── favorites.html
│ └── comments.html
└── instance/ # SQLite 数据库文件
系统架构
前后端架构
- 前端:使用HTML + Tailwind CSS构建响应式页面
- 后端:Flask提供RESTful API接口
- 数据库:SQLite存储用户、音乐、评分、收藏、评论等数据
- 可视化:ECharts实现数据可视化展示
核心模块
-
认证模块
- 用户注册与登录
- 基于Flask-Login的会话管理
- 角色权限控制
-
推荐模块
- 协同过滤算法
- 基于内容的推荐
- 混合推荐结果融合
-
内容管理模块
- 音乐上传与管理
- 封面图片处理
- 音频文件存储
-
交互模块
- 评分系统
- 收藏功能
- 评论系统
-
数据可视化模块
- 用户分布统计
- 音乐流派分析
- 系统运营数据展示
推荐流程
- 用户登录系统
- 浏览并评分至少2首音乐
- 系统计算用户相似度和流派偏好
- 混合算法生成推荐列表
- 前端展示推荐结果
使用指南
用户角色
- 登录系统(使用 user1 / 123456)
- 浏览音乐库,选择喜欢的音乐进行评分
- 查看个性化推荐(需要先评分至少2首音乐才能生成推荐)
- 根据推荐结果发现新音乐
创作者角色
- 登录系统(使用 zhangsan / 123456)
- 上传新的音乐作品
- 查看作品统计数据
管理员角色
- 登录系统(使用 admin / admin123)
- 查看系统数据可视化(用户分布、流派分布等)
- 管理用户账户(查看、编辑、激活/停用)
- 管理音乐内容(新增、编辑、删除音乐)
- 管理收藏记录(查看、筛选、删除收藏)
- 管理评论内容(查看、筛选、删除评论)
推荐算法说明
系统采用混合推荐算法,结合协同过滤和基于内容的推荐:
协同过滤(权重70%)
基于用户相似度进行推荐:
- 计算用户之间的相似度(余弦相似度)
- 找到与目标用户最相似的K个用户
- 推荐这些相似用户喜欢但目标用户未听过的音乐
基于内容的推荐(权重30%)
根据用户的流派偏好进行推荐:
- 统计用户听过的不同流派音乐
- 计算每个流派的平均评分
- 推荐用户喜爱流派中的高分音乐
混合推荐
将两种推荐结果按照70:30的权重进行融合,最终生成个性化推荐列表。
功能截图













常见问题
Q: 如何重置数据库?
A: 删除 instance/music_recommendation.db 文件,然后运行 python init_data.py
Q: 推荐功能为什么不显示结果?
A: 用户需要至少评分2首音乐才能生成推荐结果
Q: 如何上传音乐封面?
A: 确保封面图片格式为 PNG、JPG、JPEG、GIF 或 WEBP
Q: 音乐文件支持哪些格式?
A: 支持 MP3、WAV、FLAC 格式,最大文件大小50MB
Q: 如何修改管理员密码?
A: 直接在数据库中修改或通过API接口更新
Q: 系统支持的并发用户数?
A: 开发环境无限制,生产环境建议根据服务器配置优化