1. 项目概述:Django+Vue全栈球鞋商城架构设计
这个全栈电商项目采用了经典的前后端分离架构,后端使用Django框架提供RESTful API服务,前端则基于Vue.js构建单页面应用。不同于传统的Django模板渲染方式,这种架构让前后端开发完全解耦,特别适合需要快速迭代的电商系统。
我选择Django作为后端主要考虑到其完善的ORM系统和admin后台。对于球鞋商城这类需要频繁进行商品CRUD操作的项目,Django Admin可以零代码生成完善的管理界面。而Vue的响应式特性和组件化开发模式,则完美匹配电商前端频繁的状态更新需求。
2. 技术栈选型与核心组件
2.1 后端技术栈配置
后端采用Python3.8+Django3.2组合,这是目前最稳定的生产环境搭配。关键依赖包包括:
python复制# requirements.txt核心配置
djangorestframework==3.12.4 # REST API支持
django-cors-headers==3.7.0 # 跨域处理
pillow==8.3.1 # 图片处理
django-filter==2.4.0 # 商品筛选
redis==3.5.3 # 缓存和celery依赖
数据库使用MySQL5.7,相比SQLite更适合电商场景的高并发需求。项目结构采用Django推荐的分app设计:
code复制├── sneaker_shop
│ ├── products # 商品模块
│ ├── orders # 订单模块
│ ├── users # 用户模块
│ └── payments # 支付模块
2.2 前端技术栈配置
前端采用Vue3+TypeScript组合,主要依赖包括:
bash复制npm install
vue-router@4 # 路由管理
axios@0.21 # HTTP请求
vuex@4 # 状态管理
element-plus@1.1 # UI组件库
特别配置了vue-devtools调试工具,这对复杂电商页面的状态追踪至关重要。通过vscode的Vue插件,可以获得更好的代码提示支持。
3. 核心功能模块实现
3.1 商品展示系统设计
商品模块采用Django REST Framework的ModelViewSet实现API:
python复制class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.select_related('brand')
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['brand', 'size', 'price_range']
@action(detail=True, methods=['post'])
def add_to_cart(self, request, pk=None):
# 购物车逻辑
前端通过axios获取商品数据,使用vuex进行状态管理:
javascript复制// store/modules/products.js
const actions = {
async fetchProducts({ commit }, filters) {
const { data } = await api.get('/api/products/', { params: filters })
commit('SET_PRODUCTS', data)
}
}
3.2 购物车与订单系统
购物车采用本地存储+vuex双重方案,未登录用户也能暂存商品:
javascript复制// 购物车核心逻辑
addToCart({ state, commit }, product) {
const cartItem = state.cart.find(item => item.id === product.id)
if (cartItem) {
commit('INCREMENT_QUANTITY', cartItem)
} else {
commit('ADD_TO_CART', { ...product, quantity: 1 })
}
localStorage.setItem('cart', JSON.stringify(state.cart))
}
订单系统特别注意并发控制,使用Django的select_for_update:
python复制# orders/views.py
@transaction.atomic
def create_order(request):
product = Product.objects.select_for_update().get(id=product_id)
if product.stock < quantity:
raise ValidationError("库存不足")
product.stock -= quantity
product.save()
# 创建订单逻辑
4. 项目部署与优化实践
4.1 云服务器部署方案
推荐使用Ubuntu20.04+宝塔面板的组合部署:
- 安装Python环境管理:
bash复制sudo apt install python3-pip python3-venv
- 配置Nginx反向代理:
nginx复制location /api {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
location / {
root /var/www/vue-dist;
try_files $uri $uri/ /index.html;
}
- 使用Gunicorn管理Django进程:
bash复制gunicorn --workers 3 --bind unix:/tmp/gunicorn.sock sneaker_shop.wsgi:application
4.2 性能优化要点
- 数据库优化:
python复制# 使用select_related减少查询
Product.objects.select_related('brand').prefetch_related('images')
- 缓存策略:
python复制# settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
}
}
- 前端懒加载:
vue复制<template>
<img v-lazy="product.image" alt="球鞋图片">
</template>
5. 开发中的典型问题与解决方案
5.1 跨域会话保持问题
前后端分离项目常见的跨域认证问题,解决方案:
python复制# settings.py
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"https://your-domain.com",
"http://localhost:8080"
]
SESSION_COOKIE_SAMESITE = 'None'
SESSION_COOKIE_SECURE = True
前端axios需要配置withCredentials:
javascript复制axios.defaults.withCredentials = true
5.2 图片上传与处理
使用Django的FileField配合Pillow进行图片处理:
python复制# models.py
def product_image_path(instance, filename):
return f'products/{instance.product.id}/{filename}'
class ProductImage(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
image = models.ImageField(upload_to=product_image_path)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.image:
img = Image.open(self.image.path)
if img.height > 800 or img.width > 800:
output_size = (800, 800)
img.thumbnail(output_size)
img.save(self.image.path)
前端使用FormData上传:
javascript复制const formData = new FormData()
formData.append('image', file)
await api.post('/api/upload/', formData, {
headers: { 'Content-Type': 'multipart/form-data' }
})
6. 项目扩展与进阶方向
6.1 支付系统集成
以支付宝为例的支付流程实现:
- 后端生成支付参数:
python复制def create_payment(order):
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=settings.ALIPAY_NOTIFY_URL,
sign_type="RSA2",
debug=settings.DEBUG
)
return alipay.api_alipay_trade_page_pay(
subject=f"球鞋订单-{order.no}",
out_trade_no=order.no,
total_amount=str(order.total),
return_url=settings.ALIPAY_RETURN_URL
)
- 前端处理支付回调:
javascript复制// 支付组件
async handlePayment() {
const { data } = await api.post(`/api/orders/${this.orderId}/pay/`)
window.location.href = data.payment_url
}
6.2 实时库存提醒
使用WebSocket实现库存实时更新:
python复制# consumers.py
class StockConsumer(WebsocketConsumer):
def connect(self):
self.product_id = self.scope['url_route']['kwargs']['product_id']
async_to_sync(self.channel_layer.group_add)(
f'stock_{self.product_id}',
self.channel_name
)
self.accept()
def stock_update(self, event):
self.send(text_data=json.dumps(event['data']))
前端连接WebSocket:
javascript复制const socket = new WebSocket(`ws://your-domain.com/ws/stock/${productId}/`)
socket.onmessage = (e) => {
const data = JSON.parse(e.data)
this.stock = data.stock
}
这个全栈项目从技术选型到具体实现都考虑了电商平台的特性需求,特别是在高并发场景下的数据一致性和性能优化方面做了重点设计。实际开发中,建议使用Docker容器化部署,可以更方便地管理前后端服务的依赖关系。
