四:後臺數據庫設計(化妝品表格)
阿新 • • 發佈:2018-06-20
esc data nco cto 連接數據庫 objectid gedit 化妝 errno
1.數據庫字段的設計:
1.1.在數據庫moon中新建表格“MakeUp”
1.2.具體的字段含義: brand: "", //商品的類型 careType:" ", //護理類型 //可選值:facialCare:面部護理類型 ; perfumeCosmetics:香水彩妝類型 ;img:[ ],//商品圖片 useType:" " , //用途類型,可選值:“口紅” ;“化妝工具” ;“BB霜” ; “防曬霜” ;“洗面奶” ; “水” ; “乳”; ...........等 originPrice:number , //未打折價格 newPrice:number , //打折價格 goodsName:" " , //商品名稱 goodsDescribe:" " ,//商品描述 goodsDetail:" " ,//商品詳情,在商品詳情中的商品詳情描述圖片,是一個字符串類型的圖片地址 stock:number , //庫存量 monthlySales:number , //月銷售量 SalesCount:number, //總銷售量 productionPlace:"" //產地2.mongoose的使用:
2.1.基於對新知識的學習熱情,雖然前面是有用到對mongodb的封裝allhandlers.js,,基本可以達到我目前的功能,但是基於好奇現在開發的話用mongodb大多數可能都選擇用mongoose來過度使用mongodb,so我也去研究了下,前面有博文寫到基本的mongoose的使用,個人是感覺使用mongoose的話,會讓mongo數據庫在使用時更容易語義化,和操作,更穩定吧。
2.2.進入後臺項目文件夾routes 新建文件夾Model,在裏面新建文件AllHandler.js文件,對mongoose操作做一個基本的增刪改查的封裝,具體代碼如下:
var assert = require(‘assert‘); //View Code斷言包 //這個頁面來封裝基本的增刪改查的方法 //增 var add = function(Mod, selector, fn) { //參數1是實例化的Model,參數2是需要新增的內容 var model = new Mod(selector[0]); try { model.save(function(err, res) { assert.equal(err, null); fn(res) }) } catch (ex) { console.log("AllHandler報錯:" + ex); fn([]); } }//查 //查所有根據條件 var find = function(Mod, selector, fn) { try { Mod.find(selector[0], selector[1] ? selector[1] : "", function(err, res) { assert.equal(err, null); fn(res) }) } catch (ex) { console.log("AllHandler報錯:" + ex); fn([]); } } //通過ID更新某條數據 var updateById = function(Mod, selector, fn) { var id = selector[0].id; var updatestr = selector[1]; try { Mod.findByIdAndUpdate(id, updatestr, function(err, res) { if (err) { assert.equal(err, null); } else { fn(res); } }) } catch (ex) { console.log("AllHandler報錯:" + ex); fn(null); } }; //通過ID來刪除一條數據 var deleteById = function(Mod, selector, fn) { var id = selector[0].id; try { Mod.findByIdAndRemove(id, function(err, res) { if (err) { assert.equal(err, null); } else { fn(res); } }) } catch (ex) { console.log("AllHandler報錯:" + ex); fn(null); } }; //通過條件來刪除所有符合條件的 var deleteByStr = function(Mod, selector, fn) { var conditions = selector[0]; try { Mod.remove(conditions, function(err, res) { if (err) { assert.equal(err, null); } else { fn(res); } }) } catch (ex) { console.log("AllHandler報錯:" + ex); fn(null); } } //分頁 var page = function(Mod, selector, fn) { var pageSize = selector[1].pageSize || 5; //一頁多少條 var currentPage = selector[1].currentPage || 1; //當前第幾頁 var skipnum = (currentPage - 1) * pageSize; //跳過數 try { var results; var count; Mod.count(selector[0], function(err, result2) { assert.equal(err, null); count = result2; }); /* Mod.find({}, function(err, res) { //在mongoose中第一個參數查詢條件必須是一個json集合對象,如果是空寫成{},而不能是“”; assert.equal(err, null); console.log(res) fn(res) })*/ Mod.find(selector[0]).skip(skipnum).limit(pageSize).exec(function(err, res) { //console.log("hahaha") assert.equal(err, null); if (res) { results = res; //console.log(count, results) fn(results, count); } }); } catch (ex) { console.log("AllHandler報錯:" + ex); } } var OperateType = { add: add, find: find, findSome: find, page: page, deleteByStr: deleteByStr, deleteById: deleteById, updateById: updateById }; module.exports = function(Mod, i, selector, fn) { //model ; 參數 ; 回調函數 OperateType[i](Mod, selector, fn); }
2.3.然後還是繼續在上面的Model文件夾中,新建一個基本連接的文件MyMongoose.js文件,進行連接數據庫操作,具體代碼如下:
var mongoose = require(‘mongoose‘); var Url = "mongodb://localhost:27017/moon"; //要用到的數據庫moon; var db = mongoose.connect(Url); // 監聽連接成功 mongoose.connection.on(‘connected‘, function() { console.log("成功連接到數據庫:" + Url) }) //監聽連接異常 mongoose.connection.on(‘error‘, function(err) { console.log("連接數據庫出現異常:" + err) }) //監聽連接斷開 mongoose.connection.on(‘disconnected‘, function() { console.log(‘連接數據庫現在已經斷開‘) }) module.exports = { mongoose: mongoose, db: db };View Code
2.4.然後還是在routes文件夾中新建文件ModelMakeUp.js,去定義化妝品表格的model的schema,以及增刪改差的操作路由等,具體代碼如下:
//MakeUp表的數據庫操作 var express = require(‘express‘); var router = express.Router(); var crypto = require(‘crypto‘); var ObjectId = require(‘mongodb‘).ObjectId; var mongoose = require(‘./Model/MyMongoose‘).mongoose; var handle = require(‘./Model/AllHandler‘); var formidable = require(‘formidable‘); var fs = require(‘fs‘); /* brand: "", //商品的類型 careType:" ", //護理類型 //可選值:facialCare:面部護理類型 ; perfumeCosmetics:香水彩妝類型 ;img:[ ],//商品圖片 useType:" " , //用途類型,可選值:“口紅” ;“化妝工具” ;“BB霜” ; “防曬霜” ;“洗面奶” ; “水” ; “乳”; ...........等 originPrice:number , //未打折價格 newPrice:number , //打折價格 goodsName:" " , //商品名稱 goodsDescribe:" " ,//商品描述 goodsDetail:" " ,//商品詳情,在商品詳情中的商品詳情描述圖片,是一個字符串類型的圖片地址 stock:number , //庫存量 monthlySales:number , //月銷售量 SalesCount:number, //總銷售量 productionPlace:"" //產地 */ var schema = mongoose.Schema; var MakeUpSch = new schema({ //這個表的字段 goodsName: String, goodsDescribe: String, goodsDetail: String, brand: String, careType: String, useType: String, originPrice: Number, newPrice: Number, productionPlace: String, img: { type: String, default: "http://localhost:3000/images/makeUp/啦.jpg" }, stock: Number, SalesCount: Number, monthlySales: Number }); var MolMakeUp = mongoose.model(‘MakeUp‘, MakeUpSch, ‘MakeUp‘); //往表格裏面插數據 router.post(‘/add‘, function(req, res) { var collection = []; if (req.body.collection.img == "") { req.body.collection.img = "http://localhost:3000/images/makeUp/啦.jpg" } collection[0] = req.body.collection; handle(MolMakeUp, ‘add‘, collection, function(result) { res.send(result) }) }) //查詢表裏所有數據 router.post("/find", function(req, res) { var collection = [{}]; handle(MolMakeUp, ‘find‘, collection, function(result) { res.send(result) }) }) //查詢表裏符合條件的數據,並且篩選只要部分字段 router.post("/findSome", function(req, res) { var collection = [{}, {}]; collection[1] = req.body.show; handle(MolMakeUp, ‘find‘, collection, function(result) { res.send(result) }) }) //根據ID刪除表格的數據 router.post("/deleteById", function(req, res) { var id = req.body.id; var collection = []; collection[0] = { id: ObjectId(id) }; handle(MolMakeUp, "deleteById", collection, function(result) { res.send(result) }) }) //根據ID來update更新數據 router.post("/updateById", function(req, res) { var id = req.body.selector._id; var collection = []; collection[0] = { id: ObjectId(id) }; if (req.session.makeUp_imgPath != "" && req.session.makeUp_imgPath != null) { req.body.selector.img = req.session.makeUp_imgPath; console.log(req.body.selector.img[0]); console.log(req.session.makeUp_imgPath); } collection[1] = req.body.selector; handle(MolMakeUp, "updateById", collection, function(result) { res.send(result) }) }) //分頁查詢 router.post(‘/page‘, function(req, res) { var selector = []; selector[0] = {}; selector[1] = { pageSize: req.body.rows, //每頁展示幾條數據 currentPage: req.body.page //當前在第幾頁 }; //res.send("111") handle(MolMakeUp, ‘page‘, selector, function(result, count) { var result = { result: result, count: count } res.send(result); }) }) //wangEditor編輯器接口 //wangeditor上傳圖片的地址 router.post("/wangeditor/upload", function(req, res, next) { var form = new formidable.IncomingForm(); //設置文件上傳存放地址 form.uploadDir = "./public/images/makeUp"; //執行裏面的回調函數的時候,表單已經全部接收完畢了。 form.parse(req, function(err, fields, files) { //if(files.File){ var oldpath = files.myFileName.path; var extname = files.myFileName.name; //新的路徑由三個部分組成:時間戳、隨機數、拓展名 var newpath = "./public/images/makeUp/" + extname; //改名 try { fs.rename(oldpath, newpath, function(err) { if (err) { res.json({ errno: 1, data: [] }); }; var mypath = newpath.replace("./public", "http://localhost:3000"); req.session.makeUp_imgPath = mypath; res.json({ errno: 0, data: [mypath] }) }); } catch (ex) { res.json({ errno: 1, data: null }) } }); }) module.exports = router;View Code
3.修改路由,讓能訪問到上面的路徑,進入routes裏面的routes.js修改成下面的代碼:
// 主要的路由文件 module.exports = function(app) { app.use(‘/‘, require(‘./index‘)) app.use(‘/users‘, require(‘./users‘)) app.use(‘/ModelMakeUp‘, require(‘./ModelMakeUp‘)) //加這個 }
四:後臺數據庫設計(化妝品表格)