基于Flask的酷狗音乐数据可视化分析系统
📋 目录
🎯 项目概述
本项目是一个基于Flask框架开发的酷狗音乐数据可视化分析系统,旨在为用户提供音乐数据的深度分析和可视化展示。系统集成了用户管理、音乐数据管理、数据可视化分析等功能,通过直观的图表展示音乐数据的各种统计信息。
主要特点
- 🔐 完整的用户认证系统
- 📊 丰富的数据可视化图表
- 🎵 音乐数据管理功能
- 📱 响应式设计,支持多设备访问
- 🖥️ 可视化大屏展示
源码获取
码界筑梦坊 各大平台同名 文章底部含联系方式
项目演示
视频演示
基于Python的酷狗音乐数据可视化分析系统
🛠️ 技术栈
后端技术
- Web框架: Flask 3.0.0
- 数据库ORM: Flask-SQLAlchemy 3.0.3
- 数据库迁移: Flask-Migrate 4.0.4
- 表单处理: Flask-WTF 1.2.1
- 数据库: MySQL + PyMySQL 1.0.3
- 数据处理: Pandas 1.1.5
前端技术
- 模板引擎: Jinja2
- CSS框架: Bootstrap 4
- 图表库: ECharts、Chart.js、C3.js、Morris.js
- JavaScript库: jQuery
- 图标库: Dripicons、Material Design Icons
数据可视化
- Python图表库: PyECharts
- 前端图表: ECharts、Chart.js、C3.js
- 词云生成: WordCloud
🏗️ 系统架构
music/
├── app.py # Flask应用主文件
├── config.py # 配置文件
├── models.py # 数据模型
├── ext.py # 扩展初始化
├── manage.py # 管理脚本
├── blueprints/ # 蓝图模块
│ ├── admin.py # 管理功能
│ ├── chart.py # 图表功能
│ └── index.py # 首页功能
├── templates/ # 模板文件
├── static/ # 静态资源
├── util/ # 工具模块
│ └── datateal.py # 数据处理
└── model/ # 模型验证
✨ 功能特性
1. 用户管理系统
- 用户注册与登录
- 密码重置功能
- 个人信息管理
- 用户权限控制
2. 音乐数据管理
- 歌曲信息管理
- 专辑数据管理
- 歌手信息统计
- 数据搜索与筛选
3. 数据可视化分析
- 歌手歌曲数量分布
- 歌曲时长分布分析
- 专辑歌曲数量统计
- 歌手专辑数量分析
- 歌曲名称词云图
- 音乐数据大屏展示
4. 系统功能
- 响应式界面设计
- 实时数据统计
- 多图表展示
- 数据导出功能
🗄️ 数据库设计
用户表 (user)
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
phone VARCHAR(20) NOT NULL,
address VARCHAR(255) NOT NULL,
profile_picture VARCHAR(255),
reset_token VARCHAR(255)
);
音乐专辑表 (music_album)
CREATE TABLE music_album (
id INT PRIMARY KEY AUTO_INCREMENT,
album_name VARCHAR(255) NOT NULL COMMENT '专辑名',
song_name VARCHAR(255) NOT NULL COMMENT '歌曲名',
song VARCHAR(255) NOT NULL COMMENT '歌曲',
artist VARCHAR(255) NOT NULL COMMENT '歌手',
duration VARCHAR(10) NOT NULL COMMENT '时长',
url TEXT NOT NULL COMMENT '地址',
cover_url TEXT NOT NULL COMMENT '封面'
);
💻 核心代码实现
1. Flask应用初始化
# app.py
from flask import Flask, redirect, render_template, url_for, request, flash, jsonify
from flask import session
from flask_cors import CORS
from werkzeug.security import generate_password_hash, check_password_hash
import config
from blueprints.admin import bp as admin_bp
from blueprints.chart import bp as chart_bp
from blueprints.index import bp as index_bp
from models import *
from util.datateal import *
app = Flask(__name__)
CORS(app)
app.config.from_object(config)
db.init_app(app)
app.secret_key = 'your_secret_key'
# 注册蓝图
app.register_blueprint(index_bp)
app.register_blueprint(chart_bp)
app.register_blueprint(admin_bp)
2. 数据模型定义
# models.py
from ext import db
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(255), nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False)
email = db.Column(db.String(255), nullable=False, unique=True)
phone = db.Column(db.String(20), nullable=False)
address = db.Column(db.String(255), nullable=False)
profile_picture = db.Column(db.String(255), nullable=True)
reset_token = db.Column(db.String(255), nullable=True)
class MusicAlbum(db.Model):
__tablename__ = 'music_album'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
album_name = db.Column(db.String(255), nullable=False, comment='专辑名')
song_name = db.Column(db.String(255), nullable=False, comment='歌曲名')
song = db.Column(db.String(255), nullable=False, comment='歌曲')
artist = db.Column(db.String(255), nullable=False, comment='歌手')
duration = db.Column(db.String(10), nullable=False, comment='时长')
url = db.Column(db.Text, nullable=False, comment='地址')
cover_url = db.Column(db.Text, nullable=False, comment='封面')
3. 用户认证系统
# app.py - 登录功能
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
if not username or not password:
login_message = "温馨提示:账号和密码是必填"
return render_template('login.html', message=login_message)
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password):
session['username'] = username
return redirect(url_for('index.index'))
elif user:
login_message = "温馨提示:密码错误,请输入正确密码"
else:
login_message = "温馨提示:不存在该用户,请先注册"
return render_template('login.html', message=login_message)
return render_template('login.html')
4. 数据可视化处理
# util/datateal.py - 歌手歌曲数量分布
def get_top_artists_data():
"""查询数据库,统计前10名歌手的歌曲数量"""
top_artists = (
db.session.query(
MusicAlbum.artist,
func.count(MusicAlbum.id).label("song_count")
)
.group_by(MusicAlbum.artist)
.order_by(func.count(MusicAlbum.id).desc())
.limit(10)
.all()
)
return [{"artist": artist, "song_count": count} for artist, count in top_artists]
def get_funnel_chart_for_top_artists():
"""生成基于前10名歌手的歌曲数量分布的漏斗图"""
data = get_top_artists_data()
x_data = [item["artist"] for item in data]
y_data = [item["song_count"] for item in data]
range_color = ["#FFB6C1", "#FF69B4", "#FF1493", "#C71585", "#8B0000"]
lab_color1 = "#ffffff"
chart = (
Funnel()
.add('', [list(z) for z in zip(x_data, y_data)])
.set_series_opts(
label_opts=opts.LabelOpts(
position="inside",
formatter="{b} -- 数量:{c}",
color=lab_color1,
font_size=10
)
)
.set_global_opts(
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(
is_show=False,
max_=max(y_data),
min_=min(y_data),
range_color=range_color
),
)
)
funnel_options = chart.dump_options()
json_data = json.loads(funnel_options)
datas = json_data['series'][0]
datas['left'] = '2%'
datas['top'] = 10
datas['bottom'] = 10
datas['width'] = '90%'
json_data['series'][0] = datas
funnel_options = json.dumps(json_data)
title = "歌手歌曲数量分布"
return funnel_options, title
5. 图表路由处理
# blueprints/chart.py
@bp.route("/chart1")
def chart1():
username = session.get('username')
user = User.query.filter_by(username=username).first()
if username:
title = '酷狗音乐数据可视化分析系统'
bar1_options, bar1_title = get_funnel_chart_for_top_artists()
options = [bar1_options]
titles = [title, bar1_title]
return render_template("chart1.html", username=username, options=options, titles=titles, user=user)
else:
return redirect(url_for('chart1.index'))
📊 数据可视化
1. 歌手歌曲数量分布图
- 图表类型: 漏斗图
- 数据来源: 统计每个歌手的歌曲数量
- 展示效果: 直观显示歌手歌曲数量排名
2. 歌手歌曲平均时长图
- 图表类型: 横向柱状图
- 数据来源: 计算每个歌手的歌曲平均时长
- 展示效果: 对比不同歌手的歌曲时长特点
3. 歌曲总体时长分布图
- 图表类型: 饼图
- 数据来源: 按时长区间统计歌曲分布
- 展示效果: 展示歌曲时长分布规律
4. 歌手歌曲总量占比图
- 图表类型: 饼图
- 数据来源: 计算每个歌手的歌曲占比
- 展示效果: 显示歌手在系统中的占比情况
5. 专辑歌曲数量分布图
- 图表类型: 漏斗图
- 数据来源: 统计每个专辑的歌曲数量
- 展示效果: 展示专辑歌曲数量分布
6. 歌手专辑数量分布图
- 图表类型: 柱状图
- 数据来源: 统计每个歌手的专辑数量
- 展示效果: 对比不同歌手的专辑数量
7. 歌曲总计时长分布图
- 图表类型: 折线图
- 数据来源: 按歌手统计总计时长
- 展示效果: 展示歌手总计时长趋势
8. 歌曲名称词云图
- 图表类型: 词云图
- 数据来源: 分析歌曲名称关键词
- 展示效果: 展示歌曲名称中的热门词汇
🚀 部署指南
环境要求
- Python 3.7+
- MySQL 5.7+
- 现代浏览器
安装步骤
- 克隆项目
git clone <项目地址>
cd music
- 安装依赖
pip install -r dependency.txt
- 配置数据库
# 创建数据库
CREATE DATABASE design_kugou_music;
# 导入数据
mysql -u root -p design_kugou_music < design_kugou_music.sql
- 修改配置
# config.py
HOSTNAME = 'localhost'
DATABASE = 'design_kugou_music'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'your_password'
- 初始化数据库
python manage.py db init
python manage.py db migrate
python manage.py db upgrade
- 启动应用
python app.py
访问地址
- 首页: http://localhost:5000
- 登录: http://localhost:5000/login
- 注册: http://localhost:5000/register
📈 项目特色
1. 技术亮点
- 模块化设计: 使用Flask蓝图实现功能模块化
- 数据安全: 密码加密存储,会话管理
- 响应式设计: 支持多设备访问
- 丰富可视化: 多种图表类型展示数据
2. 功能完整性
- 完整的用户认证系统
- 全面的音乐数据管理
- 丰富的数据可视化分析
- 友好的用户界面
3. 扩展性
- 模块化架构便于功能扩展
- 数据库设计支持数据扩展
- 图表组件可复用
🎯 项目总结
本项目成功实现了一个功能完整的音乐数据可视化分析系统,具有以下优势:
技术优势
- 技术栈成熟: 使用Flask + MySQL + ECharts等成熟技术
- 架构清晰: 模块化设计,代码结构清晰
- 功能完整: 涵盖用户管理、数据管理、可视化分析等完整功能
- 界面友好: 响应式设计,用户体验良好
应用价值
- 数据分析: 为音乐数据提供深度分析
- 可视化展示: 直观展示音乐数据统计信息
- 用户管理: 完整的用户权限管理系统
- 扩展性强: 便于后续功能扩展和优化
技术收获
- Flask框架: 深入理解Flask应用开发
- 数据可视化: 掌握多种图表库的使用
- 数据库设计: 学习数据库设计和ORM使用
- 前端技术: 提升前端开发和界面设计能力
这个项目不仅实现了预期的功能目标,还在技术实现上体现了良好的工程实践,为后续的类似项目开发提供了宝贵的经验。
联系方式: [码界筑梦坊各平台同名]
如有问题或建议,欢迎交流讨论!