express+mysql+vue,从零搭建一个商城管理系统13--生成订单

提示:学习express,搭建管理系统


前言

需求:主要学习express,所以先写service部分

一、新建models/order.js,models/orderItem.js

models/order.js

const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');

const OrderModel = sequelize.define('Order',{
    id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    //订单ID
    orderId:DataTypes.STRING,
    //下单用户ID
    userId:DataTypes.STRING,
    //下单用户ID
    userName:DataTypes.STRING,
    //订单总价
    total:DataTypes.FLOAT,
    //商品信息
    goods:DataTypes.STRING(3000)
},{
    tableName:'order'
});
//无order表创建order表
OrderModel.sync();
module.exports = OrderModel;

models/orderItem.js

const { DataTypes } = require('sequelize');
const sequelize = require('../config/db');

const OrderItemModel = sequelize.define('OrderItemModel',{
    id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        primaryKey: true
    },
    //订单ID
    orderId:DataTypes.STRING,
    //用户ID
    userId:DataTypes.STRING,
    //下单用户ID
    userName:DataTypes.STRING,
    //商户ID
    shopId:DataTypes.STRING,
    //商户名
    shopName:DataTypes.STRING,
    //商品ID
    goodsId:DataTypes.STRING,
    //商品名称
    goodsName:DataTypes.STRING,
    //价格
    price:DataTypes.FLOAT,
    //数量
    count:DataTypes.INTEGER,
    //规格
    specs:DataTypes.STRING,
    //优惠
    preferential:DataTypes.STRING(3000),
    //商品总价
    total:DataTypes.FLOAT,
},{
    tableName:'order_item'
});

//无order_item表创建order_item表
OrderItemModel.sync();
module.exports = OrderItemModel;

在这里插入图片描述

二、新建dao/order.js

dao/order.js

const { Op } = require("sequelize");
const OrderModel = require('../models/order');
const OrderItemModel = require('../models/orderItem');
const GoodsDao = require('../dao/goods');
const md5 = require("md5");
const secretKey = 'longlongago';

const errFun = (msg,data,code)=>{
    return {
        code:code||500,
        success:false,
        msg:msg||'操作失败',
        data:data
    }
}
const sucFun = (data,msg)=>{
    return {
        code:200,
        success:true,
        msg:msg||'操作成功',
        data,
    }
}


const OrderDao = {
    //添加商品到订单
    addGoodsToOrder:async(data)=>{
        const goods = data.goods;
        //查看库存数量
        let inventoryNotEnough = [];
        const resultGoods = await GoodsDao.queryGoodsInventory(data)||[];
        resultGoods.forEach(item=>{
            goods.forEach(dItem=>{
                if(item.goodsId == dItem.goodsId && item.inventory<dItem.count)inventoryNotEnough.push(item);
            })
        })
        if(inventoryNotEnough.length>0)return errFun('以下商品库存不足',inventoryNotEnough);
        //生成orderId
        const orderId = md5(goods.userId + secretKey + new Date().getTime());
        //订单总价
        let orderTotal = 0;
        //商品total错误
        let wrongTotalGoodsData = [];
        //订单里存入商品信息
        let jsonGoods = [];
        //orderItem存入信息
        let orderItemGoods = [];
        goods.forEach(item=>{
            let preferential = item.preferential||[];
            if(preferential.length>0){
                preferential.forEach(pItem=>{
                    let nowTotal = Math.round((item.goodsTotal||(item.price*item.count))*100)/100;
                    if(pItem.operation == 'x'){
                        item.goodsTotal = Math.round((nowTotal*pItem.value)*100)/100;
                    }else if(pItem.operation == '-'){
                        item.goodsTotal = Math.round((nowTotal-pItem.value)*100)/100;
                    }
                })
            }
            //保留2位小数,向上取整
            item.goodsTotal = Math.round(item.goodsTotal*100)/100;
            orderTotal += item.goodsTotal*100;
            if(item.goodsTotal != item.total)wrongTotalGoodsData.push(item);
            jsonGoods.push({
                goodsId:item.goodsId,
                goodsName:item.goodsName,
                price:item.price,
                count:item.count
            })
            orderItemGoods.push({
                orderId,
                userId:data.userId,
                userName:data.userName,
                shopId:item.shopId,
                shopName:item.shopName,
                goodsId:item.goodsId,
                goodsName:item.goodsName,
                price:item.price,
                count:item.count,
                specs:item.specs,
                preferential:JSON.stringify(item.preferential),
                total:item.total,
            })
        });
        orderTotal = orderTotal/100;
        if(wrongTotalGoodsData.length > 0)return errFun('以下商品总价计算错误!!',wrongTotalGoodsData);
        if(orderTotal != data.total)return errFun('订单总价计算错误!!',{orderTotal,...data});
        try{
            let json = JSON.stringify(jsonGoods);
            const orderResult = await OrderModel.create({
                orderId,
                userId:data.userId,
                userName:data.userName,
                total:data.total,
                goods:json,
            });
            if(!orderResult)return errFun('下单失败!!');
            try{
                const orderItemResult = await OrderItemModel.bulkCreate(orderItemGoods);
                if(!orderItemResult)return errFun('子订单下单失败!!');
                //修改下单商品库存   单纯调用  结果不影响下单成功
                GoodsDao.changeOrderGoodsInventory(resultGoods,data);
                return sucFun(orderItemResult,'下单成功');
            }catch(oiErr){
                return errFun(err);
            }
        }catch(oErr){
            return errFun('下单失败!!',oErr);
        }
    },
    //通过商品ID查询商品信息
    queryGoodsByUserIdFromOrder:async(data)=>{
        //根据goodsId查询goods
        const goodsData = await OrderModel.findAll({where:{userId:data.userId}});
        let shopIds = [];
        let resultData = [];
        if(goodsData&&goodsData.length>0){
            goodsData.forEach(item=>{if(shopIds.indexOf(item.shopId)==-1)shopIds.push(item.shopId)});
            goodsData.forEach(item=>{
                let index = shopIds.indexOf(item.shopId);
                let goodsOne = {
                    userId: item.userId,
                    shopId: item.shopId,
                    shopName: item.shopName,
                    goodsId: item.goodsId,
                    goodsName: item.goodsName,
                    count: item.count,
                    price: item.price,
                    specs: item.specs
                }
                if(!resultData[index]){
                    resultData[index] = {
                        shopId:item.shopId,
                        shopName:item.shopName,
                        goods:[ goodsOne ]
                    }
                }else{
                    resultData[index].goods.push(goodsOne);
                }
            });
        }
        if(!resultData||await resultData.length<1)errFun('订单空空如也');
        return sucFun(resultData,'查询成功');
    },
}

module.exports = OrderDao;

在这里插入图片描述

三、新建routes/order.js

routes/order.js

const OrderDao = require('../dao/order');
const OrderRoutes = (router)=>{
    router.post('/order/addGoodsToOrder',async (req,res)=>{
        const result = await OrderDao.addGoodsToOrder(req.body);
        res.json(result);
    });
    router.get('/order/queryGoodsByUserIdFromOrder',async (req,res)=>{
        const result = await OrderDao.queryGoodsByUserIdFromOrder(req.query);
        res.json(result);
    });
}
module.exports = OrderRoutes;

在这里插入图片描述

四、添加商品到购物车

url:http://localhost:1990/order/addGoodsToOrder
params:{
    "total":51.95,
    "userId": "9e14ebba3be0ae546374e8f5a49f9e80",
    "userName": "long001",
    "goods":[
        {
            "userId": "9e14ebba3be0ae546374e8f5a49f9e80",
            "userName": "long001",
            "shopId": "098a0c4828d7d0c78f42e6124f911a77",
            "shopName": "shop01",
            "goodsId": "3984cac360808573a7b703b61a66d0fe",
            "goodsName": "奥利奥原味饼干",
            "count": 1,
            "price": 8.8,
            "preferential":[{"name":"会员95折", "value":0.95, "operation":"x"}],
            "total":8.36,
            "specs": "200克/盒"
        },
        {
            "userId": "9e14ebba3be0ae546374e8f5a49f9e80",
            "userName": "long001",
            "shopId": "098a0c4828d7d0c78f42e6124f911a77",
            "shopName": "shop01",
            "goodsId": "94f2965af1c719ade377fd9f85b61e1f",
            "goodsName": "乐事薯片",
            "count": 3,
            "price": 6.4,
            "preferential":[{"name":"会员95折", "value":0.95, "operation":"x"},{"name":"满3件减5元","value":5.0,"operation":"-"}],
            "total":13.24,
            "specs": "160克/罐"
        },
        {
            "userId": "9e14ebba3be0ae546374e8f5a49f9e80",
            "userName": "long001",
            "shopId": "a81184a745ad97a4de19823f9782f733",
            "shopName": "shop02",
            "goodsId": "a1787a5e48133e3b688412c27643df80",
            "goodsName": "大辣片",
            "count": 1,
            "price": 4.9,
            "preferential":[{"name":"会员95折", "value":0.95, "operation":"x"}],
            "total":4.66,
            "specs": "240克/袋"
        },
        {
            "userId": "9e14ebba3be0ae546374e8f5a49f9e80",
            "userName": "long001",
            "shopId": "a81184a745ad97a4de19823f9782f733",
            "shopName": "shop02",
            "goodsId": "dd427517fbdc6760a14b11ee84772685",
            "goodsName": "卫龙辣条",
            "count": 2,
            "price": 4.9,
            "preferential":[{"name":"会员95折", "value":0.95, "operation":"x"}],
            "total":9.31,
            "specs": "35克/袋"
        },
        {
            "userId": "9e14ebba3be0ae546374e8f5a49f9e80",
            "userName": "long001",
            "shopId": "79194be0b10509d407ec414e297da595",
            "shopName": "shop03",
            "goodsId": "552528655c60297fa70d2ca1cb96f995",
            "goodsName": "娃哈哈500ml",
            "count": 5,
            "price": 4.5,
            "preferential":[{"name":"会员95折", "value":0.95, "operation":"x"},{"name":"满3件减5元","value":5.0,"operation":"-"}],
            "total":16.38,
            "specs": "500ml/瓶"
        }
    ]
}

1、初始库存
在这里插入图片描述
2、生成订单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3、生成订单后库存
在这里插入图片描述

总结

踩坑路漫漫长@~@

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 18:08:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 18:08:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 18:08:03       87 阅读
  4. Python语言-面向对象

    2024-03-16 18:08:03       96 阅读

热门阅读

  1. docker安装rabbitmq

    2024-03-16 18:08:03       38 阅读
  2. Linux守护进程

    2024-03-16 18:08:03       40 阅读
  3. 每日一题 第五期 洛谷 图的遍历

    2024-03-16 18:08:03       43 阅读
  4. 最长连续序列 - LeetCode 热题 3

    2024-03-16 18:08:03       40 阅读
  5. 国金证券春招算法岗面试

    2024-03-16 18:08:03       43 阅读