☰
基于Django的的美妆商城系统设计与实现
2026/10/15 3:19:34 网站建设 项目流程

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!

一、 项目背景与意义

随着电子商务的蓬勃发展,线上美妆市场已成为一个规模庞大且增长迅速的领域。消费者对美妆产品的需求日益多样化、个性化,对购物体验也提出了更高要求。传统的电商平台虽然功能齐全,但往往缺乏针对美妆行业的深度定制和精细化运营能力。

因此,设计与实现一个基于Django的美妆商城系统具有重要的现实意义:

  • 满足垂直领域需求:针对美妆产品(如护肤品、彩妆、香水)的特性,设计专属的商品属性(如肤质、色号、功效)、分类体系和内容展示。
  • 提升用户体验:通过清晰的导航、专业的商品详情(含成分表、使用教程)、用户评价与晒单、个性化推荐等功能,帮助用户高效决策。
  • 赋能商家运营:为商家提供完善的商品管理、订单处理、促销活动(如满减、优惠券、秒杀)、数据分析等后台工具。
  • 技术实践价值:作为全栈Web项目,它涵盖了从需求分析、数据库设计、后端API开发、前端交互到部署上线的完整流程,是学习Django框架和电商系统开发的优秀案例。

二、 技术栈选型

本系统采用经典且高效的Python Web技术栈,确保开发效率、可维护性和系统性能。

1. 后端技术栈

  • 核心框架:Django 3.2+ / 4.x。选择Django因其“开箱即用”的特性,内置强大的ORM、Admin后台、用户认证、表单处理和安全防护,能极大加速开发。
  • 数据库:PostgreSQL / MySQL。关系型数据库,用于存储用户、商品、订单等核心结构化数据。Django ORM支持无缝切换。
  • 缓存:Redis。用于缓存热点数据(如首页商品、秒杀库存)、存储用户会话(Session)以及作为Celery的消息代理。
  • 异步任务:Celery + Redis/RabbitMQ。处理耗时操作,如发送注册邮件、生成订单报表、清理过期购物车等。
  • 搜索引擎(可选):Elasticsearch / Django-haystack。用于实现商品的高效、复杂全文检索。
  • 对象存储:云服务(如阿里云OSS、腾讯云COS)或本地存储。用于存储用户上传的商品图片、头像等静态资源。
  • API开发:Django REST framework (DRF)。若计划开发移动端或前后端分离,DRF是构建RESTful API的首选。

2. 前端技术栈

  • 模板引擎:Django Template。用于服务端渲染,快速构建页面。
  • UI框架:Bootstrap 5。提供响应式布局和基础组件,保证界面美观与一致性。
  • 交互增强:jQuery / 原生JavaScript。处理表单验证、AJAX请求、动态加载等前端交互。
  • 前端工程化(可选):Webpack / Vite。用于管理CSS预处理器(如Sass)、JavaScript模块打包。

3. 开发与部署

  • 版本控制:Git。
  • 依赖管理:pip + requirements.txt 或 Poetry。
  • 容器化(可选):Docker + Docker Compose。实现环境标准化,便于部署。
  • 部署:Nginx + Gunicorn/uWSGI。经典Python Web部署方案。
  • CI/CD(可选):GitHub Actions / GitLab CI。自动化测试与部署。

三、 系统核心功能模块设计

系统主要分为用户端和管理后台两大门户。

1. 用户端核心功能

  • 用户中心:注册/登录(含手机/邮箱验证)、个人信息管理、收货地址管理、密码修改。
  • 商品系统:商品分类浏览、品牌筛选、搜索(关键词/高级筛选)、商品详情页(多图轮播、规格选择、详情图文、用户评价)。
  • 购物流程:购物车管理(增删改查)、结算页面(地址选择、优惠券使用)、订单创建与支付(集成支付宝/微信支付)、订单列表与详情、物流跟踪。
  • 内容与互动:商品收藏、评价与晒单、咨询客服、促销活动专区(秒杀、拼团)。
  • 个性化:浏览历史、猜你喜欢推荐。

2. 管理后台核心功能

  • 仪表盘:核心数据概览(销售额、订单数、用户增长)。
  • 商品管理:商品SPU/SKU的增删改查、库存管理、上下架、分类与品牌管理。
  • 订单管理:订单列表、详情查看、发货、退款/售后处理。
  • 用户管理:用户列表、禁用/启用、查看用户行为。
  • 营销管理:优惠券创建与发放、秒杀活动设置、广告位管理。
  • 系统管理:管理员账号与权限管理、操作日志。

四、 数据库核心模型设计示例

以下是几个核心Django Model的简化示例,展示了关键字段和关系。

# models.py from django.db import models from django.contrib.auth.models import AbstractUser 1. 扩展用户模型 class User(AbstractUser): phone = models.CharField(max_length=11, unique=True, verbose_name='手机号') avatar = models.ImageField(upload_to='avatars/', null=True, blank=True, verbose_name='头像') gender = models.CharField(max_length=1, choices=(('M', '男'), ('F', '女')), blank=True) class Meta: db_table = 'user' verbose_name = '用户' verbose_name_plural = verbose_name 2. 商品分类 class Category(models.Model): name = models.CharField(max_length=50, verbose_name='分类名') parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name='父分类') is_nav = models.BooleanField(default=False, verbose_name='是否显示在导航栏') class Meta: db_table = 'category' verbose_name = '商品分类' verbose_name_plural = verbose_name def str(self): return self.name 3. 商品SPU(标准产品单位) class Product(models.Model): name = models.CharField(max_length=200, verbose_name='商品名称') category = models.ForeignKey(Category, on_delete=models.PROTECT, verbose_name='所属分类') brand = models.ForeignKey('Brand', on_delete=models.SET_NULL, null=True, verbose_name='品牌') main_image = models.ImageField(upload_to='products/', verbose_name='主图') price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格') stock = models.PositiveIntegerField(default=0, verbose_name='库存') sales = models.PositiveIntegerField(default=0, verbose_name='销量') is_on_sale = models.BooleanField(default=True, verbose_name='是否上架') created_time = models.DateTimeField(auto_now_add=True) updated_time = models.DateTimeField(auto_now=True) class Meta: db_table = 'product' verbose_name = '商品' verbose_name_plural = verbose_name def str(self): return self.name 4. 商品SKU(库存量单位,如不同色号、容量) class ProductSKU(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='skus') sku_code = models.CharField(max_length=50, unique=True, verbose_name='SKU编码') attributes = models.JSONField(default=dict, verbose_name='规格属性') # 如 {"color": "珊瑚橘", "size": "30ml"} price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格') stock = models.PositiveIntegerField(default=0, verbose_name='库存') class Meta: db_table = 'product_sku' verbose_name = '商品SKU' verbose_name_plural = verbose_name 5. 购物车 class Cart(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='用户') sku = models.ForeignKey(ProductSKU, on_delete=models.CASCADE, verbose_name='商品SKU') count = models.PositiveIntegerField(default=1, verbose_name='数量') selected = models.BooleanField(default=True, verbose_name='是否选中') created_time = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'cart' unique_together = ('user', 'sku') # 同一用户同一SKU只存一条 verbose_name = '购物车' verbose_name_plural = verbose_name 6. 订单 class Order(models.Model): ORDER_STATUS = ( (1, '待支付'), (2, '待发货'), (3, '已发货'), (4, '已完成'), (5, '已取消'), (6, '售后中'), ) order_no = models.CharField(max_length=64, unique=True, verbose_name='订单号') user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='用户') total_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='订单总金额') pay_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='实付金额') status = models.SmallIntegerField(choices=ORDER_STATUS, default=1, verbose_name='订单状态') address = models.ForeignKey('UserAddress', on_delete=models.PROTECT, verbose_name='收货地址') created_time = models.DateTimeField(auto_now_add=True) pay_time = models.DateTimeField(null=True, blank=True, verbose_name='支付时间') class Meta: db_table = 'order' verbose_name = '订单' verbose_name_plural = verbose_name def str(self): return self.order_no

五、 核心业务逻辑代码示例

1. 用户注册与登录

# views.py (基于Django内置视图简化) from django.contrib.auth import login, authenticate from django.contrib.auth.forms import UserCreationForm from django.shortcuts import render, redirect def register_view(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): user = form.save() login(request, user) # 注册后自动登录 return redirect('index') else: form = UserCreationForm() return render(request, 'registration/register.html', {'form': form}) def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('index') else: # 返回错误信息 pass return render(request, 'registration/login.html')

2. 商品加入购物车

# cart/views.py from django.shortcuts import get_object_or_404 from django.http import JsonResponse from django.views.decorators.http import require_POST from .models import Cart, ProductSKU @require_POST def add_to_cart(request): """AJAX接口:添加商品到购物车""" sku_id = request.POST.get('sku_id') count = int(request.POST.get('count', 1)) user = request.user if not user.is_authenticated: return JsonResponse({'code': 401, 'msg': '请先登录'}) sku = get_object_or_404(ProductSKU, id=sku_id) # 检查库存 if sku.stock < count: return JsonResponse({'code': 400, 'msg': '库存不足'}) 查找或创建购物车项 cart_item, created = Cart.objects.get_or_create( user=user, sku=sku, defaults={'count': count} ) if not created: # 如果已存在,增加数量(需再次检查库存) new_count = cart_item.count + count if sku.stock < new_count: return JsonResponse({'code': 400, 'msg': '库存不足'}) cart_item.count = new_count cart_item.save() return JsonResponse({'code': 200, 'msg': '添加成功', 'cart_count': user.cart_set.count()})

3. 创建订单

# order/views.py import uuid from django.db import transaction from django.shortcuts import get_object_or_404 from .models import Order, OrderItem from cart.models import Cart from user.models import UserAddress @transaction.atomic def create_order(request): """创建订单(简化版,忽略优惠券、运费等)""" user = request.user address_id = request.POST.get('address_id') cart_ids = request.POST.getlist('cart_ids') # 选中的购物车项ID # 1. 验证地址 address = get_object_or_404(UserAddress, id=address_id, user=user) 2. 获取选中的购物车项并锁定库存 cart_items = Cart.objects.filter(id__in=cart_ids, user=user, selected=True).select_related('sku') if not cart_items: return JsonResponse({'code': 400, 'msg': '未选择商品'}) 3. 生成唯一订单号 order_no = uuid.uuid4().hex[:20].upper() 4. 计算总金额,并预扣库存 total_amount = 0 order_items = [] for item in cart_items: sku = item.sku if sku.stock < item.count: raise Exception(f'商品 {sku.product.name} 库存不足') # 预扣库存(实际生产环境需更严谨的锁机制,如Redis分布式锁) sku.stock -= item.count sku.save() total_amount += sku.price * item.count order_items.append(OrderItem( order=None, # 稍后关联 sku=sku, price=sku.price, count=item.count )) 5. 创建订单 order = Order.objects.create( order_no=order_no, user=user, total_amount=total_amount, pay_amount=total_amount, # 暂不考虑优惠 status=1, # 待支付 address=address ) 6. 批量创建订单项 for oi in order_items: oi.order = order OrderItem.objects.bulk_create(order_items) 7. 清空已结算的购物车项 cart_items.delete() return JsonResponse({'code': 200, 'msg': '订单创建成功', 'order_no': order_no})

六、 总结与展望

本文介绍了基于Django的美妆商城系统的技术栈选型、核心功能设计以及关键代码实现。该系统充分利用了Django框架的高效与安全特性,结合现代Web开发实践,能够构建一个功能完备、体验良好的垂直电商平台。

后续可扩展方向包括:

  • 微服务化:将用户、商品、订单、支付等模块拆分为独立服务。
  • 引入更智能的推荐系统:基于用户行为和商品属性进行协同过滤或深度学习推荐。
  • 强化移动端:开发React Native或Flutter移动App,并通过DRF提供API。
  • 提升性能与高可用:引入CDN、数据库读写分离、负载均衡等架构优化。

通过此项目的实践,开发者不仅能掌握Django全栈开发技能,更能深入理解电商系统的业务逻辑与架构设计,为构建更复杂的商业应用打下坚实基础。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询