三、node系列之产品数据的excel数据导入以及查询


上一个章节中,我们实现了用户的登陆注册以及接口请求的校验,本章节中我们将实现node导入excel表格数据,上传到数据库中,实现分页获取数据以及依据产品的唯一标识获取详情数据

1、创建产品管理的路由文件

  • 新建myapp/routes/pro.js
var express = require('express');
var router = express.Router();

/* 产品路由*/
router.get('/', function(req, res, next) {
  res.send('产品路由');
});

module.exports = router;

  • myapp/app.js中注册路由,使路由生效
var proRouter = require('./routes/pro');
app.use('/pro', proRouter);

修改app.js文件需记得重新启动服务器

2、设计产品的集合

  • 新建myapp/sql/collection/pros.js
const mongoose = require('./../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象

// 设计产品的集合
const proSchema = new Schema({ 
  proid: {type: String }, // 产品id
  type: { type: String }, // 产品的类型 --- 手机、男装、女装
  brand: { type: String }, // 品牌
  barndimg: { type: String }, // 品牌图标
  proname: { type: String }, // 产品名称
  price: { type: Number }, // 产品价格
  flag: { type: Number }, // 是否推荐
  proimg: { type: String }, // 产品图片
  note: { type: String }, // 产品简介
})

module.exports = mongoose.model('Pro', proSchema);

3、准备产品列表的excel数据表格

大勋给大家准备好了这个excel数据表格,只需要在网盘下载,将其放在项目的根目录下即可,并且一定要记住这个文件的位置,大勋的位置在e:/
shop.xlsx

在这里插入图片描述

4、编写导入功能代码

安装导入的模块 node-xlsx

npm i node-xlsx -S

基本代码

var xlsx = require('node-xlsx');
var filestr = 'E:/shop.xlsx';
// 实现导入接口
router.get('/import', (req, res, next) => {
  // 1、获取表格信息
  let obj = xlsx.parse(filestr)
  res.send(obj)
})

输出结果如下
在这里插入图片描述
细心观察,我们需要的当前数组中的第一个元素的data字段的内容
修改代码再次输出

// 实现导入接口
router.get('/import', (req, res, next) => {
  // 1、获取表格信息
  let obj = xlsx.parse(filestr)[0].data
  res.send(obj)
})

结果如下
在这里插入图片描述
我们发现此时的结构为[[],[],[]],其中第一个元素的内容为表格的表头信息,其余的为表格的内容,我们此时需要做的就是遍历数据(排除第一个),并且给每一条数据生成一个单独的产品id,然后插入数据库即可
代码如下

var xlsx = require('node-xlsx');
var uuid = require('node-uuid');
var Pro = require('./../sql/collection/pros');
var sql = require('./../sql');
var filestr = 'E:/shop.xlsx';
// 实现导入接口
router.get('/import', (req, res, next) => {
  // 1、获取表格信息
  let obj = xlsx.parse(filestr)[0].data
  let arr = []
  // 2、遍历数据 --- 排除第一条数据
  obj.map((item, index) => {
    if (index !== 0) {
      // 3.生成一个产品的id,插入数据库
      arr.push({
        proid: "pro_" + uuid.v1(),
        type: item[0],
        brand: item[1],
        barndimg: item[2],
        proname: item[3],
        price: item[4],
        flag: item[5], // 是否推荐
        proimg: item[6],
        note: item[7]
      }) 
    }
  })
  // 4、插入数据库
  sql.insert(Pro, arr).then(() => {
    res.send(arr)
  })
})

5、编写分页查询数据接口

在 myapp/routes/pro.js文件中添加查询接口
此接口 默认页码下标从0开始,默认每页显示个数为10个,一定要记住页码和每页显示个数的数据类型

// 查询产品 --- 分页功能
// pageCode 页码,默认值为0
// limitNum 每页显示个数, 默认值为10
router.get('/', function(req, res, next) {
  // 1、获取前端的查询条件
  let { pageCode, limitNum } = req.query;
  // 2、设置页码和每页显示个数的默认值  ---- 数据类型
  pageCode = pageCode * 1 || 0;
  limitNum = limitNum * 1 || 10;
  // 3、查询数据
  sql.paging(Pro, {}, { _id: 0 }, limitNum, pageCode).then(data => {
    // 4、返回数据
    res.send({
      code: '200',
      success: '查询列表成功',
      length: data.length,
      data: data
    })
  })
});

浏览器访问 http://localhost:3000/pro 即可查看查询结果
在这里插入图片描述

6、依据产品id查询某一条具体数据

myapp/routes/pro.js 添加如下路由,首先获取用户传递的产品id,然后依据产品id查询数据库取得相应的数据即可

// 获取产品的详情
router.get('/detail', (req, res, next) => {
  let { proid } = req.query
  sql.find(Pro, { proid }, { _id: 0 }).then(data => {
    res.send({
      code: '200',
      message: '查询该数据成功',
      data: data[0]
    })
  })
})

7、获取当前产品的集合中有哪些类型或者哪些品牌

添加如下路由,默认查询的是产品的类型,如果需要查询品牌,请将参数type的值设为 brand

// 实现查询分类以及品牌的接口
router.get('/type', (req, res, next) => {
  // 1、获取字段名 类型 type 品牌 brand,查询数据库
  let { type } = req.query
  type = type || 'type'
  sql.distinct(Pro, type).then(data => {
    res.send({
      code: '200',
      success: '获取类型成功',
      // length: data.length,
      data: data
    })
  })
})

8、预告

下次分享node系列之购物车的业务逻辑

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值