完整电商项目--(八)商品订单模块(1):订单结算与 mysql事务

订单结算页面

  • 位置:在购物车中选择好商品之后,就 可以点击 去结算按钮,进入到这个结算页面
    没有打来fastdfs服务,所以加载不出图片

  • 这里最关键的一点是:

    • 涉及到金钱的交易,要保证数据的准确性!
    • 我们不能相信前端 传递过来的 商品价格信息,而是应该自己根据redis当中勾选的商品id,进行计算价格。
  • 其他的并没有什么好说的,前端需要的数据从后端传递过去即可

    • (1)用户地址信息
    • (2)支付方式选择
      • 支付方式,我们 直接选择是0,1就可以代表那种支付方式了,方法很多
    • (3)商品信息
    • (4)运费:这是一个复杂的地方(但是我们没有运费系统,所以不管买啥都是,运费都是默认十元
      在这里插入图片描述

重点:提交订单

创建订单数据表

注意事项:

  • (1)订单号不再采用数据库自增主键,而是由后端生成。
  • (2)一个订单中可以有多个商品信息,订单基本信息和订单商品信息是一对多的关系

订单表介绍

在这里插入图片描述

  • 一般都是订单完成之后才有的商品评论,这里很符合实际

提交订单数据:

  • 只需要(1)订单地址
  • (2)支付方式
  • 其余的均可以自己通过后端获取。 比如总价格,购买哪些商品,都可以从数据表,或者是redis当中得到。
    在这里插入图片描述
  • 点击提交订单时面就是这个地址,看到我们只传递了两个数据。
    在这里插入图片描述

保存订单中的数据处理操作(业务逻辑复杂,代码不难,前面都写过)

  • (1) 创建订单基本信息对象
  • (2) 查询选中的购物车数据
  • (3) 查询sku商品对象
    • 3.1 判断商品库存,不足则提示
    • 3.2 库存足够继续执行
    • 3.3 修改商品的库存,销量
    • 3.4 创建订单商品表对象
  • (4) 删除购物车种选中的商品数据

首先是数据验证和加载

		# 接收
        dict1 = json.loads(request.body.decode())
        address_id = dict1.get('address_id')
        pay_method = dict1.get('pay_method')
        pay_method = int(pay_method)
        # 验证
        if not all([address_id, pay_method]):
            return http.JsonResponse({
    
    'code': RETCODE.PARAMERR, 'errmsg': '参数不完整'})
        # 收货地址
        try:
            address = Address.objects.get(pk=address_id, is_delete=False, user_id=request.user.id)
        except:
            return http.JsonResponse({
    
    'code': RETCODE.PARAMERR, 'errmsg': '收货地址无效'})
        # 支付方式
        if pay_method not in [1, 2]:
            return http.JsonResponse({
    
    'code': RETCODE.PARAMERR, 'errmsg': '支付方式无效'})

        # 处理(业务最多)
        user = request.user
        now = datetime.now()
        # 1.查询购物车选中的商品
        redis_cli = get_redis_connection('cart')
        # 下面是从redis中拿出商品数据
        # 从hash中读取商品编号、数量
        cart_dict_bytes = redis_cli.hgetall('cart%d' % request.user.id)
        cart_dict_int = {
    
    int(sku_id): int(count) for sku_id, count in cart_dict_bytes.items()}
        # 从set中读取选中的商品编号
        cart_selected_bytes = redis_cli.smembers('selected%d' % request.user.id)
        cart_selected_int = [int(sku_id) for sku_id in cart_selected_bytes]

接着是具体得 业务处理

构建订单对象时,我们通过 当前时间,创建一个 订单号。

在这里插入图片描述

下面是业务处理代码,我们需要使用到mysql事务

  • 因为商品库存等的判断,以及订单对象的创建,必须是同时成功,同时失败的。我们需要使用事务。
  • 明确: django本身不提供事务功能! 必须是使用的数据库具有事务功能。 本身上django提供的事务管理函数,还是调用数据库底层的接口方法。
  • django中关于mysql事务的文档
首先说下django自动提交

在这里插入图片描述

在这里插入图片描述
这就是我们不需要自己手动commit提交数据,django会帮我们管理。

调用原始的方法,手动管理事务

在这里插入图片描述

在这里插入图片描述

  • 开启事务,我们需要使用:
    在这里插入图片描述
    后面这里的逻辑还要涉及 悲观锁乐观锁, 事务隔离级别。先到这里,后续接着讲。

猜你喜欢

转载自blog.csdn.net/pythonstrat/article/details/108184741