利用vuejs结合mockjs模拟数据做购物车

利用vuejs和mockjs模拟购物车简单制作

1、如果还没有了解mockjs,建议去官网了解一下:https://github.com/nuysoft/Mock/wiki/Image

2、首先第一步就是先自己制作模拟数据(当然也可以用nodejs的MVC模式下引入mockjs来获取模拟数据,在前端用ajax跨域请求获取后端接口数据);

-首先还是要用nodejs指令来搭建环境的,需要有nodejs基础
-下面是mockModel 模拟数据层的代码块,包括引入mockjs模块:

    //首先引入mockjs模块
const Mock = require('mockjs');
     // 定义一个数组来存放生成的每个data对象
    var arr = [];
     for(var i = 0 ; i < 20 ; i++){
         var data = Mock.mock({
             'id': i+1,
             'isSelected':false,
             //下面是通过mckjs模块产生随机数据
             '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接口数据格式

  const mockData = require('../mockModel/mockModel');
function shopController (req, res) {
    shopCar = {
        error_code:0,
        reason:'返回数据成功',
        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');
//解决跨域问题
var cors = require('cors');
//引入外置路由
var shopsRouter = require('./routes/shops');

var app = express();

app.use(cors());
//注册路由
app.use('/shop', shopsRouter);

//设置监听端口号
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购物车</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">商品参数</div>
                <div class="col-md-1 car-menu">单价</div>
                <div class="col-md-1 car-menu">数量</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>合计:<span id="selectGoodsMoney">{{ total | toFixed(2) }}</span></span>
                </div>
                <div class="col-md-1 bottom-menu submitData" :style="style">
                    结算
                </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发送请求
        $.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中写法
            priceSum(){
                var lPriceSum = 0;
                //参数要从这里传
                return function(pr,num){
                    lPriceSum = pr * num;
                    return lPriceSum;
                };
            },
            //全选按钮
            isSelectedAll:{
                get:function(){
                        //遍历一个数组,若数组中的对象中的某个属性为true时,则为true,否则都为false
                    return this.shopCar.every((ele,index)=>{
                        //当
                        return ele.isSelected;
                    });
                },

                //当isSelectedAll当前的这个属性发生变化时,就会执行set操作,
                set:function(val){
                    console.log(val);
                    return this.shopCar.map((ele,index)=>{
                        return ele.isSelected = val;
                    });
                }
            },

            //计算全部商品的总价,选中的时候才会进行,就是依赖于选中商品的数量
            total:function(){
                //定义一个接受总价的容器
                var totalAll;
                //reduce是es5中的一个累加api,用于循环数组的,pre会从0开始,return的结果又作为pre传入
                totalAll = this.shopCar.reduce((pre,nextItem)=>{
                    console.log(pre,nextItem);
                    if(nextItem.isSelected){
                        return pre + (nextItem.price * nextItem.number);
                    }
                    //否则返回 pre 最后一个,已经没有nextItem的时候
                    else{
                        return pre;
                    }
                },0);
                return totalAll;
            }

        },
        //局部过滤器,这里注意filters是复数形式
        filters:{
            //一般要传连个参数,第一个参数是priceSum()的返回值,第二个参数是到底该保留几位数
            toFixed:function(input,params){
                // console.log(input,params);
                //返回该保留位数后的小计
                return input.toFixed(params);
            }
        },
        //删除,方法块
        methods:{
            delProduct:function(item){
                //filter如果返回值是true时,则保留,否则过滤掉
                this.shopCar = this.shopCar.filter((ele,index)=>{
                    //进行删除。即过滤掉当前要删除的item
                    return ele !== item;
                });
            },
        }
    });
    }
好了,整体大概就是这样,看看效果呗!嘻嘻,可能写的有点多,希望有路过的小伙伴,有什么优化的请留言哦。谢谢
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343