前記
在學習vue的路上從開始看api到寫了幾個小專案後,對vue有了一定的瞭解,但是一直沒做過web全棧類的專案。這次跟著慕課的視訊做了web全棧類專案,特此一記,來鞏固下知識!
github地址:github.com/Conankids/m…
技術
前端
使用vue-cli搭建前端基本框架+vue-router完成前端路由+vuex管理狀態
後端
基於nodejs使用express腳手架生成express專案框架+mongoose運算元據庫
資料庫
mongodb資料庫
專案搭建
- 安裝vue-cli
- 初始化vue專案目錄
sudo vue init webpack 專案名稱 (由於我是mac電腦,需要sudo許可權;專案名必須是小寫,大寫字母會報錯)
複製程式碼
- 寫vue專案
- 在未建立後端程式碼的時候可以使用webpack自帶的外掛進行mock資料,在build/webpack.dev.conf.js裡面做如下修改,在介面請求到/goods的時候就會請求到我們事先寫好的json資料了
//mock資料
const goodsData = require('./../mock/GoodsList.json')
devServer: {
...
before:function (app) {
//模擬mock資料
app.get('/goods',function (req,res) {
res.json(goodsData)
})
}
},
複製程式碼
- 安裝express腳手架
sudo npm i -g express-generator
複製程式碼
- 初始化express專案目錄
進入到專案目錄下 express server
複製程式碼
- 安裝mongodb資料庫
技術點詳解
前端
- 使用vue-router實現前端路由功能
- 使用vue-infinite-scroll外掛實現上拉載入功能
- 使用axios來實現前後端通訊
- 使用vue-lazyLoad外掛實現圖片的懶載入
- 使用尤大的currency.js實現全域性過濾器功能
- 使用vuex管理購物車數量
(所用前端技術比較常見,不是本次記述重點)
後端
- 安裝mongoose外掛
npm i mongoose -S
複製程式碼
2.建立models檔案目錄用來存放資料庫欄位模型(users、goods)
const mongoose = require('mongoose') //引入mongoose
const schema = mongoose.Schema
//new一個schema物件,引數為欄位及其型別
const userSchema = new schema({
"userId": String,
"userName": String,
"userPwd": String,
"orderList": Array,
"cartList": [{
"productId": String,
"productName": String,
"salePrice": String,
"productImage": String,
"checked": String,
"productNum": String
}],
"addressList": [{
"addressId": String,
"userName": String,
"streetName": String,
"postCode": Number,
"tel": Number,
"isDefault": Boolean
}]
})
//模型建立之後暴露出來,mongoose.model('模型名稱',模型物件,資料庫集合名(預設會新增s可以不填,否則需要制定資料庫建立出來的模型名))
module.exports = mongoose.model('user', userSchema)
複製程式碼
3.建立路由檔案
在routes資料夾下建立users.js和goods.js分別對應/users和/goods路由。同時需要在app.js中進行引用。
var indexRouter = require('./routes/index');//index路由
var usersRouter = require('./routes/users');//users路由
var goodsRouter = require('./routes/goods');//goods路由
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/goods', goodsRouter);
複製程式碼
4.連線資料庫
//引入依賴
const express = require('express')
const mongoose = require('mongoose')
const goods = require('../models/goods')
const users = require('../models/users')
const router = express.Router()
//連線資料庫
//connect()最簡單的使用方式,就是隻要傳入url引數即可,如下所示。連線到本地localhost的db1伺服器
//mongoose.connect('mongodb://localhost/db1');
//如果還需要傳遞使用者名稱、密碼,則可以使用如下方式
//mongoose.connect('mongodb://username:password@host:port/database?options...');
mongoose.connect('mongodb://140.143.234.88:27017/db_demo')
//監聽連線狀態(已連線)
mongoose.connection.on('connected', () => {
console.log('MongoDb connected successful!')
})
//失敗
mongoose.connection.on('err', () => {
console.log('MongoDb connected fail!')
})
//斷開連線
mongoose.connection.on('disconnected', () => {
console.log('MongoDb disconnected!')
})
複製程式碼
5.編寫獲取產品列表介面(mongoose查詢用法)
router.get('/list', (req, res, next) => {
const page = parseInt(req.param('page')) //獲取頁碼引數
const pageSize = parseInt(req.param('pageSize')) //獲取一頁有多少條資料引數
const sort = req.param('sort') //獲取排序引數
const priceLevel = req.param('priceLevel') //獲取價格區間
const skip = (page - 1) * pageSize //計算跳過多少條
let params = {} //查詢引數
let startPrice = '', endPrice = ''
if (priceLevel != 'all') {
switch (priceLevel) {
case '0':
startPrice = 0
endPrice = 100
break
case '1':
startPrice = 100
endPrice = 500
break
case '2':
startPrice = 500
endPrice = 1000
break
case '3':
startPrice = 1000
endPrice = 5000
break
}
params = {
salePrice: {
$gt: startPrice,
$lt: endPrice
}
}
}
const goodsModel = goods.find(params).skip(skip).limit(pageSize) //查詢後跳過多少條限制一頁多少條,返回計算後的模型
goodsModel.sort({'salePrice': sort}) //對模型進行排序
goodsModel.exec((err, doc) => {
if (err) {
res.json({
status: -1,
msg: err.message
})
} else {
res.json({
status: 0,
msg: '',
result: {
count: doc.length,
list: doc
}
})
}
})
})
複製程式碼
6.編寫加入購物車介面(mongosse增加資料用法)
router.post('/addCart', (req, res, next) => {
const userId = req.cookies.userId
const productId = req.body.productId
let userProductId = ''
//查詢user表
users.findOne({userId: userId}, (err1, userDoc) => {
if (err1) {
res.json({
status: -1,
msg: err.message
})
} else {
if (userDoc) {
//遍歷user表的購物車列表是否已有此商品
userDoc.cartList.forEach(item => {
if (item.productId == productId) {
userProductId = productId
item.productNum++
}
})
if (userProductId) {
//已新增的商品只增加數量
userDoc.save((err2, doc2) => {
if (err2) {
res.json({
status: -1,
msg: err2.message
})
} else {
res.json({
status: 0,
msg: '操作成功',
result: ''
})
}
})
} else {
//未新增的查詢goods表資訊
goods.findOne({productId: productId}, (err3, goodsDoc) => {
if (err3) {
res.json({
status: -1,
msg: err3.message
})
} else {
if (goodsDoc) {
//查出來的資訊賦值給user表的cartList
goodsDoc.productNum = 1
goodsDoc.checked = 1
userDoc.cartList.push(goodsDoc)
userDoc.save((err4, doc4) => {
if (err4) {
res.json({
status: -1,
msg: err2.message
})
} else {
res.json({
status: 0,
msg: '操作成功',
result: ''
})
}
})
}
}
})
}
}
}
})
})
複製程式碼
7.刪除購物車商品介面(mongoose刪除用法)
router.post('/cartDel', (req, res, next) => {
const userId = req.cookies.userId
const productId = req.body.productId
user.update({
userId: userId
},
{
//使用$pull
$pull: {
cartList: {
productId: productId
}
}
}, (err, doc) => {
if (err) {
res.json({
status: -1,
msg: err.message
})
} else {
if (doc) {
res.json({
status: 0,
msg: '刪除成功',
result: ''
})
}
}
})
})
複製程式碼
8.修改購物車商品資料(mongoose修改資料用法)
router.post('/cartEdit', (req, res, next) => {
const userId = req.cookies.userId,
productId = req.body.productId,
productNum = req.body.productNum,
checked = req.body.checked
user.update({
userId: userId,
'cartList.productId': productId
}, {
'cartList.$.productNum': productNum,
'cartList.$.checked': checked
}, (err, doc) => {
if (err) {
res.json({
status: -1,
msg: err.message
})
} else {
if (doc) {
res.json({
status: 0,
msg: '操作成功',
result: ''
})
}
}
})
})
//還可以使用findOne()+save()的方式來修改資料
複製程式碼
mongodb資料庫
- 安裝mongodb資料庫 安裝教程
- 安裝完成後啟動mongodb(安裝在騰訊雲伺服器了)
mongod -f /root/mongodb/etc/mongodb.conf 使用配置檔案啟動
複製程式碼
此處有坑:如果需要mongodb常駐程式需要設定fork=true,否則在斷開伺服器連線後,資料庫會關閉 3. 另起終端視窗,可以進行mongodb操作
mongo 進入mongodb操作模式
show dbs 檢視資料庫
use demo 選擇資料庫(沒有的話建立)
db.dropDatabase() 刪除資料庫
show collections 檢視集合
db.demo.drop() 刪除集合
插入文件
db.createCollection('demo') 建立集合
db.demo.insert({id:123,name:'conan'}) 建立並插入集合
更新文件
db.demo.update({id:'123',{$set:{name:'kids'}}})
db.demo.update({id:'123',{$set:{'class.name':'jd'}}}) 更新子集欄位
刪除文件
db.demo.remove({id:123})
查詢文件
db.demo.find() 檢視集合
db.demo.find().pretty() 檢視集合(格式化形式顯示)
db.demo.findOne() 檢視第一條集合的資料
db.demo.find({id:123}) 按條件查詢(findOne()同樣用法)
db.demo.findOne({age:{$gt:20}) 大於20($lt=>小於,$eq=>等於,$gte=>大於等於,$lte=>小於等於)
複製程式碼