
之前不少同学私信问我课程设计或者毕业设计想选“数据可视化分析系统”方向但又担心 Django 环境配不明白、MySQL 数据库不会连、图表不知道怎么做。这篇文章就把整个项目从零到一完整拆开讲清楚不绕弯子直接用一套可以直接改的源码结构带你走一遍。整个系统基于 Django MySQL 实现前端使用 Chart.js 绘制图表包含商品管理、订单管理、销售趋势分析、分类销售占比、热销商品排行等模块页面清爽代码结构直观非常适合作为课设或毕设的基础框架。另外说一句这套系统的源码我已经整理好文中会给出获取方式拿到手之后改改数据库名字、换换页面文案再补充一两个功能点项目报告和答辩基本就稳了。下面我们正式开始。1. 为什么选择 Django MySQL 做数据可视化系统1.1 这个系统到底解决什么问题很多电商场景下业务数据是零散的订单表、商品表、用户表各自独立管理者很难直观看到“这个月卖了多少”“哪个分类最赚钱”“哪些商品是爆款”。数据可视化分析系统的核心任务就是把 MySQL 数据库里存储的业务数据通过后端统计汇总再以折线图、饼图、柱状图等形式展示出来。本文要做的网购数据可视化分析系统就是围绕“订单数据”和“商品数据”两类核心数据完成以下功能展示订单列表支持按订单状态筛选。统计每月销售趋势包括订单量和销售额。分析商品分类的销售额占比。展示热销商品 Top 10。支持用户消费排行统计。所以它不是一个简单的 CRUD 管理系统而是一个“数据 图表 分析”的综合项目既考察后端建模能力也考察前端展示能力非常适合课程设计和毕业设计。1.2 Django 在数据可视化项目中的优势Django 是 Python 生态里最成熟的全栈 Web 框架之一。它自带 ORM、Admin 后台、模板引擎、表单处理、认证体系做数据可视化分析系统时Django 的优势非常明显。第一Django ORM 可以直接把 Python 类映射成 MySQL 数据表不用手写建表 SQL对课设和毕设来说能省下大量时间而且模型关系清晰写报告的时候也容易描述。第二Django 自带 Admin 后台就算你还没有写任何前端页面只要注册了模型就能在/admin路径下录入商品、分类、订单数据。对演示和答辩来说这是一个非常加分的点。第三Django 的模板系统支持把后端动态数据渲染到 HTML 页面配合前端图表库如 Chart.js、ECharts可以快速实现数据可视化展示。有同学问Python 生态里现在也有 Flask、FastAPI 可以选为什么推荐 Django如果你的课设要求里出现了“后台管理”“用户登录”“数据库操作”“页面展示”这些关键词Django 完整度高、文档多、踩坑资料全国内高校相关项目使用非常广遇到问题更容易找到解决方案。1.3 MySQL 数据库在项目中的作用MySQL 是项目的数据底座。订单数据、商品数据、用户数据都存储在 MySQL 中。Django 通过mysqlclient或者PyMySQL驱动连接 MySQLORM 负责把 Python 对象转换为 SQL 语句执行。使用 MySQL 而不是默认的 SQLite主要原因是课设和毕设通常要求使用 MySQL 数据库。MySQL 在数据量较大时性能更好也更容易体现数据库设计能力。答辩时老师通常会问“你的数据库为什么这样设计”使用 MySQL 会显得更正规。本文的数据库名称为shop_analysis编码使用utf8mb4可以完整支持中文和 emoji 字符。2. 环境准备与项目初始化2.1 开发环境清单在开始写代码之前先把环境准备好。下面是我建议的开发环境版本实际操作中可以根据你自己的电脑情况调整核心思路大于具体版本号。环境推荐版本说明操作系统Windows 10/11、macOS、Linux本文以 Windows 为例Python3.8 以上建议 3.10 或 3.11Django4.2 LTS 或 5.x版本可调整配置方式相同MySQL8.0 以上建议 8.0.20 以上数据库图形工具Navicat / MySQL Workbench非必须方便查看数据IDEPyCharm / VS Code推荐 PyCharm 社区版版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。2.2 创建虚拟环境并安装依赖先创建一个项目目录并进入目录然后创建 Python 虚拟环境。mkdir shop_analysis cd shop_analysis python -m venv venvWindows 下激活虚拟环境venv\Scripts\activatemacOS / Linux 下激活虚拟环境source venv/bin/activate激活后命令行前面会出现(venv)前缀就说明虚拟环境已经生效了。接下来安装 Django 和 MySQL 连接驱动。pip install django mysqlclient如果你在 Windows 下安装mysqlclient遇到编译报错可以改用PyMySQLpip install django pymysql然后在项目的__init__.py中设置 PyMySQL 作为 MySQLdb 的替代# 文件路径shop_analysis/__init__.py import pymysql pymysql.install_as_MySQLdb()安装完成后可以用以下命令查看 Django 版本python -m django --version如果正常输出版本号说明 Django 安装成功。2.3 新建 Django 项目与应用在项目目录下创建 Django 项目项目名可以和系统名区分开避免混淆。django-admin startproject config . python manage.py startapp analysis这里我使用config作为项目配置目录名analysis作为业务应用名。创建成功后项目结构大致如下shop_analysis/ ├── manage.py ├── config/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── analysis/ ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── views.py ├── urls.py └── migrations/然后在config/settings.py的INSTALLED_APPS中加入analysis应用。# 文件路径config/settings.py INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, analysis, ]2.4 配置 MySQL 数据库连接打开config/settings.py默认的数据库配置是 SQLite。我们需要改成 MySQL并填上自己的数据库名、用户名和密码。# 文件路径config/settings.py DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: shop_analysis, USER: root, PASSWORD: 你的数据库密码, HOST: 127.0.0.1, PORT: 3306, OPTIONS: { charset: utf8mb4, }, } }修改好之后需要先在 MySQL 中创建数据库shop_analysis。可以使用命令行也可以使用 Navicat 等工具。CREATE DATABASE shop_analysis DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;这里要注意一定要提前在 MySQL 中创建好数据库否则后面执行迁移命令时会报Unknown database错误。3. 数据库设计先想清楚要分析什么3.1 网购业务的三张核心表做数据可视化系统第一件事不是写代码而是设计数据库。表结构设计得是否合理直接决定后面的统计查询是否方便。本系统涉及三类核心数据商品分类Category商品属于哪个分类决定“分类销售占比”这个分析维度。商品Product商品名称、价格、所属分类决定“热销商品”分析。订单Order订单号、用户、商品、数量、金额、状态、城市、下单时间是销售趋势分析的数据来源。为什么订单表要记录城市和下单时间因为“按时间趋势分析”和“按地域分析”是电商可视化最常见的两个维度。提前在表结构里预留这些字段后面写统计接口会非常轻松。在 Django 模型中ForeignKey用来表达表和表之间的关系。分类与商品是一对多关系一个分类下有多个商品商品与订单也是一对多关系一个商品会出现在多个订单中。3.2 Django 模型代码下面编写数据模型文件路径为analysis/models.py。# 文件路径analysis/models.py from django.db import models from django.contrib.auth.models import User class Category(models.Model): 商品分类 name models.CharField(分类名称, max_length50, uniqueTrue) class Meta: verbose_name 商品分类 verbose_name_plural verbose_name def __str__(self): return self.name class Product(models.Model): 商品 name models.CharField(商品名称, max_length200) category models.ForeignKey(Category, on_deletemodels.CASCADE, verbose_name所属分类) price models.DecimalField(单价, max_digits10, decimal_places2) class Meta: verbose_name 商品 verbose_name_plural verbose_name def __str__(self): return self.name class Order(models.Model): 订单 STATUS_CHOICES ( (待付款, 待付款), (已付款, 已付款), (已发货, 已发货), (已完成, 已完成), (已取消, 已取消), ) order_no models.CharField(订单号, max_length50, uniqueTrue) user models.ForeignKey(User, on_deletemodels.CASCADE, verbose_name下单用户) product models.ForeignKey(Product, on_deletemodels.PROTECT, verbose_name购买商品) quantity models.PositiveIntegerField(购买数量, default1) amount models.DecimalField(订单金额, max_digits12, decimal_places2) status models.CharField(订单状态, max_length20, choicesSTATUS_CHOICES, default待付款) city models.CharField(收货城市, max_length50, blankTrue, default) create_time models.DateTimeField(下单时间, auto_now_addTrue) class Meta: verbose_name 订单 verbose_name_plural verbose_name ordering [-create_time] def __str__(self): return self.order_no这段代码里有几个设计细节需要重点说明。第一订单状态使用choices限制为固定的枚举值避免脏数据进入数据库。统计销售数据时只需要过滤掉“待付款”和“已取消”的订单就得到有效销售数据。第二on_deletemodels.PROTECT表示商品被订单引用时不允许直接删除商品这样能保护历史订单数据的完整性。分类表使用CASCADE删除分类时会把该分类下的商品一起删除这个在真实业务中需要谨慎但课设场景里可以接受。第三订单金额amount使用DecimalField而不是FloatField因为浮点数在金额计算中会出现精度误差而DecimalField在数据库中对应的是省钱的decimal类型统计求和不会出现奇怪的小数尾巴。3.3 数据迁移与测试数据模型写完之后执行迁移命令让 Django 在 MySQL 中生成对应的数据表。python manage.py makemigrations python manage.py migrate执行完migrate后可以在 MySQL 中看到analysis_category、analysis_product、analysis_order等数据表。然后创建超级管理员账号用于登录 Admin 后台录入数据。python manage.py createsuperuser接下来启动 Django 开发服务器python manage.py runserver浏览器访问http://127.0.0.1:8000/admin用刚才创建的账号登录进入 Django 后台。在后台中录入几个商品分类、商品和订单数据后续的图表展示才有数据来源。有一点需要注意Admin 后台默认不会显示Order和Product模型需要在analysis/admin.py中注册。# 文件路径analysis/admin.py from django.contrib import admin from .models import Category, Product, Order admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display (id, name) admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display (id, name, category, price) list_filter (category,) admin.register(Order) class OrderAdmin(admin.ModelAdmin): list_display (id, order_no, user, product, quantity, amount, status, create_time) list_filter (status,) date_hierarchy create_time注册完成后刷新 Admin 页面就能看到这三个模型的管理入口了。4. 后端查询与统计接口开发4.1 订单列表查询接口系统首页需要展示订单列表同时提供状态筛选。这里我们用一个页面把订单列表和图表放在一起后端只需要提供数据统计接口。打开analysis/views.py编写首页视图和统计接口。# 文件路径analysis/views.py from django.db.models import Sum, Count from django.db.models.functions import TruncDate from django.http import JsonResponse from django.shortcuts import render from .models import Category, Product, Order def index(request): 数据可视化首页 return render(request, analysis/index.html)这里index负责渲染页面。后面的统计接口都返回JsonResponse前端页面通过fetch获取数据后再交给图表库绘制。4.2 聚合统计月度销售趋势销售趋势是电商可视化最核心的图表通常用折线图展示。我们需要按月统计有效订单的“总销售额”和“总订单量”。def trend_data(request): 月度销售趋势销售额 订单量 result ( Order.objects .filter(status__in[已付款, 已发货, 已完成]) .annotate(monthTruncDate(create_time, month)) .values(month) .annotate(total_amountSum(amount), order_countCount(id)) .order_by(month) ) data { months: [item[month].strftime(%Y-%m) for item in result], amounts: [float(item[total_amount]) for item in result], counts: [item[order_count] for item in result], } return JsonResponse(data)这段代码有几个重点TruncDate(create_time, month)把下单时间截断为“月份”这是 Django ORM 中做时间分组的常用方法。values(month)表示按月份分组。Sum(amount)对订单金额求和Count(id)统计订单数量。最后把Decimal类型转成float方便 JSON 序列化。4.3 分类销售占比与热销排行分类销售占比通常用饼图展示核心逻辑是按商品分类分组对订单金额求和。def category_data(request): 商品分类销售额占比 result ( Order.objects .filter(status__in[已付款, 已发货, 已完成]) .values(product__category__name) .annotate(total_amountSum(amount)) .order_by(-total_amount) ) data { categories: [item[product__category__name] for item in result], amounts: [float(item[total_amount]) for item in result], } return JsonResponse(data)这里使用了 Django ORM 的外键跨表查询语法product__category__name。一条查询就完成了“订单 → 商品 → 分类”的关联统计这正是 ORM 相比手写 SQL 更简洁的地方。热销商品排行使用柱状图展示按商品分组统计销售数量并按数量降序取前 10。def hot_product_data(request): 热销商品 Top10 result ( Order.objects .filter(status__in[已付款, 已发货, 已完成]) .values(product__name) .annotate(salesSum(quantity)) .order_by(-sales)[:10] ) data { names: [item[product__name] for item in result], sales: [item[sales] for item in result], } return JsonResponse(data)4.4 接口路由设计在analysis/urls.py中注册路由。# 文件路径analysis/urls.py from django.urls import path from . import views urlpatterns [ path(, views.index, nameindex), path(api/trend/, views.trend_data, nametrend_data), path(api/category/, views.category_data, namecategory_data), path(api/hot/, views.hot_product_data, namehot_product_data), ]然后在config/urls.py中把analysis应用的路由挂载到项目主路由。# 文件路径config/urls.py from django.contrib import admin from django.urls import path, include urlpatterns [ path(admin/, admin.site.urls), path(, include(analysis.urls)), ]到这里后端接口已经完成。可以先用浏览器访问http://127.0.0.1:8000/api/trend/看看是否返回 JSON 数据。如果能看到类似下面的结果说明统计逻辑没问题{ months: [2025-01, 2025-02], amounts: [15200.0, 21000.5], counts: [28, 35] }5. 前端页面与可视化图表展示5.1 页面整体结构前端页面使用 Django 模板 Chart.js。整体布局采用上下结构顶部是统计卡片区域展示总订单量、总销售额、商品总数、分类总数中间是两个图表卡片分别展示“月度销售趋势”和“分类销售占比”下方再放一个“热销商品 Top10”图表和订单列表表格。先创建模板目录然后在templates/analysis/下创建index.html。创建模板目录的命令mkdir -p templates/analysis同时需要在config/settings.py中配置模板路径。Django 项目默认会查找应用下的 templates 目录但为了清晰我习惯在项目根目录统一存放模板。# 文件路径config/settings.py import os TEMPLATES [ { BACKEND: django.template.backends.django.DjangoTemplates, DIRS: [os.path.join(BASE_DIR, templates)], APP_DIRS: True, OPTIONS: { context_processors: [ django.template.context_processors.debug, django.template.context_processors.request, django.contrib.auth.context_processors.auth, django.contrib.messages.context_processors.messages, ], }, }, ]5.2 Chart.js 折线图与饼图Chart.js 是一个轻量的前端图表库通过canvas绘制图表。我们用 CDN 引入它然后使用fetch从后端接口获取数据。页面中图表部分的核心代码如下!-- 文件路径templates/analysis/index.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title网购数据可视化分析系统/title script srchttps://cdn.jsdelivr.net/npm/chart.js4.4.0/dist/chart.umd.min.js/script style body { font-family: Microsoft YaHei, PingFang SC, sans-serif; margin: 0; padding: 20px; background: #f5f7fa; } .container { max-width: 1200px; margin: 0 auto; } .page-title { text-align: center; color: #333; margin-bottom: 20px; } .cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; } .card { background: #fff; border-radius: 10px; padding: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); text-align: center; } .card .num { font-size: 28px; font-weight: bold; color: #2f54eb; } .chart-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 24px; } .chart-box { background: #fff; border-radius: 10px; padding: 20px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); } .chart-box h3 { margin-top: 0; font-size: 16px; color: #333; } canvas { max-height: 320px; } .full-width { grid-column: 1 / -1; } table { width: 100%; border-collapse: collapse; margin-top: 12px; } th, td { padding: 10px; border-bottom: 1px solid #eee; text-align: left; font-size: 14px; } th { background: #fafafa; font-weight: 600; } /style /head body div classcontainer h1 classpage-title网购数据可视化分析系统/h1 div classcards div classcard div总订单量/div div classnum idtotalOrders-/div /div div classcard div总销售额/div div classnum idtotalAmount-/div /div div classcard div商品总数/div div classnum idtotalProducts-/div /div div classcard div分类总数/div div classnum idtotalCategories-/div /div /div div classchart-grid div classchart-box h3月度销售趋势/h3 canvas idtrendChart/canvas /div div classchart-box h3分类销售占比/h3 canvas idcategoryChart/canvas /div div classchart-box full-width h3热销商品 Top10/h3 canvas idhotChart/canvas /div /div /div script // 页面加载完成后请求后端接口并绘制图表 window.addEventListener(DOMContentLoaded, function () { // 加载趋势图 fetch(/api/trend/) .then(res res.json()) .then(data { document.getElementById(totalOrders).textContent data.counts.reduce((a, b) a b, 0); document.getElementById(totalAmount).textContent data.amounts.reduce((a, b) a b, 0).toFixed(2); new Chart(document.getElementById(trendChart), { type: line, data: { labels: data.months, datasets: [ { label: 销售额元, data: data.amounts, borderColor: #2f54eb, backgroundColor: rgba(47, 84, 235, 0.1), yAxisID: y, }, { label: 订单量, data: data.counts, borderColor: #fa8c16, backgroundColor: rgba(250, 140, 22, 0.1), yAxisID: y1, } ] }, options: { responsive: true, interaction: { mode: index, intersect: false }, scales: { y: { type: linear, position: left, }, y1: { type: linear, position: right, grid: { drawOnChartArea: false }, } } } }); }); // 加载分类占比图 fetch(/api/category/) .then(res res.json()) .then(data { new Chart(document.getElementById(categoryChart), { type: pie, data: { labels: data.categories, datasets: [{ data: data.amounts, backgroundColor: [#2f54eb, #fa8c16, #52c41a, #f5222d, #722ed1, #13c2c2], }] }, options: { responsive: true, plugins: { legend: { position: bottom } } } }); }); // 加载热销商品图 fetch(/api/hot/) .then(res res.json()) .then(data { new Chart(document.getElementById(hotChart), { type: bar, data: { labels: data.names, datasets: [{ label: 销售数量, data: data.sales, backgroundColor: #69b1ff }] }, options: { responsive: true, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: true } } } }); }); }); /script /body /html5.3 对接 Django 接口数据前端脚本通过fetch请求三个接口并在拿到数据后生成图表。页面中统计卡片的数据也来源于接口返回的汇总值。这里有几个容易踩坑的地方Chart.js 的 type 要写对折线图是line饼图是pie柱状图是bar。一个 canvas 只能绑定一个图表不要重复调用new Chart绑定到同一个元素。左右双轴图表的y和y1配置要写完整否则图表可能显示空白。如果接口数据为空图表会显示空白且没有报错。所以要先保证数据再检查图标。建议在 Admin 后台多录入几条不同月份、不同分类的订单数据这样图表展示效果会好看很多。6. 系统运行与效果验证6.1 启动项目和初始化数据在项目根目录执行python manage.py runserver浏览器访问http://127.0.0.1:8000/应该能看到系统首页。如果首页没有图表数据按照下面的顺序排查检查 MySQL 数据库中是否已经有订单数据。访问http://127.0.0.1:8000/api/trend/看是否返回 JSON 数组。打开浏览器开发者工具的 Network 面板看接口请求是否报错。6.2 页面功能说明系统首页分为上下几个区域顶部统计卡片展示总订单量、总销售额、商品总数、分类总数数据来自趋势接口的汇总。月度销售趋势折线图横向是月份左侧纵轴是销售额右侧纵轴是订单量。分类销售占比饼图展示不同商品分类的销售额占比情况。热销商品 Top10 柱状图按销售数量降序排列展示最受欢迎的前 10 个商品。这套页面结构已经覆盖了“数据分析”“可视化展示”两个核心要求如果需要更加完整可以在后面继续增加订单列表表格、用户消费排行等模块。6.3 数据可视化效果验证常见验证思路是如果“月度销售趋势”中某个月份的数据明显高于其他月份可以准备一些对应的业务解释比如“6 月有平台大促订单量明显上涨”。在课设或者毕设答辩中这种结合数据的解释能力非常加分因为说明你不仅会写代码还能理解业务数据背后的含义。7. 常见问题与排查思路很多同学第一次配置 Django MySQL 时会遇到各种报错。下面把高频问题整理成表格方便快速对照解决。问题现象常见原因解决思路执行 migrate 报Unknown database shop_analysisMySQL 中还没有创建数据库先用命令行或图形工具创建数据库再执行 migrate连接 MySQL 报ModuleNotFoundError: No module named MySQLdb没有安装 mysqlclient 或 PyMySQL安装 mysqlclient或安装 PyMySQL 并添加初始化代码中文数据显示乱码数据库编码不是 utf8mb4创建数据库时指定DEFAULT CHARACTER SET utf8mb4页面图表空白接口没有返回数据或请求路径错误先访问接口地址确认返回 JSON再检查前端 fetch 路径启动项目时报port 8000 is already in use8000 端口被占用改用其他端口如python manage.py runserver 8001Admin 后台没有录入菜单模型没有注册到 admin.py在analysis/admin.py中注册模型删除商品时报保护错误on_deletemodels.PROTECT限制了删除有订单的商品先处理关联订单再删除商品或者改为 CASCADE如果你在 Windows 下安装mysqlclient时出现error: Microsoft Visual C 14.0 is required的报错这是常见的编译环境问题。解决办法有两种一是安装 Visual C Build Tools二是改用它人编译好的 wheel 包。如果是课设或者毕设为了省时间更推荐直接使用 PyMySQL 方案pip install pymysql然后在config/__init__.py中加入import pymysql pymysql.install_as_MySQLdb()这种方式不需要编译 C 扩展兼容性更好适合新手快速跑通项目。8. 课设毕设答辩重点与扩展建议8.1 答辩时怎么讲系统答辩环节老师喜欢问的问题通常集中在几个方向项目架构、数据库设计、统计逻辑、图表实现。准备答辩时可以按下面的思路组织讲解。第一先讲项目背景和功能模块。明确告诉老师这是一个基于 Django MySQL 的网购数据可视化分析系统主要功能包括订单管理、销售趋势分析、分类占比、热销商品排行。第二重点讲数据库设计。说明分类、商品、订单三张表之间的外键关系以及为什么订单状态用枚举而不是自由输入。老师很看重数据表设计的合理性。第三讲统计接口的实现。直接切换到/api/trend/接口展示返回的 JSON再结合views.py中的TruncDate和annotate说明 Django ORM 的分组聚合逻辑。第四展示页面图表。把项目跑起来用真实数据演示折线图、饼图、柱状图的效果。可以提前准备一份数据量较大的测试数据让图表看起来更有说服力。如果老师问“你还能扩展哪些分析功能”可以回答增加用户行为分析、地区销售地图、商品价格区间分析、订单状态转化漏斗图等方向。一句话就能体现你理解系统的扩展边界。8.2 功能扩展方向这套系统目前已经涵盖了数据可视化分析系统的基本功能。如果你想把它做得更完整或者想把课设做到“良好”以上的水平可以考虑增加下面几个功能。第一个方向是用户分析。目前系统里已经通过外键关联了 Django 自带的 User 表可以增加一个“用户消费排行”接口按用户分组统计累计消费金额。这个功能实现成本很低但对系统的完整度提升很明显。def user_rank_data(request): 用户消费排行 result ( Order.objects .filter(status__in[已付款, 已发货, 已完成]) .values(user__username) .annotate(total_amountSum(amount), order_countCount(id)) .order_by(-total_amount)[:10] ) return JsonResponse({ users: [item[user__username] for item in result], amounts: [float(item[total_amount]) for item in result], })第二个方向是订单状态分析。用饼图展示不同订单状态的占比例如已付款、已发货、已完成、已取消各占多少。这个分析维度在电商场景中非常常见可以作为系统的第三个饼图。第三个方向是数据导入导出。现在数据录入依赖 Django Admin可以增加一个 CSV 导入功能从文件批量导入订单数据。再增加一个导出功能把统计结果导出为 Excel 报告方便汇报。第四个方向是用户登录鉴权。目前系统首页是公开的可以引入 Django 的LoginRequiredMixin要求用户登录后才能查看数据。这个功能可以展示你对认证和安全的掌握。第五个方向是前端升级。如果时间充裕可以把页面框架替换为 Vue 3 ECharts 的分离式架构Django 只提供 JSON API。但这种方案工作量大适合有一定前端基础的同学。如果课设只用 Django 模板渲染也能满足要求重点在于把基础功能做扎实。8.3 源码获取与项目整理建议这套系统的完整源码我已经整理好包含全部模型代码、统计接口、前端模板和初始化脚本。有需要的同学可以私信我获取。拿到源码之后建议不要直接交源码而是做下面几件事把settings.py里的数据库密码改成自己的密码。在 Admin 后台重新录入一份符合你自己主题的测试数据。改页面标题加入你名字或学号信息。至少新增一个统计图表或分析页面让系统明显区别于原版源码。经常有同学问“源码直接提交会不会被老师发现”实际上源码本身不是问题问题在于有没有消化理解。建议把系统跑通之后自己动手改一个功能点比如把月度趋势改成周度趋势或者把热销商品从 Top10 改成 Top5。一旦你操作过一遍答辩时无论老师怎么问代码你都能答上来。如果你在搭建过程中卡在某一步可以重点检查两个位置一是DATABASES配置是否正确二是模型和数据库是否完成迁移。这两个位置解决了系统基本就能跑起来。数据可视化分析系统的开发并不复杂关键是耐心把每一步跑通然后基于实际数据去理解分析逻辑。希望这套 Django MySQL 的完整案例能帮你顺利通过课设或毕设。