express+mysql+vue,从零搭建一个商城管理系统17--查询订单导出excel

news/2024/7/19 12:37:13 标签: express, mysql, vue.js

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

文章目录

  • 前言
  • 一、安装exceljs
  • 二、新建config/exportExcel.js
  • 三、修改dao/order.js
  • 四、修改routes/order.js
  • 五、添加商品到购物车
  • 总结


前言

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

一、安装exceljs

npm install exceljs --save

在这里插入图片描述

二、新建config/exportExcel.js

exportExcel.js

const Excel = require('exceljs');
const exportExcel = async (data)=>{
	let workbook = new Excel.Workbook();
	let worksheet = workbook.addWorksheet(data.userName+'-'+data.orderId);
	worksheet.columns = [
		{ header:'用户名', key:'userName' },
		{ header:'订单号', key:'orderId' },
		{ header:'订单总价', key:'orderTotal' },
		{ header:'商户名称', key:'shopName' },
		{ header:'商品名称', key:'goodsName' },
		{ header:'规格', key:'specs' },
		{ header:'数量', key:'count' },
		{ header:'单个商品总价', key:'goodsTotal' },
		{ header:'折扣', key:'preferential' },
	]
	let rows = [];
	for(let i=0;i<data.goods.length;i++){
		let oneGoods = data.goods[i];
		worksheet.addRow({ 
			userName: data.userName, 
			orderId: data.orderId,  
			orderTotal: data.total, 
			shopName: oneGoods.shopName, 
			goodsName: oneGoods.goodsName, 
			specs:oneGoods.specs, 
			count:oneGoods.count,
			goodsTotal:oneGoods.total, 
			preferential:oneGoods.preferential, 
		});
	}
	// worksheet.addRow(rows);
	// A列 从第2行开始--到data.goods.length+1行合并  因为头部占了一行   所以第二行开始   到n+1行结束
	worksheet.mergeCells('A2:A+'+(data.goods.length+1));
	worksheet.mergeCells('B2:B'+(data.goods.length+1));
	worksheet.mergeCells('C2:C'+(data.goods.length+1));
	//合并后的单元格文字水平垂直居中
	worksheet.getCell('A2').style.alignment = worksheet.getCell('B2').style.alignment = worksheet.getCell('C2').style.alignment = { vertical: 'middle', horizontal: 'center' };
	try{
		await workbook.xlsx.writeFile(data.userName+'-'+data.orderId+'.xlsx');
		return {
			msg:'表格下载成功',
			code:200,
			success:false
		}
	}catch(err){
		return {
			msg:err,
			code:500,
			success:false
		}
	}
}

module.exports = exportExcel;

在这里插入图片描述

三、修改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 = parseFloat((item.goodsTotal||(item.price*item.count)).toFixed(2));//Math.round((item.goodsTotal||(item.price*item.count))*100)/100;
                    if(pItem.operation == 'x'){
                        item.goodsTotal = parseFloat((nowTotal*pItem.value).toFixed(2));//Math.round((nowTotal*pItem.value)*100)/100;
                    }else if(pItem.operation == '-'){
                        item.goodsTotal = parseFloat((nowTotal-pItem.value).toFixed(2));//Math.round((nowTotal-pItem.value)*100)/100;
                    }
                })
            }
            //保留2位小数,向上取整
            item.goodsTotal = parseFloat(item.goodsTotal.toFixed(2));//Math.round(item.goodsTotal*100)/100;
            orderTotal = parseFloat((orderTotal+item.goodsTotal).toFixed(2));
            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({
                    id: orderResult.id,
                    orderId: orderResult.orderId,
                    userId: orderResult.userId,
                    userName: orderResult.userName,
                    total: orderResult.total,
                    goods:orderItemResult
                },'下单成功');
            }catch(oiErr){
                return errFun(err);
            }
        }catch(oErr){
            return errFun('下单失败!!',oErr);
        }
    },
    //通过orderId获取订单数据
    queryOrderByOrderId:async(data)=>{
        try{
            const orderData = await OrderModel.findOne({where:{orderId:data.orderId}});
            try{
                const orderItemData = await OrderItemModel.findAll({where:{orderId:data.orderId}});
                console.log(orderItemData)
                if(orderData&&orderItemData){
                    return sucFun({
                        id: orderData.id,
                        orderId: orderData.orderId,
                        userId: orderData.userId,
                        userName: orderData.userName,
                        total: orderData.total,
                        goods:orderItemData
                    },'订单查询成功');
                }
            }catch(err){
                return errFun('订单查询失败!!',oErr);
            }
        }catch(err){
            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 logistics = require('../config/logistics');
const exportExcel = require('../config/exportExcel');
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);
    });
    router.post('/order/queryOrderByOrderId',async (req,res)=>{
        const result = await OrderDao.queryOrderByOrderId(req.body);
        res.json(result);
    });
    router.post('/order/queryOrderLogistics',async (req,res)=>{
        const result = await logistics.query(req.body);
        res.json(result);
    });
    router.post('/order/exportExcel',async (req,res)=>{
        const orderResult = await OrderDao.queryOrderByOrderId(req.body);
        let result = {code:500,success:false,msg:'导出excel失败'};
        if(orderResult.success){
            result = await exportExcel(orderResult.data);
        }else{
            result = orderResult;
        }
        res.json(result);
    });
}
module.exports = OrderRoutes;


在这里插入图片描述

五、添加商品到购物车

url:http://localhost:1990/order/exportExcel
params:{
   "orderId": "420cdcbd6ef3075f41c8613ff8bcf013"
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

踩坑路漫漫长@~@


http://www.niftyadmin.cn/n/5464246.html

相关文章

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…

Jenkins插件下载错误时间问题

以下为错误原因&#xff0c;主要是虚拟机的时间和北京时间不一致造成的 java.security.cert.CertificateNotYetValidException: NotBefore: Tue Mar 26 10:14:30 UTC 2024 jenkins-jenkins-1 | 2024-03-25 19:36:03.9460000 [id72] INFO h.model.UpdateCenter$DownloadJob#run…

泰克Tektronix TCP0030A电流探头

181/2461/8938产品概述&#xff1a; TCP0030 是简便易用的高性能交流/直流探头&#xff0c;旨在用于通过 TekVPI™ 探头接口直接连接示波器。该交流/直流测量探头提供了超过 120 MHz 的带宽&#xff0c;选配择 5 A 和 30 A 测量量程。还提供了卓越的低电流测量能力和最低 1 mA…

【漏洞复现】金和OA XmlDeal.aspx XXE漏洞

0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…

HackTheBox-Mist

整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口&#xff0c;将mist.htb加入到hosts文件后&#xff0c;访问mist.htb Pluck CMS文件读取 在…

iPhone设备中调试应用程序崩溃日志的高效方法探究

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

银行业架构网络BIAN (Banking IndustryArchitecture Network)详细介绍

BIAN ( The Banking Industry Architecture Network) 是一个业界多方协作的非营利性组织&#xff0c;由全球领先银行、技术提供商、顾问和学者组成&#xff0c;定义了一个用以简化和标准化核心银行体系结构的银行技术框架。这一框架基于面向服务的架构 (SOA) 原则&#xff0c;银…

算法2.6基数排序

基数排序 属于分配式排序,又称桶子法,通过键值的各个位上的值,将要排序的元素分配至某些桶中,达到排序的作用. 基数排序属于稳定性排序,是效率高的稳定性排序法 是桶排序的扩展,将整数按照位数进行切割,再按各个位数进行比较 是用空间换时间的经典算法 在使用8kw个数据进行…