食品营养特征数据可视化分析系统 --- 技术文档
1. 项目概述
本系统是一个基于 Python 的食品营养特征数据可视化分析平台(NutriLab),集成了数据管理、基础统计分析、统计检验、营养密度评估和高级数据挖掘等功能。系统采用 B/S 架构,后端提供 RESTful API,前端通过 ECharts 实现丰富的交互式数据可视化。































2. 技术栈
2.1 后端技术
| 技术 |
版本 |
用途 |
| Python |
3.8+ |
主要开发语言 |
| FastAPI |
0.104.1 |
Web 框架,提供异步 RESTful API |
| Uvicorn |
0.24.0 |
ASGI 服务器,承载 FastAPI 应用 |
| SQLAlchemy |
2.0.23 |
ORM 框架,数据库操作 |
| SQLite |
内置 |
关系型数据库,存储食品与用户数据 |
| Pandas |
2.1.4 |
数据处理与分析 |
| NumPy |
1.26.2 |
数值计算 |
| SciPy |
1.11.4 |
统计检验(Spearman 相关、Kruskal-Wallis 检验) |
| scikit-learn |
1.3.2 |
机器学习(PCA 降维、GMM 聚类、标准化) |
| python-jose |
3.3.0 |
JWT 令牌签发与验证 |
| passlib |
1.7.4 |
密码哈希(bcrypt 算法) |
| Jinja2 |
3.1.2 |
HTML 模板引擎 |
2.2 前端技术
| 技术 |
版本 |
用途 |
| Bootstrap |
5.3.0 |
UI 组件库与响应式布局 |
| Bootstrap Icons |
1.11.0 |
图标库 |
| ECharts |
5.4.3 |
数据可视化图表库 |
| jQuery |
3.7.0 |
DOM 操作辅助 |
| DataTables |
1.13.6 |
数据表格分页与排序 |
| Google Fonts |
--- |
Outfit + DM Sans 字体 |
2.3 设计风格
- 设计语言:有机暖色调与数据精确感结合
- 主色调 :橄榄绿(
#4a6741)+ 琥珀黄(#d4943a)
- 背景:奶油白渐变 + 微粒纹理覆盖
- 圆角风格:大圆角卡片(14px ~ 28px)
- 字体:Outfit(标题) + DM Sans(正文)
- 页面头部 :图标与标题紧邻排列,
page-header-meta 徽章自动右对齐
- 错误提示:全部使用中文(如「用户名或密码错误」「未找到该食品」)
3. 项目结构
复制代码
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 条)
4. 数据库设计
4.1 数据库引擎
- 类型:SQLite
- 连接串 :
sqlite:///./food_nutrition.db
- ORM:SQLAlchemy 2.0(Declarative Base)
4.2 数据表:users(用户表)
| 字段 |
类型 |
约束 |
说明 |
id |
INTEGER |
PK, 自增 |
用户唯一标识 |
username |
VARCHAR(50) |
UNIQUE, NOT NULL, 索引 |
用户名 |
password_hash |
VARCHAR(255) |
NOT NULL |
bcrypt 哈希后的密码 |
role |
VARCHAR(20) |
NOT NULL, DEFAULT 'user' |
角色:admin / user |
created_at |
DATETIME |
DEFAULT 当前时间 |
注册时间 |
业务规则:
- 第一个注册的用户自动成为管理员
- 系统至少保留一名管理员,不可降级或删除最后的管理员
- 用户不可修改自身角色,不可删除自身账号
4.3 数据表:foods(食品营养表)
| 字段分类 |
字段名 |
类型 |
说明 |
| 基本信息 |
id |
INTEGER (PK) |
食品唯一标识 |
|
food_name |
VARCHAR(200) |
食品名称,索引 |
|
category_name |
VARCHAR(100) |
食品分类,索引 |
| 基础营养 |
calories |
FLOAT |
热量 (kcal) |
|
protein |
FLOAT |
蛋白质 (g) |
|
carbs |
FLOAT |
碳水化合物 (g) |
|
fats |
FLOAT |
脂肪 (g) |
|
fiber |
FLOAT |
膳食纤维 (g) |
|
sugar |
FLOAT |
糖 (g) |
|
net_carbs |
FLOAT |
净碳水 (g) |
|
starch |
FLOAT |
淀粉 (g) |
|
fructose |
FLOAT |
果糖 (g) |
| 脂肪细分 |
saturated_fat |
FLOAT |
饱和脂肪 (g) |
|
monounsaturated_fat |
FLOAT |
单不饱和脂肪 (g) |
|
polyunsaturated_fat |
FLOAT |
多不饱和脂肪 (g) |
|
trans_fat |
FLOAT |
反式脂肪 (g) |
|
cholesterol |
FLOAT |
胆固醇 (mg) |
| 矿物质 |
calcium |
FLOAT |
钙 (mg) |
|
iron |
FLOAT |
铁 (mg) |
|
magnesium |
FLOAT |
镁 (mg) |
|
phosphorus |
FLOAT |
磷 (mg) |
|
potassium |
FLOAT |
钾 (mg) |
|
sodium |
FLOAT |
钠 (mg) |
|
zinc |
FLOAT |
锌 (mg) |
|
selenium |
FLOAT |
硒 (mcg) |
|
copper |
FLOAT |
铜 (mg) |
|
manganese |
FLOAT |
锰 (mg) |
| 维生素 |
vitamin_a |
FLOAT |
维生素 A |
|
vitamin_a_rae |
FLOAT |
维生素 A (RAE) |
|
vitamin_b1 |
FLOAT |
维生素 B1 |
|
vitamin_b2 |
FLOAT |
维生素 B2 |
|
vitamin_b3 |
FLOAT |
维生素 B3 |
|
vitamin_b5 |
FLOAT |
维生素 B5 |
|
vitamin_b6 |
FLOAT |
维生素 B6 |
|
vitamin_b12 |
FLOAT |
维生素 B12 |
|
vitamin_c |
FLOAT |
维生素 C (mg) |
|
vitamin_d |
FLOAT |
维生素 D |
|
vitamin_e |
FLOAT |
维生素 E |
|
vitamin_k |
FLOAT |
维生素 K |
|
folate |
FLOAT |
叶酸 |
|
choline |
FLOAT |
胆碱 |
| 氨基酸 |
histidine |
FLOAT |
组氨酸 |
|
isoleucine |
FLOAT |
异亮氨酸 |
|
leucine |
FLOAT |
亮氨酸 |
|
lysine |
FLOAT |
赖氨酸 |
|
methionine |
FLOAT |
蛋氨酸 |
|
phenylalanine |
FLOAT |
苯丙氨酸 |
|
threonine |
FLOAT |
苏氨酸 |
|
tryptophan |
FLOAT |
色氨酸 |
|
valine |
FLOAT |
缬氨酸 |
| Omega-3 |
omega3_dha |
FLOAT |
DHA |
|
omega3_dpa |
FLOAT |
DPA |
|
omega3_epa |
FLOAT |
EPA |
|
omega3_ala |
FLOAT |
ALA |
| Omega-6 |
omega6_linoleic |
FLOAT |
亚油酸 |
|
omega6_eicosadienoic |
FLOAT |
二十碳二烯酸 |
|
omega6_gamma_linoleic |
FLOAT |
γ-亚麻酸 |
|
omega6_dihomo_gamma |
FLOAT |
二高-γ-亚麻酸 |
|
omega6_arachidonic |
FLOAT |
花生四烯酸 |
|
omega3_eicosatrienoic |
FLOAT |
二十碳三烯酸 |
数据来源 :foodstruct_nutritional_facts.csv,共 1171 条食品记录,涵盖 18 个食品分类。
4.4 食品分类一览
| 英文名 |
中文名 |
| Baby Foods |
婴幼儿食品 |
| Baked Products |
烘焙制品 |
| Beverages |
饮料 |
| Dairy |
乳制品 |
| Fast Foods |
快餐 |
| Fruits |
水果 |
| Grains |
谷物 |
| Greens |
绿叶蔬菜 |
| Meals, Entrees, and Side Dishes |
餐食与配菜 |
| Meat |
肉类 |
| Mushrooms |
菌菇 |
| Nuts |
坚果 |
| Oils and Sauces |
油脂与酱料 |
| Seafood |
水产海鲜 |
| Soups |
汤羹 |
| Spices |
香辛料 |
| Sweets |
甜食 |
| Vegetables |
蔬菜 |
5. 系统架构
5.1 整体架构
复制代码
┌─────────────────────────────────────────────────┐
│ 浏览器 (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 │ │
│ └───────┘ └───────────┘ │
└─────────────────────────────────────────────────┘
5.2 请求处理流程
- 浏览器发送 HTTP 请求到 Uvicorn ASGI 服务器
- FastAPI 路由匹配并执行依赖注入(数据库会话、认证校验)
- 业务逻辑通过 SQLAlchemy ORM 操作 SQLite 数据库
- 统计分析模块调用 SciPy / scikit-learn 进行计算
- Pydantic 模型序列化响应数据为 JSON
- 前端通过 ECharts 渲染交互式图表
5.3 认证流程
复制代码
用户输入账号密码
│
▼
POST /api/auth/login
│
▼
bcrypt 验证密码 ──── 失败 → 401 "用户名或密码错误"
│
▼ 成功
JWT 签发 (HS256, 有效期 24h)
│
▼
前端存储 token 至 localStorage
│
▼
后续请求 Header: Authorization: Bearer <token>
│
▼
FastAPI 依赖注入解码 JWT → 获取当前用户
│
├── require_user → 未登录返回 401
└── require_admin → 非管理员返回 403
6. API 接口文档
6.1 认证模块 /api/auth
| 方法 |
路径 |
说明 |
权限 |
| POST |
/api/auth/register |
用户注册 |
公开 |
| POST |
/api/auth/login |
用户登录,返回 JWT |
公开 |
| GET |
/api/auth/me |
获取当前用户信息 |
需登录 |
6.2 食品管理模块 /api/foods
| 方法 |
路径 |
说明 |
权限 |
| GET |
/api/foods |
分页查询食品列表(支持搜索、分类筛选) |
公开 |
| GET |
/api/foods/categories |
获取所有食品分类 |
公开 |
| GET |
/api/foods/{food_id} |
获取单个食品详情 |
公开 |
| POST |
/api/foods |
新增食品 |
管理员 |
| PUT |
/api/foods/{food_id} |
修改食品信息 |
管理员 |
| DELETE |
/api/foods/{food_id} |
删除食品 |
管理员 |
6.3 仪表盘模块 /api/dashboard
| 方法 |
路径 |
说明 |
| GET |
/api/dashboard/overview |
概览数据(总食品数、分类数、平均热量、最热门分类) |
| GET |
/api/dashboard/category-stats |
各分类食品数量统计 |
| GET |
/api/dashboard/top-foods |
按指定营养素排序的 Top N 食品 |
6.4 基础分析模块 /api/basic
| 方法 |
路径 |
说明 |
| GET |
/api/basic/category-distribution |
各分类食品数量及平均营养素 |
| GET |
/api/basic/nutrient-comparison |
指定营养素按分类的箱线图统计数据 |
| GET |
/api/basic/macronutrient-comparison |
宏量营养素(蛋白质/碳水/脂肪/反式脂肪)分类对比 |
| GET |
/api/basic/calorie-comparison |
热量按分类的箱线图统计数据 |
6.5 统计分析模块 /api/stat
| 方法 |
路径 |
说明 |
| GET |
/api/stat/correlation |
26 种营养素的 Spearman 相关系数矩阵与 p 值 |
| GET |
/api/stat/kruskal-wallis |
Kruskal-Wallis 检验(各分类间营养素差异显著性) |
| GET |
/api/stat/radar-compare |
两种食品的雷达图对比(含分类均值) |
| GET |
/api/stat/foods-by-category |
获取指定分类下的所有食品名称 |
6.6 营养密度模块 /api/density
| 方法 |
路径 |
说明 |
| GET |
/api/density/heatmap |
营养密度指数 (NDI) 热力图数据 |
| GET |
/api/density/top-categories |
按指定营养素 NDI 排序的 Top N 分类 |
| GET |
/api/density/top-foods |
按指定营养素 NDI 排序的 Top N 食品 |
NDI 计算公式 :NDI = (营养素含量 / 热量) × 100
6.7 高级挖掘模块 /api/mining
| 方法 |
路径 |
说明 |
| GET |
/api/mining/clusters |
GMM 聚类分析(含聚类中心、交叉表、AIC/BIC) |
| GET |
/api/mining/pca |
PCA 降维投影(2D 散点坐标) |
| GET |
/api/mining/cluster-profile |
单个聚类的详细画像(统计量、分类分布、Top 食品) |
| GET |
/api/mining/nutrient-pair-scatter |
两种营养素的散点图数据(按聚类或分类着色) |
| GET |
/api/mining/radar-cluster |
各聚类的雷达图对比 |
| GET |
/api/mining/health-scores |
食品健康评分排名(综合收益/惩罚指标) |
| GET |
/api/mining/nutrient-network |
营养素相关性网络图(节点 + 边) |
| GET |
/api/mining/anomaly-detection |
营养素异常值检测(IQR 方法) |
6.8 用户管理模块 /api/users(仅管理员)
| 方法 |
路径 |
说明 |
| GET |
/api/users |
获取所有用户列表 |
| PUT |
/api/users/{user_id}/role |
修改用户角色 |
| DELETE |
/api/users/{user_id} |
删除用户 |
7. 功能模块详解
7.1 用户认证与权限管理
- 注册:用户名唯一校验,bcrypt 密码哈希存储
- 登录:JWT Token 签发(HS256 算法,24 小时有效期)
- 角色 :双角色模型(
admin 管理员 / user 普通用户)
- 前端守卫:页面级权限控制,管理页面自动拦截非管理员访问,展示居中卡片式无权限页面(含脉冲动画盾牌图标、渐变顶栏、「前往登录」与「返回仪表盘」双按钮)
- API 守卫 :
require_user / require_admin 依赖注入守卫
7.2 数据仪表盘
- 总食品数、总分类数、平均热量、最热门分类的卡片展示
- 各分类食品数量柱状图
- 按营养素排序的 Top 10 食品排行榜
7.3 基础分析
- 分类分布:饼图展示各分类食品占比,含平均营养素数据
- 营养素对比:箱线图展示各分类在指定营养素上的分布(最小值、Q1、中位数、Q3、最大值、均值)
- 宏量营养素:蛋白质、碳水化合物、脂肪、反式脂肪的分类箱线图对比
- 热量对比:各分类热量分布箱线图
7.4 统计分析
- 相关性热力图:26 种营养素的 Spearman 秩相关系数矩阵,附带 p 值和显著性标记
- Kruskal-Wallis 检验:非参数检验各分类间营养素差异,含 Benjamini-Hochberg 校正后的 q 值,以及效应量(epsilon-squared)
- 雷达图对比:同分类下两种食品的多维营养素雷达图对比,叠加分类均值参考线
7.5 营养密度分析
- NDI 热力图:各分类 × 各营养素的营养密度指数矩阵
- Top 分类:按指定营养素 NDI 排名的头部分类
- Top 食品:按指定营养素 NDI 排名的头部食品
7.6 高级数据挖掘
- GMM 聚类:基于高斯混合模型的食品聚类(2~10 类),含聚类中心、AIC/BIC 模型选择指标、分类-聚类交叉表
- PCA 降维:主成分分析将 26 维营养素降至 2 维,可视化聚类分布
- 聚类画像:单个聚类的详细统计量(均值、中位数、标准差、极值)、分类分布、高热量 Top 10
- 营养素散点:任意两种营养素的散点图,支持按聚类或分类着色
- 聚类雷达图:各聚类在 10 种关键营养素上的均值雷达对比
- 健康评分:综合蛋白质密度、纤维密度、矿物质、维生素等正面指标(权重 75%)和饱和脂肪、钠、糖、胆固醇等负面指标(权重 25%),百分位评分 0~100。Top 食品柱状图与评分详情表格分两行展示
- 营养素网络:基于 Spearman 相关的营养素关系网络图(可调阈值),节点与连线均显示中文营养素名称,悬浮边时展示相关系数及正/负相关标记
- 异常检测:IQR 方法识别各营养素的异常高值食品
7.7 数据管理(管理员)
- 食品数据的增删改查
- DataTables 分页表格展示
- 搜索与分类筛选
7.8 用户管理(管理员)
- 用户列表查看
- 角色变更(管理员 ↔ 普通用户)
- 用户删除(含安全校验)
7.9 前端国际化翻译系统
系统通过三层 JavaScript 字典实现前端中文显示:
| 字典 |
位置 |
条目数 |
说明 |
FIELD_META |
app.js |
30+ |
营养素字段中英文映射(含单位),通过 formatMetricLabel() 调用 |
CATEGORY_META |
app.js |
18 |
食品分类中英文映射,通过 formatCategoryLabel() 调用 |
FOOD_NAME_ZH |
food_name_zh.js |
1171 |
食品名称中英文映射,通过 formatFoodName() 调用 |
- 所有图表轴标签、图例、Tooltip 均使用翻译函数渲染中文
- 营养素网络图的节点名与连线 source/target 同步翻译
- 食品名翻译覆盖仪表盘、雷达图、散点图、健康评分、异常检测、营养密度、热量对比、聚类分析、数据管理共 9 个页面
- 未命中字典的名称回退显示英文原名
8. 数据分析算法说明
8.1 Spearman 秩相关系数
用于衡量两种营养素之间的单调关系,不假设数据服从正态分布。
复制代码
ρ = 1 - (6 Σd²) / (n(n²-1))
d:每对观测值的秩次差
n:样本量
- 显著性标记:
* p<0.05, ** p<0.01, *** p<0.001
8.2 Kruskal-Wallis 检验
非参数方法,检验多个独立分类组间某营养素的分布是否存在显著差异。
- H 统计量:基于秩次的组间差异度量
- p 值:原假设(各组分布相同)下的概率
- q 值:Benjamini-Hochberg 校正后的 p 值,控制错误发现率 (FDR)
- 效应量 ε² :
ε² = (H - k + 1) / (n - k),其中 k 为组数,n 为总样本量
8.3 高斯混合模型 (GMM)
假设数据由多个高斯分布混合生成,通过 EM 算法迭代拟合。
- 输入:26 维营养素特征,StandardScaler 标准化
- 参数 :
n_components(聚类数 2~10),n_init=5(多次初始化取最优)
- 模型选择:AIC(赤池信息准则)和 BIC(贝叶斯信息准则),越低越好
8.4 主成分分析 (PCA)
线性降维方法,将 26 维营养素特征投影到 2 维主成分空间。
- 目标:保留数据方差最大的方向
- 输出:2D 坐标 + 各主成分解释方差比
8.5 健康评分模型
综合评分公式:
复制代码
健康评分 = 收益分 × 0.75 + 惩罚分 × 0.25
收益指标(百分位评分,越高越好):
| 指标 |
权重 |
| 蛋白质密度 |
22% |
| 膳食纤维密度 |
22% |
| 维生素 C 密度 |
15% |
| 钾密度 |
10% |
| 叶酸密度 |
10% |
| 钙密度 |
8% |
| 铁密度 |
8% |
| 健康脂肪比例 |
5% |
惩罚指标(百分位评分,越低越好):
| 指标 |
权重 |
| 钠密度 |
35% |
| 饱和脂肪密度 |
25% |
| 糖密度 |
25% |
| 胆固醇密度 |
15% |
8.6 异常值检测(IQR 方法)
对每种营养素:
- 计算 Q1(第 25 百分位)和 Q3(第 75 百分位)
- IQR = Q3 - Q1
- 上界 = Q3 + 1.5 × IQR
- 超过上界的值标记为异常高值
- 每个食品仅保留 fold 值最高的异常项
9. 前端页面功能一览
| 页面 |
路径 |
功能 |
| 登录 |
/page/login |
用户登录,带 loading 动画,渐变图标装饰 |
| 注册 |
/page/register |
用户注册,密码一致性与长度校验,渐变图标装饰 |
| 数据仪表盘 |
/ |
概览卡片 + 分类柱状图 + 营养素 Top 10 |
| 分类分布 |
/page/category |
饼图 + 分类营养素均值 |
| 营养素对比 |
/page/nutrient_compare |
可选营养素的分类箱线图 |
| 宏量营养素 |
/page/macronutrient |
蛋白质/碳水/脂肪/反式脂肪箱线图 |
| 热量对比 |
/page/calorie |
各分类热量箱线图 |
| 相关性热力图 |
/page/correlation |
26×26 营养素相关矩阵热力图 |
| 统计检验 |
/page/stat_test |
Kruskal-Wallis 检验结果表格 |
| 雷达图对比 |
/page/radar |
两种食品多维雷达图对比 |
| 营养密度 |
/page/density |
NDI 热力图 + Top 排名 |
| 聚类分析 |
/page/clustering |
GMM 聚类散点 + 交叉表 + AIC/BIC |
| 高级挖掘 |
/page/mining_advanced |
健康评分 + 异常检测 + 营养素网络 |
| 数据管理 |
/page/data_manage |
食品 CRUD 表格(管理员) |
| 用户管理 |
/page/user_manage |
用户角色管理与删除(管理员) |
10. 部署与运行
10.1 环境要求
10.2 安装依赖
bash
复制代码
pip install -r requirements.txt
10.3 启动服务
bash
复制代码
python main.py
服务默认运行在 http://localhost:8001。
10.4 初始化行为
应用启动时自动执行:
- 创建数据库表(如不存在)
- 检查并补充
users 表的 role 字段(兼容旧数据库)
- 确保存在至少一名管理员
- 从 CSV 文件导入食品数据(仅在
foods 表为空时执行)
10.5 配置项
| 配置 |
默认值 |
说明 |
SECRET_KEY |
food-nutrition-secret-key-2024 |
JWT 签名密钥(生产环境应更换) |
ALGORITHM |
HS256 |
JWT 签名算法 |
ACCESS_TOKEN_EXPIRE_MINUTES |
1440 (24h) |
Token 有效期 |
DATABASE_URL |
sqlite:///./food_nutrition.db |
数据库连接串 |
11. 安全机制
| 机制 |
实现方式 |
| 密码存储 |
bcrypt 单向哈希,不可逆 |
| 身份认证 |
JWT Bearer Token,HS256 签名 |
| 权限控制 |
角色守卫(require_user / require_admin),前后端双重校验 |
| CORS |
允许所有来源(开发模式,生产环境应限制) |
| 输入校验 |
Pydantic 模型自动校验请求参数类型与约束 |
| SQL 注入防护 |
SQLAlchemy ORM 参数化查询 |
| 前端状态管理 |
Token 存储于 localStorage,401 时自动清除并跳转登录 |
12. 数据集说明
- 文件 :
foodstruct_nutritional_facts.csv
- 记录数:1171 条食品
- 字段数:60 个营养素维度
- 覆盖分类:18 个食品大类
- 数据特征:数值已归一化为相对评分(0~1000+量级),部分字段存在缺失值(导入时以 0 填充)