基于 Flask 的客户购物趋势分析系统:从零到一的实战落地指南(含代码与可视化)
一套现代化、可扩展的客户购物趋势分析系统:内置仪表盘、多维度分析(时间/客户/商品/交易/行为)、用户与权限管理、系统日志、数据导入,前后端风格统一、交互流畅,适合企业级数据分析与管理场景。
目录
- 简介与亮点
- 项目结构
- 技术栈与依赖
- 架构设计与运行机制
- 数据模型与数据库
- 后端 API 设计(含代码)
- 前端可视化(Chart.js 片段)
- 仪表盘与多维度分析页
- 安装与部署
- 可视化展示预留位(占位图片/视频)
- 二次开发与扩展指引
- 性能优化与安全实践
- 常见问题 FAQ
- 许可证与联系
简介与亮点
- 一体化:集数据可视化、趋势洞察、用户/权限管理、系统日志于一体。
- 易扩展:Flask 蓝图 + 前后端分层清晰,快速新增模块和维度。
- 体验佳:Bootstrap 5 + 现代配色(极简白灰+橙),Chart.js 细致打磨的交互和动效。
- 稳定可靠:SQLAlchemy ORM + 分层日志 + 接口鉴权,保证数据与访问安全。
项目结构
text
code/
├── app/ # 后端核心模块
│ ├── __init__.py # Flask 应用工厂与蓝图注册
│ ├── admin.py # 后台管理:用户/趋势/日志
│ ├── api.py # 数据分析与统计 API
│ ├── auth.py # 登录/注册/改密/注销
│ ├── forms.py # WTForms 表单
│ ├── main.py # 首页/仪表盘/分析入口
│ ├── models.py # ORM 数据模型(User/ShoppingTrends 等)
│ └── utils.py # 数据分析与日志工具
├── static/ # 前端静态资源
│ ├── css/ (bootstrap.min.css, aos.css, style.css)
│ └── js/ (analysis.js, analysis_main.js, dashboard.js, ...)
├── templates/ # 前端模板(Jinja2)
│ ├── base.html, index.html, dashboard.html, analysis*.html
│ └── admin/*, auth/*, errors/*
├── data/ # 数据样例与探索
│ ├── shopping_trends.csv
│ └── 关于客户购物(最新趋势)数据集的探索.ipynb
├── logs/ # 运行日志
├── uploads/ # 上传文件
├── config.py # 配置(数据库/日志/会话)
├── run.py # 启动入口
├── requirements.txt # 依赖
└── README.md # 项目说明
技术栈与依赖
-
后端
- Flask, Flask-SQLAlchemy, Flask-Migrate, Flask-Login, Flask-WTF, Flask-Cors, Flask-Mail
- 数据:MySQL(生产/开发),SQLite(测试)
- 数据处理:Pandas, NumPy(工具类预留)
-
前端
- Bootstrap 5, Chart.js, AOS(动画)
- 少量原生 JS + DOM API,统一橙色主题与阴影层级
核心依赖版本(节选,自 requirements.txt
):
text
Flask==2.3.3
Flask-SQLAlchemy==3.0.5
Flask-Login==0.6.3
Flask-Migrate==4.0.5
Chart.js(前端静态引入)
项目演示
🅰️ 项目源码获取 码界筑梦坊各大平台同名 博客底部含联系方式卡片,欢迎咨询~
架构设计与运行机制
蓝图与应用工厂
python
# app/__init__.py(节选)
db = SQLAlchemy()
login_manager = LoginManager()
def create_app(config_name='default'):
app = Flask(__name__, template_folder=..., static_folder=...)
app.config.from_object(config[config_name])
db.init_app(app)
login_manager.init_app(app)
from app.main import main as main_blueprint
app.register_blueprint(main_blueprint)
from app.auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')
from app.admin import admin as admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
from app.api import api as api_blueprint
app.register_blueprint(api_blueprint, url_prefix='/api')
return app
交互流程(Mermaid)
浏览器 Flask(后端) MySQL GET /api/stats (需登录) 聚合查询(用户/订单/销售额/评分) 统计结果 JSON { total_orders, total_sales, ... } Chart.js 渲染仪表盘 浏览器 Flask(后端) MySQL
数据模型与数据库
python
# app/models.py(节选)
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False, index=True)
email = db.Column(db.String(120), unique=True, nullable=False, index=True)
password_hash = db.Column(db.String(255), nullable=False)
role = db.Column(db.String(20), default='user') # admin, user
is_active = db.Column(db.Boolean, default=True)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class ShoppingTrends(db.Model):
__tablename__ = 'shopping_trends'
id = db.Column(db.Integer, primary_key=True)
customer_id = db.Column(db.Integer, nullable=False, index=True)
age = db.Column(db.Integer, nullable=False)
gender = db.Column(db.String(10), nullable=False)
item_purchased = db.Column(db.String(100), nullable=False)
category = db.Column(db.String(50), nullable=False)
purchase_amount_usd = db.Column(db.Float, nullable=False)
location = db.Column(db.String(100), nullable=False)
size = db.Column(db.String(10), nullable=False)
color = db.Column(db.String(20), nullable=False)
season = db.Column(db.String(20), nullable=False)
review_rating = db.Column(db.Float, nullable=False)
discount_applied = db.Column(db.String(10), nullable=False)
promo_code_used = db.Column(db.String(10), nullable=False)
previous_purchases = db.Column(db.Integer, nullable=False)
payment_method = db.Column(db.String(50), nullable=False)
frequency_of_purchases = db.Column(db.String(20), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
数据库配置(config.py
,请更换实际密码/环境变量):
python
class Config:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:你的密码@localhost:3306/design_109_custom?charset=utf8mb4'
SQLALCHEMY_TRACK_MODIFICATIONS = False
后端 API 设计(含代码)
典型统计接口:
python
# app/api.py(节选)
@api.route('/stats', methods=['GET'])
@login_required
def get_stats():
user_count = User.query.count()
order_count = ShoppingTrends.query.count()
total_amount = db.session.query(func.sum(ShoppingTrends.purchase_amount_usd)).scalar() or 0
avg_rating = db.session.query(func.avg(ShoppingTrends.review_rating)).scalar() or 0
return jsonify({
'success': True,
'data': {
'total_customers': user_count,
'total_orders': order_count,
'total_sales': float(total_amount),
'avg_rating': float(avg_rating)
}
})
类别销售分布:
python
@api.route('/category-sales', methods=['GET'])
@login_required
def get_category_sales():
results = db.session.query(
ShoppingTrends.category,
func.count(ShoppingTrends.id),
func.sum(ShoppingTrends.purchase_amount_usd)
).group_by(ShoppingTrends.category).all()
data = [{
'category': c, 'count': n, 'total_amount': float(a or 0)
} for c, n, a in results]
return jsonify({'success': True, 'data': data})
多维度分析(时间/客户/商品/交易/行为)统一入口:
python
@api.route('/analysis', methods=['GET'])
@login_required
def get_analysis():
time_dim = request.args.get('time_dimension', 'all')
customer_dim = request.args.get('customer_dimension', 'all')
product_dim = request.args.get('product_dimension', 'all')
transaction_dim = request.args.get('transaction_dimension', 'all')
return jsonify({'success': True, 'data': generate_analysis_data(
time_dim, customer_dim, product_dim, transaction_dim
)})
前端可视化(Chart.js 片段)
主要图表初始化(Bar):
javascript
// static/js/analysis.js(节选)
const mainCtx = document.getElementById('mainChart').getContext('2d');
const mainChart = new Chart(mainCtx, {
type: 'bar',
data: { labels: [], datasets: [{ label: '数量', data: [], backgroundColor: '#ff9800', borderColor: '#f57c00', borderWidth: 2, borderRadius: 8 }] },
options: { responsive: true, maintainAspectRatio: false }
});
仪表盘加载:
javascript
// static/js/dashboard.js(节选)
async function loadStats() {
const res = await fetch('/api/stats');
const data = await res.json();
if (data.success) {
document.getElementById('total-sales').textContent = '$' + data.data.total_sales.toLocaleString();
}
}
仪表盘与多维度分析页
index.html
:首页英雄区 + 动效卡片 + CTA。dashboard.html
:指标卡(订单/收入/评分/客户)+ 多图联动。analysis.html
+analysis_*.html
:维度选择、说明、跳转至细分页(时间/客户/商品/交易/行为)。
页面示例(维度入口卡片,来自 templates/analysis.html
):
html
<div class="dimension-card-enhanced" data-dimension="product">
<i class="fas fa-box"></i> 商品维度分析
<ul>
<li>类别销售排行</li>
<li>颜色偏好分析</li>
<li>尺码分布统计</li>
</ul>
<!-- 点击可跳转到 /analysis/product -->
<!-- 由 analysis_main.js 处理交互与跳转 -->
</div>
安装与部署
1) 环境要求
- Python 3.8+
- MySQL 5.7+
2) 安装依赖
bash
pip install -r requirements.txt
3) 配置数据库
sql
CREATE DATABASE design_109_custom CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
编辑 config.py
:
python
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:你的密码@localhost:3306/design_109_custom?charset=utf8mb4'
4) 初始化数据(如需)
bash
python init_data.py
5) 启动服务
bash
python run.py
访问:http://localhost:5000
可视化展示预留位(占位)
将项目运行截图/动图放入
static/uploads/blog/
,以下为占位锚点:
- 仪表盘总览(图1)
markdown

- 商品维度分析(图2)
markdown

- 交易金额分布雷达图(图3)
markdown

- 短视频演示(图4)
markdown

二次开发与扩展指引
新增分析维度(后端)
- 在
app/api.py
增加路由与聚合查询; - 若需复杂统计,可在
app/utils.py
的DataAnalyzer
中封装; - 返回统一 JSON:
{ labels, data, table_data? }
; - 在前端使用 Chart.js 渲染对应图表。
新增页面(前端)
- 在
templates/
新增analysis_xxx.html
; - 在
static/js/
新增/复用analysis_xxx.js
; - 在
templates/base.html
的导航添加入口; - 路由在
app/main.py
中注册页面。
新增管理功能
- 在
app/admin.py
新增页面与接口; - 配合
templates/admin/*
页面与static/js/admin_*.js
; - 通过
current_user.is_admin()
进行权限管控。
性能优化与安全实践
- 查询优化:对高频分组字段建索引(如
ShoppingTrends.category/gender/created_at
)。 - 连接池:
SQLALCHEMY_ENGINE_OPTIONS
设置连接池大小与预热。 - 鉴权:所有数据接口默认
@login_required
;后台入口仅admin
可见。 - 日志:
RotatingFileHandler
滚动日志,logs/app.log
持续记录关键动作。 - CORS:仅对前端域名开放;生产环境按需收紧策略。
- 配置:生产环境使用环境变量注入
SECRET_KEY
、数据库密码、邮件凭据。
常见问题 FAQ
-
Q: MySQL 某些日期函数不兼容?
- A: 已在接口中提供
extract
与substring
双方案回退,确保兼容性。
- A: 已在接口中提供
-
Q: 图表无数据/加载失败?
- A: 检查登录状态与
/api/*
返回;确认数据库中已有样例数据。
- A: 检查登录状态与
-
Q: 静态资源未加载?
- A: 清理浏览器缓存,检查
templates/base.html
中静态路径是否正确。
- A: 清理浏览器缓存,检查
许可证与联系
- 许可证:MIT
- 联系方式(同名检索):码界筑梦坊各大平台同名
如果这篇文章对你有帮助,欢迎收藏与分享;也期待你在"码界筑梦坊各大平台同名"找到我们,获取更多开源与实战案例。