基于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_hashimport 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 dbclass 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'] = usernamereturn 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'] = 10datas['bottom'] = 10datas['width'] = '90%'json_data['series'][0] = datasfunnel_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使用
- 前端技術: 提升前端開發和界面設計能力
這個項目不僅實現了預期的功能目標,還在技術實現上體現了良好的工程實踐,為后續的類似項目開發提供了寶貴的經驗。
聯系方式: [碼界筑夢坊各平臺同名]
如有問題或建議,歡迎交流討論!