ゼロから始めて、シンプルなショッピングプラットフォームを構築します(10)

ゼロから始めて、簡単なショッピングプラットフォームを構築します(9):
https //blog.csdn.net/time_____/article/details/105465499
プロジェクトのソースコード(継続的な更新):https//gitee.com/DieHunter/myCode/ツリー/マスター/ショッピングは
長い間遅れています。過去数か月の会社のプロジェクトのピーク期間についてはご容赦ください。

この記事では、ユーザー管理や商品管理とは少し異なるため、主にバックエンド管理システムの新しい注文モジュールの一部について説明します(フロントエンドは以前の計画でわずかに変更され、注文機能が導入されていますが、支払い機能は含まれていません)。 、だから取り出して別々に紹介する

フロントエンド効果:

注文モジュールの主な機能には、注文リストの表示、注文ステータスの変更(注文ステータス以外のデータ変更は含まれません)、注文の削除、新しい注文の追加(新しい注文の場合は、製品名インデックスからのみ追加します。管理システムの注文追加は主な機能ではなく、ほとんど役に立たないため、詳細な機能はありません。この記事では、主にバックエンドの注文管理とインターフェイスドッキングの実装について説明します。

サーバ:

  • まず、サーバー上でデータベーステーブル構造を構成する必要があります。これには主に次のフィールドが含まれます。
        Order: {
          modelName: "orders",
          data: {
            orderId: {
              // 订单号
              type: String,
              required: true,
            },
            username: {
              //用户名
              type: String,
              required: true,
            },
            phoneNum: {
              //手机号
              type: String,
              required: true,
            },
            address: {
              //具体地址
              type: String,
              required: true,
            },
            orderState: {
              //订单状态
              type: String,
              required: true,
            },
            orderPrice: {
              // 订单总价
              type: String,
              required: true,
            },
            shopList: {
              //商品列表
              type: Array,
              required: true,
            },
            orderTime: {
              //订单创建时间
              type: String,
              required: true,
            },
          },
        },

     

  • npmstartを使用してサーバーを起動します
  • 次に、注文インターフェイスとロジックの実装のために、srcディレクトリの下のコントローラディレクトリに注文フォルダを作成します。modファイルは以前と同じで、新しい注文テーブルが作成されます。
  • 注文に依存関係パッケージを導入します。新しい注文を追加するには、注文テーブルが必要なだけでなく、ユーザーテーブルやショップテーブルとリンクする必要があることに注意してください。したがって、他のインターフェイスロジックのメソッドを呼び出す必要があります。インポートされたパッケージ名は次のとおりです。
    const router = require("express").Router();//路由
    const UserMod = require("../user/mod");//user表联动
    const ShopMod = require("../shopList/mod");//shop表联动
    const Mod = require("./mod");//order表
    const Util = require("../../../utils/utils");//工具类
    const Config = require("../../../config/config");//配置文件
    const Bussiness = require("../../bussiness/bussiness");//接口逻辑
    const { addData, updateData, findData } = require("../../command/command");//数据库操作

     

  •  1つ目は新しい注文インターフェースです。このインターフェースは注意が必要な場所でもあり、最も落とし穴があります。以下は、ユーザー、ユーザーアドレス、および製品の存在を検出するためのものです。

    let userFindRes = await Bussiness.hasUser(req, res, UserMod);//检测用户及地址是否存在
      if (!userFindRes) {
        return;
      }
      if (!userFindRes[0].alladdress || !userFindRes[0].address) {
        res.send({
          result: -1,
          msg: "添加失败,请完善收货地址",
        });
        return;
      }
      let shopFindRes = await findData(ShopMod, {//检测商品是否存在
        shopName: {
          $in: res._data.shopList.map((item) => {
            return item.shopName;
          }),
        },
      });
      if (
        !shopFindRes ||
        !shopFindRes.length ||
        shopFindRes.length != res._data.shopList.length
      ) {
        res.send({
          result: -2,
          msg: "有商品不存在",
        });
        return;
      }

    次のステップでは、データベース情報が取得されます(注:データベース情報は読み取り専用であり、データベースコマンドでのみ変更できるため、従来のヒープメモリアクセスは使用できず、単純なヒープ変数のコピーが必要です)

    static deepCopy(org) {
        //简单的对象复制
        return JSON.parse(JSON.stringify(org));
      }

    コピー機能を使用して、データベース情報を取り出し、その後の変更を行います

    let _shopFindRes = Util.deepCopy(shopFindRes); //解决数据库对象只读属性

    フロントエンドに戻る前に、合計金額と注文追加時間を計算します

    let _orderPrice;//初始化商品总价
      let _shopFindRes = Util.deepCopy(shopFindRes); //解决数据库对象只读属性
      _shopFindRes.forEach((item, index) => {//合计总费用
        if (index == 0) {
          _orderPrice = 0;
        }
        _shopFindRes[index].shopCount = res._data.shopList[index].shopCount;
        _orderPrice +=
          _shopFindRes[index].shopCount * _shopFindRes[index].shopPrice;
      });
    
      res._data = {
        ...res._data,
        username: userFindRes[0].username,
        phoneNum: userFindRes[0].phoneNum,
        address: userFindRes[0].alladdress.join("") + userFindRes[0].address,
        orderId: Util.createOrderNo(),
        orderTime: Util.joinDate(),
        shopList: _shopFindRes,
        orderPrice: _orderPrice,
      };
      let addRes = await addData(Mod, res._data);
      if (!addRes || !addRes.length) {
        res.send({
          result: 0,
          msg: "添加失败",
        });
        return;
      }
      res.send({
        result: 1,
        msg: "添加成功",
        orderId: res._data.orderId,
      });

     

  •  注文の照会、削除、変更と比較して、注文の追加は論理的に異なる機能です。コードを再利用できる場所が少なくなります。他の3つの機能は、製品とユーザーインターフェイスの記述を模倣することで実装できます。

  • 注文リストを取得する

    router.get(Config.ServerApi.orderList, Util.checkToken, async (req, res) => {
      Bussiness.findInfo(
        req,
        res,
        Mod,
        {
          orderTime: res._data.sort,//时间排序
        },
        {
          orderId: new RegExp(res._data.orderId, "i"),//orderId(订单号)模糊过滤
          username: new RegExp(res._data.keyWord, "i"),//订单用户名模糊过滤
          orderState: new RegExp(res._data.orderState, "i"),//订单状态模糊过滤
        }
      );
    });

     

  •  

    注文を削除

     

    router.get(Config.ServerApi.delOrder, Util.checkToken, async (req, res) => {
      if (!Bussiness.isAdmin(res)) {
        return;
      }
      Bussiness.delInfo(req, res, Mod);
    });

     

  •  

    注文ステータスの変更

    router.post(Config.ServerApi.updateOrder, Util.checkToken, async (req, res) => {
      let updateRes = await updateData(Mod, res._data._id, res._data);
      if (updateRes) {
        res.send({
          result: 1,
          msg: "修改成功",
        });
        return;
      }
      res.send({
        result: 0,
        msg: "修改失败",
      });
    });

    上記は注文管理サーバーのインターフェースとロジック部分です

総括する:

オブジェクト指向のコードを記述してその機能を実装する場合は、機能間の結合(機能と機能間の接続)を最小限に抑えて、再利用性を高め、開発効率を大幅に節約します。

おすすめ

転載: blog.csdn.net/time_____/article/details/108442619
おすすめ