利用vuejs結(jié)合mockjs模擬數(shù)據(jù)做購(gòu)物車(chē)

利用vuejs和mockjs模擬購(gòu)物車(chē)簡(jiǎn)單制作

1玻粪、如果還沒(méi)有了解mockjs,建議去官網(wǎng)了解一下:https://github.com/nuysoft/Mock/wiki/Image

2、首先第一步就是先自己制作模擬數(shù)據(jù)(當(dāng)然也可以用nodejs的MVC模式下引入mockjs來(lái)獲取模擬數(shù)據(jù),在前端用ajax跨域請(qǐng)求獲取后端接口數(shù)據(jù));

-首先還是要用nodejs指令來(lái)搭建環(huán)境的首量,需要有nodejs基礎(chǔ)
-下面是mockModel 模擬數(shù)據(jù)層的代碼塊,包括引入mockjs模塊:

    //首先引入mockjs模塊
const Mock = require('mockjs');
     // 定義一個(gè)數(shù)組來(lái)存放生成的每個(gè)data對(duì)象
    var arr = [];
     for(var i = 0 ; i < 20 ; i++){
         var data = Mock.mock({
             'id': i+1,
             'isSelected':false,
             //下面是通過(guò)mckjs模塊產(chǎn)生隨機(jī)數(shù)據(jù)
             'productPic':Mock.Random.image('100×100','#fb0a2a'),
             'productName':Mock.Random.cparagraph(1),
             'productInfo':Mock.Random.cparagraph(1),
             'price':Mock.Random.float(0,100),
             'number':1
         })
         arr.push(data);
     }
module.exports = {
    arr
}

-下面是Controllers層的shopController.js模塊,提供api接口數(shù)據(jù)格式

  const mockData = require('../mockModel/mockModel');
function shopController (req, res) {
    shopCar = {
        error_code:0,
        reason:'返回?cái)?shù)據(jù)成功',
        shopcar:mockData.arr
    }
    res.json(shopCar);
  };
//暴露接口
module.exports = {
    shopController,
}

-下面是路由shop.js模塊:

var express = require('express');
var router = express.Router();
var shopCatCon = require('../controllers/shopController');
/* GET users listing. */
router.get('/list', shopCatCon.shopController);

module.exports = router;

-下面是app.js部分:

var express = require('express');
var path = require('path');
//解決跨域問(wèn)題
var cors = require('cors');
//引入外置路由
var shopsRouter = require('./routes/shops');

var app = express();

app.use(cors());
//注冊(cè)路由
app.use('/shop', shopsRouter);

//設(shè)置監(jiān)聽(tīng)端口號(hào)
var port = 3000;
app.listen(port,()=>{
    console.log('this server is running at '+port)
})
//暴露
module.exports = app;

-下面是HTML部分

  <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Bootstrap購(gòu)物車(chē)</title>
</head>
<link rel="stylesheet" type="text/css" href="css/bootstrap.css">
<link type="text/css" rel="stylesheet" href="css/style.css" />
<body>
    <div class="shopping-car-container" id="cartBox">
        <div class="car-headers-menu">
            <div class="row">
                <div class="col-md-1 car-menu">
                    <label><input type="checkbox" id="check-goods-all" v-model="isSelectedAll"/><span id="checkAll">全選</span></label>
                </div>
                <div class="col-md-3 car-menu">商品信息</div>
                <div class="col-md-3 car-menu">商品參數(shù)</div>
                <div class="col-md-1 car-menu">單價(jià)</div>
                <div class="col-md-1 car-menu">數(shù)量</div>
                <div class="col-md-1 car-menu">金額</div>
                <div class="col-md-2 car-menu">操作</div>
            </div>
        </div>
        <div class="goods-content" v-for="item in shopCar">
            <div class="goods-item">
                <div class="panel panel-default">
                    <div class="panel-body">
                        <div class="col-md-1 car-goods-info">
                            <label><input type="checkbox" class="goods-list-item" v-model="item.isSelected" /></label>
                        </div>
                        <div class="col-md-3 car-goods-info goods-image-column">
                            <img class="goods-image" :src="  item.productPic  " style="width: 100px; height: 100px;" />
                            <span id="goods-info">
                                {{ item.productInfo }}
                            </span>
                        </div>
                        <div class="col-md-3 car-goods-info goods-params">{{ item.productName }} </div>
                        <div class="col-md-1 car-goods-info goods-price"><span>¥</span><span class="single-price">
                                {{ item.price | toFixed(2) }} </span></div>
                        <div class="col-md-1 car-goods-info goods-counts">
                            <div class="input-group">
                                <div class="input-group-btn">
                                    <button type="button" class="btn btn-default car-decrease">-</button>
                                </div>
                                <input type="text" class="form-control goods-count" value="" v-model=" item.number ">
                                <div class="input-group-btn">
                                    <button type="button" class="btn btn-default car-add">+</button>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-1 car-goods-info goods-money-count"><span>¥</span><span class="single-total">
                                {{ priceSum(item.price,item.number) | toFixed(2) }}</span></div>
                        <div class="col-md-2 car-goods-info goods-operate">
                            <button type="button" class="btn btn-danger item-delete"  @click="delProduct(item)">刪除</button>
                        </div>
                    </div>
                </div>
            </div>
            <!--goods display-->
        </div>
        <div class="panel panel-default">
            <div class="panel-body bottom-menu-include">
                <div class="col-md-1 check-all-bottom bottom-menu">
                    <label>
                        <input type="checkbox" id="checked-all-bottom" />
                        <span id="checkAllBottom">全選</span>
                    </label>
                </div>
                <div class="col-md-1 bottom-menu">
                    <span id="deleteMulty">
                        刪除
                    </span>
                </div>
                <div class="col-md-6 bottom-menu">

                </div>
                <div class="col-md-2 bottom-menu">
                    <span>已選商品 <span id="selectGoodsCount">0</span> 件</span>
                </div>
                <div class="col-md-1 bottom-menu">
                    <span>合計(jì):<span id="selectGoodsMoney">{{ total | toFixed(2) }}</span></span>
                </div>
                <div class="col-md-1 bottom-menu submitData" :style="style">
                    結(jié)算
                </div>
            </div>
        </div>
    
    </div>
</body>
</html>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript" src="js/renderVue.js"></script>

-下面是JavaScript部分

//ajax發(fā)送請(qǐng)求
        $.ajax({
            url:'http://localhost:3000/shop/list',
            type:'GET',
            dataType:'json',
            success:(data)=>{
                shiLiVue(data)
            }
        });


    function shiLiVue(data){
        var shopCar = data.shopcar;
        var vm = new Vue({
        el:'#cartBox',
        data:{
            shopCar,
            number:0,
            style:'',
            isSelected:false,
        },
        computed:{
            //es6中寫(xiě)法
            priceSum(){
                var lPriceSum = 0;
                //參數(shù)要從這里傳
                return function(pr,num){
                    lPriceSum = pr * num;
                    return lPriceSum;
                };
            },
            //全選按鈕
            isSelectedAll:{
                get:function(){
                        //遍歷一個(gè)數(shù)組进苍,若數(shù)組中的對(duì)象中的某個(gè)屬性為true時(shí)加缘,則為true,否則都為false
                    return this.shopCar.every((ele,index)=>{
                        //當(dāng)
                        return ele.isSelected;
                    });
                },

                //當(dāng)isSelectedAll當(dāng)前的這個(gè)屬性發(fā)生變化時(shí)琅捏,就會(huì)執(zhí)行set操作,
                set:function(val){
                    console.log(val);
                    return this.shopCar.map((ele,index)=>{
                        return ele.isSelected = val;
                    });
                }
            },

            //計(jì)算全部商品的總價(jià)递雀,選中的時(shí)候才會(huì)進(jìn)行柄延,就是依賴(lài)于選中商品的數(shù)量
            total:function(){
                //定義一個(gè)接受總價(jià)的容器
                var totalAll;
                //reduce是es5中的一個(gè)累加api,用于循環(huán)數(shù)組的缀程,pre會(huì)從0開(kāi)始搜吧,return的結(jié)果又作為pre傳入
                totalAll = this.shopCar.reduce((pre,nextItem)=>{
                    console.log(pre,nextItem);
                    if(nextItem.isSelected){
                        return pre + (nextItem.price * nextItem.number);
                    }
                    //否則返回 pre 最后一個(gè),已經(jīng)沒(méi)有nextItem的時(shí)候
                    else{
                        return pre;
                    }
                },0);
                return totalAll;
            }

        },
        //局部過(guò)濾器,這里注意filters是復(fù)數(shù)形式
        filters:{
            //一般要傳連個(gè)參數(shù)杨凑,第一個(gè)參數(shù)是priceSum()的返回值滤奈,第二個(gè)參數(shù)是到底該保留幾位數(shù)
            toFixed:function(input,params){
                // console.log(input,params);
                //返回該保留位數(shù)后的小計(jì)
                return input.toFixed(params);
            }
        },
        //刪除,方法塊
        methods:{
            delProduct:function(item){
                //filter如果返回值是true時(shí)撩满,則保留蜒程,否則過(guò)濾掉
                this.shopCar = this.shopCar.filter((ele,index)=>{
                    //進(jìn)行刪除。即過(guò)濾掉當(dāng)前要?jiǎng)h除的item
                    return ele !== item;
                });
            },
        }
    });
    }
好了伺帘,整體大概就是這樣昭躺,看看效果唄!嘻嘻伪嫁,可能寫(xiě)的有點(diǎn)多领炫,希望有路過(guò)的小伙伴,有什么優(yōu)化的請(qǐng)留言哦张咳。謝謝
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帝洪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脚猾,更是在濱河造成了極大的恐慌葱峡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龙助,死亡現(xiàn)場(chǎng)離奇詭異族沃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)脆淹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)常空,“玉大人,你說(shuō)我怎么就攤上這事盖溺±觳冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵烘嘱,是天一觀的道長(zhǎng)昆禽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蝇庭,這世上最難降的妖魔是什么醉鳖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮哮内,結(jié)果婚禮上盗棵,老公的妹妹穿的比我還像新娘。我一直安慰自己北发,他們只是感情好纹因,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著琳拨,像睡著了一般瞭恰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狱庇,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天惊畏,我揣著相機(jī)與錄音,去河邊找鬼密任。 笑死陕截,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的批什。 我是一名探鬼主播农曲,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驻债!你這毒婦竟也來(lái)了乳规?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤合呐,失蹤者是張志新(化名)和其女友劉穎暮的,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體淌实,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冻辩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年猖腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恨闪。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倘感,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咙咽,到底是詐尸還是另有隱情老玛,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布钧敞,位于F島的核電站蜡豹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溉苛。R本人自食惡果不足惜镜廉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愚战。 院中可真熱鬧娇唯,春花似錦、人聲如沸凤巨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敢茁。三九已至,卻和暖如春留美,著一層夾襖步出監(jiān)牢的瞬間彰檬,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工谎砾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逢倍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓景图,卻偏偏與公主長(zhǎng)得像较雕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挚币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355