1. 项目概述:Django+Python微信小程序蔬菜商城系统
这个项目是一个典型的O2O生鲜电商解决方案,采用Django作为后端框架,配合微信小程序作为前端入口。我在实际开发中发现,这种技术组合特别适合中小型生鲜电商的快速落地——Django自带的管理后台能快速搭建商品管理系统,而微信小程序则提供了天然的流量入口和支付闭环。
系统核心功能包括:蔬菜分类展示、购物车管理、微信支付对接、订单跟踪和简单的会员体系。相比传统电商平台,生鲜品类有几个特殊需求:需要显示实时库存(因为蔬菜容易售罄)、需要突出显示配送时效(通常按天预约)、还要考虑商品重量/规格的灵活切换(比如500g装和1kg装)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 后端技术选型
选择Django框架主要基于三个考虑:
- ORM开发效率高,适合快速迭代的电商业务模型
- 自带Admin后台,省去基础CRUD界面的开发
- REST framework可以快速构建小程序所需的API接口
实际开发中我使用了以下关键包:
python复制# requirements.txt核心部分
Django==3.2.16
djangorestframework==3.14.0
django-filter==23.2 # 用于商品筛选
Pillow==9.5.0 # 处理蔬菜图片
WeChatPayv3==1.2.4 # 官方微信支付SDK
2.2 数据库设计要点
生鲜电商的数据库有几个特殊设计:
python复制class Vegetable(models.Model):
CATEGORY_CHOICES = [
('leaf', '叶菜类'),
('fruit', '果菜类'),
('root', '根茎类')
]
name = models.CharField(max_length=50)
category = models.CharField(max_length=20, choices=CATEGORY_CHOICES)
price = models.DecimalField(max_digits=6, decimal_places=2)
weight = models.CharField(max_length=20) # 如"500g/份"
stock = models.PositiveIntegerField(default=0)
daily_limit = models.PositiveIntegerField() # 每日限购
is_recommended = models.BooleanField(default=False)
image = models.ImageField(upload_to='vegetables/')
# 重要:生鲜需要记录上架时间
harvest_date = models.DateField()
expiry_days = models.PositiveSmallIntegerField()
2.3 微信小程序端关键技术
小程序端采用原生开发+自定义组件方案,主要解决三个痛点:
- 商品图片懒加载:使用
wx.createIntersectionObserver()监听滚动 - 购物车动画:通过CSS3动画实现添加商品时的飞入效果
- 库存实时检查:下单前用
wx.request()快速校验库存
3. 核心功能实现细节
3.1 商品展示与筛选
蔬菜商城需要强大的筛选能力,我在Django后端实现了多维度过滤:
python复制# views.py
from django_filters import rest_framework as filters
class VegetableFilter(filters.FilterSet):
min_price = filters.NumberFilter(field_name="price", lookup_expr='gte')
max_price = filters.NumberFilter(field_name="price", lookup_expr='lte')
category = filters.CharFilter(field_name="category")
class Meta:
model = Vegetable
fields = ['category', 'min_price', 'max_price']
class VegetableListView(generics.ListAPIView):
queryset = Vegetable.objects.filter(stock__gt=0)
serializer_class = VegetableSerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = VegetableFilter
小程序端对应实现横向滚动分类导航:
javascript复制// 小程序WXML
<scroll-view scroll-x class="category-scroll">
<view
wx:for="{{categories}}"
wx:key="id"
class="category-item {{activeCategory === item.value ? 'active' : ''}}"
bindtap="switchCategory"
data-category="{{item.value}}"
>
{{item.name}}
</view>
</scroll-view>
3.2 购物车与库存管理
生鲜电商的购物车需要特殊处理:
- 同一商品可能选择不同规格(如500g或1kg)
- 需要实时显示剩余库存
- 要有每日限购校验
后端购物车逻辑:
python复制# serializers.py
class CartItemSerializer(serializers.ModelSerializer):
vegetable = VegetableSerializer(read_only=True)
vegetable_id = serializers.PrimaryKeyRelatedField(
queryset=Vegetable.objects.filter(stock__gt=0),
source='vegetable',
write_only=True
)
def validate(self, data):
vegetable = data['vegetable']
if data['quantity'] > vegetable.stock:
raise serializers.ValidationError("库存不足")
return data
3.3 微信支付集成
支付环节的关键点:
- 需要处理微信小程序的openid
- 生鲜订单通常需要选择配送时间
- 支付成功后要实时扣减库存
支付接口核心代码:
python复制# views.py
class PaymentView(APIView):
def post(self, request):
order = get_object_or_404(Order, pk=request.data['order_id'])
# 构造微信支付请求
wxpay = WeChatPay(
appid='你的小程序appid',
mchid='商户号',
private_key='私钥内容',
cert_serial_no='证书序列号',
notify_url='支付回调地址'
)
# 重要:生鲜订单需要传递配送时间
description = f"{order.items.count()}件生鲜商品(配送时间:{order.delivery_time})"
# 发起支付
resp = wxpay.order.create(
description=description,
out_trade_no=order.order_number,
amount={'total': int(order.total_amount * 100)},
payer={'openid': request.user.openid}
)
return Response(resp)
4. 性能优化实践
4.1 数据库查询优化
蔬菜列表页容易成为性能瓶颈,我通过以下方式优化:
- 使用
select_related和prefetch_related减少查询次数 - 对分类字段添加数据库索引
- 实现简单的缓存策略
python复制# 优化后的查询
vegetables = Vegetable.objects.filter(
stock__gt=0
).select_related('category').prefetch_related(
'promotions'
).only(
'name', 'price', 'image', 'category__name'
)
4.2 小程序端图片优化
生鲜商品对图片质量要求高,但又要考虑加载速度:
- 使用微信图片CDN
- 实现渐进式图片加载
- 根据网络环境切换图片质量
javascript复制// 图片懒加载组件
Component({
data: {
loaded: false
},
methods: {
_onImageLoad() {
this.setData({ loaded: true })
}
}
})
5. 实际运营中的经验
5.1 库存管理的坑
初期直接使用数据库库存字段导致超卖问题,后来改用:
python复制# 使用原子操作更新库存
from django.db import transaction
@transaction.atomic
def decrease_stock(item, quantity):
item = Vegetable.objects.select_for_update().get(pk=item.id)
if item.stock < quantity:
raise ValueError("库存不足")
item.stock -= quantity
item.save()
5.2 微信小程序审核要点
生鲜类小程序特别注意:
- 商品图片不能有夸大宣传(比如"最便宜"等字样)
- 需要提供清晰的退换货政策
- 配送时间选择要明确
5.3 用户行为分析
通过埋点发现:
- 下午5-7点是下单高峰
- 商品详情页的平均停留时间约23秒
- 加入购物车但未支付的比例约65%
对应的优化措施:
- 在高峰时段增加服务器资源
- 优化商品详情页的加载速度
- 对放弃支付的用户进行短信提醒
6. 扩展功能建议
6.1 预售功能实现
对于季节性蔬菜,可以增加预售模块:
python复制class PreSale(models.Model):
vegetable = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
start_date = models.DateField()
end_date = models.DateField()
expected_delivery = models.DateField()
discount = models.DecimalField(max_digits=3, decimal_places=1)
6.2 社区团购模式
添加团长管理和分销功能:
- 团长可以创建虚拟店铺
- 设置不同级别的佣金比例
- 实现小区级别的商品推荐
6.3 智能推荐系统
基于用户购买历史实现简单推荐:
python复制from django.db.models import Count
def get_recommendations(user):
# 获取用户常买品类
fav_category = OrderItem.objects.filter(
order__user=user
).values('vegetable__category').annotate(
total=Count('id')
).order_by('-total').first()
# 推荐同品类商品
return Vegetable.objects.filter(
category=fav_category['vegetable__category']
).exclude(
orders__user=user
).order_by('?')[:4]
这个项目最让我意外的是用户对配送时间选择的敏感度——添加精确到半小时的配送时段选择后,转化率提升了28%。建议在开发类似系统时,一定要把配送时间选择做得尽可能细致。
