本系统是一个基于 Python 的食品营养特征数据可视化分析平台(NutriLab),集成了数据管理、基础统计分析、统计检验、营养密度评估和高级数据挖掘等功能。系统采用 B/S 架构,后端提供 RESTful API,前端通过 ECharts 实现丰富的交互式数据可视化。
#4a6741
#d4943a
page-header-meta
code/├── main.py # 应用入口,路由注册与生命周期管理├── config.py # 全局配置(密钥、数据库路径、Token 有效期)├── database.py # 数据库引擎与会话管理├── models.py # SQLAlchemy 数据模型定义├── schemas.py # Pydantic 请求/响应数据模型├── auth.py # 认证与授权(JWT、密码哈希、权限守卫)├── data_loader.py # CSV 数据自动导入├── requirements.txt # Python 依赖清单├── foodstruct_nutritional_facts.csv # 原始食品营养数据集(1171 条)├── food_nutrition.db # SQLite 数据库文件│├── routers/│ ├── __init__.py│ ├── auth_router.py # 认证相关 API(登录、注册、获取当前用户)│ ├── food_router.py # 食品 CRUD API│ ├── dashboard_router.py # 仪表盘概览 API│ ├── basic_router.py # 基础分析 API(分类分布、营养素对比)│ ├── stat_router.py # 统计分析 API(相关性、检验、雷达图)│ ├── density_router.py # 营养密度分析 API│ ├── mining_router.py # 高级挖掘 API(聚类、PCA、健康评分)│ └── user_router.py # 用户管理 API(仅管理员)│├── templates/│ ├── base.html # 基础布局模板(顶栏 + 侧边栏 + 内容区)│ ├── login.html # 登录页面│ ├── register.html # 注册页面│ ├── index.html # 数据仪表盘首页│ ├── category.html # 分类分布分析页│ ├── nutrient_compare.html # 营养素对比分析页│ ├── macronutrient.html # 宏量营养素分析页│ ├── calorie.html # 热量对比分析页│ ├── correlation.html # 相关性热力图分析页│ ├── stat_test.html # 统计检验分析页│ ├── radar.html # 雷达图对比分析页│ ├── density.html # 营养密度分析页│ ├── clustering.html # 聚类分析页│ ├── mining_advanced.html # 高级挖掘分析页│ ├── data_manage.html # 数据管理页(管理员)│ └── user_manage.html # 用户管理页(管理员)│└── static/ ├── css/ │ └── style.css # 全局样式(设计系统) └── js/ ├── app.js # 核心 JS(认证、API 封装、UI 控制) ├── charts.js # ECharts 图表配置与渲染 └── food_name_zh.js # 食品名中英文翻译字典(1171 条)
code/
├── main.py # 应用入口,路由注册与生命周期管理
├── config.py # 全局配置(密钥、数据库路径、Token 有效期)
├── database.py # 数据库引擎与会话管理
├── models.py # SQLAlchemy 数据模型定义
├── schemas.py # Pydantic 请求/响应数据模型
├── auth.py # 认证与授权(JWT、密码哈希、权限守卫)
├── data_loader.py # CSV 数据自动导入
├── requirements.txt # Python 依赖清单
├── foodstruct_nutritional_facts.csv # 原始食品营养数据集(1171 条)
├── food_nutrition.db # SQLite 数据库文件
│
├── routers/
│ ├── __init__.py
│ ├── auth_router.py # 认证相关 API(登录、注册、获取当前用户)
│ ├── food_router.py # 食品 CRUD API
│ ├── dashboard_router.py # 仪表盘概览 API
│ ├── basic_router.py # 基础分析 API(分类分布、营养素对比)
│ ├── stat_router.py # 统计分析 API(相关性、检验、雷达图)
│ ├── density_router.py # 营养密度分析 API
│ ├── mining_router.py # 高级挖掘 API(聚类、PCA、健康评分)
│ └── user_router.py # 用户管理 API(仅管理员)
├── templates/
│ ├── base.html # 基础布局模板(顶栏 + 侧边栏 + 内容区)
│ ├── login.html # 登录页面
│ ├── register.html # 注册页面
│ ├── index.html # 数据仪表盘首页
│ ├── category.html # 分类分布分析页
│ ├── nutrient_compare.html # 营养素对比分析页
│ ├── macronutrient.html # 宏量营养素分析页
│ ├── calorie.html # 热量对比分析页
│ ├── correlation.html # 相关性热力图分析页
│ ├── stat_test.html # 统计检验分析页
│ ├── radar.html # 雷达图对比分析页
│ ├── density.html # 营养密度分析页
│ ├── clustering.html # 聚类分析页
│ ├── mining_advanced.html # 高级挖掘分析页
│ ├── data_manage.html # 数据管理页(管理员)
│ └── user_manage.html # 用户管理页(管理员)
└── static/
├── css/
│ └── style.css # 全局样式(设计系统)
└── js/
├── app.js # 核心 JS(认证、API 封装、UI 控制)
├── charts.js # ECharts 图表配置与渲染
└── food_name_zh.js # 食品名中英文翻译字典(1171 条)
sqlite:///./food_nutrition.db
users
id
username
password_hash
role
admin
user
created_at
业务规则:
foods
food_name
category_name
calories
protein
carbs
fats
fiber
sugar
net_carbs
starch
fructose
saturated_fat
monounsaturated_fat
polyunsaturated_fat
trans_fat
cholesterol
calcium
iron
magnesium
phosphorus
potassium
sodium
zinc
selenium
copper
manganese
vitamin_a
vitamin_a_rae
vitamin_b1
vitamin_b2
vitamin_b3
vitamin_b5
vitamin_b6
vitamin_b12
vitamin_c
vitamin_d
vitamin_e
vitamin_k
folate
choline
histidine
isoleucine
leucine
lysine
methionine
phenylalanine
threonine
tryptophan
valine
omega3_dha
omega3_dpa
omega3_epa
omega3_ala
omega6_linoleic
omega6_eicosadienoic
omega6_gamma_linoleic
omega6_dihomo_gamma
omega6_arachidonic
omega3_eicosatrienoic
数据来源:foodstruct_nutritional_facts.csv,共 1171 条食品记录,涵盖 18 个食品分类。
foodstruct_nutritional_facts.csv
┌─────────────────────────────────────────────────┐│ 浏览器 (Browser) ││ ┌──────────┐ ┌──────────┐ ┌───────────────┐ ││ │ Bootstrap │ │ ECharts │ │ DataTables │ ││ │ (UI 框架) │ │ (图表库) │ │ (数据表格) │ ││ └─────┬────┘ └────┬─────┘ └──────┬────────┘ ││ └────────────┼───────────────┘ ││ │ HTTP / AJAX │└─────────────────────┼───────────────────────────┘ │┌─────────────────────┼───────────────────────────┐│ FastAPI 服务端 (Uvicorn) ││ ┌──────────────────┼────────────────────────┐ ││ │ Jinja2 模板引擎 │ ││ │ (服务端渲染 HTML 页面骨架) │ ││ └──────────────────┼────────────────────────┘ ││ ┌──────────────────┼────────────────────────┐ ││ │ API 路由层 (Routers) │ ││ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ │ ││ │ │ Auth │ │ Food │ │ Stat │ │ Mining │ │ ││ │ └──┬───┘ └──┬───┘ └──┬───┘ └────┬─────┘ │ ││ └─────┼────────┼────────┼──────────┼────────┘ ││ ┌─────┼────────┼────────┼──────────┼────────┐ ││ │ └────────┴────────┴──────────┘ │ ││ │ SQLAlchemy ORM + Pydantic │ ││ └──────────────────┬───────────────────────┘ ││ ┌──────────────────┼───────────────────────┐ ││ │ 认证中间件 (JWT + bcrypt) │ ││ └──────────────────┬───────────────────────┘ │└─────────────────────┼───────────────────────────┘ │┌─────────────────────┼───────────────────────────┐│ SQLite 数据库 ││ ┌───────┐ ┌───────────┐ ││ │ users │ │ foods │ ││ └───────┘ └───────────┘ │└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ 浏览器 (Browser) │
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ Bootstrap │ │ ECharts │ │ DataTables │ │
│ │ (UI 框架) │ │ (图表库) │ │ (数据表格) │ │
│ └─────┬────┘ └────┬─────┘ └──────┬────────┘ │
│ └────────────┼───────────────┘ │
│ │ HTTP / AJAX │
└─────────────────────┼───────────────────────────┘
┌─────────────────────┼───────────────────────────┐
│ FastAPI 服务端 (Uvicorn) │
│ ┌──────────────────┼────────────────────────┐ │
│ │ Jinja2 模板引擎 │ │
│ │ (服务端渲染 HTML 页面骨架) │ │
│ └──────────────────┼────────────────────────┘ │
│ │ API 路由层 (Routers) │ │
│ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ │ │
│ │ │ Auth │ │ Food │ │ Stat │ │ Mining │ │ │
│ │ └──┬───┘ └──┬───┘ └──┬───┘ └────┬─────┘ │ │
│ └─────┼────────┼────────┼──────────┼────────┘ │
│ ┌─────┼────────┼────────┼──────────┼────────┐ │
│ │ └────────┴────────┴──────────┘ │ │
│ │ SQLAlchemy ORM + Pydantic │ │
│ └──────────────────┬───────────────────────┘ │
│ ┌──────────────────┼───────────────────────┐ │
│ │ 认证中间件 (JWT + bcrypt) │ │
│ SQLite 数据库 │
│ ┌───────┐ ┌───────────┐ │
│ │ users │ │ foods │ │
│ └───────┘ └───────────┘ │
└─────────────────────────────────────────────────┘
用户输入账号密码 │ ▼POST /api/auth/login │ ▼ bcrypt 验证密码 ──── 失败 → 401 "用户名或密码错误" │ ▼ 成功 JWT 签发 (HS256, 有效期 24h) │ ▼ 前端存储 token 至 localStorage │ ▼ 后续请求 Header: Authorization: Bearer │ ▼ FastAPI 依赖注入解码 JWT → 获取当前用户 │ ├── require_user → 未登录返回 401 └── require_admin → 非管理员返回 403
用户输入账号密码
▼
POST /api/auth/login
bcrypt 验证密码 ──── 失败 → 401 "用户名或密码错误"
▼ 成功
JWT 签发 (HS256, 有效期 24h)
前端存储 token 至 localStorage
后续请求 Header: Authorization: Bearer
FastAPI 依赖注入解码 JWT → 获取当前用户
├── require_user → 未登录返回 401
└── require_admin → 非管理员返回 403
/api/auth
/api/auth/register
/api/auth/login
/api/auth/me
/api/foods
/api/foods/categories
/api/foods/{food_id}
/api/dashboard
/api/dashboard/overview
/api/dashboard/category-stats
/api/dashboard/top-foods
/api/basic
/api/basic/category-distribution
/api/basic/nutrient-comparison
/api/basic/macronutrient-comparison
/api/basic/calorie-comparison
/api/stat
/api/stat/correlation
/api/stat/kruskal-wallis
/api/stat/radar-compare
/api/stat/foods-by-category
/api/density
/api/density/heatmap
/api/density/top-categories
/api/density/top-foods
NDI 计算公式:NDI = (营养素含量 / 热量) × 100
NDI = (营养素含量 / 热量) × 100
/api/mining
/api/mining/clusters
/api/mining/pca
/api/mining/cluster-profile
/api/mining/nutrient-pair-scatter
/api/mining/radar-cluster
/api/mining/health-scores
/api/mining/nutrient-network
/api/mining/anomaly-detection
/api/users
/api/users/{user_id}/role
/api/users/{user_id}
require_user
require_admin
系统通过三层 JavaScript 字典实现前端中文显示:
FIELD_META
app.js
formatMetricLabel()
CATEGORY_META
formatCategoryLabel()
FOOD_NAME_ZH
food_name_zh.js
formatFoodName()
用于衡量两种营养素之间的单调关系,不假设数据服从正态分布。
ρ = 1 - (6 Σd²) / (n(n²-1))
d
n
*
**
***
非参数方法,检验多个独立分类组间某营养素的分布是否存在显著差异。
ε² = (H - k + 1) / (n - k)
假设数据由多个高斯分布混合生成,通过 EM 算法迭代拟合。
n_components
n_init=5
线性降维方法,将 26 维营养素特征投影到 2 维主成分空间。
综合评分公式:
健康评分 = 收益分 × 0.75 + 惩罚分 × 0.25
收益指标(百分位评分,越高越好):
惩罚指标(百分位评分,越低越好):
对每种营养素:
/page/login
/page/register
/
/page/category
/page/nutrient_compare
/page/macronutrient
/page/calorie
/page/correlation
/page/stat_test
/page/radar
/page/density
/page/clustering
/page/mining_advanced
/page/data_manage
/page/user_manage
pip install -r requirements.txt
python main.py
服务默认运行在 http://localhost:8001。
http://localhost:8001
应用启动时自动执行:
SECRET_KEY
food-nutrition-secret-key-2024
ALGORITHM
HS256
ACCESS_TOKEN_EXPIRE_MINUTES
1440
DATABASE_URL