十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Django商城系统毕业设计:商品、订单、库存与部署实战

Django商城系统毕业设计:商品、订单、库存与部署实战 简介这份资源是一篇完整的本科毕业设计论文文档面向计算机相关专业需要完成购物商城系统类毕设的学生以及想学习 Python Web 开发全流程的初学者。论文以 Python 语言结合 Django 框架为主线采用 MySQL 数据库与 B/S 结构完整记录了从需求分析、系统设计到编码测试的全过程。压缩包内共 1 个 docx 文件约 6.82MB即论文正文本身包含摘要、目录、系统开发技术、需求分析、系统设计、数据库设计与功能实现等章节可直接作为撰写参考或答辩材料。论文重点梳理了管理员与用户两种角色的交互流程管理员侧覆盖系统管理、订单管理、商品类别管理、热卖商品管理用户侧涵盖个人中心、用户管理、投诉建议等模块并对 Python 跨平台特性、Django 框架工具库、MySQL 关系型数据库与 B/S 架构做了介绍。目前已有 320 人学习下载适合需要快速搭建毕设框架、理清模块划分与论文结构的学习者参考借鉴。1. 从一个毕业论文选题说起Django 商城系统到底要做哪些模块很多人看到「pythondjango网上购物商城系统毕业论文.docx」这个标题第一反应是去找一份现成源码交差但真正动手写论文的人会发现答辩老师最先问的不是「用了什么框架」而是「你的商品、订单、库存三者怎么保证一致」。这就是选题的分水岭一份能过答辩的 Django 商城系统核心不是页面好不好看而是商品、购物车、订单、支付和后台管理这几条链路能不能串起来。Django 之所以常被选作这类论文的技术底座原因很实在自带 ORM、自带 admin 后台、自带用户认证一个python manage.py startapp就能把业务拆开。对本科生来说它能把精力放在业务建模上而不是重复写数据库连接和登录逻辑。适合的人群也很明确——正在准备计算机相关专业毕业论文、需要一套可演示、可讲清楚业务流程的商城系统的人以及想用 Django 练手完整 CRUD 到订单流的入门开发者。后面的内容按「环境搭起来 → 模型设计 → 核心功能实现 → 部署排错」这条线走每一步都给能直接跑的命令和代码。2. Django 网上购物商城的环境搭建与项目骨架2.1 Python 安装与虚拟环境配置Windows 或 Linux 都一样先确认 Python 版本。Django 4.2 及以上建议 Python 3.9 起步命令行执行python --version # 期望输出 Python 3.10.x 或更高 pip install django4.2.7 pip install mysqlclient如果mysqlclient在 Windows 上编译失败换成pymysql并在__init__.py里补一行注册这是很常见的做法# 项目同名包下的 __init__.py import pymysql pymysql.install_as_MySQLdb()虚拟环境不要省论文里也建议写进去python -m venv venv之后激活再装依赖。这样答辩演示时不会因为机器上其他包版本冲突导致跑不起来。2.2 用 django-admin 创建项目与 app 划分django-admin startproject shop . python manage.py startapp goods python manage.py startapp cart python manage.py startapp orders python manage.py startapp usersshop是配置和路由总入口goods管商品分类和商品cart管购物车orders管订单users管用户扩展信息。这样拆分的好处是论文里的模块图能直接对应代码目录写设计章节时不用硬凑。在settings.py里注册应用并配置数据库INSTALLED_APPS [ # ... 默认应用 goods, cart, orders, users, ] DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: shop_db, USER: root, PASSWORD: your_password, HOST: 127.0.0.1, PORT: 3306, } }参数说明ENGINE固定写 MySQL 后端NAME是提前建好的库名HOST用 127.0.0.1 比 localhost 更稳避免部分环境解析到 IPv6 造成连接失败。数据库先手动建好Django 不会替你建库。2.3 MTV 模式在商城项目里的落点热搜里常有人问「django 之 mtv 模式的 mtv 有什么作用」放到商城场景很好解释Model 对应商品、订单这些表Template 对应列表页、详情页、购物车页View 接收请求、查数据、返回渲染结果。用户下单时View 先校验库存再写 Order 和 OrderItem最后扣减库存这一串就是 MTV 里 V 承担的业务编排。层商城中的典型文件作用Modelgoods/models.py定义商品、分类表结构Vieworders/views.py处理下单、支付回调Templatetemplates/goods/list.html商品列表渲染URLshop/urls.py路由分发理清这层对应关系后写论文的需求分析和详细设计章节就有了骨架不会堆砌概念。3. 商品、购物车、订单的模型设计与数据库落地3.1 商品与分类模型的关键字段# goods/models.py from django.db import models class Category(models.Model): name models.CharField(max_length50, verbose_name分类名) parent models.ForeignKey(self, nullTrue, blankTrue, on_deletemodels.CASCADE, related_namechildren) def __str__(self): return self.name class Goods(models.Model): category models.ForeignKey(Category, on_deletemodels.CASCADE) name models.CharField(max_length100) price models.DecimalField(max_digits10, decimal_places2) stock models.IntegerField(default0) image models.ImageField(upload_togoods/, blankTrue) is_on_sale models.BooleanField(defaultTrue) created models.DateTimeField(auto_now_addTrue)逻辑说明Category用自关联parent实现多级分类商城里常见的一级、二级分类靠它解决。price必须用DecimalField浮点数存价格会出现精度问题这是新手最容易踩的坑。stock是库存字段下单时要配合F表达式做原子扣减。3.2 购物车与订单表的关联设计购物车有两种常见做法存 session 或存数据库。论文演示建议存数据库方便画 E-R 图。# cart/models.py class CartItem(models.Model): user models.ForeignKey(auth.User, on_deletemodels.CASCADE) goods models.ForeignKey(goods.Goods, on_deletemodels.CASCADE) quantity models.IntegerField(default1) added models.DateTimeField(auto_now_addTrue)订单表拆成主表和明细表这是订单系统最基本的范式# orders/models.py class Order(models.Model): STATUS ((unpaid, 待支付), (paid, 已支付), (done, 已完成)) user models.ForeignKey(auth.User, on_deletemodels.CASCADE) order_no models.CharField(max_length32, uniqueTrue) total models.DecimalField(max_digits10, decimal_places2) status models.CharField(max_length10, choicesSTATUS, defaultunpaid) created models.DateTimeField(auto_now_addTrue) class OrderItem(models.Model): order models.ForeignKey(Order, related_nameitems, on_deletemodels.CASCADE) goods models.ForeignKey(goods.Goods, on_deletemodels.CASCADE) price models.DecimalField(max_digits10, decimal_places2) quantity models.IntegerField()OrderItem里单独存一份price是有意为之商品价格会变订单必须记录下单时的价格否则历史订单金额会错乱。3.3 迁移与数据初始化命令模型写完后执行迁移把表结构同步到 MySQLpython manage.py makemigrations python manage.py migrate python manage.py createsuperuser参数说明makemigrations生成迁移文件migrate真正建表createsuperuser建后台账号。改过模型字段后必须重新跑前两条只改代码不迁移页面会报字段不存在的错误。3.4 用 Django admin 快速搭出商品后台在goods/admin.py注册模型论文里的「后台管理模块」就基本成型from django.contrib import admin from .models import Category, Goods admin.register(Goods) class GoodsAdmin(admin.ModelAdmin): list_display (name, category, price, stock, is_on_sale) list_filter (is_on_sale, category) search_fields (name,)list_display控制列表页展示列list_filter加右侧筛选search_fields支持按商品名搜索。这样电商后台常见的商品上下架、库存查看就直接可用不用自己写增删改查页面。4. 商城核心功能商品查询、购物车与下单流程4.1 商品列表与筛选查询的视图实现# goods/views.py from django.shortcuts import render from django.core.paginator import Paginator from .models import Goods, Category def goods_list(request): category_id request.GET.get(category) keyword request.GET.get(kw, ) qs Goods.objects.filter(is_on_saleTrue) if category_id: qs qs.filter(category_idcategory_id) if keyword: qs qs.filter(name__icontainskeyword) paginator Paginator(qs.order_by(-created), 12) page paginator.get_page(request.GET.get(page)) return render(request, goods/list.html, {page: page, categories: Category.objects.all()})逻辑说明icontains做模糊匹配适合商品名搜索Paginator每页 12 条翻页参数取page。查询条件通过 GET 传递这样筛选后的 URL 可分享也利于调试。热搜里提到的「python筛选一样的」其实就是这类过滤逻辑用filter链式调用即可。4.2 加入购物车与库存校验# cart/views.py from django.contrib.auth.decorators import login_required from django.shortcuts import redirect from .models import CartItem from goods.models import Goods login_required def add_to_cart(request, goods_id): if request.method POST: num int(request.POST.get(num, 1)) goods Goods.objects.get(idgoods_id) if num goods.stock: return redirect(/goods/%d/?errstock % goods_id) item, created CartItem.objects.get_or_create( userrequest.user, goodsgoods, defaults{quantity: num}) if not created: item.quantity num item.save() return redirect(/cart/)get_or_create保证同一商品只保留一条购物车记录已存在时累加数量。加购前先比较库存这是简单但有效的防护避免用户加购超过库存数量的商品。4.3 提交订单与事务扣减库存下单是整个系统最容易出问题的地方必须放在事务里并用F表达式避免并发超卖# orders/views.py import uuid from django.db import transaction from django.db.models import F from cart.models import CartItem from .models import Order, OrderItem from goods.models import Goods transaction.atomic def create_order(request): items CartItem.objects.filter(userrequest.user).select_related(goods) total sum(i.goods.price * i.quantity for i in items) order Order.objects.create( userrequest.user, order_nouuid.uuid4().hex[:16], totaltotal) for i in items: # 条件更新只有库存足够时才扣减成功 updated Goods.objects.filter( idi.goods_id, stock__gtei.quantity ).update(stockF(stock) - i.quantity) if not updated: raise ValueError(库存不足: %s % i.goods.name) OrderItem.objects.create(orderorder, goodsi.goods, pricei.goods.price, quantityi.quantity) items.delete() return order逻辑说明transaction.atomic保证扣库存和建订单要么全成功要么全回滚。filter(stock__gtei.quantity).update(...)是条件原子更新两个用户同时抢最后一件库存时只有一个能成功另一个更新影响行数为 0直接抛异常回滚。这就是防超卖的关键比先查库存再更新靠谱得多。订单号用uuid4().hex[:16]生成避免自增 ID 暴露业务量也方便论文里讲订单编号规则。4.4 订单查询与取消涉及的对象删除热搜里有「django执行查询-删除对象」订单模块正好用得上。用户取消待支付订单时需要删除订单明细并回补库存# orders/views.py transaction.atomic def cancel_order(request, order_id): order Order.objects.get(idorder_id, userrequest.user, statusunpaid) for item in order.items.all(): Goods.objects.filter(iditem.goods_id).update(stockF(stock) item.quantity) order.items.all().delete() # 级联删除明细 order.delete()order.items.all().delete()走的是查询集批量删除比循环单条删快。回补库存用F表达式更新避免读改写带来的并发问题。注意只允许取消unpaid状态订单已支付订单要走退款流程不能直接删。功能视图函数关键点商品筛选goods_listfilter 链式 分页加入购物车add_to_cartget_or_create 去重提交订单create_order事务 F 表达式取消订单cancel_order回补库存 级联删除5. 用 waitressnginx 部署与常见报错排查5.1 Windows 环境下的 waitress 启动论文演示常在本机跑不建议用runserver对外。Windows 上用 waitress 替代更稳pip install waitress waitress-serve --listen0.0.0.0:8000 shop.wsgi:application参数说明--listen指定监听地址和端口shop.wsgi:application是 WSGI 入口对应shop/wsgi.py里的 application 对象。启动前把settings.py里DEBUG False并配置好ALLOWED_HOSTS否则会报 DisallowedHost。5.2 nginx 反向代理与静态文件nginx 配置核心是转发动态请求、直接托管 staticserver { listen 80; server_name localhost; location /static/ { alias D:/shop/static/; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }逻辑说明静态文件交给 nginx 直接返回减少 waitress 压力动态请求proxy_pass转给后端。上线前必须执行python manage.py collectstatic把各 app 的静态文件集中到STATIC_ROOT否则页面样式会 404。5.3 部署后高频报错对照报错现象常见原因处理方式DisallowedHostALLOWED_HOSTS 未配加入域名或 IP静态文件 404未 collectstatic执行收集命令数据库连接被拒账号密码或端口错检查 DATABASES500 无堆栈DEBUGFalse查日志或临时开 DEBUG排错顺序建议先看 nginx 错误日志确认请求有没有到后端再看 waitress 控制台输出最后查 Django 日志。三层逐级看能快速定位是代理层、应用层还是数据库层的问题。6. 让论文加分用 Django ORM 做销量统计与性能优化商城系统答辩时老师很爱问「首页销量排行怎么实现」。用 ORM 聚合一步到位# goods/views.py from django.db.models import Sum from orders.models import OrderItem def hot_goods(): return (OrderItem.objects .values(goods__name) .annotate(totalSum(quantity)) .order_by(-total)[:5])逻辑说明values按商品名分组annotate配合Sum求销量合计order_by(-total)降序取前五。这条查询只打一次数据库比循环统计高效得多也是论文里能体现 ORM 掌握程度的写法。商品列表页容易出 N1 查询列表展示分类名时用select_related一次性把外键查出来qs Goods.objects.select_related(category).filter(is_on_saleTrue)热门商品可以再用 Django 缓存框架缓存 5 分钟避免每次刷新都聚合全表from django.core.cache import cache def get_hot_goods(): data cache.get(hot_goods) if data is None: data list(hot_goods()) cache.set(hot_goods, data, 300) # 缓存 300 秒 return data参数说明cache.set第三个参数是超时秒数设成 300 表示 5 分钟。缓存键命名要能看出含义方便后续清理。一个容易被忽略的技巧用assertNumQueries在测试里卡住查询数量防止后续改代码时无意引入 N1from django.test import TestCase class QueryTest(TestCase): def test_list_queries(self): with self.assertNumQueries(2): list(Goods.objects.select_related(category)[:10])把它写进论文的测试章节比单纯说「系统运行正常」有说服力得多。本文还有配套的精品资源点击获取
返回列表