完全なeコマースプロジェクト-(8)商品注文モジュール(1):注文決済とmysqlトランザクション

注文決済ページ

  • 位置:ショッピングカートで良い商品を選択した後、決済クリックしこの決済ページに入ることができます
    fastdfsサービスが呼び出されないため、画像を読み込めません

  • ここで最も重要なポイントは次のとおりです。

    • 金銭取引に関しては、データの正確性を保証する必要があります。
    • フロントエンドから渡された商品価格情報は信じられませんが、redisでチェックされた商品IDに基づいて価格を計算する必要があります。
  • 言うまでもないことですが、フロントエンドに必要なデータはバックエンドから渡すことができます

    • (1)ユーザーアドレス情報
    • (2)お支払い方法の選択
      • お支払い方法、そのお支払い方法を表すために直接0,1を選択します。多くの方法があります
    • (3)製品情報
    • (4)貨物:ここは複雑な場所です(ただし、貨物システムがないため、何を購入しても、デフォルトで10元になります)。
      ここに画像の説明を挿入

焦点:注文を送信する

注文データテーブルを作成する

予防:

  • (1)注文番号は、データベースの自動インクリメント主キーを使用しなくなりましたが、バックエンドによって生成されます。
  • (2)注文には複数の商品情報が含まれる場合があり、注文の基本情報と注文商品情報は1対多の関係にあります。

オーダーフォーム紹介

ここに画像の説明を挿入

  • 通常、商品レビューは注文が完了した後にのみ利用可能であり、これは非常に現実的です

注文データの送信:

  • (1)注文先住所のみが必要です
  • (2)お支払い方法
  • 残りはバックエンドから取得できます。たとえば、合計価格と購入された製品は、データシートまたはredisから取得できます。
    ここに画像の説明を挿入
  • これは、クリックして注文を送信したときのアドレスであり、2つのデータのみが渡されたことがわかります。
    ここに画像の説明を挿入

データ処理操作を順番に保存します(ビジネスロジックは複雑で、コードは難しくありません。すべて書きました)

  • (1)注文の基本情報オブジェクトを作成します
  • (2)選択したショッピングカートデータをクエリします
  • (3)SKU製品オブジェクトのクエリ
    • 3.1製品在庫を判断し、不十分かどうかを確認する
    • 3.2実行を継続するのに十分なインベントリ
    • 3.3商品の在庫と販売を変更する
    • 3.4注文アイテムテーブルオブジェクトの作成
  • (4)ショッピングカートの選択した商品データを削除します

1つ目は、データの検証と読み込みです

		# 接收
        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の自動送信について説明しましょう

ここに画像の説明を挿入

ここに画像の説明を挿入
これは、自分でデータを送信するために手動でコミットする必要がないということです。djangoがデータを管理してくれます。

元のメソッドを呼び出して、トランザクションを手動で管理します

ここに画像の説明を挿入

ここに画像の説明を挿入

  • トランザクションを開くには、を使用する必要があります。
    ここに画像の説明を挿入
    ここでの背後にあるロジックには、悲観的ロック、楽観的ロック、およびトランザクション分離レベルも含まれます。最初にここに来て、フォローアップしましょう。

おすすめ

転載: blog.csdn.net/pythonstrat/article/details/108184741