用vue和node寫的簡易購物車實(shí)現(xiàn)
項(xiàng)目介紹
這是用vue寫前端,用node來接收前端發(fā)來的請求,然后進(jìn)行相應(yīng)的數(shù)據(jù)操作,例如數(shù)據(jù)的存取和刪除等。這是個(gè)人的練習(xí)項(xiàng)目,目前功能做的比較簡單,主要是展示商品列表,把商品加入購物車,從購物車刪除商品三個(gè)小功能。
搭建本地環(huán)境
因?yàn)槭怯胿ue,需要用babel把es6語法轉(zhuǎn)為es5語法。
1.配置.babelrc文件
{ "presets": [ "es2015", "stage-2" ], "plugins": ["transform-runtime"] }
2.配置package.json文件
3.配置webpack.config.js文件。因?yàn)閎abel后的代碼是遵循commonjs規(guī)范的代碼,不能直接在瀏覽器上運(yùn)行,需要用webpack打包成可直接運(yùn)行的代碼。
配置完成后運(yùn)行 npm run build 和 webpack 命令。運(yùn)行后會(huì)生成lib和dist文件夾。
文件目錄
-dist -index -lib -index.js -my_server.js -src -component -list.vue -public -view -index.pug -index.js -my_server.js -.babelrc -package.json -webpack.config.js
數(shù)據(jù)庫使用mysql,僅有兩張表,一張表存儲(chǔ)的是商品id,商品名,商品圖。另一張表存儲(chǔ)的是用戶id和商品id。
my_server.js 使用node的expres,mysql,path,pug模塊,為了能解析http請求數(shù)據(jù),還需要引入body-parser。
lib文件夾下的文件是babel生成的,src文件夾下的文件這是webpack打包后的文件。
購物車實(shí)例
今天優(yōu)化了下,購物車首屏加載使用pug模板將數(shù)據(jù)直出到頁面,提高加載速度。
1、連接數(shù)據(jù)庫
var conn = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database:'test', port: 3306 }); conn.connect();
2.初始化查詢商品列表和購物車。商品列表數(shù)據(jù)是直出的,而購物車列表是用post請求的數(shù)據(jù),后續(xù)會(huì)優(yōu)化成數(shù)據(jù)直出到頁面,減少http請求,加快頁面加載速度。
index.pug首頁模板
doctype html html(lang="en") head title= 'index' body div(id='app') app script. init_data= !{init_data}; script(src='http://libs.baidu.com/jquery/2.1.1/jquery.min.js') script(src='http://localhost:4444/index.js')
list.vue
<template> <div class="content_wrap"> <div class="content_left"> <h3>商品列表</h3> <div class="item" v-for="list in mess" @click="add_to_cart" data-id="{{list.f_id}}"> <div class="img_wrap"> <img :src='list.f_avatar' > </div> <span>{{list.f_name}}</span> </div> </div> <div class="content_right" id="content_right" @click="delete_item"> <h3>購物車</h3> <div class="item" v-for="list in cart_mess" data-id="{{list.f_id}}"> <div class="img_wrap"> <img :src='list.f_avatar'> </div> <span>{{list.f_name}}</span> <div class="delete_layer"> <p class="delete">刪除</p> </div> </div> </div> </div> </template> <script> export default { }, data(){ return { mess:init_data, cart_mess:[] } }, methods:{ }, init:function(){ let self = this; //初始化購物車 this.$http.post('/search_cart',{user_id:2333}).then(response => { if(response.data.errcode===0){ let data = response.data; self.cart_mess = data.data; } }, response => { // error callback }); } } </script>
my_server.js
//初始化查詢商品列表 app.get('/',function(req,res){ var selectSQL = 'select * from t_list limit 4'; conn.query(selectSQL, function (err2, rows) { if (err2) console.log(err2); var seach_result = JSON.stringify(rows); res.render('index',{//pug(jade)是express默認(rèn)模板 init_data:seach_result, }); }); });
初始化查詢購物車列表
這里邏輯是根據(jù)用戶id查出商品id,再根據(jù)商品id查出商品信息添加到頁面上
用promise寫異步邏輯
app.post('/search_cart', function (req, res) { return new Promise(function(resolve){ let return_data = { req :req }; resolve(return_data); }) .then(function(return_data){ let user_id=return_data.req.body.user_id; let query = 'SELECT * FROM t_item_user WHERE f_uid = ?'; let query_param = user_id; return new Promise(function(resolve){ conn.query(query,query_param, function (err2, rows) { resolve(rows); }); }); }).then(function(rows){ if(rows.length>0){ let query_item = 'SELECT * FROM t_list WHERE f_id in (?)'; let whereIn = []; for(let i=0,len=rows.length;i<len;i++){ whereIn.push(rows[i].f_item_id); } conn.query(query_item,[whereIn], function (err2, rowss) {//異步分兩次查。。。。 if (err2){ console.log(err2); } let $return={ errcode:0, errmsg:'', data:rowss, }; res.end(JSON.stringify($return));//返回 }); }else if(rows.length==0){ let $return={ errcode:0, errmsg:'', data:'' }; res.end(JSON.stringify($return));//返回 } }); });
3.加入購物車
list.vue頁面的請求
add_to_cart:function (e) { let item_id = parseInt(e.currentTarget.getAttribute('data-id'));//vue獲取當(dāng)前dom對象 let data = {id:2333,item_id:item_id}; $.ajax({ type: "post", url: "/add_to_cart", dataType: "json", data: JSON.stringify(data), contentType: 'application/json', success: function (response) { if(response.errcode ===1 ){ console.log('加入購物車成功'); let div = document.createElement('div'); div.setAttribute('class','item'); div.setAttribute('data-id',item_id); let img_src; if(e.target.nodeName==='IMG'){ img_src = e.target.getAttribute('src'); }else if(e.target.nodeName==='SPAN'){ img_src = e.target.previousSbiling.getAttribute('src'); } let str = '<div class="img_wrap"> '+'<img src="'+ img_src +'">' + '</div><span>test1</span>'+'<div class="delete_layer">' +'<p class="delete">刪除</p>'+ '</div>'; div.innerHTML = str; document.getElementById('content_right').appendChild(div); }else if(response.errcode ===2){ alert('已經(jīng)添加過了哦'); } }, error: function (request) { } }); }
my_server.js接收請求
app.post('/add_to_cart', function (req, res) { let request = req.body; let query = 'SELECT f_uid,f_item_id FROM t_item_user WHERE f_item_id = ?'; let query_param = request.item_id; conn.query(query,query_param, function (err2, rows) { if (err2) console.log(err2); if(rows.length===0){ //insert let sql = 'insert into t_item_user(f_uid,f_item_id) values(?,?)'; let param = [req.body.id,req.body.item_id]; conn.query(sql,param, function (err1, res1) { if(res1.affectedRows==1){ let $return={ errcode:1, errmsg:'插入成功', }; res.end(JSON.stringify($return)); }else{ console.log('what'); } }) }else{ let $return={ errcode:2, errmsg:'該商品已經(jīng)存在', }; res.end(JSON.stringify($return));//返回 } }) });
github:https://github.com/yunhongyao/simple_shopping_cart
完整代碼下載:simple_shopping_cart_jb51.rar
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue使用動(dòng)態(tài)添加路由(router.addRoutes)加載權(quán)限側(cè)邊欄的方式
這篇文章主要介紹了vue使用動(dòng)態(tài)添加路由(router.addRoutes)加載權(quán)限側(cè)邊欄的方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06vue實(shí)現(xiàn)移動(dòng)端圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12Vue頁面中實(shí)現(xiàn)平滑滾動(dòng)功能
這是一個(gè)實(shí)現(xiàn)平滑滾動(dòng)的函數(shù),可以讓頁面在滾動(dòng)到指定位置時(shí)產(chǎn)生緩動(dòng)效果,本文給大家介紹了如何在在Vue頁面中實(shí)現(xiàn)平滑滾動(dòng)功能,<BR>,文中詳細(xì)的代碼講解供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12Vue替代marquee標(biāo)簽超出寬度文字橫向滾動(dòng)效果
這篇文章主要介紹了Vue替代marquee標(biāo)簽超出寬度文字橫向滾動(dòng)效果,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12