1、项目介绍

技术栈:
Python语言、Flask框架、MySQL数据库、Echarts可视化、HTML

2、项目界面

(1)数据可视化大屏分析
在这里插入图片描述
(2)系统首页–数据概况

在这里插入图片描述

(3)动漫集数区间分布分析
在这里插入图片描述

(4)动漫评分区间分布分析
在这里插入图片描述

(5)动漫评分人数榜单

在这里插入图片描述
(6)评分人数区间分布

在这里插入图片描述

(7)动漫播出数量分布
在这里插入图片描述

(8)动漫词云图分析
在这里插入图片描述

(9)动漫词云图分析
在这里插入图片描述
(10)番剧管数据理
在这里插入图片描述
(11) 动漫数据管理
在这里插入图片描述
(12)注册登录
在这里插入图片描述

3、项目说明

1、数据可视化大屏分析
功能描述:提供一个综合的数据可视化界面,通过图表和图形展示动漫数据的整体概况和关键指标。
特点:大屏设计,适合在会议室或控制中心展示,便于团队快速了解数据状态。
2、系统首页 - 数据概况
功能描述:展示动漫数据的整体概况,包括动漫数量、评分分布、热门动漫等信息。
特点:作为用户进入系统的入口,提供简洁明了的数据概览。
3、动漫集数区间分布分析
功能描述:分析动漫的集数分布情况,展示不同集数区间的动漫数量。
特点:帮助用户了解动漫集数的普遍长度和分布情况。
4、动漫评分区间分布分析
功能描述:展示动漫评分的分布情况,包括不同评分区间的动漫数量和比例。
特点:帮助用户了解动漫的整体质量分布和用户满意度。
5、动漫评分人数榜单
功能描述:列出评分人数最多的动漫,展示其评分人数和评分。
特点:突出显示受欢迎且用户参与度高的动漫。
6、评分人数区间分布
功能描述:分析不同评分人数区间的动漫数量,展示评分人数的分布情况。
特点:帮助用户了解动漫的受欢迎程度和用户参与度。
7、动漫播出数量分布
功能描述:展示不同时间段内动漫的播出数量,分析播出趋势。
特点:帮助用户了解动漫的播出规律和季节性变化。
8、动漫词云图分析
功能描述:通过词云图展示动漫相关的关键词和短语,反映动漫的主题和热点。
特点:直观展示动漫内容的关键词,便于用户快速捕捉重点信息。
(重复项,应为其他功能模块,但图片链接重复,故假设为不同视角或细节的词云图分析)
假设功能:提供另一个视角或细节的词云图分析,如特定类型动漫的词云图。
9、番剧管理
功能描述:提供对番剧数据的增删改查功能,包括番剧信息、播出时间、简介等。
特点:方便管理员或具有权限的用户管理番剧数据。
10、动漫数据管理
功能描述:对动漫数据进行全面管理,包括动漫信息、评分、评论等。
特点:提供详细的数据管理界面,支持数据导出和导入功能(尽管在描述中未明确提及,但通常是数据管理系统的标准功能)。
11、注册登录
功能描述:提供用户注册和登录功能,确保用户数据的安全性和个性化服务的提供。
特点:支持邮箱/用户名和密码注册登录,可能还包含密码找回和重置功能(尽管在描述中未明确提及)。
总结
该项目是一个基于Flask框架和MySQL数据库的动漫数据分析系统,通过Echarts实现数据可视化。系统提供了丰富的功能模块,包括数据可视化大屏分析、数据概况展示、动漫集数/评分/播出数量分布分析、词云图分析以及番剧和动漫数据管理等功能。此外,系统还支持用户注册和登录,确保用户数据的安全性和个性化服务的提供。整体而言,该项目具有较高的实用价值和数据分析能力。

4、核心代码


import random
import string

from flask import Flask, redirect, render_template, url_for, request, flash, jsonify
from flask import session
from flask_cors import CORS
from sqlalchemy import func, desc
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 blueprints.anime import bp as anime_bp
from models import *
from util.visual 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)
app.register_blueprint(anime_bp)


@app.route('/logout')
def logout():
    # 清除会话中的用户名
    session.pop('username', None)
    # 重定向到登录页面
    return render_template('logout.html')


@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')


@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        email = request.form.get('email')
        phone = request.form.get('phone')
        address = request.form.get('address')
        profile_picture = "../static/image/user/default-avatar.png"

        if not username or not password or not email or not phone or not address:
            login_message = "温馨提示:所有字段都是必填"
            return render_template('register.html', message=login_message)

        existing_user = User.query.filter_by(username=username).first()

        if existing_user:
            login_message = "温馨提示:用户已存在,请直接登录"
            return render_template('register.html', message=login_message)

        # 创建新用户
        new_user = User(
            username=username,
            password=generate_password_hash(password),
            email=email,
            phone=phone,
            address=address,
            profile_picture=profile_picture
        )
        db.session.add(new_user)
        db.session.commit()

        return render_template('login.html')

    return render_template('register.html')


@app.route("/edit_profile", methods=["GET", "POST"])
def edit_profile():
    username = session.get('username')
    if not username:
        return redirect(url_for('login'))  # 确保用户已登录

    user = User.query.filter_by(username=username).first()
    if not user:
        return redirect(url_for('login'))  # 如果用户不存在,重定向到登录页面

    if request.method == 'POST':
        user.username = request.form['username']
        user.email = request.form['email']
        user.phone = request.form['phone']
        user.address = request.form['address']
        db.session.commit()
        message = ""
        return render_template('edit_profile.html', user=user, message=message, username=username)

    return render_template('edit_profile.html', user=user, username=username)


@app.route('/screen')
def screen():
    title = '可视化分析大屏'
    bar1_options, bar1_title = get_episode_count_distribution1()
    polar1_options, polar1_title = get_score_distribution1()
    pictorialBar1_options, pictorialBar1_title = get_anime_name_wordcloud1()
    pie1_options, pie1_title = get_score_count_distribution1()
    bar2_options, bar2_title = get_anime_type_distribution_bar1()
    m1_options, m1_title = get_anime_release_year_distribution1()
    geo_options, geo_title = get_anime_director_distribution1()
    wd_options, wd_title = get_score_count_ranking1()

    options = [bar1_options, polar1_options, pictorialBar1_options, pie1_options, bar2_options, m1_options, geo_options,
               wd_options]
    titles = [title, bar1_title, polar1_title, pictorialBar1_title, pie1_title, bar2_title, m1_title, geo_title,
              wd_title]

    return render_template('screen.html', options=options, titles=titles)

if __name__ == "__main__":
    app.run(host='127.0.0.1', port=5000)

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐