ゼロから始めて、簡単なショッピングプラットフォームを構築します(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: "修改失败", }); });
上記は注文管理サーバーのインターフェースとロジック部分です
総括する:
オブジェクト指向のコードを記述してその機能を実装する場合は、機能間の結合(機能と機能間の接続)を最小限に抑えて、再利用性を高め、開発効率を大幅に節約します。