提示:学习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、生成订单后库存
总结
踩坑路漫漫长@~@