基于Python的诺贝尔奖数据可视化分析系统 --- 技术文档
1. 项目概述
1.1 项目背景
诺贝尔奖自 1901 年首次颁发以来,已有超过百年的历史,涵盖物理学、化学、生理学或医学、文学、和平、经济学六大领域。本系统旨在通过数据可视化技术,对诺贝尔奖获奖数据进行多维度分析,帮助用户直观了解百年学术荣耀的数据规律。
1.2 项目目标
- 提供完整的诺贝尔奖数据浏览与管理功能
- 实现多维度数据可视化分析(年度趋势、地理分布、人口统计、交叉对比)
- 支持全屏可视化大屏展示
- 提供用户认证与角色权限管理(普通用户 + 管理员)
- 支持数据的 CSV 导入/导出
1.3 技术选型
| 层次 | 技术 | 版本 | 说明 |
|---|---|---|---|
| 后端框架 | FastAPI | 0.104.1 | 高性能异步 Web 框架 |
| 模板引擎 | Jinja2 | 3.1.2 | 服务端 HTML 模板渲染 |
| 前端框架 | Bootstrap | 5.x | 响应式 CSS 组件库 |
| 图表库 | ECharts | 5.x | 百度开源可视化图表库 |
| 图标库 | Bootstrap Icons | 精简版 | 约 400 个常用图标 |
| 数据库 | MySQL | 5.7+ | 关系型数据库 |
| 数据库驱动 | PyMySQL | 1.1.0 | Python MySQL 连接器 |
| 数据分析 | Pandas | 2.1.4 | 数据处理与分析库 |
| 数值计算 | NumPy | 1.25.2 | 科学计算库 |
| 密码加密 | Passlib + bcrypt | 1.7.4 | 安全密码哈希 |
| ASGI 服务器 | Uvicorn | 0.24.0 | 异步 HTTP 服务器 |
| 配置管理 | PyYAML | 6.0.1 | YAML 配置文件解析 |
2. 系统架构
2.1 整体架构
系统采用 MVC(Model-View-Controller) 架构模式:
┌──────────────────────────────────────────────┐
│ 浏览器 (Browser) │
│ HTML + Bootstrap + ECharts │
└────────────────────┬─────────────────────────┘
│ HTTP
┌────────────────────▼─────────────────────────┐
│ FastAPI 路由层 (main.py) │
│ ┌─────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ 认证路由 │ │ 分析路由 │ │ 管理/API 路由 │ │
│ └────┬────┘ └─────┬────┘ └──────┬────────┘ │
│ │ │ │ │
│ ┌────▼────────────▼──────────────▼────────┐ │
│ │ 业务逻辑 + Pandas 数据处理 │ │
│ └────────────────┬───────────────────────┘ │
└───────────────────┼──────────────────────────┘
│
┌───────────────────▼──────────────────────────┐
│ 数据层 (database.py) │
│ ┌──────────────┐ ┌─────────────────────┐ │
│ │ 用户管理 │ │ 数据集管理 │ │
│ └──────────────┘ └─────────────────────┘ │
└───────────────────┬──────────────────────────┘
│ PyMySQL
┌───────────────────▼──────────────────────────┐
│ MySQL 数据库 │
│ design_220_nobel (users + dataset_data) │
└──────────────────────────────────────────────┘
2.2 目录结构
code/
├── main.py # FastAPI 主路由文件(所有 Web 路由)
├── database.py # 数据库操作类(用户管理 + 数据管理)
├── config.yaml # 项目配置文件(数据库、字段、模块开关)
├── run.py # 项目启动脚本(依赖检查 + uvicorn 启动)
├── requirements.txt # Python 依赖列表
├── data/
│ └── nobel.csv # 诺贝尔奖原始数据集
├── static/
│ ├── css/
│ │ ├── bootstrap.min.css # Bootstrap 5 CSS
│ │ ├── bootstrap-icons.css # Bootstrap Icons(精简版)
│ │ ├── boxicons.min.css # Boxicons CSS
│ │ └── style.css # 项目主题样式(金色主题)
│ ├── js/
│ │ ├── bootstrap.bundle.min.js # Bootstrap JS
│ │ └── echarts.min.js # ECharts 图表库
│ └── image/
│ └── index.png # 首页装饰图
└── templates/
├── base.html # 基础模板(导航栏 + 页脚)
├── index.html # 首页
├── login.html # 登录页
├── register.html # 注册页
├── profile.html # 个人资料页
├── edit_profile.html # 编辑资料页
├── change_password.html # 修改密码页
├── analytics.html # 数据分析概览页
├── award_overview.html # 获奖概览分析页
├── geographic.html # 地理分布分析页
├── demographics.html # 人口统计分析页
├── correlations.html # 综合对比分析页
├── dashboard.html # 全屏可视化大屏
├── data_manage.html # 数据管理列表页
├── data_manage_edit.html # 数据新增/编辑页
└── admin/
├── dashboard.html # 管理控制台
└── users.html # 用户管理页
2.3 模块划分
| 模块 | 功能 | 状态 |
|---|---|---|
| auth | 用户认证(登录、注册、登出、密码管理) | 启用 |
| analytics | 数据分析(4 个分析页面 + 概览) | 启用 |
| data_manage | 数据管理(CRUD + CSV 导入/导出) | 启用 |
| dashboard | 全屏可视化大屏 | 启用 |
| prediction | 机器学习预测 | 未启用 |
| model_evaluation | 模型评估 | 未启用 |
2.4 演示图片
























3. 数据库设计
3.1 数据库信息
- 数据库名称 :
design_220_nobel - 字符集:utf8mb4
- 存储引擎:InnoDB
3.2 表结构
3.2.1 用户表 users
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | INT | PRIMARY KEY, AUTO_INCREMENT | 用户唯一标识 |
| username | VARCHAR(100) | UNIQUE, NOT NULL | 用户名(3-20字符) |
| VARCHAR(200) | UNIQUE, NOT NULL | 邮箱地址 | |
| password_hash | VARCHAR(255) | NOT NULL | bcrypt 加密后的密码哈希 |
| role | VARCHAR(20) | DEFAULT 'user' | 角色:user / admin |
| status | VARCHAR(20) | DEFAULT 'active' | 状态:active / disabled |
| full_name | VARCHAR(100) | DEFAULT '' | 姓名 |
| phone | VARCHAR(30) | DEFAULT '' | 手机号 |
| gender | VARCHAR(20) | DEFAULT '' | 性别 |
| age | INT | NULL | 年龄 |
| bio | TEXT | NULL | 个人简介 |
| last_login_at | DATETIME | NULL | 最后登录时间 |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 注册时间 |
3.2.2 数据集表 dataset_data
该表字段根据 config.yaml 中的 features 配置动态生成:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INT (AUTO_INCREMENT) | 记录唯一标识 |
| awardyear | DOUBLE | 获奖年份 |
| category | VARCHAR(200) | 奖项类别 |
| name | TEXT | 获奖者姓名 |
| gender | VARCHAR(200) | 性别 |
| birth_continent | VARCHAR(200) | 出生洲 |
| birth_countrynow | VARCHAR(200) | 出生国家(现名) |
| prizeamount | DOUBLE | 奖金金额(瑞典克朗) |
| prizeamountadjusted | DOUBLE | 调整后奖金 |
| motivation | TEXT | 获奖理由 |
| ind_or_org | VARCHAR(200) | 个人/组织 |
| birth_date | TEXT | 出生日期 |
| death_date | TEXT | 逝世日期 |
| affiliation_1 | TEXT | 所属机构 |
| portion | VARCHAR(200) | 奖金份额(1, 1/2, 1/3, 1/4) |
| created_at | TIMESTAMP | 记录创建时间 |
注意:MySQL 存储时字段名自动转为小写(如
awardYear→awardyear)。
3.3 ER 关系
系统中 users 表和 dataset_data 表之间没有直接的外键关系。users 表管理系统用户,dataset_data 表存储诺贝尔奖数据记录。两张表通过权限控制逻辑关联------只有 admin 角色用户可以对 dataset_data 进行增删改操作。
3.4 默认数据
系统启动时自动创建默认管理员账户:
- 用户名:admin
- 密码:admin123
- 角色:admin
4. 功能模块
4.1 用户认证模块
功能说明
- 登录:用户名 + 密码认证,Session 存储登录状态
- 注册:支持填写用户名、邮箱、密码、姓名、手机、性别、年龄、简介
- 登出:清除 Session 后重定向到登录页
- 修改密码:需验证原密码
- 编辑资料:修改姓名、手机、性别、年龄、邮箱、简介
安全机制
- 密码使用 bcrypt 算法加密存储
- Session 中间件使用 secret key 签名
- 服务端表单验证(用户名长度、邮箱格式、密码长度)
- 账号禁用状态检查(status = disabled 的用户无法登录)
4.2 数据分析模块
4.2.1 分析概览页(analytics.html)
- 4 个统计卡片:总记录数、年份跨度、奖项类别数、国家数
- 2 个饼图:奖项类别分布、性别分布
- 4 个导航卡片:快速进入各详细分析页面
4.2.2 获奖概览分析(award_overview.html)
- 年度获奖人数趋势:折线图 + 面积填充 + 数据缩放
- 奖项类别分布:环形饼图
- 平均奖金金额趋势:折线图(调整后金额)
- 各类别年度获奖趋势:堆叠面积图
4.2.3 地理分布分析(geographic.html)
- 各国获奖人数 TOP30:横向柱状图
- 各洲获奖分布:环形饼图
- TOP10 国家各类别获奖对比:堆叠柱状图
4.2.4 人口统计分析(demographics.html)
- 性别分布:环形饼图
- 个人 vs 组织:环形饼图
- 获奖年龄分布:柱状图(5 年一组)
- 各类别平均获奖年龄:横向柱状图
- 男女获奖者年度趋势:折线图 + 数据缩放
4.2.5 综合对比分析(correlations.html)
- 各类别性别对比:分组柱状图
- 各洲获奖类别对比:堆叠柱状图
- 各年代获奖类别分布:堆叠柱状图
4.2.6 年份筛选功能
所有 4 个分析页面均支持年份区间筛选:
- 页面顶部提供起始年份和结束年份两个下拉选择器
- 选择后通过 URL 参数
?year_start=1950&year_end=2000传递 - 后端 Pandas DataFrame 在生成图表数据前进行过滤
- 默认不筛选,显示全部年份数据
4.3 可视化大屏模块
全屏展示核心数据指标和动态图表:
- 顶部统计条:总记录数、年份范围、类别数、国家数
- 奖项类别分布饼图
- 性别分布饼图
- 各洲分布饼图
- 年度趋势折线图
- 各国 TOP15 柱状图
- 近期获奖者列表
4.4 数据管理模块
功能说明(仅管理员可用)
- 数据列表:分页展示(每页 20 条),支持按姓名/类别/国家搜索
- 新增数据:表单填写所有字段后插入数据库
- 编辑数据:修改已有记录的任意字段
- 删除数据:确认后删除单条记录
- CSV 导入 :将
data/nobel.csv批量导入数据库(200 条/批) - CSV 导出:将数据库中所有记录导出为 CSV 文件下载
4.5 管理控制台模块
功能说明(仅管理员可用)
- 统计概览:注册用户数、数据记录数、奖项类别数
- 各年代获奖记录图表:ECharts 柱状图展示各年代数据量
- 最近注册用户:最近 5 位注册用户列表(用户名、角色、注册时间)
- 快捷操作:一键跳转到用户管理、数据管理、数据分析、可视化大屏
- 系统信息:项目名称、技术栈、数据库名、端口号
4.6 用户管理模块
功能说明(仅管理员可用)
- 创建用户:管理员可直接创建新用户并指定角色
- 角色管理:下拉菜单切换用户角色(user / admin)
- 状态管理:启用/禁用用户账号
- 重置密码 :将用户密码重置为默认值
123456 - 删除用户:删除用户账号(不可删除自己)
5. API 路由表
5.1 页面路由
| 方法 | 路径 | 功能 | 权限 |
|---|---|---|---|
| GET | / |
首页 | 公开 |
| GET | /login |
登录页 | 公开 |
| POST | /login |
登录提交 | 公开 |
| GET | /register |
注册页 | 公开 |
| POST | /register |
注册提交 | 公开 |
| GET | /logout |
登出 | 需登录 |
| GET | /profile |
个人资料 | 需登录 |
| GET | /edit_profile |
编辑资料页 | 需登录 |
| POST | /edit_profile |
编辑资料提交 | 需登录 |
| GET | /change_password |
修改密码页 | 需登录 |
| POST | /change_password |
修改密码提交 | 需登录 |
5.2 数据分析路由
| 方法 | 路径 | 功能 | 权限 |
|---|---|---|---|
| GET | /analytics |
数据分析概览 | 公开 |
| GET | /analytics/award_overview |
获奖概览分析 | 公开 |
| GET | /analytics/geographic |
地理分布分析 | 公开 |
| GET | /analytics/demographics |
人口统计分析 | 公开 |
| GET | /analytics/correlations |
综合对比分析 | 公开 |
| GET | /dashboard |
全屏可视化大屏 | 公开 |
分析页面支持可选参数
?year_start=&year_end=进行年份筛选。
5.3 数据管理路由
| 方法 | 路径 | 功能 | 权限 |
|---|---|---|---|
| GET | /data_manage |
数据管理列表 | 管理员 |
| GET | /data_manage/add |
新增数据页 | 管理员 |
| POST | /data_manage/add |
新增数据提交 | 管理员 |
| GET | /data_manage/edit/{id} |
编辑数据页 | 管理员 |
| POST | /data_manage/edit/{id} |
编辑数据提交 | 管理员 |
| POST | /data_manage/delete/{id} |
删除数据 | 管理员 |
| GET | /data_manage/export_csv |
导出 CSV 文件 | 管理员 |
| POST | /data_manage/import_csv |
从 CSV 导入数据 | 管理员 |
5.4 管理员路由
| 方法 | 路径 | 功能 | 权限 |
|---|---|---|---|
| GET | /admin |
管理控制台 | 管理员 |
| GET | /admin/users |
用户管理 | 管理员 |
| POST | /admin/users/create |
创建用户 | 管理员 |
| POST | /admin/users/{id}/role |
修改用户角色 | 管理员 |
| POST | /admin/users/{id}/status |
修改用户状态 | 管理员 |
| POST | /admin/users/{id}/reset_password |
重置密码 | 管理员 |
| POST | /admin/users/{id}/delete |
删除用户 | 管理员 |
5.5 API 端点(JSON 响应)
| 方法 | 路径 | 功能 | 权限 |
|---|---|---|---|
| GET | /api/overview |
数据概览(类别/国家/年度统计) | 公开 |
| GET | /api/map_data |
各国获奖人数(地图数据) | 公开 |
6. 页面说明
6.1 公开页面
| 页面 | 模板文件 | 说明 |
|---|---|---|
| 首页 | index.html |
Hero 区域 + 核心功能介绍 + 数据概况统计(动态) |
| 登录 | login.html |
左侧装饰面板 + 右侧登录表单 |
| 注册 | register.html |
左侧装饰面板 + 右侧多字段注册表单 |
| 分析概览 | analytics.html |
4 个统计卡片 + 2 个饼图 + 4 个导航卡片 |
| 获奖概览 | award_overview.html |
年份筛选器 + 4 个 ECharts 图表 |
| 地理分布 | geographic.html |
年份筛选器 + 3 个 ECharts 图表 |
| 人口统计 | demographics.html |
年份筛选器 + 5 个 ECharts 图表 |
| 综合对比 | correlations.html |
年份筛选器 + 3 个 ECharts 图表 |
| 可视化大屏 | dashboard.html |
深色主题全屏布局,核心指标 + 多图表 |
6.2 用户页面
| 页面 | 模板文件 | 说明 |
|---|---|---|
| 个人资料 | profile.html |
头像 + 用户信息表格 + 操作按钮 |
| 编辑资料 | edit_profile.html |
表单编辑个人信息 |
| 修改密码 | change_password.html |
原密码 + 新密码 + 确认密码 |
6.3 管理员页面
| 页面 | 模板文件 | 说明 |
|---|---|---|
| 管理控制台 | admin/dashboard.html |
统计卡片 + 年代图表 + 最近用户 + 快捷操作 |
| 用户管理 | admin/users.html |
创建用户表单 + 用户列表(角色/状态/操作) |
| 数据管理 | data_manage.html |
搜索 + 导入/导出 + 数据表格 + 分页 |
| 数据编辑 | data_manage_edit.html |
动态表单(根据 config 字段自动生成) |
7. 部署指南
7.1 环境要求
- Python:3.8 及以上版本
- MySQL:5.7 及以上版本
- 操作系统:Windows / Linux / macOS
7.2 安装步骤
第一步:创建 MySQL 数据库
登录 MySQL 并执行以下命令:
sql
CREATE DATABASE IF NOT EXISTS design_220_nobel CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
如果数据库用户和密码与默认配置不同,请修改
config.yaml中的数据库连接信息。
第二步:安装 Python 依赖
bash
cd code
pip install -r requirements.txt
依赖列表:
| 包名 | 版本 | 用途 |
|---|---|---|
| fastapi | 0.104.1 | Web 框架 |
| uvicorn | 0.24.0 | ASGI 服务器 |
| jinja2 | 3.1.2 | 模板引擎 |
| python-multipart | 0.0.6 | 表单数据解析 |
| pandas | 2.1.4 | 数据处理 |
| numpy | 1.25.2 | 数值计算 |
| passlib[bcrypt] | 1.7.4 | 密码加密 |
| pymysql | 1.1.0 | MySQL 连接器 |
| pyyaml | 6.0.1 | YAML 配置解析 |
| aiofiles | 23.2.1 | 异步文件处理 |
| python-dotenv | 1.0.0 | 环境变量加载 |
第三步:确认数据文件
确保 code/data/nobel.csv 文件存在。该文件是诺贝尔奖原始数据集,系统启动时会从此文件加载数据进行分析。
第四步:启动系统
bash
cd code
python run.py
启动后控制台将输出:
==================================================
诺贝尔奖数据可视化分析系统
==================================================
✓ 所有依赖已安装
✓ 数据文件检查通过
✓ 目录结构检查完成
启动系统...
访问地址: http://localhost:8000
按 Ctrl+C 停止服务
第五步:初始化数据
- 打开浏览器访问
http://localhost:8000 - 使用默认管理员账号登录:admin / admin123
- 进入「数据管理」页面,点击「从CSV导入数据」按钮
- 等待导入完成,即可查看完整数据
7.3 访问地址
| 页面 | 地址 |
|---|---|
| 首页 | http://localhost:8000 |
| 登录 | http://localhost:8000/login |
| 数据分析 | http://localhost:8000/analytics |
| 可视化大屏 | http://localhost:8000/dashboard |
| 管理控制台 | http://localhost:8000/admin |
8. 配置说明
配置文件为 config.yaml,各字段含义如下:
8.1 项目配置 project
yaml
project:
id: '220' # 项目编号
name: 诺贝尔奖数据可视化分析系统 # 项目名称(显示在导航栏和页面标题)
name_en: nobel # 英文短名
stack: fastapi_bootstrap # 技术栈标识
db_name: design_220_nobel # MySQL 数据库名
db_host: localhost # 数据库主机
db_port: 3306 # 数据库端口
db_user: root # 数据库用户名
db_password: '123456' # 数据库密码
port: 8000 # Web 服务端口
theme_color: '#B8860B' # 主题色(金色)
8.2 数据集配置 dataset
yaml
dataset:
file: nobel.csv # CSV 数据文件名(相对于 data/ 目录)
target_column: category # 目标列(分类列)
target_labels: # 目标值的中文映射
Physics: 物理学
Chemistry: 化学
...
features: # 特征字段列表
- key: awardYear # 字段键名(对应 CSV 列名)
label: 获奖年份 # 中文标签(前端显示)
type: numeric # 字段类型:numeric / categorical / text / binary
unit: 年 # 单位(可选)
range: [1901, 2025] # 取值范围(可选,numeric 类型)
- key: category
label: 奖项类别
type: categorical
options: # 可选值列表(categorical 类型)
- Physics
- Chemistry
...
字段类型与数据库映射:
| 字段类型 | 数据库类型 | 说明 |
|---|---|---|
| numeric | DOUBLE | 数值型 |
| categorical | VARCHAR(200) | 类别型(有限选项) |
| text | TEXT | 文本型(长文本) |
| binary | INT | 二值型(0/1) |
8.3 模块配置 modules
yaml
modules:
auth: true # 用户认证模块
roles: [user, admin] # 支持的角色列表
prediction: false # 预测模块(未启用)
analytics: true # 数据分析模块
data_manage: true # 数据管理模块
model_evaluation: false # 模型评估(未启用)
dashboard: true # 可视化大屏模块
8.4 分析页面配置 analysis_pages
yaml
analysis_pages:
- route: award_overview # URL 路由名
title: 获奖概览 # 页面标题
description: ... # 页面描述
columns: # 使用的数据列
- awardYear
- category
- prizeAmount
- route: geographic
title: 地理分布分析
has_map: true # 是否包含地图
columns: [birth_countryNow, birth_continent]
...
附录
A. 主题色配色方案
系统使用金色(Nobel Gold)主题,完整调色板:
| 变量 | 色值 | 用途 |
|---|---|---|
| --primary | #AE7F0A | 主色 |
| --primary-dark | #B8860B | 主色深 |
| --primary-darker | #6E5006 | 主色更深 |
| --primary-light | #DCA00D | 主色浅 |
| --primary-lighter | #FFC910 | 主色更浅 |
| --accent | #F97316 | 强调色(橙) |
| --success | #059669 | 成功色(绿) |
| --warning | #D97706 | 警告色(琥珀) |
| --danger | #DC2626 | 危险色(红) |
| --info | #0891B2 | 信息色(青) |
B. ECharts 图表配色
所有分析页面统一使用以下配色数组:
javascript
var chartColors = ['#B8860B', '#DCA00D', '#F97316', '#059669', '#0891B2', '#DC2626'];
C. 默认账户
| 用户名 | 密码 | 角色 |
|---|---|---|
| admin | admin123 | 管理员 |