1、后端的接口
express myapp --view=ejs
cd myapp
cnpm i
cnpm i bcryptjs node-uuid
mongoose@4 -S
修改配置文件 package.json 添加dev指令
復制 數據庫相關文件,修改用戶集合 (userid,username,password,tel)
創建數據庫 1908shop,修改db.js
2、實現用戶的注冊接口 routes/users.js
var User = require('./../sql/collection/users');
var sql = require('./../sql');
var utils = require('./../utils')
var uuid = require('node-uuid');
var bcrypt = require('bcryptjs');
var salt = bcrypt.genSaltSync(10); // 加密級別
// 實現注冊接口 -- post提交方式
router.post('/register', (req, res, next) => {
// 1、先獲取表單信息
let { username, password, tel } = req.body;
// 2、根據手機號查詢 用戶集合中是否有該用戶,如果有,返回有該賬戶,如果沒有注冊繼續
sql.find(User, { tel }, { _id: 0 }).then(data => {
// 2.1 判斷有沒有該用戶
if (data.length === 0) {
// 2.2 沒有該用戶----繼續完成注冊操作
// 2.2.1 生成用戶的id
let userid = 'users_' + uuid.v1();
// 2.2.2 對密碼加密
password = bcrypt.hashSync(password, salt)
// 2.2.3 插入數據庫
sql.insert(User, { userid, username, password, tel}).then(() => {
res.send(utils.registersuccess)
})
} else {
// 2.3 已有該用戶
res.send(utils.registered)
}
})
})
3、實現登陸功能 routes/users.js
// 實現登陸功能
router.post('/login', (req, res, next) => {
// 1、獲取表單信息
let { tel, password } = req.body;
// 2、依據手機號查詢有沒有該用戶
sql.find(User, { tel }, { _id: 0 }).then(data => {
// 2.1 判斷有么有該用戶
if (data.length === 0) {
// 2.2 沒有該用戶
res.send(utils.unregister)
} else {
// 2.3 有該用戶,驗證密碼
// 2.3.1 獲取數據庫中的密碼
let pwd = data[0].password;
// 2.3.2 比較 輸入的 密碼和數據庫中的密碼
var flag = bcrypt.compareSync(password, pwd) // 前為輸入,后為數據庫
if (flag) {
// 2.3.3 密碼正確
res.send(utils.loginsuccess)
} else {
// 2.3.4 密碼錯誤
res.send(utils.loginfail)
}
}
})
})
4、編寫登陸注冊接口文檔
api/用戶.md
5、編寫導入excel表格數據
cnpm i node-xlsx -S
5.1 創建產品的集合 sql/collection/pros.js
const mongoose = require('./../db.js'); // 引入數據庫連接模塊
const Schema = mongoose.Schema; // 拿到當前數據庫相應的集合對象
// 設計用戶表的集合
const proSchema = new Schema({ // 設計用戶集合的字段以及數據類型
proid: {type: String },
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);
5.2 添加產品的相關路由
routes/pro.js + app.js 注冊路由
5.3 導入功能 --- 只需要一次即可
routes/pro.js
// 實現導入接口
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)
})
})
6、查詢產品數據
// 查詢產品 --- 分頁功能
// 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
})
})
});
7、查詢產品的接口文檔
api/產品.md
8、獲取產品的類型接口
8.1 封裝獲取類型的數據庫 sql/index.js
distinct(CollectionName, name) {
return new Promise((resolve, reject) => {
CollectionName.distinct(name).exec((err, data) => {
if (err) throw err;
resolve(data)
})
})
}
8.2 獲取分類接口 routes/pro.js
// 實現查詢分類以及品牌的接口
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.3 接口文檔 api/產品.md
9、加入購物車業務邏輯
routes/cart.js + app.js
9.1 設計購物車的集合 sql/collection/carts.js
9.2 加入購物車接口
// 加入購物車 購物車數據id 產品id 用戶id 產品的數量num
router.get('/add', (req, res, next) => {
// 1、獲取數據
let { userid, proid, num } = req.query;
num = num * 1 || 1 // 設定默認數量
// 2、加入購物車
// 如果當前用戶的購物車中有這個產品,數量加1,否則加入
sql.find(Cart, { userid, proid }, { _id: 0 }).then(data => {
if (data.length === 0) {
// 2.1沒有改數據 --- 插入數據庫操作
sql.insert(Cart, {
cartid: 'cart_' + uuid.v1(),
userid,
proid,
num
}).then(() => {
res.send({
code: '200',
message: '加入購物車成功'
})
})
} else {
// 2.2更新數據庫中購物車產品的數量
sql.update(Cart, { userid, proid }, { $inc: { num: 1 } }).then(() => {
res.send({
code: '200',
message: '加入購物車成功'
})
})
}
})
})
9.3 編寫接口文檔
api/購物車.md
10、實現查詢購物車接口
// 查詢購物車數據 ---- 依據用戶id獲取購物車的數據,依據 產品id獲取產品的信息,然后組合數據,輸出數據
router.get('/', function(req, res, next) {
// 1、獲取用戶id
let { userid } = req.query;
// 2、依據用戶id查詢購物車的數據
sql.find(Cart, { userid }, { _id: 0 }).then(data => {
// 如果沒有數據,告訴用戶沒有數據
if (data.length === 0) {
// 2.1 沒有數據
res.send(utils.cartnull)
} else {
// 2.2 有數據,遍歷數據,獲取數據的基本信息,組合數據
let arr = []
new Promise(resolve => { // 2.2.1內含異步操作
data.map((item, index) => { // 2.2.2遍歷數據
// 2.2.3 依據產品的id查詢數據的相關信息
sql.find(Pro, { proid: item.proid }, { _id: 0 }).then(data1 => {
// console.log(data1)
// 2.2.4 組合數據
arr.push({
cartid: item.cartid,
userid: userid,
proid: item.proid,
proname: data1[0].proname,
proimg: data1[0].proimg,
price: data1[0].price,
num: item.num
})
// 2.2.5 遍歷所有的數據結束
if (index >= data.length - 1) {
resolve()
}
})
})
}).then(() => {
// 2.2.6 返回購物車數據結果
res.send({
code: '200',
message: '獲取購物車列表的數據',
length: arr.length,
data: arr
})
})
}
})
});
- 編寫接口文檔 api/購物車.md
11、刪除購物車接口
// 刪除購物車
router.get('/delete', (req, res, next) => {
// 1、獲取刪除的條件
let { userid, proid } = req.query
// 2、刪除
sql.delete(Cart, { userid, proid }).then(() => {
res.send(utils.deletesuccess)
})
})
- 接口文檔
12、更新購物車數據數量
// 更新購物車
router.get('/update', (req, res, next) => {
// 1、獲取更新的數據
let { cartid, num } = req.query
// 2、更新數據
sql.update(Cart, { cartid }, { $set: { num: num } }).then(() => {
res.send(utils.updatesuccess)
})
})
13、獲取產品詳情接口
routes/pro.js
// 獲取產品的詳情
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]
})
})
})
接口文檔 api/產品.md
14、輪播圖接口
-
數據庫集合 sql/collection/banners.js
-
數據庫插入數據
public/images復制相關圖片,myapp/banner.js插入數據
const sql = require('./sql')
const Banner = require('./sql/collection/banners')
const uuid = require('node-uuid');
const arr = []
for (var i = 0; i < 6; i++) {
arr.push({
bannerid: 'banner_' + uuid.v1(),
type: 'home',
img: 'images/' + (i + 1) + '.jpg',
href: ''
})
}
sql.insert(Banner, arr)
- 編寫接口
routes/banner.js + app.js
// 獲取輪播圖
router.get('/', function(req, res, next) {
// 依據類型查詢相關的輪播圖數據
let { type } = req.query
type = type || 'home'
sql.find(Banner, { type }, { _id: 0 }).then(data => {
res.send({
code: '200',
message: '獲取輪播圖數據成功',
data: data
})
})
});
- 編寫接口文檔 api/輪播圖.md
15、評論接口
-
設計評論 數據庫集合 sql/collection/comments.js
-
routes/comment.js + app.js
-
依據產品id 獲取評論信息列表
// 獲取評論信息列表
router.get('/', function(req, res, next) {
let { proid } = req.query;
// 內部包含用戶的信息,通過用戶id 獲取到所有的用戶名,對應的相關評論,拼接數據
sql.find(Comment, { proid }, { _id: 0 }).then(data => {
let arr = []
new Promise(resolve => {
data.map((item, index) => {
sql.find(User, { userid: item.userid }, { _id: 0 }).then(data1 => {
arr.push({
commentid: item.commentid,
username: data1[0].username,
note: item.note,
rating: item.rating
})
if (index >= data.length - 1) {
resolve()
}
})
})
}).then(() => {
res.send({
code: '200',
message: '查詢評論列表',
data: arr
})
})
})
});
- 添加評論信息
router.post('/add', (req, res, next) => {
let { userid, proid, rating, note } = req.body;
rating = rating * 1 || 5
sql.insert(Comment, {
commentid: 'comment_' + uuid.v1(),
userid, proid, rating, note
}).then(() => {
res.send(utils.commentsuccess)
})
})