基于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字符) |
| email | 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 并执行以下命令:
CREATEDATABASEIFNOTEXISTS design_220_nobel CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci;
如果数据库用户和密码与默认配置不同,请修改 config.yaml 中的数据库连接信息。
第二步:安装 Python 依赖
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 文件存在。该文件是诺贝尔奖原始数据集,系统启动时会从此文件加载数据进行分析。
第四步:启动系统
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
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
dataset:file: nobel.csv # CSV 数据文件名(相对于 data/ 目录)target_column: category # 目标列(分类列)target_labels:# 目标值的中文映射Physics: 物理学 Chemistry: 化学 ...features:# 特征字段列表-key: awardYear # 字段键名(对应 CSV 列名)label: 获奖年份 # 中文标签(前端显示)type: numeric # 字段类型:numeric / categorical / text / binaryunit: 年 # 单位(可选)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
modules:auth:true# 用户认证模块roles:[user, admin]# 支持的角色列表prediction:false# 预测模块(未启用)analytics:true# 数据分析模块data_manage:true# 数据管理模块model_evaluation:false# 模型评估(未启用)dashboard:true# 可视化大屏模块
8.4 分析页面配置 analysis_pages
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 图表配色
所有分析页面统一使用以下配色数组:
var chartColors =['#B8860B','#DCA00D','#F97316','#059669','#0891B2','#DC2626'];
C. 默认账户