订单系统功能实现

订单系统

订单模型设计

创建模型类
生成迁移文件进行迁移
goods

from users.models import User,Addr
#订单表
PAYSTATUS=(
    (1,'待支付'),
    (1,'待发货'),
    (1,'待收货'),
    (1,'待评价'),
    (1,'已完成'),
)
class Order(models.Model):
    order_id=models.CharField(max_length=100,verbose_name='订单号',primary_key=True)
    user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')
    addr=models.ForeignKey(Addr,on_delete=models.CASCADE,verbose_name='收货地址')
    total_price=models.DecimalField(max_digits=9,decimal_places=2,verbose_name='总价')
    total_count=models.IntegerField(verbose_name='总商品数')
    pay_method=models.IntegerField(verbose_name='支付方式',choices=((1,'支付宝'),(2,'银联')))
    pay_status= models.IntegerField(choices=PAYSTATUS,verbose_name='支付状态')
    create_time=models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    update_time=models.DateTimeField(auto_now=True,verbose_name='更新时间')
    class Meta:
        verbose_name='订单'
        verbose_name_plural=verbose_name
    def __str__(self):
        return self.order_id

class OrderGoods(models.Model):
    goods=models.ForeignKey(Goods,on_delete=models.CASCADE,verbose_name='商品信息')
    count=models.IntegerField(verbose_name='数量')
    price=models.DecimalField(max_digits=7,decimal_places=2,verbose_name='单价')
    order=models.ForeignKey(Order,on_delete=models.CASCADE,verbose_name='订单')
    class Meta:
        verbose_name='订单商品'
        verbose_name_plural=verbose_name
    def __str__(self):
        return self.goods.sku_name

后端

#收货地址
class Addrview(APIView):
    #查看收货地址
    def get(self,request):
        user = request.META.get('USER')
        if not user:
            return Response({
                'code': 400,
                'msg': '用户未登录'
            })
        user_id = user['user_id']
        #拿到当前用户下面的所有地址信息
        addr_list=Addr.objects.filter(user_id=user_id).all()
        addr_all=[]
        for i in addr_list:
            addr_all.append({
                'id':i.id,
                'name':i.name,
                'tel':i.tel,
                'addr':i.addr,
                'is_default':i.is_default,
            })
        return Response({
            'code':200,
            'msg':'地址获取成功',
            'addrs':addr_all,

        })
    #添加收货地址
    def post(self,request):
        ...
    #删除收货地址
    def delete(self,request):
        ...

配置路由

from django.urls import path
from users import views
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('addr/',views.Addrview.as_view()),   #用户收获地址

]

前端

订单系统获取用户地址信息及添加地址信息
找到对应的vue文件配置对应的功能函数
例如: ConfirmOrder.vue

created() {
    // 未勾选购物车商品时,直接进入确认订单页面,提示信息并返回购物车
    if (this.getCheckNum < 1) {
      this.notifyError("请勾选商品后再结算");
      this.$router.push({path: "/shoppingCart"});
    }
    // TODO 获取用户地址信息
    this.$axios.get('/user/addr/',{
      'headers':{
        'token':localStorage.getItem('token')
      }
    }).then((result) => {
      if (result.data.code==200){
        this.address=result.data.addrs
      }
    }).catch((err) => {
      console.log(err)
    });

  },

订单系统添加地址信息
例如:AddMyAddr.vue

// 点击添加地址
    addMyAddr() {
      // TODO 添加地址
      console.log("开始发送请求,添加收货地址...")
      this.$axios.post('user/addr/',{
        'name':this.LoginUser.receiver,
        'tel':this.LoginUser.receive_mobile,
        'addr':this.LoginUser.receive_addr,
        'is_default':this.LoginUser.is_default

      },{
        'headers':{
          'token':localStorage.getItem('token')
        }
      }).then((result) => {
        this.notifySucceed(result.data.msg)
        this.LoginUser.receiver=''
        this.LoginUser.receive_mobile=''
        this.LoginUser.receive_addr=''
        this.LoginUser.is_default=false
        this.setAddMyAddr(false)
      }).catch((err) => {
        console.log(err)
      });
    },

创建订单

后端

创建订单
goods

from rest_framework.response import Response
from rest_framework.views import APIView
from goods.models import Categroy,Goods,Addr,Order,OrderGoods
from goods.serializers import Goodsser
import redis,random
class Goodsview(APIView):
    #生成订单
    def post(self,request):
        #判断登录
        user = request.META.get('USER')  # 获取到中间件检测完登录,传递过来的用户信息、
        if not user:
            return Response({
                'code': 400,
                'msg': '用户未登录'
            })
        user_id = user['user_id']
        addr_id=request.data.get('addr_id')
        goods_list=request.data.get('goods_list')  #[{'goods_id':1,'num':2},{'goods_id':2,'num':2}]
        pay_method=request.data.get('pay_method')
        #获取收货地址并验证
        addr_info=Addr.objects.filter(id=addr_id,user_id=user_id).first()
        if not addr_info:
            return Response({
                'code':400,
                'msg':'收货地址不存在'
            })
        #获取商品信息并验证
        goods_buy=[]
        for i in goods_list:
            goods_info=Goods.objects.filter(id=i['goods_id']).first()
            if not goods_info:
                continue
            if goods_info.stock<i['num']:
                return Response({
                    'code':400,
                    'msg':'%s商品库存不足'%goods_info.sku_name
                })
            goods_buy.append({
                'id':i['goods_id'],
                'num':i['num'],
                'price':goods_info.selling_price
            })
        #创建订单
        order_info=Order.objects.create(
            order_id=str(random.randint(100000,999999)),
            user_id=user_id,
            addr=addr_info,
            total_price=0,
            total_count=0,
            pay_method=pay_method,
            pay_status=1,
        )
        #创建订单商品
        for i in goods_buy:
            #创建子订单
            OrderGoods.objects.create(
                goods_id=i['id'],
                count=i['num'],
                price=i['price'],
                order=order_info,
            )
            #修改主订单
            order_info.total_price+=(i['price']*i['num'])
            order_info.total_count+=i['num']
            #扣除库存
            g_info=Goods.objects.filter(id=i['id']).first()
            g_info.stock=i['num']
            g_info.save()
        order_info.save()
        #返回下单成功
        return Response({
            'code':200,
            'msg':'下单成功'
        })

配置路由

from django.urls import path
from goods import views
urlpatterns = [
    path('goods/',views.Goodsview.as_view())   #订单
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值