109-基于Flask的客户购物趋势分析系统

基于 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 复制代码
![仪表盘总览](static/uploads/blog/dashboard-overview.png)
  • 商品维度分析(图2)
markdown 复制代码
![商品维度分析](static/uploads/blog/product-analysis.png)
  • 交易金额分布雷达图(图3)
markdown 复制代码
![交易金额分布](static/uploads/blog/transaction-radar.png)
  • 短视频演示(图4)
markdown 复制代码
![交互演示GIF](static/uploads/blog/interaction-demo.gif)

二次开发与扩展指引

新增分析维度(后端)

  1. app/api.py 增加路由与聚合查询;
  2. 若需复杂统计,可在 app/utils.pyDataAnalyzer 中封装;
  3. 返回统一 JSON:{ labels, data, table_data? }
  4. 在前端使用 Chart.js 渲染对应图表。

新增页面(前端)

  1. templates/ 新增 analysis_xxx.html
  2. static/js/ 新增/复用 analysis_xxx.js
  3. templates/base.html 的导航添加入口;
  4. 路由在 app/main.py 中注册页面。

新增管理功能

  1. app/admin.py 新增页面与接口;
  2. 配合 templates/admin/* 页面与 static/js/admin_*.js
  3. 通过 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: 已在接口中提供 extractsubstring 双方案回退,确保兼容性。
  • Q: 图表无数据/加载失败?

    • A: 检查登录状态与 /api/* 返回;确认数据库中已有样例数据。
  • Q: 静态资源未加载?

    • A: 清理浏览器缓存,检查 templates/base.html 中静态路径是否正确。

许可证与联系

  • 许可证:MIT
  • 联系方式(同名检索):码界筑梦坊各大平台同名

如果这篇文章对你有帮助,欢迎收藏与分享;也期待你在"码界筑梦坊各大平台同名"找到我们,获取更多开源与实战案例。