影视数据可视化分析系统
完整项目技术文档
目录
一、项目概述
1.1 项目名称
影视数据采集与可视化分析系统
1.2 项目简介
本系统是一个综合性的影视数据管理与分析平台,集成了数据采集(爬虫)、数据存储、数据可视化、机器学习分析等功能。系统支持多数据源(哔哩哔哩、Netflix、豆瓣等),提供丰富的数据图表展示和智能分析功能。
1.3 核心功能
| 功能模块 | 描述 |
|---|---|
| 用户认证系统 | 登录、注册、密码找回、角色权限管理(管理员/普通用户) |
| 数据管理 | 影视数据的增删改查,支持分类筛选、搜索、分页 |
| 数据爬虫 | B站影视数据自动采集,支持5个分类,可配置爬取参数 |
| 数据可视化 | 20+种图表类型,两个数据大屏(影视剧大屏、B站科技风大屏) |
| 机器学习分析 | 评分预测、聚类分析、异常检测、内容推荐 |
| 邮件通知 | 数据更新完成后自动发送邮件通知 |
1.4 系统特色
- 双角色权限控制:管理员拥有完整权限,普通用户只读访问
- 科技感数据大屏:粒子动画、光圈效果、数据流动画
- 一键爬虫更新:可视化配置界面,实时进度反馈
- 机器学习集成:6大分析模块,深度数据挖掘
- 炫酷登录界面:卡通动画、粒子背景、音效交互
1.5 项目演示
326-基于Python的影视数据可视化分析系统































二、技术架构
2.1 技术栈总览
┌─────────────────────────────────────────────────────────────┐
│ 前端展示层 │
│ Bootstrap 4 │ jQuery 3.3 │ ECharts │ FontAwesome │ CSS3 │
├─────────────────────────────────────────────────────────────┤
│ 后端服务层 │
│ Flask 3.0 │ Jinja2模板 │ Blueprint蓝图 │ Flask-CORS │
├─────────────────────────────────────────────────────────────┤
│ 数据处理层 │
│ Pandas │ NumPy │ PyEcharts │ Scikit-learn │ Requests │
├─────────────────────────────────────────────────────────────┤
│ 数据存储层 │
│ MySQL 5.7+ │ SQLAlchemy ORM │ PyMySQL │
└─────────────────────────────────────────────────────────────┘
2.2 详细技术说明
| 类别 | 技术 | 版本 | 用途说明 |
|---|---|---|---|
| Web框架 | Flask | 3.0.0 | Python轻量级Web框架,处理HTTP请求 |
| ORM框架 | Flask-SQLAlchemy | 3.0.3 | 数据库对象关系映射 |
| 数据库驱动 | PyMySQL | 1.0.3 | MySQL数据库Python连接器 |
| 数据库迁移 | Flask-Migrate | 4.0.4 | 数据库版本管理 |
| 表单验证 | Flask-WTF | 1.2.1 | 表单处理和CSRF保护 |
| 跨域支持 | Flask-CORS | - | 处理跨域资源共享 |
| 数据处理 | Pandas | 1.1.5 | 数据分析和处理 |
| 数值计算 | NumPy | - | 科学计算库 |
| 图表生成 | PyEcharts | - | Python ECharts图表库 |
| 机器学习 | Scikit-learn | - | 机器学习算法库 |
| 网络请求 | Requests | - | HTTP请求库(爬虫) |
| 密码加密 | Werkzeug | - | 密码哈希加密 |
| 前端框架 | Bootstrap | 4.x | 响应式CSS框架 |
| 图表展示 | ECharts | 5.x | 前端可视化图表库 |
| 图标库 | FontAwesome | 5.x | 矢量图标库 |
2.3 系统架构图
用户请求 → Nginx(可选) → Flask App → Blueprint路由
↓
┌─────────────────────┐
│ 视图函数处理 │
│ - 权限验证 │
│ - 业务逻辑 │
│ - 数据查询 │
└─────────────────────┘
↓
┌────────────────────┴────────────────────┐
↓ ↓
数据库操作 工具模块调用
(SQLAlchemy ORM) (analyze/crawler/ml)
↓ ↓
MySQL PyEcharts图表生成
↓ ↓
←─────────────── 返回JSON/HTML ←──────────────────
三、项目目录结构
film/ # 项目根目录
│
├── app.py # 【主入口】Flask应用入口文件
│ # - 应用初始化和配置
│ # - 蓝图注册
│ # - 核心路由(登录、注册、大屏等)
│
├── config.py # 【配置】数据库连接配置
│ # - MySQL主机、端口、用户名、密码
│ # - SQLAlchemy配置
│
├── ext.py # 【扩展】Flask扩展初始化
│ # - SQLAlchemy实例创建
│
├── models.py # 【模型】数据库ORM模型定义
│ # - User(用户表)
│ # - FilmInformation(影视剧表)
│ # - NetflixTitles(Netflix表)
│ # - BilibiliMedia(B站影视表)
│
├── manage.py # 【管理】Flask-Migrate数据库迁移
│
├── dependency.txt # 【依赖】pip安装命令列表
│
├── design_326_film.sql # 【备份】数据库SQL备份文件(约8MB)
│
├── email_config.json # 【配置】邮件服务配置(JSON格式)
│
├── blueprints/ # 【蓝图目录】路由模块
│ │
│ ├── __init__.py # 包初始化文件
│ │
│ ├── admin.py # 【后台管理蓝图】URL前缀: /admin
│ │ # - 用户管理(CRUD)
│ │ # - 影视数据管理(Film/Netflix/Bilibili)
│ │ # - 爬虫控制
│ │ # - 邮件设置
│ │ # - 权限装饰器定义
│ │
│ ├── chart.py # 【图表蓝图】URL前缀: /chart
│ │ # - 17个影视剧数据分析图表路由
│ │ # - chart1 ~ chart17
│ │
│ ├── bilibili_chart.py # 【B站图表蓝图】URL前缀: /bilibili
│ │ # - 13个B站数据分析图表
│ │ # - 机器学习分析页面
│ │ # - ML API端点
│ │
│ └── index.py # 【首页蓝图】URL前缀: /
│ # - 系统首页
│ # - 统计数据API
│
├── model/ # 【验证模块】表单验证
│ ├── __init__.py
│ ├── check_login.py # 登录表单验证逻辑
│ └── check_regist.py # 注册表单验证逻辑
│
├── util/ # 【工具模块】数据处理
│ │
│ ├── analyze.py # 影视剧数据分析
│ │ # - 为chart蓝图提供图表数据
│ │
│ ├── datateal.py # 大屏数据处理
│ │ # - 为screen.html提供图表数据
│ │ # - get_pie1/get_pie2/get_grid等函数
│ │
│ ├── bilibili_analyze.py # B站数据分析(核心文件,约1500行)
│ │ # - 13个普通图表生成函数
│ │ # - 9个大屏专用图表函数
│ │ # - 统计数据获取函数
│ │
│ ├── bilibili_crawler.py # B站数据爬虫
│ │ # - BilibiliCrawler类
│ │ # - 5个分类的API配置
│ │ # - 数据爬取和解析逻辑
│ │ # - 数据库保存函数
│ │
│ ├── bilibili_ml.py # B站机器学习分析
│ │ # - 评分预测模型
│ │ # - K-Means聚类分析
│ │ # - 异常检测
│ │ # - 推荐系统
│ │
│ ├── save_data.py # 数据导入工具
│ ├── save_data1.py # 数据导入工具(备用)
│ │
│ ├── bilibili_data.csv # B站数据CSV备份
│ ├── netflix_titles.csv # Netflix数据CSV
│ └── 影视剧信息.xlsx # 影视剧Excel数据
│
├── templates/ # 【模板目录】HTML页面
│ │
│ ├── base.html # 基础布局模板(约800行)
│ │ # - 导航栏、侧边栏
│ │ # - 卡通装饰元素
│ │ # - 公共CSS/JS引入
│ │
│ ├── macros.html # Jinja2宏定义
│ │ # - render_pagination 分页组件
│ │
│ ├── login.html # 登录页面(约1200行)
│ │ # - 客厅动画场景
│ │ # - 粒子背景效果
│ │ # - 背景音乐控制
│ │
│ ├── register.html # 注册页面
│ ├── forgot_password.html # 忘记密码页面(侦探主题)
│ ├── reset_password.html # 重置密码页面
│ ├── change_password.html # 修改密码页面
│ │
│ ├── index.html # 系统首页
│ │ # - 统计卡片
│ │ # - 快捷入口
│ │
│ ├── screen.html # 影视剧数据大屏
│ ├── bilibili_screen.html # B站数据大屏(科技风格)
│ │ # - 星空粒子背景
│ │ # - 光圈动画效果
│ │ # - 9个图表展示
│ │
│ ├── bilibili_list.html # B站数据列表
│ │ # - 爬虫配置面板
│ │ # - 进度条显示
│ │ # - 分类筛选
│ │
│ ├── bilibili_detail.html # B站数据详情
│ ├── bilibili_chart.html # B站图表展示
│ ├── bilibili_chart_3d.html # B站3D图表
│ ├── bilibili_ml.html # 机器学习分析页
│ │
│ ├── film_list.html # 影视剧列表
│ ├── netflix_list.html # Netflix列表
│ ├── user_list.html # 用户管理列表
│ │
│ ├── edit_profile.html # 个人资料编辑
│ ├── email_settings.html # 邮件设置页面
│ │
│ ├── chart1.html ~ chart17.html # 17个图表展示页面
│ │
│ ├── add_bilibili.html # 添加B站数据
│ ├── add_film.html # 添加影视剧
│ ├── add_netflix.html # 添加Netflix数据
│ ├── add_user.html # 添加用户
│ │
│ ├── edit_bilibili.html # 编辑B站数据
│ ├── edit_film.html # 编辑影视剧
│ ├── edit_netflix.html # 编辑Netflix
│ └── edit_user.html # 编辑用户
│
└── static/ # 【静态资源目录】
│
├── assets/ # 前端框架资源
│ ├── vendor/ # 第三方库
│ │ ├── bootstrap/ # Bootstrap CSS/JS
│ │ ├── jquery/ # jQuery库
│ │ ├── charts/ # 图表相关库
│ │ ├── fonts/ # 字体和图标
│ │ │ ├── fontawesome/ # FontAwesome图标
│ │ │ ├── simple-line-icons/ # 简线图标
│ │ │ └── themify-icons/ # Themify图标
│ │ ├── datatables/ # 数据表格插件
│ │ ├── datepicker/ # 日期选择器
│ │ └── select2/ # 下拉选择增强
│ │
│ ├── libs/ # 自定义资源
│ │ ├── css/style.css # 主样式文件
│ │ └── js/ # 自定义JS
│ │
│ └── images/ # 系统图片
│ ├── logo.png # Logo图片
│ ├── logo1.png
│ └── logo2.png
│
├── image/ # 业务图片
│ ├── user/ # 用户头像
│ │ └── default-avatar.png # 默认头像
│ └── screen_bg.jpg # 大屏背景图
│
├── audio/ # 音频文件
│ ├── background.mp3 # 背景音乐
│ └── click.mp3 # 点击音效
│
├── visual/ # 可视化模板参考
│
└── dist/ # 其他前端资源
└── modules/ # 模块资源
四、数据库设计
4.1 数据库基本信息
| 项目 | 值 |
|---|---|
| 数据库类型 | MySQL 5.7+ |
| 数据库名称 | design_326_film |
| 字符集 | utf8mb4 |
| 排序规则 | utf8mb4_general_ci |
4.2 数据表概览
| 表名 | 中文名称 | 记录数量级 | 主要用途 |
|---|---|---|---|
| user | 用户表 | 10-100 | 存储系统用户信息 |
| film_information | 影视剧信息表 | 100-1000 | 存储影视剧基本数据 |
| netflix_titles | Netflix节目表 | 1000-10000 | 存储Netflix影视数据 |
| bilibili_media | B站影视表 | 1000-50000 | 存储B站影视数据 |
4.3 用户表 (user)
表说明:存储系统用户信息,包含认证、个人资料和权限信息。
建表语句:
sql
CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '用户ID,主键自增',
`username` VARCHAR(255) NOT NULL COMMENT '用户名,唯一',
`password` VARCHAR(255) NOT NULL COMMENT '密码(哈希加密存储)',
`email` VARCHAR(255) NOT NULL COMMENT '邮箱地址,唯一',
`phone` VARCHAR(20) NOT NULL COMMENT '手机号码',
`address` VARCHAR(255) NOT NULL COMMENT '地址',
`profile_picture` VARCHAR(255) DEFAULT NULL COMMENT '头像图片路径',
`reset_token` VARCHAR(255) DEFAULT NULL COMMENT '密码重置令牌',
`role` VARCHAR(20) NOT NULL DEFAULT 'user' COMMENT '用户角色:admin/user',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_username` (`username`),
UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
字段详细说明:
| 字段名 | 数据类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| id | INT | 是 | 自增 | 主键,用户唯一标识 |
| username | VARCHAR(255) | 是 | - | 用户名,用于登录,全局唯一 |
| password | VARCHAR(255) | 是 | - | 密码,使用werkzeug进行哈希加密存储 |
| VARCHAR(255) | 是 | - | 邮箱地址,用于密码找回和通知,全局唯一 | |
| phone | VARCHAR(20) | 是 | - | 手机号码,用于密码找回验证 |
| address | VARCHAR(255) | 是 | - | 用户地址信息 |
| profile_picture | VARCHAR(255) | 否 | NULL | 用户头像图片路径 |
| reset_token | VARCHAR(255) | 否 | NULL | 密码重置令牌,重置成功后清空 |
| role | VARCHAR(20) | 是 | 'user' | 用户角色,admin=管理员,user=普通用户 |
索引设计:
- 主键索引:id
- 唯一索引:username(快速登录验证)
- 唯一索引:email(防止重复注册)
示例数据:
sql
INSERT INTO `user` VALUES
(1, 'admin', 'pbkdf2:sha256:...', 'admin@example.com', '13800138000', '北京市', '../static/image/user/default-avatar.png', NULL, 'admin'),
(2, 'testuser', 'pbkdf2:sha256:...', 'test@example.com', '13900139000', '上海市', '../static/image/user/default-avatar.png', NULL, 'user');
4.4 影视剧信息表 (film_information)
表说明:存储影视剧基本信息,主要来源于豆瓣等平台。
建表语句:
sql
CREATE TABLE `film_information` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`title` TEXT NOT NULL COMMENT '影视剧名称',
`tags` TEXT DEFAULT NULL COMMENT '影视剧标签(逗号分隔)',
`barrage_count` TEXT DEFAULT NULL COMMENT '弹幕数量',
`hotness` BIGINT DEFAULT NULL COMMENT '热度值',
`keywords` TEXT DEFAULT NULL COMMENT '关键词描述',
`image_url` TEXT DEFAULT NULL COMMENT '海报图片URL',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='影视剧信息表';
字段详细说明:
| 字段名 | 数据类型 | 是否必填 | 说明 |
|---|---|---|---|
| id | BIGINT | 是 | 主键,自动递增 |
| title | TEXT | 是 | 影视剧名称,如"流浪地球2" |
| tags | TEXT | 否 | 标签,多个标签用逗号分隔,如"科幻,冒险,动作" |
| barrage_count | TEXT | 否 | 弹幕数量,存储格式如"12.5万" |
| hotness | BIGINT | 否 | 热度数值,用于排序 |
| keywords | TEXT | 否 | 关键词描述,用于搜索和词云分析 |
| image_url | TEXT | 否 | 海报高清图片URL |
4.5 Netflix节目表 (netflix_titles)
表说明:存储Netflix平台的影视节目数据。
建表语句:
sql
CREATE TABLE `netflix_titles` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`show_id` TEXT NOT NULL COMMENT 'Netflix节目ID',
`type` TEXT NOT NULL COMMENT '类型:Movie/TV Show',
`title` TEXT NOT NULL COMMENT '节目标题',
`director` TEXT DEFAULT NULL COMMENT '导演',
`cast` TEXT DEFAULT NULL COMMENT '演员阵容',
`country` TEXT DEFAULT NULL COMMENT '制作国家',
`date_added` TEXT DEFAULT NULL COMMENT '上架日期',
`release_year` BIGINT DEFAULT NULL COMMENT '上映年份',
`rating` TEXT DEFAULT NULL COMMENT '分级:PG-13/R/TV-MA等',
`duration` TEXT DEFAULT NULL COMMENT '时长:电影为分钟,剧集为季数',
`listed_in` TEXT DEFAULT NULL COMMENT '分类标签',
`description` TEXT DEFAULT NULL COMMENT '节目简介',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Netflix节目表';
字段详细说明:
| 字段名 | 数据类型 | 是否必填 | 说明 | 示例值 |
|---|---|---|---|---|
| id | BIGINT | 是 | 主键自增 | 1 |
| show_id | TEXT | 是 | Netflix内部ID | s1, s2 |
| type | TEXT | 是 | 节目类型 | Movie / TV Show |
| title | TEXT | 是 | 节目标题 | Stranger Things |
| director | TEXT | 否 | 导演姓名 | The Duffer Brothers |
| cast | TEXT | 否 | 演员列表(逗号分隔) | Millie Bobby Brown, Finn Wolfhard |
| country | TEXT | 否 | 制作国家 | United States |
| date_added | TEXT | 否 | Netflix上架日期 | July 15, 2016 |
| release_year | BIGINT | 否 | 首映年份 | 2016 |
| rating | TEXT | 否 | 内容分级 | TV-14, PG-13, R |
| duration | TEXT | 否 | 时长信息 | 4 Seasons / 120 min |
| listed_in | TEXT | 否 | 分类标签 | TV Dramas, Sci-Fi |
| description | TEXT | 否 | 节目简介 | When a young boy... |
4.6 哔哩哔哩影视表 (bilibili_media) ⭐核心表
表说明:存储从B站爬取的影视数据,是系统最核心的数据表,数据量最大。
建表语句:
sql
CREATE TABLE `bilibili_media` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增ID,主键',
`media_id` BIGINT NOT NULL COMMENT 'B站媒体ID(唯一标识)',
`title` TEXT NOT NULL COMMENT '影视名称',
`category` VARCHAR(50) NOT NULL COMMENT '分类:movie/tv/bangumi/guochuang/documentary',
`cover` TEXT DEFAULT NULL COMMENT '封面图片URL',
`tag1` TEXT DEFAULT NULL COMMENT '主标签(类型)',
`tag2` TEXT DEFAULT NULL COMMENT '副标签(地区)',
`score` FLOAT DEFAULT NULL COMMENT '评分(0-10分)',
`review_count` TEXT DEFAULT NULL COMMENT '评分人数',
`play_count` TEXT DEFAULT NULL COMMENT '总播放量',
`follow_count` TEXT DEFAULT NULL COMMENT '追剧/追番人数',
`danmaku_count` TEXT DEFAULT NULL COMMENT '弹幕总数',
`release_date` TEXT DEFAULT NULL COMMENT '上映/开播时间',
`duration` TEXT DEFAULT NULL COMMENT '播放时长/总集数',
`keywords` TEXT DEFAULT NULL COMMENT '关键词(逗号分隔)',
`keyword_count` INT DEFAULT NULL COMMENT '关键词数量',
`url` TEXT DEFAULT NULL COMMENT 'B站详情页URL',
`actors` TEXT DEFAULT NULL COMMENT '演员/声优(逗号分隔)',
`description` TEXT DEFAULT NULL COMMENT '简介',
`area` TEXT DEFAULT NULL COMMENT '地区',
`style` TEXT DEFAULT NULL COMMENT '风格类型(逗号分隔)',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '数据创建时间',
PRIMARY KEY (`id`),
KEY `idx_category` (`category`),
KEY `idx_media_id` (`media_id`),
KEY `idx_score` (`score`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='B站影视数据表';
字段详细说明:
| 字段名 | 数据类型 | 是否必填 | 说明 | 示例值 |
|---|---|---|---|---|
| id | BIGINT | 是 | 系统主键 | 1 |
| media_id | BIGINT | 是 | B站媒体唯一ID | 28237119 |
| title | TEXT | 是 | 影视名称 | 流浪地球2 |
| category | VARCHAR(50) | 是 | 分类代码 | movie/tv/bangumi/guochuang/documentary |
| cover | TEXT | 否 | 封面图URL | https://i0.hdslb.com/bfs/... |
| tag1 | TEXT | 否 | 主标签 | 科幻 |
| tag2 | TEXT | 否 | 副标签 | 中国大陆 |
| score | FLOAT | 否 | 评分(0-10) | 9.5 |
| review_count | TEXT | 否 | 评分人数 | 12.5万 |
| play_count | TEXT | 否 | 播放量 | 3.2亿 |
| follow_count | TEXT | 否 | 追剧人数 | 856.7万 |
| danmaku_count | TEXT | 否 | 弹幕数 | 125.6万 |
| release_date | TEXT | 否 | 上映时间 | 2023-01-22 |
| duration | TEXT | 否 | 时长/集数 | 173分钟 / 全24集 |
| keywords | TEXT | 否 | 关键词 | 科幻,冒险,地球,太阳系 |
| keyword_count | INT | 否 | 关键词数量 | 4 |
| url | TEXT | 否 | B站链接 | https://www.bilibili.com/bangumi/... |
| actors | TEXT | 否 | 演员/声优 | 吴京,刘德华,李雪健 |
| description | TEXT | 否 | 简介 | 太阳即将毁灭... |
| area | TEXT | 否 | 地区 | 中国大陆 |
| style | TEXT | 否 | 风格 | 科幻,冒险,灾难 |
| created_at | DATETIME | 否 | 创建时间 | 2024-01-10 12:00:00 |
分类代码说明:
| category值 | 中文名称 | 说明 |
|---|---|---|
| movie | 电影 | 院线电影、网络电影 |
| tv | 电视剧 | 国产剧、海外剧 |
| bangumi | 番剧 | 日本动画为主 |
| guochuang | 国创 | 国产动画 |
| documentary | 纪录片 | 各类纪录片 |
索引设计:
- 主键索引:id
- 普通索引:category(分类筛选)
- 普通索引:media_id(去重检查)
- 普通索引:score(评分排序)
4.7 数据库ER图
┌─────────────────┐
│ user │
├─────────────────┤
│ PK id │
│ username │──┐
│ password │ │
│ email │ │
│ phone │ │ 用户管理
│ address │ │ 全部数据
│ profile_pic │ │
│ reset_token │ │
│ role │──┘
└─────────────────┘
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│film_information │ │ netflix_titles │ │ bilibili_media │
├─────────────────┤ ├─────────────────┤ ├─────────────────┤
│ PK id │ │ PK id │ │ PK id │
│ title │ │ show_id │ │ media_id │
│ tags │ │ type │ │ title │
│ barrage_cnt │ │ title │ │ category │
│ hotness │ │ director │ │ cover │
│ keywords │ │ cast │ │ score │
│ image_url │ │ country │ │ play_count │
└─────────────────┘ │ date_added │ │ follow_count │
│ release_year │ │ danmaku_cnt │
│ rating │ │ keywords │
│ duration │ │ actors │
│ listed_in │ │ area │
│ description │ │ style │
└─────────────────┘ │ created_at │
└─────────────────┘
五、核心模块详解
5.1 应用主入口 (app.py)
文件位置 :film/app.py
代码行数 :约300行
核心职责:
- Flask应用实例化和配置
- 数据库初始化
- 蓝图注册
- 核心路由定义
关键代码解析:
python
# 应用初始化
app = Flask(__name__)
CORS(app) # 启用跨域支持
app.config.from_object(config) # 加载配置
db.init_app(app) # 初始化数据库
# 蓝图注册
app.register_blueprint(index_bp) # 首页蓝图 /
app.register_blueprint(chart_bp) # 图表蓝图 /chart
app.register_blueprint(admin_bp) # 后台蓝图 /admin
app.register_blueprint(bilibili_bp) # B站蓝图 /bilibili
主要路由功能:
| 路由 | 函数 | 方法 | 功能描述 |
|---|---|---|---|
| /login | login() | GET/POST | 用户登录验证 |
| /register | register() | GET/POST | 用户注册 |
| /logout | logout() | GET | 退出登录 |
| /screen | screen() | GET | 影视剧数据大屏 |
| /bilibili_screen | bilibili_screen() | GET | B站数据大屏 |
| /forgot_password | forgot_password() | GET/POST | 忘记密码 |
| /reset_password/<token> | reset_password() | GET/POST | 重置密码 |
| /change_password | change_password() | GET/POST | 修改密码 |
| /edit_profile | edit_profile() | GET/POST | 编辑个人资料 |
5.2 后台管理蓝图 (blueprints/admin.py)
文件位置 :film/blueprints/admin.py
代码行数 :约900行
URL前缀 :/admin
权限装饰器:
python
# 登录检查装饰器
@login_required # 任何已登录用户可访问
# 管理员权限装饰器
@admin_required # 仅管理员可访问
路由清单:
| 路由 | 方法 | 权限 | 功能 |
|---|---|---|---|
| /user_list | GET | admin | 用户列表 |
| /add_user | GET/POST | admin | 添加用户 |
| /edit_user<id> | GET/POST | admin | 编辑用户 |
| /delete_user<id> | POST | admin | 删除用户 |
| /film_list | GET | login | 影视剧列表 |
| /add_film | GET/POST | admin | 添加影视剧 |
| /edit_film<id> | GET/POST | admin | 编辑影视剧 |
| /delete_film<id> | POST | admin | 删除影视剧 |
| /netflix_list | GET | login | Netflix列表 |
| /add_netflix | GET/POST | admin | 添加Netflix |
| /edit_netflix<id> | GET/POST | admin | 编辑Netflix |
| /delete_netflix<id> | POST | admin | 删除Netflix |
| /bilibili_list | GET | login | B站数据列表 |
| /bilibili_detail<id> | GET | login | B站数据详情 |
| /search_bilibili | GET | login | 搜索B站数据 |
| /add_bilibili | GET/POST | admin | 添加B站数据 |
| /edit_bilibili<id> | GET/POST | admin | 编辑B站数据 |
| /delete_bilibili<id> | POST | admin | 删除B站数据 |
| /update_bilibili | POST | admin | 启动爬虫更新 |
| /update_bilibili_status | GET | admin | 获取爬虫进度 |
| /email_settings | GET/POST | admin | 邮件设置 |
| /test_email | POST | admin | 测试邮件发送 |
5.3 B站数据爬虫 (util/bilibili_crawler.py)
文件位置 :film/util/bilibili_crawler.py
核心类 :BilibiliCrawler
支持的分类配置:
python
CATEGORY_CONFIG = {
'movie': {
'name': '电影',
'season_type': 2,
'api_url': 'https://api.bilibili.com/pgc/season/index/result',
'pages': 50
},
'tv': {
'name': '电视剧',
'season_type': 5,
'pages': 50
},
'bangumi': {
'name': '番剧',
'season_type': 1,
'pages': 100
},
'guochuang': {
'name': '国创',
'season_type': 4,
'pages': 50
},
'documentary': {
'name': '纪录片',
'season_type': 3,
'pages': 30
}
}
核心方法:
| 方法名 | 功能 | 参数 |
|---|---|---|
| get_media_ids() | 获取指定分类页面的媒体ID列表 | category, page |
| get_media_info() | 获取单个媒体的详细信息 | media_id, category |
| crawl_category() | 爬取整个分类 | category, max_pages |
| save_to_database() | 保存数据到数据库 | data_list, incremental |
5.4 B站数据分析 (util/bilibili_analyze.py)
文件位置 :film/util/bilibili_analyze.py
代码行数:约1500行
图表生成函数列表:
| 函数名 | 图表类型 | 用途 | 使用页面 |
|---|---|---|---|
| get_bilibili_category_pie() | 饼图 | 分类数量占比 | chart1 |
| get_bilibili_score_distribution() | 柱状图 | 评分区间分布 | chart2 |
| get_bilibili_top_plays() | 条形图 | 播放量TOP20 | chart3 |
| get_bilibili_radar_by_category() | 雷达图 | 分类综合指标 | chart4 |
| get_bilibili_heatmap() | 热力图 | 分类-评分热力图 | chart5 |
| get_bilibili_sankey() | 桑基图 | 内容流向 | chart6 |
| get_bilibili_bar3d() | 3D柱状图 | 三维数据展示 | chart7 |
| get_bilibili_keyword_wordcloud() | 词云 | 热门关键词 | chart8 |
| get_bilibili_actor_wordcloud() | 词云 | 热门演员 | chart9 |
| get_bilibili_style_polar() | 极坐标图 | 风格分布 | chart10 |
| get_bilibili_funnel() | 漏斗图 | 用户互动转化 | chart11 |
| get_bilibili_gauge() | 仪表盘 | 综合评分 | chart12 |
| get_bilibili_timeline() | 折线图 | 发布趋势 | chart13 |
大屏专用函数:
| 函数名 | 用途 |
|---|---|
| get_screen_category_pie() | 大屏-分类占比 |
| get_screen_score_bar() | 大屏-评分分布 |
| get_screen_top_plays() | 大屏-播放量 |
| get_screen_radar() | 大屏-雷达图 |
| get_screen_area_bar() | 大屏-地区分布 |
| get_screen_keyword_cloud() | 大屏-词云 |
| get_screen_top_score() | 大屏-评分分布 |
| get_screen_follow_pie() | 大屏-追剧分布 |
| get_screen_timeline() | 大屏-年份分布 |
| get_screen_gauge() | 大屏-仪表盘 |
5.5 机器学习分析 (util/bilibili_ml.py)
文件位置 :film/util/bilibili_ml.py
使用的算法库:Scikit-learn
分析功能:
| 功能 | 算法 | API端点 | 说明 |
|---|---|---|---|
| 评分预测 | RandomForest/GradientBoosting | /api/ml/prediction | 预测影视作品评分 |
| 特征重要性 | RandomForest | /api/ml/importance | 分析影响评分的关键因素 |
| 聚类分析 | K-Means | /api/ml/cluster | 作品自动分群 |
| 最优聚类数 | 肘部法则 | /api/ml/elbow | 确定最佳K值 |
| 异常检测 | IsolationForest/DBSCAN | /api/ml/anomaly | 识别异常数据点 |
| 内容推荐 | 相似度计算 | /api/ml/recommend | 基于内容的推荐 |
六、路由接口文档
6.1 认证相关接口
6.1.1 用户登录
POST /login
Content-Type: application/x-www-form-urlencoded
参数:
- username: 用户名
- password: 密码
- remember_me: 记住我(可选)
返回:
- 成功:重定向到首页,session中存储username和role
- 失败:返回登录页面,显示错误信息
6.1.2 用户注册
POST /register
Content-Type: application/x-www-form-urlencoded
参数:
- username: 用户名
- password: 密码
- email: 邮箱
- phone: 手机号
- address: 地址
- role: 角色(admin/user)
返回:
- 成功:显示注册成功提示
- 失败:返回注册页面,显示错误信息
6.2 数据接口
6.2.1 首页统计数据
GET /api/stats
返回:
{
"user_count": 10,
"film_count": 100,
"netfix_count": 1000,
"bilibili_count": 5000
}
6.2.2 爬虫控制
POST /admin/update_bilibili
Content-Type: application/json
参数:
{
"categories": ["movie", "tv", "bangumi"], // 选中的分类
"max_pages": 3, // 每个分类爬取页数
"incremental": true // 是否增量更新
}
返回:
{
"success": true,
"message": "数据更新已开始,请稍候..."
}
6.2.3 爬虫进度查询
GET /admin/update_bilibili_status
返回:
{
"is_updating": true,
"progress": 45,
"message": "[2/5] 正在爬取【电视剧】第 3/5 页...",
"last_update": "2024-01-10 12:00:00",
"total_count": 150
}
6.3 机器学习API
| 端点 | 方法 | 返回内容 |
|---|---|---|
| /bilibili/api/ml/prediction | GET | 评分预测散点图配置 |
| /bilibili/api/ml/importance | GET | 特征重要性柱状图配置 |
| /bilibili/api/ml/cluster | GET | 聚类散点图配置 |
| /bilibili/api/ml/elbow | GET | 肘部法则折线图配置 |
| /bilibili/api/ml/anomaly | GET | 异常检测散点图配置 |
| /bilibili/api/ml/recommend | GET | 推荐分析图表配置 |
| /bilibili/api/ml/summary | GET | 分析摘要JSON |
七、功能模块说明
7.1 用户认证系统
功能点:
- 用户注册(支持选择角色)
- 用户登录(密码哈希验证)
- 密码找回(手机号+用户名验证,生成重置令牌)
- 密码重置(通过令牌验证)
- 密码修改(验证当前密码)
- 个人资料编辑
密码安全:
python
# 密码加密存储
from werkzeug.security import generate_password_hash, check_password_hash
# 注册时加密
password = generate_password_hash(plain_password)
# 登录时验证
check_password_hash(user.password, input_password)
7.2 权限控制系统
角色定义:
| 角色 | role值 | 权限范围 |
|---|---|---|
| 管理员 | admin | 完整权限:CRUD、爬虫、用户管理 |
| 普通用户 | user | 只读权限:查看数据、图表 |
权限控制实现:
python
# 装饰器方式
@admin_required
def some_admin_function():
pass
# 模板中判断
{% if role == 'admin' %}
<button>编辑</button>
{% endif %}
7.3 数据爬虫系统
工作流程:
- 管理员在B站列表页点击"一键更新数据"
- 配置爬取参数(分类、页数、增量模式)
- 点击"开始爬取",后台线程启动
- 前端轮询进度接口,显示进度条
- 爬取完成后发送邮件通知
增量更新:
- 爬取前加载已存在的media_id集合
- 跳过已存在的数据
- 仅保存新数据
7.4 邮件通知系统
配置项:
json
{
"smtp_server": "smtp.qq.com",
"smtp_port": 465,
"sender_email": "xxx@qq.com",
"sender_password": "授权码",
"enabled": true,
"debug_mode": false
}
支持的邮件服务:
- QQ邮箱(端口465/587)
- 163邮箱
- Gmail
- 其他SMTP服务
八、页面模板说明
8.1 基础布局 (base.html)
结构:
html
<!DOCTYPE html>
<html>
<head>
<!-- Bootstrap CSS -->
<!-- 自定义样式 -->
<!-- 图标库 -->
</head>
<body>
<!-- 导航栏 -->
<nav class="navbar">
<!-- Logo -->
<!-- 用户菜单 -->
</nav>
<!-- 侧边栏 -->
<aside class="sidebar">
<!-- 菜单项 -->
<!-- 根据role显示不同菜单 -->
</aside>
<!-- 主内容区 -->
<main>
{% block main %}{% endblock %}
</main>
<!-- 卡通装饰元素 -->
<div class="film-decorations">
<!-- 电影胶片、场记板、星星等 -->
</div>
<!-- 公共JS -->
</body>
</html>
8.2 登录页面 (login.html)
特色效果:
- 客厅动画场景(电视机、沙发、一家人)
- 飘动的电影票
- 星星闪烁
- 海浪动画
- 粒子背景
- 背景音乐
- 鼠标轨迹特效
- 点击波纹效果
8.3 B站数据大屏 (bilibili_screen.html)
布局结构:
┌─────────────────────────────────────────────────────────────┐
│ 标题栏 │
│ 哔哩哔哩影视数据大屏 │
├─────────┬───────────────────────────────────┬───────────────┤
│ │ │ │
│ 左侧图表 │ 中间区域 │ 右侧图表 │
│ (22%) │ (自适应) │ (22%) │
│ │ │ │
│ 饼图 │ 统计卡片 │ 地区分布 │
│ 评分 │ 雷达图 │ 词云 │
│ 播放量 │ │ 追剧数 │
│ │ │ │
├─────────┴───────────────────────────────────┴───────────────┤
│ 底部图表 │
│ 评分分布环形图 │ 年份分布漏斗图 │ 综合评分仪表盘 │
└─────────────────────────────────────────────────────────────┘
科技感效果:
- 星空背景(twinkle动画)
- 科技网格(pulse动画)
- 透视网格地板
- 六边形图案覆盖
- 3个旋转光圈
- 5条能量光束
- 扫描线效果
- 4条数据流
- 30个浮动粒子
- 角落装饰
- 中心光晕
九、部署与运行
9.1 环境要求
| 项目 | 要求 |
|---|---|
| Python | 3.8+ |
| MySQL | 5.7+ |
| 操作系统 | Windows/Linux/macOS |
| 内存 | 建议4GB+ |
9.2 安装步骤
bash
# 1. 克隆或下载项目
cd film
# 2. 创建虚拟环境
python -m venv venv
# 3. 激活虚拟环境
# Windows:
venv\Scripts\activate
# Linux/macOS:
source venv/bin/activate
# 4. 安装依赖
pip install flask==3.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask-sqlalchemy==3.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install flask-migrate==4.0.4 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql==1.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas pyecharts scikit-learn requests flask-cors flask-wtf
# 5. 配置数据库
# 编辑 config.py,修改数据库连接信息
HOSTNAME = 'localhost'
DATABASE = 'design_326_film'
USERNAME = 'root'
PASSWORD = 'your_password'
# 6. 导入数据库
mysql -u root -p design_326_film < design_326_film.sql
# 7. 运行应用
python app.py
9.3 访问地址
9.4 默认账户
管理员账户:
用户名:admin
密码:123456
普通用户:
用户名:user
密码:123456
十、系统功能清单
10.1 功能统计
| 类别 | 数量 | 说明 |
|---|---|---|
| 数据表 | 4个 | user, film_information, netflix_titles, bilibili_media |
| 路由接口 | 50+ | 包含页面路由和API接口 |
| 图表类型 | 20+ | 饼图、柱状图、雷达图、词云等 |
| 页面模板 | 45+ | HTML页面 |
| 数据大屏 | 2个 | 影视剧大屏、B站科技大屏 |
10.2 图表清单
影视剧图表(17个):
- chart1-chart17:各类分析图表
B站图表(13个):
- 分类占比饼图
- 评分分布柱状图
- 播放量TOP20
- 分类综合雷达图
- 分类评分热力图
- 内容流向桑基图
- 3D数据柱状图
- 关键词词云
- 演员词云
- 风格分布极坐标图
- 用户互动漏斗图
- 综合评分仪表盘
- 发布趋势折线图
机器学习图表(6个):
- 评分预测散点图
- 特征重要性柱状图
- 聚类分析散点图
- 肘部法则折线图
- 异常检测散点图
- 推荐分析图表
文档版本 :v2.0
更新日期 :2026年1月11日
文档字数 :约15000字
作者:码界筑梦坊