113-基于Python的国际超市电商销售数据可视化分析系统

International SuperStore Insight Hub

MVP 项目技术文档

1. 项目概述

1.1 项目名称

International SuperStore Insight Hub

中文名称:国际超市电商销售数据可视化分析系统

1.2 项目定位

本项目是一个基于 FastAPI + Vue 3 + ECharts + MySQL 的国际超市经营分析 MVP 系统。它围绕 data/SuperStore.xlsx 数据集构建,通过将 Excel 业务明细导入 MySQL,再由后端实时执行聚合查询,为前端提供经营驾驶舱、分析中心、用户管理和数据管理能力。

该 MVP 不是一个通用 ERP,也不是完整的 BI 平台,而是一个聚焦于以下目标的最小可用产品:

  • 让业务数据从 Excel 快速落库
  • 让用户完成登录、查看分析、维护个人资料
  • 让管理员能够管理账号与业务数据
  • 让经营分析从单一大屏扩展为多模块专题分析
  • 用真实数据库聚合结果驱动可视化,而不是使用前端硬编码数据

1.3 MVP 目标

  • 快速验证国际超市销售数据可视化方案是否可行
  • 用较低的实现复杂度支撑真实数据分析
  • 建立一个后续可扩展为完整分析平台的基础工程
  • 以单体应用形式完整覆盖"认证 + 导入 + 分析 + 管理"闭环

1.4 当前 MVP 能力边界

当前版本已经覆盖:

  • 认证:注册、登录、登出、当前用户信息读取
  • 个人中心:用户资料查看与更新
  • 数据底座:Excel 导入 MySQL、导入状态查看
  • 经营驾驶舱:大屏总览
  • 分析中心:地理、商品、客户、运营四大专题分析
  • 管理后台:用户管理、订单明细管理
  • 权限控制:普通用户与管理员可见模块隔离

当前版本仍然保留典型 MVP 特征:

  • 业务明细表采用单表宽表设计,而非完整星型模型
  • 数据来源以单一 Excel 为主,暂不接第三方业务系统
  • 未引入消息队列、缓存中间件、任务调度器
  • 未拆分微服务,仍采用单体后端 + 单页前端模式
































2. 系统整体架构

2.1 架构形式

项目采用典型的 前后端一体式单体架构:

  • 前端静态资源位于 static/
  • 后端 API 位于 app/routers/
  • 数据模型位于 app/models.py
  • 数据导入逻辑位于 app/importer.py
  • FastAPI 同时提供 API 和前端静态页面访问

2.2 运行链路

  1. 用户通过浏览器访问 /
  2. FastAPI 返回 static/index.html
  3. 前端 app.js 启动 Vue 单页应用
  4. 用户登录后,前端通过 fetch 访问 /api/*
  5. FastAPI 读取 Token,解析当前用户身份
  6. 业务路由调用 SQLAlchemy 查询 MySQL
  7. 聚合结果以 JSON 返回前端
  8. 前端使用 ECharts 将结果渲染为图表

2.3 架构分层

表现层
  • static/index.html
  • static/styles.css
  • static/app.js
接口层
  • app/main.py
  • app/routers/auth.py
  • app/routers/profile.py
  • app/routers/data.py
  • app/routers/dashboard.py
  • app/routers/admin.py
业务与基础设施层
  • app/importer.py
  • app/security.py
  • app/dependencies.py
  • app/db.py
  • app/config.py
数据层
  • MySQL 数据库:design_113_shop
  • 三张核心物理表:users、auth_tokens、superstore_orders

3. 技术栈

3.1 后端技术栈

技术 版本/来源 用途
FastAPI requirements.txt Web API 框架
Uvicorn requirements.txt ASGI 服务运行器
SQLAlchemy 2 requirements.txt ORM 与 SQL 查询
PyMySQL requirements.txt MySQL 驱动
OpenPyXL requirements.txt 读取 Excel 数据
Python 项目运行环境 后端主语言

3.2 前端技术栈

技术 来源 用途
Vue 3 CDN 引入 单页应用框架
Vue Router 4 CDN 引入 路由管理
ECharts 5 CDN 引入 图表可视化
ECharts World Map CDN 引入 世界地图图层
原生 Fetch API 浏览器内置 调用后端接口
原生 CSS 本地文件 页面样式与布局

3.3 数据库与数据源

技术 用途
MySQL 结构化业务数据存储
SuperStore.xlsx 原始业务数据输入源

3.4 工程特征

  • 前端不依赖打包器,直接使用 CDN 版 Vue / ECharts
  • 后端通过 FastAPI 单体对外提供全部接口
  • 采用 SQLAlchemy 模型定义数据库结构
  • 采用 Excel 批量导入作为 MVP 数据接入方式
  • 采用 Token 表持久化会话,而不是纯 JWT 无状态方案

4. 项目目录结构

text 复制代码
shop/
├─ app/
│  ├─ config.py                # 配置项
│  ├─ db.py                    # 数据库初始化、建库、会话工厂
│  ├─ dependencies.py          # 登录与管理员依赖
│  ├─ importer.py              # Excel -> MySQL 导入逻辑
│  ├─ main.py                  # FastAPI 应用入口
│  ├─ models.py                # ORM 数据模型
│  ├─ security.py              # 密码哈希、Token 生成与注销
│  └─ routers/
│     ├─ auth.py               # 注册/登录/退出/当前用户
│     ├─ profile.py            # 个人资料
│     ├─ data.py               # 数据状态与导入
│     ├─ dashboard.py          # 大屏与分析接口
│     └─ admin.py              # 管理员用户与数据管理
├─ data/
│  └─ SuperStore.xlsx          # 原始业务数据
├─ static/
│  ├─ index.html               # SPA 容器页面
│  ├─ styles.css               # 全局样式
│  └─ app.js                   # Vue SPA 主文件
├─ design_113_shop.sql         # SQL 参考文件
├─ main.py                     # 运行入口代理
├─ README.md
└─ requirements.txt

5. 数据库设计

5.1 数据库基本信息

  • 数据库类型:MySQL
  • 默认数据库名:design_113_shop
  • 编码:utf8mb4
  • 排序规则:utf8mb4_unicode_ci

配置默认值位于 app/config.py:

  • DB_HOST=localhost
  • DB_PORT=3306
  • DB_USER=root
  • DB_PASSWORD=123456
  • DB_NAME=design_113_shop

5.2 建库与建表策略

项目启动时执行 app/db.py 中的以下流程:

  1. ensure_database():若数据库不存在,则自动创建
  2. Base.metadata.create_all():根据 ORM 自动建表
  3. sync_schema():执行轻量兼容迁移

当前兼容迁移包括:

  • 若 users 表不存在 is_admin 字段,则自动补列
  • 若系统中没有管理员,则自动将首个用户提升为管理员

这意味着项目具备基础的 MVP 自恢复 schema 能力,但尚未引入 Alembic 这类正式迁移框架。

5.3 数据库表总览

当前项目共有三张核心表:

表名 类型 作用
users 主数据表 存储系统用户账户与个人资料
auth_tokens 会话表 存储用户登录 Token 与有效期
superstore_orders 事实表/业务明细表 存储导入后的国际超市订单明细

6. 数据库表详细设计

6.1 users 表

6.1.1 作用

用于存储平台用户账号信息、基础资料和角色属性。

6.1.2 字段说明

字段名 类型 约束 说明
id Integer PK, 自增 用户主键
username String(50) 唯一, 索引 登录用户名
email String(120) 唯一, 可空, 索引 邮箱
password_hash String(255) 非空 哈希后的密码
is_admin Boolean 非空, 默认 False 是否管理员
full_name String(80) 可空 真实姓名
phone String(30) 可空 电话
country String(80) 可空 所属国家
city String(80) 可空 所属城市
bio Text 可空 个人简介
created_at DateTime 默认当前时间 创建时间
updated_at DateTime 默认当前时间, 更新时自动刷新 更新时间

6.1.3 业务规则

  • 用户名唯一
  • 邮箱唯一,但允许为空
  • 第一个注册用户自动成为管理员
  • 系统必须至少保留一个管理员
  • 管理员不能删除自己,也不能把自己降为普通用户

6.2 auth_tokens 表

6.2.1 作用

用于实现登录态持久化和服务端会话控制。

6.2.2 字段说明

字段名 类型 约束 说明
token String(128) PK 登录 Token
user_id Integer FK -> users.id, 索引 所属用户
expires_at DateTime 索引 过期时间
created_at DateTime 默认当前时间 Token 创建时间

6.2.3 关系说明

  • 一个 User 可以拥有多个 AuthToken
  • 一个 AuthToken 必须归属于一个 User
  • 删除用户时,相关 Token 级联删除

6.2.4 设计特点

当前项目没有采用纯前端保存的 JWT 无状态鉴权,而是采用:

  • 随机 Token
  • 存数据库
  • 每次请求查表校验

这种方案的优点是:

  • 容易做登出
  • 容易做过期清理
  • 容易后续扩展为多端登录控制

6.3 superstore_orders 表

6.3.1 作用

这是整个系统最核心的业务表,用于承载导入后的国际超市订单明细数据,也是所有图表与分析查询的唯一事实表。

该表采用 宽表 + 反规范化 设计,目的是:

  • 简化 Excel 导入逻辑
  • 简化分析 SQL
  • 降低 MVP 数据建模成本
  • 适合围绕一个固定业务数据集快速做可视化

6.3.2 字段说明

字段名 类型 约束 说明
row_id Integer PK Excel 行唯一编号
order_id String(40) 索引 订单编号
ship_mode String(50) 非空 运输方式
customer_id String(30) 索引 客户编号
customer_name String(120) 非空 客户名称
segment String(40) 索引 客户群体
city String(120) 索引 城市
state String(120) 索引 州/省
country String(120) 索引 国家
postal_code String(40) 可空 邮编
market String(20) 索引 市场
region String(60) 索引 区域
product_id String(40) 索引 商品编号
category String(60) 索引 品类
sub_category String(60) 索引 子品类
product_name String(255) 非空 商品名称
sales Float 非空 销售额
quantity Integer 非空 销量
discount Float 非空 折扣
profit Float 非空 利润
shipping_cost Float 非空 运费
order_priority String(20) 索引 订单优先级
order_date Date 索引 下单日期
month_name String(20) 索引 月份名称
month_order Integer 索引 月份序号
year Integer 索引 年份

6.3.3 索引设计

除单列索引外,还定义了两个复合索引:

索引名 字段 目的
ix_orders_market_region_country market, region, country 加速多级地理筛选
ix_orders_year_month year, month_order 加速时间趋势查询

6.3.4 设计说明

superstore_orders 是一个典型分析型事实表,但当前 MVP 没有拆成:

  • 订单事实表
  • 客户维表
  • 商品维表
  • 地理维表
  • 时间维表

而是选择单表承载全部维度。这种设计适合 MVP 快速落地,但后期若数据量继续增长,建议升级为:

  • 星型模型
  • 维表标准化
  • 预聚合宽表
  • 数据仓库分层

7. E-R 图

7.1 物理 E-R 图(当前实现)

owns
USERS
INT
id
PK
VARCHAR
username
UK
VARCHAR
email
UK
VARCHAR
password_hash
BOOLEAN
is_admin
VARCHAR
full_name
VARCHAR
phone
VARCHAR
country
VARCHAR
city
TEXT
bio
DATETIME
created_at
DATETIME
updated_at
AUTH_TOKENS
VARCHAR
token
PK
INT
user_id
FK
DATETIME
expires_at
DATETIME
created_at
SUPERSTORE_ORDERS
INT
row_id
PK
VARCHAR
order_id
VARCHAR
ship_mode
VARCHAR
customer_id
VARCHAR
customer_name
VARCHAR
segment
VARCHAR
city
VARCHAR
state
VARCHAR
country
VARCHAR
postal_code
VARCHAR
market
VARCHAR
region
VARCHAR
product_id
VARCHAR
category
VARCHAR
sub_category
VARCHAR
product_name
FLOAT
sales
INT
quantity
FLOAT
discount
FLOAT
profit
FLOAT
shipping_cost
VARCHAR
order_priority
DATE
order_date
VARCHAR
month_name
INT
month_order
INT
year

7.2 E-R 图解读

当前物理模型只有一个明确外键关系:

  • users.id -> auth_tokens.user_id

superstore_orders 没有关联到 users,原因是:

  • 订单数据来自外部 Excel 导入
  • 系统用户是平台使用者,不是业务订单中的客户
  • 因此"平台账号"和"业务客户"是两套不同语义的实体

换句话说:

  • users:系统操作者
  • superstore_orders.customer_id:业务客户

这两者在当前 MVP 中没有物理关联。

7.3 业务视角的概念关系

虽然当前数据库没有拆维表,但从分析语义上可以理解为:

  • 一个订单属于一个市场
  • 一个订单属于一个区域
  • 一个订单属于一个国家/城市
  • 一个订单属于一个客户群体
  • 一个订单关联一个商品、品类、子品类
  • 一个订单具有时间属性

因此,superstore_orders 实际上承载了一个简化版的"订单事实 + 多维分析"模型。

8. 结构功能说明

8.1 用户与权限结构

系统采用两级角色:

角色 能力范围
普通用户 登录、查看驾驶舱、查看分析中心、维护个人中心
管理员 拥有普通用户全部能力,外加用户管理、数据管理

权限表现

  • 顶部导航按角色动态显示
  • 路由守卫控制管理员路由访问
  • 后端通过 get_admin_user 进行强校验

8.2 页面结构

游客页

  • 登录页 /login
  • 注册页 /register

普通用户页

  • 驾驶舱 /dashboard
  • 分析中心总览 /analysis
  • 地理分析 /analysis/geo
  • 商品分析 /analysis/product
  • 客户分析 /analysis/customer
  • 运营分析 /analysis/operations
  • 个人中心 /profile

管理员页

  • 用户管理 /admin/users
  • 数据管理 /admin/data

8.3 功能模块说明

8.3.1 认证模块

后端文件:

主要能力:

  • 注册
  • 登录
  • 登出
  • 当前用户读取
  • Token 过期控制
  • 登录态解析

8.3.2 个人中心模块

后端文件:

前端页面:

  • ProfilePage

主要能力:

  • 查看当前资料
  • 修改姓名、邮箱、电话、国家、城市、简介

8.3.3 数据导入模块

后端文件:

主要能力:

  • 查看数据状态
  • 将 Excel 导入 MySQL
  • 支持强制重导
  • 支持批量插入

8.3.4 驾驶舱模块

前端页面:

  • DashboardPage

后端接口集中在:

主要图表与能力:

  • 核心经营指标卡片
  • 市场结构
  • 月度趋势
  • 国家排行
  • 品类经营
  • 客户矩阵
  • 折扣画像
  • 运费压力
  • 明星商品
  • 订单热力日历
  • 市场流向桑基图
  • 子品类榜单

8.3.5 分析中心模块

前端页面:

  • AnalysisHubPage
  • GeoAnalysisPage
  • ProductAnalysisPage
  • CustomerAnalysisPage
  • OperationsAnalysisPage
地理分析
  • 市场表现
  • 区域销售
  • 国家对比
  • 全球销售地图
  • 区域、国家、城市明细
商品分析
  • 商品层级旭日图
  • 商品结构树图
  • 品类表现
  • 市场品类结构
  • 利润气泡散点
  • 子品类排行
  • 明星商品
  • 风险商品
客户分析
  • 客群表现
  • 忠诚度结构
  • 忠诚漏斗
  • RFM 热力矩阵
  • RFM 平行坐标
  • 市场客群结构
  • 客群明细
  • 头部客户
运营分析
  • 运输方式表现
  • 年度运营走势
  • 折扣影响
  • 运输方式雷达
  • 利润瀑布图
  • 优先级明细
  • 低利润区域

8.3.6 管理后台模块

后端文件:

前端页面:

  • AdminUsersPage
  • AdminDataPage
用户管理

能力包括:

  • 用户列表查询
  • 搜索用户
  • 创建用户
  • 编辑用户
  • 删除用户
  • 切换管理员权限
  • 管理员保底保护
数据管理

能力包括:

  • 订单明细分页查询
  • 多维筛选
  • 搜索订单/客户/商品/国家/城市
  • 查看单条数据
  • 新增订单明细
  • 编辑订单明细
  • 删除订单明细

9. 核心 API 结构

9.1 认证接口

接口 方法 说明
/api/auth/register POST 注册
/api/auth/login POST 登录
/api/auth/logout POST 退出登录
/api/auth/me GET 当前登录用户

9.2 个人中心接口

接口 方法 说明
/api/profile/me GET 获取个人资料
/api/profile/me PUT 更新个人资料

9.3 数据底座接口

接口 方法 说明
/api/data/status GET 查看导入状态
/api/data/import POST 导入 Excel 数据

9.4 驾驶舱与分析接口

接口 方法 说明
/api/dashboard/filters GET 获取筛选项
/api/dashboard/summary GET 汇总指标
/api/dashboard/market-distribution GET 市场分布
/api/dashboard/monthly-trend GET 月度趋势
/api/dashboard/category-overview GET 品类概览
/api/dashboard/segment-matrix GET 客群矩阵
/api/dashboard/top-countries GET 国家排行
/api/dashboard/discount-analysis GET 折扣分析
/api/dashboard/shipping-priority GET 运费与优先级
/api/dashboard/top-products GET 商品排行
/api/dashboard/insights GET 自动洞察摘要
/api/dashboard/geo-analysis GET 地理分析
/api/dashboard/product-analysis GET 商品分析
/api/dashboard/customer-analysis GET 客户分析
/api/dashboard/operations-analysis GET 运营分析
/api/dashboard/product-advanced GET 树图、旭日图、气泡散点
/api/dashboard/calendar-analysis GET 日历热力数据
/api/dashboard/geo-map GET 世界地图数据
/api/dashboard/market-flow GET 桑基图数据
/api/dashboard/customer-rfm GET RFM 数据
/api/dashboard/profit-waterfall GET 利润瀑布图数据

上述分析接口统一支持当前 MVP 的核心筛选维度:

  • year
  • market
  • region
  • country

9.5 管理员接口

用户管理

接口 方法 说明
/api/admin/users GET 用户列表
/api/admin/users POST 新建用户
/api/admin/users/{user_id} PUT 更新用户
/api/admin/users/{user_id} DELETE 删除用户

数据管理

接口 方法 说明
/api/admin/orders GET 订单分页列表
/api/admin/orders/options GET 下拉筛选项
/api/admin/orders/{row_id} GET 单条订单详情
/api/admin/orders POST 新增订单
/api/admin/orders/{row_id} PUT 编辑订单
/api/admin/orders/{row_id} DELETE 删除订单

10. 前端结构说明

10.1 前端路由策略

前端使用 Vue Router 4 的 createWebHashHistory()。

路由特征:

  • 未登录用户访问受保护页面会被重定向到 /login
  • 已登录用户访问游客页会跳回 /dashboard
  • 非管理员访问管理员路由会跳回 /dashboard

10.2 前端组件结构

关键公共组件:

  • TopNav:顶部导航和角色感知菜单
  • ScopeSummary:当前筛选范围摘要
  • AnalysisTabs:分析中心二级导航
  • AdminTabs:后台管理二级导航

10.3 前端工程特征

  • 所有页面均在 static/app.js 中定义
  • 使用原生 fetch 发请求
  • 内置 GET 请求缓存
  • 内置筛选请求乱序保护
  • 内置 resize 节流
  • 支持 CSV 导出
  • 支持基于角色的导航渲染

11. 数据流与处理流程

11.1 Excel 导入数据流

  1. 用户点击"同步 Excel / Import"
  2. 前端调用 POST /api/data/import
  3. 后端读取 data/SuperStore.xlsx
  4. OpenPyXL 按行遍历工作表
  5. 标准化文本、日期、邮编等字段
  6. 按 1000 条为一批写入 superstore_orders
  7. 返回导入结果和总行数

11.2 分析查询数据流

  1. 前端根据筛选条件拼接查询参数
  2. 调用 /api/dashboard/*
  3. 后端对 superstore_orders 执行聚合查询
  4. 将结果组装为图表友好 JSON
  5. 前端将 JSON 转为 ECharts option
  6. 页面渲染图表

11.3 权限控制数据流

  1. 用户登录成功后生成 Token
  2. Token 保存到 auth_tokens 表
  3. 前端本地存储 token 和 user
  4. 后续请求带 Authorization: Bearer <token>
  5. 后端查 auth_tokens 和 users
  6. 管理员接口额外校验 is_admin

12. MVP 设计取舍说明

12.1 为什么使用宽表

宽表对当前项目的好处:

  • 导入简单
  • 查询直观
  • 适合单数据集分析
  • 减少维表维护成本

代价是:

  • 冗余较高
  • 数据治理能力弱
  • 不利于大规模扩展

12.2 为什么使用服务端 Token 表

优点:

  • 容易实现登出
  • 易于失效控制
  • 易于后续增加风控策略

代价:

  • 每次请求都需要查数据库
  • 会话状态不完全无状态

12.3 为什么前端不打包

MVP 场景下直接使用 CDN 有明显优势:

  • 搭建速度快
  • 依赖少
  • 结构简单
  • 演示部署成本低

代价:

  • 前端代码集中在单文件中
  • 不利于大型团队协作
  • 不利于类型系统和复杂工程管理

13. 当前 MVP 的优势与不足

13.1 优势

  • 技术栈轻量,部署简单
  • 数据从 Excel 到图表闭环完整
  • 后端结构清晰,职责分离明确
  • 管理员能力已覆盖用户和数据双管理
  • 图表维度丰富,支持多专题分析
  • 普通用户与管理员权限边界清楚

13.2 不足

  • static/app.js 体积较大,前端模块化不足
  • 数据库迁移机制较弱,尚未接入 Alembic
  • 缺乏自动化测试体系
  • 缺少 Redis 缓存或预聚合层
  • 业务数据仍是单一数据源
  • 尚未形成真正的数据仓库模型

14. 后续演进建议

14.1 数据层

  • 拆分客户、商品、地理、时间维表
  • 建立星型模型
  • 引入 Alembic 迁移
  • 增加物化聚合表或缓存

14.2 后端层

  • 增加服务层抽象
  • 增加统一分页与响应结构
  • 增加自动化测试
  • 增加权限粒度控制

14.3 前端层

  • 将 static/app.js 拆分为模块
  • 引入构建工具
  • 细化图表主题系统
  • 增加浏览器级交互测试

14.4 业务层

  • 增加退货分析
  • 增加库存与周转分析
  • 增加活动与营销维度
  • 增加利润归因与经营预警

15. 结论

从 MVP 视角看,该项目已经形成了一个完整、闭环、可运行的国际超市经营分析系统:

  • 数据有来源:SuperStore.xlsx
  • 数据能落库:MySQL
  • 用户能登录:users + auth_tokens
  • 页面能分析:dashboard + analysis
  • 管理能闭环:admin/users + admin/orders

其最重要的工程价值不在于"技术多复杂",而在于用较少的基础设施,实现了:

  • 真实数据导入
  • 真实数据库聚合
  • 多维可视化分析
  • 权限分级
  • 管理后台

这正符合一个课程设计、毕业设计或业务验证型 MVP 应有的完整性。

相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github