Django电商功能

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/")
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值