一、 项目背景与意义

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

因此,设计与实现一个基于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全栈开发技能,更能深入理解电商系统的业务逻辑与架构设计,为构建更复杂的商业应用打下坚实基础。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐