Django电商功能
一、订单
-
订单逻辑
登陆用户可以浏览商品
商品详情页立即购买,生成订单,订单状态为未支付
商品添加购物车,查看购物车,选中指定商品,立即购买生成订单,订单状态为未支付
结算订单,使用支付宝结算订单,订单状态修改为已支付
-
模型创建
class Cart(models.Model): """购物车""" goods = models.ForeignKey(to=Goods, on_delete=models.CASCADE) # 所属商品 count = models.IntegerField() # 数量 buyer = models.ForeignKey(to=Buyer, on_delete=models.CASCADE) # 所属用户 def __str__(self): return self.buyer.name + '-' + self.goods.name class Meta: db_table = 'cart' class Order(models.Model): """订单""" id = models.CharField(max_length=128, primary_key=True) # 订单id buyer = models.ForeignKey(to=Buyer, on_delete=models.CASCADE) # 用户 paymethod = models.IntegerField(default=3) # 支付方式 1:货到付款 2:微信支付 3:支付宝 4:银联支付 createtime = models.DateTimeField() # 创建时间 # 冗余,为了方便使用,允许部分冗余 totalcount = models.IntegerField() # 商品数量 totalprice = models.FloatField() # 商品总价 freight = models.IntegerField() # 订单运费 status = models.IntegerField(default=1) # 订单状态 1:待支付 2:待发货 3:待收货 4:待评价 5:已完成 tradeno = models.CharField(max_length=64, null=True) # 交易号 tradetime = models.DateTimeField(null=True) # 交易时间 # 记录收货信息 name = models.CharField(max_length=64) # 收货用户名 postcode = models.CharField(max_length=64) # 收货邮编 phone = models.CharField(max_length=64) # 收货电话 address = models.CharField(max_length=64) # 收货地址 class Meta: db_table = 'order' class OrderDetail(models.Model): """订单明细""" order = models.ForeignKey(to=Order, on_delete=models.CASCADE) # 所属订单 goods = models.ForeignKey(to=Goods, on_delete=models.CASCADE) # 所属商品 count = models.IntegerField() # 商品数量 price = models.FloatField() # 商品价格 name = models.CharField(max_length=64) # 商品名称 picture = models.ImageField() # 商品图片 unite = models.CharField(max_length=64) # 商品单位 class Meta: db_table = 'orderdetail'
-
后台添加商品数据
-
生成订单
流程如下:添加购物车–>结算—>生成订单
二、购物车
- 模型搭建
1、添加购物车
在单击【加入购物车】,使用ajax异步添加,提示“添加成功,在购物车等亲
如果是同一个产品,数量增加,不需要添加的数据
1、前端做什么?
发送参数:商品的id ,商品的数量
2、后端做什么?
接受参数,新增购物车,修改商品库存 (判断库存是否足够)
-
前端操作
- 修改页面,在页面中任选一个位置,只要方便获取即可
<p class="col-xs-3"><a goods_id="{{ goods.id }}" class="btn btn-danger btn-lg" href="bootstrap_cart.html" id="my_cart_add" role="button">加入购物车</a></p> {% csrf_token %}
- 发送ajax异步请求,根据后端响应内容给与不同提示
<script> //添加购物车,单击事件, $("#my_cart_add").click(function () { //商品id,attr获取属性 var goods_id = $(this).attr("goods_id") //商品数量,val获取input value值 var goods_num = $("#my_goods_num").val() //csrf,根据name属性获取 var csrfmiddlewaretoken = $("[name=csrfmiddlewaretoken]").val() //发送异步请求 $.ajax({ url: "/cart/add/",//路由 method:"post",//post请求 data: {//参数 goods_id:goods_id, goods_num:goods_num, csrfmiddlewaretoken:csrfmiddlewaretoken//为了防止csrf拦截 1、需要加入csrf标签 2、获取值 }, success: function (data) {//成功回调函数 console.log(data) if(data["code"]==0){ alert("添加成功,在购物车等亲~") }else if(data["code"]==1){ alert("数据不完整亲~") }else if(data["code"]==2){ alert("库存不足亲~") }else if(data["code"]==3){ alert("异常啦亲~") } }, error:function () { alert("error...") } }) //return false取消默认功能a标签不再跳转 return false }) </script>
-
后端操作
- 路由
# 购物车-添加 path('cart/add/', buyer_view.cart_add),
- 视图
@buer_login_verify def cart_add(request): """购物车-添加""" # 准备数据 0表示成功 1表示数据不完整 2表示库存不足 3表示服务器异常 data = {"code": 0} try: if request.method == "POST": # 接收参数 goods_id = request.POST.get("goods_id") goods_num = request.POST.get("goods_num") # 查询 goods = Goods.objects.get(pk=goods_id) # 判断-非空 if not all([goods_id, goods_num]): # 数据不完整 data["code"] = 1 # 响应 return JsonResponse(data) # 字符串转数字 goods_num = int(goods_num) # 判断-库存 if goods.number < goods_num: # 数据不完整 data["code"] = 2 # 响应 return JsonResponse(data) # 查询当前用户 buyer = Buyer.objects.filter(name=request.session.get("buyer_logined")).first() # 判断商品是否已经在购物车中 cart = Cart.objects.filter(goods=goods).first() if cart: # 此商品已经在购物车中 cart.count += goods_num else: # 此商品未在购物车中 # 创建对象 cart = Cart() # 赋值属性 cart.goods = goods cart.buyer = buyer cart.count = goods_num # 新增/修改 cart.save() # 商品库存修改,销量 goods.number -= goods_num goods.sale += goods_num goods.save() # 响应 return JsonResponse(data) except Exception as ex: print("异常:", ex) data = {"code": 3} return JsonResponse(data)
2、 查看购物车
查询所有的购物信息,渲染
- 路由
# 购物车-列表
path('cart/list/', buyer_view.cart_list),
- 视图
@buer_login_verify
def cart_list(request):
"""购物车-列表"""
# 当前登录用户
buyer = Buyer.objects.filter(name=request.session.get("buyer_logined")).first()
# 查询当前用户所有的购物车
cart_list = Cart.objects.filter(buyer=buyer).order_by("-id")
# 渲染
return render(request, "ft/bootstrap_cart.html", locals())
3、 购物车发起结算
- 路由
# 提交订单页
path('order/place/', buyer_view.order_place),
- 视图
@buer_login_verify
def order_place(request):
"""提交订单页"""
# 接收参数 get获取1个 getlist获取多个
cart_ids = request.POST.getlist("ids")
if not all([cart_ids]):
return HttpResponse("数据不完整")
# 查找
cart_list = Cart.objects.filter(id__in=cart_ids)
# 总数
totle_count = 0
# 总价
totle_price = 0
for cart in cart_list:
totle_count += cart.count
totle_price += cart.goods.price * cart.count
# 运费
freight = 10
# 实付款
totle_actual = totle_price + freight
# 查询当前用户的默认收获地址
receiver = Receiver.objects.filter(buyer__name=request.session.get("buyer_logined"), isdefault=1).first()
# 渲染
return render(request, "ft/place_order.html", locals())
4、 下订单
订单表新增,订单明细新增,购物车删除
1、前端发参数:地址id,支付方式编号,购物车ids
2、后端:接收参数,新增订单,新增订单明细,删除购物车
模板:添加form,添加hidden,记得input标签的name属性的添加
- 路由
# 订单新增-下单
path('order/add/', buyer_view.order_add),
- 视图
@buer_login_verify
def order_add(request):
"""订单新增-下单"""
# 判断
if request.method == "POST":
# 接收参数
receiver_id = request.POST.get("receiver_id")
pay_method = request.POST.get("pay_method")
cart_ids = request.POST.getlist("cart_ids")
# 查找
cart_list = Cart.objects.filter(id__in=cart_ids)
receiver = Receiver.objects.get(pk=receiver_id)
buyer = Buyer.objects.filter(name=request.session.get("buyer_logined")).first()
# 总数
totle_count = 0
# 总价
totle_price = 0
for cart in cart_list:
totle_count += cart.count
totle_price += cart.goods.price * cart.count
# 运费
freight = 10
# 创建订单对象
order = Order()
# 属性赋值
order.id = product_order_id()
order.buyer = buyer
order.createtime = datetime.now()
order.totalcount = totle_count
order.totalprice = totle_price
order.freight = freight
order.status = 1
order.name = receiver.name
order.postcode = receiver.postcode
order.phone = receiver.phone
order.address = receiver.address
# 新增订单对象
order.save()
# 循环新增订单明细
for cart in cart_list:
# 创建对象
orderdetail = OrderDetail()
# 属性赋值
orderdetail.order = order
orderdetail.goods = cart.goods
orderdetail.count = cart.count
orderdetail.price = cart.goods.price
orderdetail.name = cart.goods.name
orderdetail.picture = cart.goods.picture
orderdetail.unite = cart.goods.unite
# 新增
orderdetail.save()
# 删除购物车对象
cart_list.delete()
# 重定向
return redirect("/user/center/")