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系列之购物车的业务逻辑