当前位置: 首页 > news >正文

164-基于Python的甜点销售数据可视化分析系统

甜点销售数据可视化分析系统 — 技术文档

一、项目概述

1.1 项目简介

本项目是一个基于 Python 的甜点销售数据可视化分析系统,面向甜点零售场景,提供从数据管理到多维度分析、可视化大屏展示的一站式解决方案。系统涵盖用户认证、角色权限、数据 CRUD、多维图表分析及数据大屏等核心功能。

1.2 技术栈

层级技术版本
后端框架FastAPI0.115.0
数据库SQLite3内置
模板引擎Jinja23.1.4
可视化ECharts5.5.0
ECharts 扩展echarts-liquidfill3.1.0
用户认证JWT (PyJWT)2.9.0
密码加密passlib + bcrypt1.7.4 / 4.0.1
ASGI 服务器Uvicorn0.30.6

1.3 运行环境

  • Python 3.11+
  • Windows / Linux / macOS
  • 浏览器:Chrome 80+、Edge 80+、Firefox 78+

















二、系统架构

2.1 整体架构

┌─────────────────────────────────────────────────────┐ │ 浏览器 (前端) │ │ ECharts 渲染引擎 + Jinja2 模板 + CSS 甜品主题样式 │ └──────────────────────┬──────────────────────────────┘ │ HTTP / Cookie ┌──────────────────────▼──────────────────────────────┐ │ FastAPI (后端) │ │ ┌──────────┐ ┌──────────┐ ┌───────────────────┐ │ │ │ 页面路由 │ │ REST API │ │ 权限中间件 │ │ │ └──────────┘ └──────────┘ └───────────────────┘ │ └──────────────────────┬──────────────────────────────┘ │ SQLite3 ┌──────────────────────▼──────────────────────────────┐ │ sweet.db (SQLite) │ │ users 表 │ sales 表 │ └─────────────────────────────────────────────────────┘

2.2 目录结构

sweet/ ├── run.py # 启动入口 ├── requirements.txt # Python 依赖 ├── 甜点销售数据.csv # 原始数据源 (10000 条) └── app/ ├── __init__.py ├── main.py # FastAPI 应用:路由、API、权限控制 (656 行) ├── database.py # 数据库初始化、CSV 导入、迁移 (87 行) ├── auth.py # JWT 认证、密码哈希 (33 行) ├── static/ │ ├── css/ │ │ └── style.css # 甜品主题粉色风格 (701 行) │ ├── js/ │ │ ├── echarts.min.js # ECharts 核心库 │ │ └── echarts-liquidfill.min.js # 水球图扩展 │ └── img/ └── templates/ ├── login.html # 登录页 ├── register.html # 注册页 ├── dashboard.html # 概览仪表盘 ├── analysis.html # 数据分析 (18 种图表) ├── data.html # 数据管理 (管理员) ├── users.html # 用户管理 (管理员) ├── profile.html # 个人中心 └── bigscreen.html # 可视化大屏

2.3 代码规模

文件行数
app/main.py656
app/static/css/style.css701
app/templates/analysis.html586
app/templates/profile.html222
app/templates/data.html146
app/templates/dashboard.html146
app/templates/bigscreen.html158
app/templates/users.html108
app/templates/register.html71
app/templates/login.html61
app/database.py87
app/auth.py33
总计3039

三、数据库设计

3.1 users 表

字段类型约束说明
idINTEGERPK, AUTO用户 ID
usernameTEXTUNIQUE, NOT NULL用户名
passwordTEXTNOT NULLbcrypt 哈希密码
is_adminINTEGERDEFAULT 01=管理员, 0=普通用户
created_atTEXTDEFAULT datetime注册时间

预置账号:

  • 管理员:admin/123456
  • 普通用户:user/123456

角色分配规则:系统中第一个注册的用户自动成为管理员,后续注册用户均为普通用户。

3.2 sales 表

字段类型约束说明
idINTEGERPK, AUTO记录 ID
customer_idINTEGERNOT NULL顾客 ID
product_idINTEGERNOT NULL产品 ID
product_nameTEXTNOT NULL产品名称
quantityINTEGERNOT NULL购买数量
priceREALNOT NULL单价
purchase_dateTEXTNOT NULL购买日期
total_priceREALNOT NULL总价 (数量×单价)

3.3 数据集概况

指标
记录总数10,000
产品种类10
客户数量1,000
时间范围2024-02-12 ~ 2025-02-11
总销售额¥2,763,145

10 种甜点产品:

序号产品名称
1巧克力熔岩蛋糕
2抹茶红豆蛋糕
3提拉米苏
4柠檬塔
5椰香芒果布丁
6焦糖玛奇朵冰淇淋
7芒果慕斯
8草莓千层蛋糕
9蓝莓芝士蛋糕
10黑森林樱桃蛋糕

3.4 数据库初始化流程

启动 → CREATE TABLE IF NOT EXISTS → 检查 is_admin 列是否存在 ↓ 否 ALTER TABLE ADD COLUMN ↓ 检查是否有管理员账号 ↓ 否 INSERT 默认 admin 账号 ↓ 检查 sales 是否为空 ↓ 是 从 CSV 导入 10000 条数据

数据库支持热迁移:如果已有旧版数据库(无 is_admin 字段),系统会自动ALTER TABLE添加该列,无需手动迁移。


四、认证与权限

4.1 JWT 认证流程

用户提交登录表单 ↓ FastAPI 校验用户名密码 ↓ 生成 JWT Token (payload: user_id, username, is_admin, exp) ↓ 设置 HttpOnly Cookie (token=xxx, max_age=86400) ↓ 返回 JSONResponse { msg, is_admin } ↓ 前端 JS 读取响应,成功则跳转 /

JWT Payload 结构:

{"user_id":1,"username":"admin","is_admin":true,"exp":1779724439}

4.2 角色权限矩阵

功能管理员普通用户
概览仪表盘
数据分析
可视化大屏
个人中心
数据管理 (CRUD)
用户管理
数据写入 API
用户管理 API

4.3 权限实现

页面级别:路由函数中检查user.get("is_admin"),非管理员重定向到首页。

API 级别:require_admin()函数校验 JWT 中的is_admin字段,不满足则返回 403。

前端级别:侧边栏导航使用 Jinja2{% if user.is_admin %}条件渲染,管理员才可见数据管理和用户管理入口。

4.4 前端错误提示

登录/注册页面使用 JSfetch提交表单,根据 HTTP 状态码显示中文提示:

状态码提示信息
200跳转首页
401用户名或密码错误
400用户名已存在
前端校验两次密码输入不一致
网络异常网络错误,请稍后重试

五、页面功能详解

5.1 登录页 (/login)

  • 甜品风格粉色渐变背景 + 浮动光斑动画
  • 毛玻璃卡片效果登录框
  • 🧁 图标装饰
  • 前端 JS 异步提交,失败时红色错误提示框
  • 底部链接跳转注册页

5.2 注册页 (/register)

  • 与登录页相同的甜品主题风格
  • 🍰 图标装饰
  • 前端校验两次密码一致性
  • 第一个注册用户自动成为管理员

5.3 概览仪表盘 (/)

核心指标卡片 (5 项):

图标指标数据源
💰总销售额overview.revenue
📦总销量overview.qty
🧾订单总数overview.cnt
👥客户总数overview.customers
💎平均客单价overview.avg_order

图表 (4 个):

图表类型API
月度销售趋势折线+柱状混合monthly_trend
产品销售额占比环形饼图product_sales
产品销量排行横向条形图product_sales
订单金额分布饼图price_distribution

5.4 数据分析 (/analysis)

18 种图表,6 行布局:

第一行 — 时间维度:

图表类型说明
📈 月度销售趋势折线+柱状销售额面积折线 + 销量柱状,双 Y 轴
📅 星期销售分析渐变柱状7 天销售额对比

第二行 — 产品维度:

图表类型说明
🏆 产品销售额排行横向渐变条形按销售额降序
🍩 产品销量占比玫瑰饼图南丁格尔玫瑰图效果

第三行 — 客户维度:

图表类型说明
👥 TOP10 高消费客户横向条形消费金额前 10
📦 购买数量分布饼图不同购买件数的订单占比

第四行 — 交叉维度:

图表类型说明
🌡️ 产品-星期热力图热力图10 产品 × 7 天订单量矩阵
🎯 产品多维雷达图雷达图销量/销售额/订单数/均客单价

第五行 — 结构维度:

图表类型说明
📊 产品月度销售堆叠图堆叠柱状各产品月度销售额堆叠
💰 订单金额分布柱状0-50/50-100/100-200/200-500/500+

第六行 — 单值维度:

图表类型说明
⏱️ 产品平均单价横向条形各产品均价对比
🔻 销售漏斗图漏斗图产品销售额漏斗
🌊 产品订单量涟漪图涟漪散点effectScatter 动画

第七行 — 特殊图表:

图表类型说明
🎯 总销售额仪表盘Gauge 仪表目标 300 万达成率
🟩 产品销售矩形树图Treemap面积表示销售占比
☀️ 星期×产品旭日图Sunburst层级:星期→产品

第八行 — 多维与对比:

图表类型说明
∥ 产品多维平行坐标图Parallel均购量/均单价/均客单价/总销售额
📊 产品订单量对比柱状图渐变条形按订单量降序

第九行 — 流向与趋势:

图表类型说明
🔀 产品→金额等级桑基图Sankey产品流向小/中/高/大额订单
🌊 产品销售主题河流图ThemeRiver时间维度上的销售河流

第十行 — 形象化图表:

图表类型说明
🍫 产品销量象形柱图PictorialBar矩形纹理重复填充
💧 销售目标完成率水球图LiquidFillecharts-liquidfill 波浪效果
🎨 产品收入结构组合图组合图柱状+虚线+帕累托累计曲线

5.5 数据管理 (/data) — 仅管理员

  • 产品名称 + 日期范围筛选
  • 分页表格(每页 20 条)
  • 添加/编辑/删除销售记录
  • 弹窗表单,Toast 提示
  • 写入操作需管理员权限,API 级别校验

5.6 用户管理 (/users) — 仅管理员

  • 用户列表表格(ID、用户名、角色、注册时间)
  • 切换管理员状态按钮
  • 删除用户按钮(不可删除自己)
  • Toast 提示操作结果

5.7 个人中心 (/profile)

用户信息卡片:

  • 🧁 头像 + 用户名 + 注册时间
  • 管理员/活跃用户徽章
  • 管理数据量 + 系统用户数

分析图表 (4 个):

图表类型说明
🧑‍🤝‍🧑 客户消费等级分布环形饼图低/中/高/超高消费客户数
🍩 产品关注度偏好环形饼图TOP5 产品订单占比
📈 月度订单趋势面积折线图月度订单数量变化
🔍 单价 vs 销量散点图散点图产品均价与总销量关系

修改密码:

  • 原密码 + 新密码 + 确认新密码
  • 前端校验密码一致性
  • 后端校验原密码正确性

5.8 可视化大屏 (/bigscreen)

  • 深色主题全屏布局,无需登录
  • 实时时钟显示 + 返回首页按钮
  • 5 项核心指标卡片
  • 6 个图表:月度趋势、产品占比、销量排行、星期分布、热力图
  • Flex 弹性布局自适应屏幕
  • 每 5 分钟自动刷新

六、API 接口文档

6.1 认证接口

POST /api/login

用户登录,返回 JWT Cookie。

请求:application/x-www-form-urlencoded

参数类型必填说明
usernamestring用户名
passwordstring密码

成功响应 (200):

{"msg":"登录成功","is_admin":true}

Cookie:token=eyJ...; HttpOnly; Max-Age=86400; Path=/

失败响应 (401):

{"detail":"用户名或密码错误"}
POST /api/register

用户注册,返回 JWT Cookie。

参数类型必填说明
usernamestring用户名 (唯一)
passwordstring密码

成功响应 (200):

{"msg":"注册成功","is_admin":false}

失败响应 (400):

{"detail":"用户名已存在"}
POST /api/logout

退出登录,删除 Cookie,302 重定向到登录页。


6.2 数据 CRUD 接口

GET /api/sales

分页查询销售数据。

参数类型默认说明
pageint1页码
sizeint20每页条数 (1-100)
productstring-按产品名筛选
start_datestring-起始日期 (YYYY-MM-DD)
end_datestring-结束日期 (YYYY-MM-DD)

响应:

{"total":10000,"page":1,"size":20,"data":[{"id":1,"customer_id":66,"product_name":"提拉米苏",...}]}
POST /api/sales — 🔒 管理员

新增销售记录。

参数类型必填说明
customer_idint顾客 ID
product_idint产品 ID
product_namestring产品名称
quantityint数量
pricefloat单价
purchase_datestring购买日期

响应:

{"msg":"添加成功"}
PUT /api/sales/{sale_id} — 🔒 管理员

更新销售记录,请求体为 JSON。

DELETE /api/sales/{sale_id} — 🔒 管理员

删除销售记录。


6.3 用户管理接口 — 🔒 管理员

GET /api/users

获取用户列表。

响应:

[{"id":1,"username":"admin","is_admin":1,"created_at":"2026-05-25 00:00:00"},{"id":2,"username":"user","is_admin":0,"created_at":"2026-05-25 00:00:00"}]
DELETE /api/users/{user_id}

删除用户(不可删除自己)。

失败响应 (400):

{"detail":"不能删除自己"}
PUT /api/users/{user_id}/toggle_admin

切换用户管理员状态(不可修改自己)。

响应:

{"msg":"更新成功","is_admin":1}

6.4 分析接口

接口说明维度
GET /api/analysis/overview核心指标汇总全局
GET /api/analysis/product_sales产品销量/销售额/均价/订单数产品
GET /api/analysis/monthly_trend月度销售额/销量/订单数时间×指标
GET /api/analysis/weekday星期销售额/订单数时间
GET /api/analysis/price_distribution订单金额区间分布金额
GET /api/analysis/quantity_distribution购买数量分布数量
GET /api/analysis/top_customersTOP10 高消费客户客户
GET /api/analysis/product_monthly产品月度销售额产品×时间
GET /api/analysis/daily_trend日度销售额/订单数时间
GET /api/analysis/customer_heatmap产品×星期订单热力矩阵产品×时间
GET /api/analysis/revenue_rank产品销售额排名产品
GET /api/analysis/sunburst星期×产品层级数据时间×产品
GET /api/analysis/parallel产品多维指标 (均购量/均单价/均客单价/总销售额)产品×多维
GET /api/analysis/sankey产品→金额等级流向产品→金额
GET /api/analysis/theme_river日度产品销售河流时间×产品

通用响应格式:

[{"product_name":"提拉米苏","total_qty":5764,"total_revenue":292205.0,"avg_price":281.24,"order_count":1039}]

6.5 个人中心接口

GET /api/profile/stats — 🔒 登录

获取个人中心统计数据。

POST /api/profile/change_password — 🔒 登录

修改密码。

参数类型必填说明
old_passwordstring原密码
new_passwordstring新密码

七、前端设计

7.1 设计风格

  • 主题:甜品风格粉色系
  • 主色:#ec407a (Pink 500)
  • 辅色:#ffa726 (Orange 400)、#ab47bc (Purple 400)、#26a69a (Teal 400)
  • 背景:#fff0f5 (Pink 100) 渐变至 #fff8f0 (Cream)
  • 圆角:16px (卡片)、10px (按钮/输入框)
  • 阴影:粉色系半透明投影
  • 动画:浮动光斑背景、卡片 hover 上浮、按钮点击下沉

7.2 响应式断点

断点侧边栏图表网格大屏网格
>1200px240px 固定2列/3列3列
768-1200px60px 仅图标1列2列
<768px60px 仅图标1列1列

7.3 ECharts 图表类型汇总

图表类型ECharts series.type使用位置
折线图line仪表盘、分析、大屏、个人中心
柱状图bar仪表盘、分析、大屏
饼图pie仪表盘、分析、大屏、个人中心
环形饼图pie (radius)仪表盘、分析、个人中心
玫瑰图pie (roseType)分析
横向条形图bar (横向)仪表盘、分析、大屏
雷达图radar分析
热力图heatmap分析、大屏
堆叠柱状图bar (stack)分析
仪表盘gauge分析
漏斗图funnel分析
涟漪散点图effectScatter分析
矩形树图treemap分析
旭日图sunburst分析
平行坐标图parallel分析
桑基图sankey分析
主题河流图themeRiver分析
象形柱图pictorialBar分析
水球图liquidFill分析
组合图bar+line分析
散点图scatter个人中心

共计 21 种图表类型,18 种出现在数据分析页。


八、部署与运行

8.1 安装依赖

pipinstall-rrequirements.txt

requirements.txt 内容:

fastapi==0.115.0 uvicorn==0.30.6 jinja2==3.1.4 python-multipart==0.0.9 pyjwt==2.9.0 passlib==1.7.4 bcrypt==4.0.1

注意:bcrypt 版本锁定为 4.0.1,与 passlib 兼容。4.2+ 版本会导致module 'bcrypt' has no attribute '__about__'错误。

8.2 启动服务

cdsweet python run.py

服务默认运行在http://localhost:8001,支持热重载。

8.3 首次运行

系统启动时自动执行:

  1. 创建 SQLite 数据库app/sweet.db
  2. 创建 users / sales 表
  3. 若无管理员,自动创建admin/123456
  4. 若 sales 为空,自动从 CSV 导入 10000 条数据
  5. 若是旧数据库(无 is_admin 字段),自动 ALTER TABLE 迁移

8.4 访问地址

页面URL
登录http://localhost:8001/login
概览http://localhost:8001/
数据分析http://localhost:8001/analysis
数据管理http://localhost:8001/data
用户管理http://localhost:8001/users
个人中心http://localhost:8001/profile
可视化大屏http://localhost:8001/bigscreen

九、安全设计

9.1 认证安全

措施说明
密码哈希bcrypt (cost factor 12)
JWT HttpOnly Cookie防 XSS 窃取 token
Token 过期24 小时自动失效
Cookie Path/ 全站可用

9.2 权限安全

层级机制
页面路由后端检查 is_admin,非法访问 302 重定向
写入 APIrequire_admin() 装饰器,非管理员返回 403
前端导航Jinja2 条件渲染,非管理员看不到管理入口
自保护管理员不可删除自己、不可修改自己的管理员状态

十、关键代码说明

10.1 database.py — 数据库初始化与迁移

  • init_db(): 幂等初始化,支持 CREATE IF NOT EXISTS + ALTER TABLE 迁移
  • _import_csv(): 读取 UTF-8 编码的 CSV,批量 INSERT 10000 条记录
  • 首次无管理员时,自动 INSERTadmin/123456(is_admin=1)

10.2 auth.py — 认证模块

  • create_token(user_id, username, is_admin): 生成 JWT,payload 包含 is_admin
  • decode_token(token): 解码验证,过期/无效返回 None
  • hash_password()/verify_password(): bcrypt 封装

10.3 main.py — 核心路由

  • get_current_user(): 从 Cookie 读取 token 并解码
  • require_admin(): 认证 + 管理员权限双重校验
  • 登录/注册 API:成功时JSONResponse+set_cookie,失败时HTTPException
  • 分析 API:15 个端点覆盖全局、产品、时间、客户、交叉、流向等维度

十一、常见问题

Q: 启动报错module 'bcrypt' has no attribute '__about__'

A: bcrypt 版本过高,与 passlib 不兼容。执行pip install bcrypt==4.0.1

Q: 数据库损坏如何重建

A: 删除app/sweet.db文件,重启服务即可自动重建并导入数据。

Q: 忘记管理员密码

A: 删除app/sweet.db,重启服务后自动创建admin/123456

Q: 如何新增管理员

A: 以 admin 登录,进入用户管理,点击"设为管理员"按钮。

Q: 大屏页面打不开

A: 大屏无需登录,直接访问/bigscreen。如仍无法访问,检查端口是否正确。

Q: 图表数据为空

A: 检查甜点销售数据.csv是否在项目根目录,首次启动需从此文件导入数据。

http://www.rkmt.cn/news/1419450.html

相关文章:

  • ♪苍穹外卖♪Day2 | 项目日记
  • Hermes Agent 完全使用指南:从安装到多平台部署的全流程教程
  • 战略落地难?试试分拆对
  • 项目介绍 MATLAB实现基于SVM-LSTM支持向量机(SVM)结合长短期记忆网络(LSTM)进行回归预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我
  • 别再硬编码了!用HTN框架让游戏AI自己找最优解(附Unity/Unreal实现思路)
  • 【DeepSeek云服务部署黄金标准】:工信部认证AI云平台合规部署 checklist(限免领取)
  • 告别手动点点点!用ArcMap‘按位置选择’高效处理空间分析(附实战案例)
  • 2026 郑州靠谱婚介机构、本地婚恋平台、正规婚姻介绍、单身脱单、中老年婚恋服务、相亲交友机构口碑榜单:资质、口碑、服务实力多维度综合解析 - 海棠依旧大
  • 手把手图解:用Wireshark抓包分析一次完整的IMS SIP注册流程(含信令交互详解)
  • 机器学习未来趋势:从数据闭环到MLOps的工程化实践
  • Verilog中casez与casex语法详解:用法、区别与避坑指南
  • 私有信息检索(PIR)技术解析与DNS隐私保护实践
  • 从录音→纪要→待办→飞书/钉钉自动同步:一套可即插即用的ChatGPT自动化链路(内测版仅开放最后87个名额)
  • 大数据商业应用:从数据采集到智能决策的完整实践指南
  • Unity UI画线太头疼?试试Vectrosity插件,轻松搞定曲线与层级穿插
  • 2026 水泥制管机、悬辊式水泥制管机、离心式水泥制管机、立式水泥制管机、全自动水泥制管机、水泥管模具厂家综合测评:设备性能、工艺成熟度、售后适配全方位解析 - 海棠依旧大
  • 主题12:蓝牙家族——从替代线缆到Mesh组网
  • 机器人开发避坑:KDL库三种逆解算法(NR、NR_JL、LMA)到底怎么选?
  • 最近又挖到 MuMu 模拟器的新活,跟 AI 搭上线了
  • 告别TBtools?用R语言ggplot2从零绘制染色体SNP密度图(附完整代码与数据清洗技巧)
  • 搭建本地知识库系统:基于spring-ai的实战案例
  • 告别付费软件!用FileZilla Server在Win10上5分钟搞定个人FTP服务器
  • MinIO分享链接太长太丑?教你一键生成带域名的短链接(CentOS 7实战)
  • AI搜索优化值不值?价格与效果真实解析
  • 基于树莓派与E-ink屏幕打造低功耗智能信息显示终端
  • 程序代码篇---多语言混合编程
  • 从Kaggle肺炎X光分类项目实战出发:5步搞定PyTorch Grad-CAM,让你的模型‘说话’
  • PAT天梯赛L2-045‘堆宝塔’:一个被低估的栈应用经典练习题
  • 差分隐私算法审计实战:DP-Auditorium原理与应用指南
  • 一文带你解锁最佳电子书阅读平台