食品营养特征数据可视化分析系统 --- 技术文档
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 环境要求
- Python 3.8 及以上
- pip 包管理器
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 填充)