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系列之購物車的業務邏輯