zoukankan      html  css  js  c++  java
  • 基于Vue的WebApp项目开发(六)

    实现商品购买列表页面

    步骤一:新建goodslist.vue文件

    <template>
      <div id="tml">
        <!--利用mui中的图文表格组件实现-->
        <div id="mui-content" class="mui-content" style="background-color:#fff">
          <ul class="mui-table-view mui-grid-view">
            <li v-for="item in list" class="mui-table-view-cell mui-media mui-col-xs-6">
              <router-link v-bind="{to:'/goods/goodsinfo/'+item.id}">
                <img class="mui-media-object" :src="item.img_url" style="height: 250px;">
                <div class="mui-media-body" v-text="item.title"></div>
                <div class="desc">
                  <p>
                    <span>¥{{item.sell_price}}</span>
                    <s>¥{{item.market_price}}</s>
                  </p>
                  <p>
                    <h6 class="left">热卖中</h6>
                    <h6 class="right">剩余{{item.stock_quantity}}件</h6>
                  </p>
                </div>
              </router-link>
            </li>
          </ul>
        </div>
      </div>
    </template>
    
    <script>
      import { Toast } from 'mint-ui';
      // 代表vm
      export default {
        data() {
          return {
            list: []
          }
        },
        created() {
          this.getlist();
        },
        methods: {
          getlist() {
            //获取到商品列表数据
            var url = '../../../statics/json/goodslist.json';
            this.$http.get(url).then(function(res) {
              if(res.body.status != 0) {
                Toast(res.body.message);
                return;
              }
              //当服务器返回了正常数据的时候做赋值操作
              this.list = res.body.message;
            });
          }
        }
      }
    </script>
    
    <style scoped>
      #mui-content li {
        border: 1px solid rgba(0, 0, 0, 0.4);
        -webkit-box-shadow: 0 0 4px #000;
        -moz-box-shadow: 0 0 4px #000;
        box-shadow: 0 0 4px #000;
        margin-left: 4px;
        padding: 0px;
        background-color: #fff;
        margin-bottom: 6px;
      }  
      #mui-content .mui-media-body {
        color: #0094ff;
      } 
      #mui-content .desc {
        height: 60px;
        background-color: rgba(0, 0, 0, 0.2);
        margin-top: 10px;
        padding: 5px;
        text-align: left;
      } 
      #mui-content .desc span {
        color: #a22b2b;
        margin-right: 15px;
      }  
      #mui-content a {
        padding-left: 0px;
        margin-left: 0px;
      }  
      #mui-content .desc .right {
        position: absolute;
        right: 10px;
        bottom: 0px;
        font-weight: bold;
      }  
      #mui-content .desc .left {
        position: absolute;
        left: 10px;
        bottom: 0px;
        color: red;
        font-weight: bold;
      }
    </style>
    View Code

    步骤二:新建goodslist.json文件

    {
      "status": 0,
      "message": [
        {
          "id": 1,
          "title": "动漫被套床单",
          "add_time": "2017-12-25",
          "zhaiyao": "尺寸图样皆可以订制,如果在店铺展示页面没有喜欢的角色,可以咨询客服,查看图库,进行选取!",
          "click": 30,
          "img_url": "../../statics/imgs/goodslist/goodslist01.jpg",
          "sell_price": 78,
          "market_price": 68,
          "stock_quantity": 200,
          "goods_no": "SD13313123"
        }, {
          "id": 2,
          "title": "二次元毛绒抱枕",
          "add_time": "2017-12-25",
          "zhaiyao": "此优惠限5件,超出则该商品全部恢复非活动价",
          "click": 33,
          "img_url": "../../statics/imgs/goodslist/goodslist02.jpg",
          "sell_price": 58,
          "market_price": 63,
          "stock_quantity": 500
        }, {
          "id": 3,
          "title": "逍遥宅品猫咪痛包",
          "add_time": "2017-12-25",
          "zhaiyao": "一共是一个外包+印花猫咪内包+纯色内包+肩带+手拎带。自由发挥自主搭配!带子之后会换成皮的!",
          "click": 34,
          "img_url": "../../statics/imgs/goodslist/goodslist03.jpg",
          "sell_price": 57,
          "market_price": 63,
          "stock_quantity": 500
        }, {
          "id": 4,
          "title": "动漫周边保温杯",
          "add_time": "2017-12-25",
          "zhaiyao": "采用304不锈钢 双层真空内胆 保温久不烫手 支持来图定制 买就送杯套",
          "click": 36,
          "img_url": "../../statics/imgs/goodslist/goodslist04.jpg",
          "sell_price": 80,
          "market_price": 100,
          "stock_quantity": 300
        }, {
          "id": 5,
          "title": "雪初音卫衣棉服",
          "add_time": "2017-12-25",
          "zhaiyao": "此优惠限5件,超出则该商品全部恢复非活动价",
          "click": 63,
          "img_url": "../../statics/imgs/goodslist/goodslist05.jpg",
          "sell_price": 66,
          "market_price": 80,
          "stock_quantity": 300
        }, {
          "id": 6,
          "title": "Monchhichi萌趣趣",
          "add_time": "2017-12-25",
          "zhaiyao": "Monchhichi萌趣趣十二生肖狗鸡小兔马羊龙老虎猪小鸡公仔送人礼品",
          "click": 38,
          "img_url": "../../statics/imgs/goodslist/goodslist06.jpg",
          "sell_price": 75,
          "market_price": 90,
          "stock_quantity": 800
        }
      ]
    }
    View Code

    步骤三:在入口文件main.js中配置好路由规则

    //导入vue核心包
    import Vue from 'vue';
    
    //导入App.vue的vue对象
    import App from './App.vue';
    
    //导入vue-router
    import vueRouter from 'vue-router';
    
    //将vueRouter对象绑定到Vue对象上
    Vue.use(vueRouter);
    
    //导入路由规则对应的组件对象
    import home from './components/Home.vue';
    import shopcar from './components/shopcar/car.vue';
    import newslist from './components/news/newslist.vue';
    import newsinfo from './components/news/newsinfo.vue';
    import photolist from './components/photo/photolist.vue';
    import photoinfo from './components/photo/photoinfo.vue';
    import goodslist from './components/goods/goodslist.vue';
    
    //定义路由规则
    var router1 = new vueRouter({
        //改变路由激活时的class名称
      linkActiveClass: 'mui-active', 
      routes: [{
          path: '/',
          component: home 
        }, {
          path: '/home',
          component: home
        },
        {
          path: '/shopcar',
          component: shopcar
        },
        {
          path: '/news/newslist',
          component: newslist
        },
        {
          path: '/news/newsinfo/:id',
          component: newsinfo
        },
        {
          path: '/photo/photolist',
          component: photolist
        },
        {
          path: '/photo/photoinfo/:id',
          component: photoinfo
        },
        {
          path: '/goods/goodslist',
          component: goodslist
        }
      ]
    });
    
    //导入mint-ui的css文件
    import 'mint-ui/lib/style.min.css';
    //导入mint-ui组件对象
    import mintui from 'mint-ui';
    //在Vue中全局使用mintui
    Vue.use(mintui);
    
    //注册mui的css样式
    import '../statics/mui/css/mui.css';
    
    //导入一个当前系统的全局基本样式
    import '../statics/css/site.css';
    
    //将vue-resource在vue中绑定,自动在vue对象实例上注入一个$http对象就可以使用ajax方法了
    import vueResource from 'vue-resource';
    Vue.use(vueResource);
    
    //定义一个全局过滤器实现日期的格式化
    import moment from 'moment';
    Vue.filter('datefmt', function(input, fmtstring) {
      //使用momentjs这个日期格式化类库实现日期的格式化功能
      //input代表左值(原始时间格式),fmtstring代表右值括号内的规则
      return moment(input).format(fmtstring);
    });
    
    //使用图片预览组件vue-preview
    import VuePreview from 'vue-preview';
    Vue.use(VuePreview);
    
    //利用Vue对象进行解析渲染
    new Vue({
      el: '#app',
      //使用路由对象实例
      router: router1,
      render: c => c(App) //es6写法
    })
    View Code

     项目结构图:

    商品详情页开发(一)

    步骤一:创建goodsinfo.vue文件

    <template>
      <div id="tml">
        商品详情
      </div>
    </template>
    
    <script>
    </script>
    
    <style>
    
    </style>
    View Code

    步骤二:修改goodslist.vue文件

    <template>
      <div id="tml">
        <!--利用mui中的图文表格组件实现-->
        <div id="mui-content" class="mui-content" style="background-color:#fff">
          <ul class="mui-table-view mui-grid-view">
            <li v-for="item in list" class="mui-table-view-cell mui-media mui-col-xs-6">
              <router-link v-bind="{to:'/goods/goodsinfo/'+item.id}">
                <img class="mui-media-object" :src="item.img_url" style="height: 250px;">
                <div class="mui-media-body" v-text="item.title"></div>
                <div class="desc">
                  <p>
                    <span>¥{{item.sell_price}}</span>
                    <s>¥{{item.market_price}}</s>
                  </p>
                  <p>
                    <h6 class="left">热卖中</h6>
                    <h6 class="right">剩余{{item.stock_quantity}}件</h6>
                  </p>
                </div>
              </router-link>
            </li>
          </ul>
        </div>
      </div>
    </template>
    
    <script>
      import { Toast } from 'mint-ui';
      // 代表vm
      export default {
        data() {
          return {
            list: []
          }
        },
        created() {
          this.getlist();
        },
        methods: {
          getlist() {
            //获取到商品列表数据
            var url = '../../../statics/json/goodslist.json';
            this.$http.get(url).then(function(res) {
              if(res.body.status != 0) {
                Toast(res.body.message);
                return;
              }
              //当服务器返回了正常数据的时候做赋值操作
              this.list = res.body.message;
            });
          }
        }
      }
    </script>
    
    <style scoped>
      #mui-content li {
        border: 1px solid rgba(0, 0, 0, 0.4);
        -webkit-box-shadow: 0 0 4px #000;
        -moz-box-shadow: 0 0 4px #000;
        box-shadow: 0 0 4px #000;
        margin-left: 4px;
        padding: 0px;
        background-color: #fff;
        margin-bottom: 6px;
      }  
      #mui-content .mui-media-body {
        color: #0094ff;
      } 
      #mui-content .desc {
        height: 60px;
        background-color: rgba(0, 0, 0, 0.2);
        margin-top: 10px;
        padding: 5px;
        text-align: left;
      } 
      #mui-content .desc span {
        color: #a22b2b;
        margin-right: 15px;
      }  
      #mui-content a {
        padding-left: 0px;
        margin-left: 0px;
      }  
      #mui-content .desc .right {
        position: absolute;
        right: 10px;
        bottom: 0px;
        font-weight: bold;
      }  
      #mui-content .desc .left {
        position: absolute;
        left: 10px;
        bottom: 0px;
        color: red;
        font-weight: bold;
      }
    </style>
    View Code

    步骤三:配置入口文件mian.js的路由规则

    //导入vue核心包
    import Vue from 'vue';
    
    //导入App.vue的vue对象
    import App from './App.vue';
    
    //导入vue-router
    import vueRouter from 'vue-router';
    
    //将vueRouter对象绑定到Vue对象上
    Vue.use(vueRouter);
    
    //导入路由规则对应的组件对象
    import home from './components/Home.vue';
    import shopcar from './components/shopcar/car.vue';
    import newslist from './components/news/newslist.vue';
    import newsinfo from './components/news/newsinfo.vue';
    import photolist from './components/photo/photolist.vue';
    import photoinfo from './components/photo/photoinfo.vue';
    import goodslist from './components/goods/goodslist.vue';
    import goodsinfo from './components/goods/goodsinfo.vue';
    
    //定义路由规则
    var router1 = new vueRouter({
        //改变路由激活时的class名称
      linkActiveClass: 'mui-active', 
      routes: [{
          path: '/',
          component: home 
        }, {
          path: '/home',
          component: home
        },
        {
          path: '/shopcar',
          component: shopcar
        },
        {
          path: '/news/newslist',
          component: newslist
        },
        {
          path: '/news/newsinfo/:id',
          component: newsinfo
        },
        {
          path: '/photo/photolist',
          component: photolist
        },
        {
          path: '/photo/photoinfo/:id',
          component: photoinfo
        },
        {
          path: '/goods/goodslist',
          component: goodslist
        },
        {
          path: '/goods/goodsinfo/:id',
          component: goodsinfo
        }
      ]
    });
    
    //导入mint-ui的css文件
    import 'mint-ui/lib/style.min.css';
    //导入mint-ui组件对象
    import mintui from 'mint-ui';
    //在Vue中全局使用mintui
    Vue.use(mintui);
    
    //注册mui的css样式
    import '../statics/mui/css/mui.css';
    
    //导入一个当前系统的全局基本样式
    import '../statics/css/site.css';
    
    //将vue-resource在vue中绑定,自动在vue对象实例上注入一个$http对象就可以使用ajax方法了
    import vueResource from 'vue-resource';
    Vue.use(vueResource);
    
    //定义一个全局过滤器实现日期的格式化
    import moment from 'moment';
    Vue.filter('datefmt', function(input, fmtstring) {
      //使用momentjs这个日期格式化类库实现日期的格式化功能
      //input代表左值(原始时间格式),fmtstring代表右值括号内的规则
      return moment(input).format(fmtstring);
    });
    
    //使用图片预览组件vue-preview
    import VuePreview from 'vue-preview';
    Vue.use(VuePreview);
    
    //利用Vue对象进行解析渲染
    new Vue({
      el: '#app',
      //使用路由对象实例
      router: router1,
      render: c => c(App) //es6写法
    })
    View Code

    案例四(商品详情页轮播图实现)

    步骤一:在subcom文件夹中封装一个公用轮播组件slider.vue

    <template>
      <div id="tml">
        <mt-swipe :auto="2000">
          <mt-swipe-item v-for="item in imgs">
            <img :src="item.img">
          </mt-swipe-item>
        </mt-swipe>
      </div>
    </template>
    
    <script>
      export default {
        //用来接收父组件传入过来的数据
        props: ['imgs']
      }
    </script>
    
    <style scoped>
      /*重写轮播图样式*/
      
      .mint-swipe {
        height: 310px;
      }
      .mint-swipe-item {
        width: 100%;
        height: 300px;
      }
      .mint-swipe-item img {
        width: 100%;
        height: 80%;
      }
    </style>
    View Code

    此时Home.vue的代码为

    <template>
      <div id="tml">
          <!--使用组件结合mint-ui实现轮播图-->
        <silder :imgs="list"></silder>
    
        <!--使用MUI的九宫格-->
        <div class="mui-content">
          <ul class="mui-table-view mui-grid-view mui-grid-9">
            <li class="mui-table-view-cell mui-media mui-col-xs-4 mui-col-sm-3">
              <router-link to="/news/newslist">
                <span class="mui-icon mui-icon-home"></span>
                <div class="mui-media-body">新闻资讯</div>
              </router-link>
            </li>
            <li class="mui-table-view-cell mui-media mui-col-xs-4 mui-col-sm-3">
              <router-link to="/photo/photolist">
                <span class="mui-icon mui-icon-email"></span>
                <div class="mui-media-body">图片分享</div>
              </router-link>
            </li>
            <li class="mui-table-view-cell mui-media mui-col-xs-4 mui-col-sm-3">
              <router-link to="/goods/goodslist">
                <span class="mui-icon mui-icon-chatbubble"></span>
                <div class="mui-media-body">商品购买</div>
              </router-link>
            </li>
            <li class="mui-table-view-cell mui-media mui-col-xs-4 mui-col-sm-3">
              <router-link to="/feedback">
                <span class="mui-icon mui-icon-location"></span>
                <div class="mui-media-body">留言反馈</div>
              </router-link>
            </li>
            <li class="mui-table-view-cell mui-media mui-col-xs-4 mui-col-sm-3">
              <router-link to="/vide">
                <span class="mui-icon mui-icon-search"></span>
                <div class="mui-media-body">视频专区</div>
              </router-link>
            </li>
            <li class="mui-table-view-cell mui-media mui-col-xs-4 mui-col-sm-3">
              <router-link to="/callme">
                <span class="mui-icon mui-icon-phone"></span>
                <div class="mui-media-body">联系我们</div>
              </router-link>
            </li>
          </ul>
        </div>
    
      </div>
    </template>
    
    <script>
      import { Toast } from 'mint-ui';
      import silder from './subcom/slider.vue';
    
      export default {
        components: {
          silder
        },
        data() {
          return {
            list: []
          }
        },
        created() {
          // 当页面中的data和methods对象都创建完毕以后,就会自动调用created
          this.getimgs();
        },
        methods: {
          getimgs() {
            // 实现轮播组件中的数据请求
            // 1.0 确定url
            var url = '../../statics/json/homeslide.json'
            console.log(url);
            // 2.0 调用$http.get()
            this.$http.get(url).then(function(response) {
              var data = response.body;
              //错误处理
              if(data.status != 0) {
                Toast(data.message);
                return;
              }
              // 如果服务器返回的数据正常则赋值给list
              this.list = data.message;
            });
          }
        }
      }
    </script>
    
    <style scoped>
      /*重写九宫格样式*/  
      .mui-content,
      .mui-content ul li a {
        background: #fff;
      }
      /*改变九宫格图标样式*/ 
      .mui-grid-9 .mui-icon-home:before,
      .mui-grid-9 .mui-icon-email:before,
      .mui-grid-9 .mui-icon-chatbubble:before,
      .mui-grid-9 .mui-icon-location:before,
      .mui-grid-9 .mui-icon-search:before,
      .mui-grid-9 .mui-icon-phone:before {
        content: '';
        display: inline-block;
        width: 50px;
        height: 50px;
        background-repeat: round;
      }
      .mui-grid-9 .mui-icon-home:before {
        background-image: url(../../statics/imgs/Hgrid/1.png);
      }
      .mui-grid-9 .mui-icon-email:before {
        background-image: url(../../statics/imgs/Hgrid/2.png);
      }
      .mui-grid-9 .mui-icon-chatbubble:before {
        background-image: url(../../statics/imgs/Hgrid/3.png);
      }
      .mui-grid-9 .mui-icon-location:before {
        background-image: url(../../statics/imgs/Hgrid/4.png);
      }
      .mui-grid-9 .mui-icon-search:before {
        background-image: url(../../statics/imgs/Hgrid/5.png);
      }
      .mui-grid-9 .mui-icon-phone:before {
        background-image: url(../../statics/imgs/Hgrid/6.png);
      }
    </style>
    View Code

    步骤二:创建goodslunbo1.json和goodslunbo.json用来存放轮播图片

    {
      "status": 0,
      "message": [
        {
          "src": "../../statics/imgs/goodsinfo/lunbo01.jpg",
          "url": "#",
          "img": "../../statics/imgs/goodsinfo/lunbo01.jpg"
        }, {
          "src": "../../statics/imgs/goodsinfo/lunbo02.jpg",
          "url": "#",
          "img": "../../statics/imgs/goodsinfo/lunbo02.jpg"
        }, {
          "src": "../../statics/imgs/goodsinfo/lunbo03.jpg",
          "url": "#",
          "img": "../../statics/imgs/goodsinfo/lunbo03.jpg"
        }
      ]
    }
    View Code
    {
      "status": 0,
      "message": [
        {
          "src": "../../statics/imgs/goodsinfo/lunbo04.jpg",
          "url": "#",
          "img": "../../statics/imgs/goodsinfo/lunbo04.jpg"
        }, {
          "src": "../../statics/imgs/goodsinfo/lunbo05.jpg",
          "url": "#",
          "img": "../../statics/imgs/goodsinfo/lunbo05.jpg"
        }, {
          "src": "../../statics/imgs/goodsinfo/lunbo06.jpg",
          "url": "#",
          "img": "../../statics/imgs/goodsinfo/lunbo06.jpg"
        }
      ]
    }
    View Code

    步骤三:修改goodsinfo.vue文件

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <silder :imgs="imgs"></silder>
    
        <!--2.0 实现商品购买区-->
    
        <!--3.0 图文详情-->
    
        <!--4.0 商品评论-->
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
    
      export default {
        components: {
          silder
        },
        data() {
          return {
            id: 0, //表示商品id
            imgs: []
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
        },
        methods: {
          getimgs() {
            var url = '../../../statics/json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              if(res.body.status != 0) {
                Toast(res.body.message);
                return;
              }
              //当服务器返回了正常数据的时候做赋值操作
              this.imgs = res.body.message;
            });
          }
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    View Code

    实现商品购买区

    步骤一:修改goodsinfo.vue文件

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <div class="silder">
          <silder :imgs="imgs"></silder>
        </div>
    
        <!--2.0 实现商品购买区-->
        <div id="buy">
          <h4 v-text="info.title"></h4>
          <p class="line"></p>
          <ul>
            <li class="price">
              市场价: <s>¥{{info.market_price}}</s> 销售价:<span>¥{{info.sell_price}}</span>
            </li>
            <li>
              购买数量:
            </li>
            <li>
              <mt-button type="primary" size="small">立即购买</mt-button>
              <mt-button type="danger" size="small">加入购物车</mt-button>
            </li>
          </ul>
        </div>
    
        <div id="params">
          <h6>商品参数</h6>
          <p class="line"></p>
          <ul>
            <li>商品货号:{{info.goods_no}}</li>
            <li>库存情况:{{info.stock_quantity}}</li>
            <li>上架时间:{{info.add_time}}</li>
          </ul>
        </div>
    
        <!--3.0 图文详情-->
        <!--4.0 商品评论-->
        <div id="other">
          <mt-button plain class="imgdesc" type="primary" size="large">图文详情</mt-button>
          <mt-button plain type="danger" size="large">商品评论</mt-button>
        </div>
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
    
      export default {
        components: {
          silder
        },
        data() {
          return {
            id: 0, //表示商品id
            imgs: [],
            info: {} //存储商品详细信息
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
          this.getinfo();
        },
        methods: {
          getimgs() {
            var url = '../../../statics/json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              //判断状态
              this.imgs = res.body.message;
            });
          },
          getinfo() {
            var url = '../../../statics/json/goodslist.json';
            this.$http.get(url).then(function(res) {
              var body = res.body;
              if(body.status != 0) {
                alert(body.message);
                return;
              }
    
              for(var i = 0; i < body.message.length; i++) {
                if(this.id == body.message[i].id) {
                  console.log(body.message[i])
                  this.info = body.message[i];
                  console.log(this.info);
                }
              }
            });
          }
    
        }
      }
    </script>
    
    <style scoped>
      .silder {
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
        margin: 5px;
      }
      
      #buy,
      #params,
      #other {
        margin: 5px;
        padding: 5px;
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
      }
      
      .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.2);
      }
      
      #buy ul,
      #params ul {
        padding-left: 0px;
      }
      
      #buy h4 {
        color: #0094ff;
        padding: 5px;
      }
      
      #buy li,
      #params li {
        list-style: none;
        padding: 8px;
      }
      
      #buy .price span {
        color: red;
      }
      
      #other .imgdesc {
        margin-bottom: 20px;
      }
    </style>
    View Code

    步骤二:创建goodslist.json文件

    {
      "status": 0,
      "message": [
        {
          "id": 1,
          "title": "动漫被套床单",
          "add_time": "2017-12-25",
          "zhaiyao": "尺寸图样皆可以订制,如果在店铺展示页面没有喜欢的角色,可以咨询客服,查看图库,进行选取!",
          "click": 30,
          "img_url": "../../statics/imgs/goodslist/goodslist01.jpg",
          "sell_price": 78,
          "market_price": 68,
          "stock_quantity": 200,
          "goods_no": "SD13313123"
        }, {
          "id": 2,
          "title": "二次元毛绒抱枕",
          "add_time": "2017-12-25",
          "zhaiyao": "此优惠限5件,超出则该商品全部恢复非活动价",
          "click": 33,
          "img_url": "../../statics/imgs/goodslist/goodslist02.jpg",
          "sell_price": 58,
          "market_price": 63,
          "stock_quantity": 500,
          "goods_no": "SD13313123"
        }, {
          "id": 3,
          "title": "逍遥宅品猫咪痛包",
          "add_time": "2017-12-25",
          "zhaiyao": "一共是一个外包+印花猫咪内包+纯色内包+肩带+手拎带。自由发挥自主搭配!带子之后会换成皮的!",
          "click": 34,
          "img_url": "../../statics/imgs/goodslist/goodslist03.jpg",
          "sell_price": 57,
          "market_price": 63,
          "stock_quantity": 500,
          "goods_no": "SD13313123"
        }, {
          "id": 4,
          "title": "动漫周边保温杯",
          "add_time": "2017-12-25",
          "zhaiyao": "采用304不锈钢 双层真空内胆 保温久不烫手 支持来图定制 买就送杯套",
          "click": 36,
          "img_url": "../../statics/imgs/goodslist/goodslist04.jpg",
          "sell_price": 80,
          "market_price": 100,
          "stock_quantity": 300,
          "goods_no": "SD13313123"
        }, {
          "id": 5,
          "title": "雪初音卫衣棉服",
          "add_time": "2017-12-25",
          "zhaiyao": "此优惠限5件,超出则该商品全部恢复非活动价",
          "click": 63,
          "img_url": "../../statics/imgs/goodslist/goodslist05.jpg",
          "sell_price": 66,
          "market_price": 80,
          "stock_quantity": 300,
          "goods_no": "SD13313123"
        }, {
          "id": 6,
          "title": "Monchhichi萌趣趣",
          "add_time": "2017-12-25",
          "zhaiyao": "Monchhichi萌趣趣十二生肖狗鸡小兔马羊龙老虎猪小鸡公仔送人礼品",
          "click": 38,
          "img_url": "../../statics/imgs/goodslist/goodslist06.jpg",
          "sell_price": 75,
          "market_price": 90,
          "stock_quantity": 800,
          "goods_no": "SD13313123"
        }
      ]
    }
    View Code

    实现商品图文详情

    步骤一:创建一个goodsdesc.json文件

    {
      "status": 0,
      "message": [
        {
          "id": 1,
          "title": "动漫被套床单",
          "content": "尺寸图样皆可以订制,如果在店铺展示页面没有喜欢的角色,可以咨询客服,查看图库,进行选取!"
        }, {
          "id": 2,
          "title": "二次元毛绒抱枕",
          "content": "此优惠限5件,超出则该商品全部恢复非活动价"
        }
      ]
    }
    View Code

    步骤二:创建goodsdesc.vue文件

    <template>
      <div id="tml">
        <h4 v-text="info.title" style="padding-top: 10px;"></h4>
        <p class="line"></p>
        <p v-html="info.content"></p>
      </div>
    </template>
    
    <script>
      import { Toast } from 'mint-ui';
      export default {
        data() {
          return {
            id: 0, // 代表的是当前商品的id
            info: {}
          }
        },
        created() {
          this.id = this.$route.params.id;
          this.getinfo();
        },
        methods: {
          getinfo() {
            //1.0 定义url
            var url = '../../../statics/json/goodsdesc.json';
            //2.0 发出ajax请求获取数据
            this.$http.get(url).then(function (res) {
              var body = res.body;
              if (body.status != 0) {
                alert(body.message);
                return;
              }
              //3.0 赋值
              for (var i = 0; i < body.message.length; i++) {
                if (this.id == body.message[i].id) {
                  console.log(body.message[i])
                  this.info = body.message[i];
                  console.log(this.info);
                }
              }
            });
          }
        }
      }
    </script>
    
    <style scoped>
      #tmpl {
        padding: 5px;
        margin-top: 60px;
      }
      #tmpl h4 {
        color: #0094ff;
      }
      #tmpl .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.3);
      }
    </style>
    View Code

    步骤三:修改goodsinfo.vue文件

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <div class="silder">
          <silder :imgs="imgs"></silder>
        </div>
    
        <!--2.0 实现商品购买区-->
        <div id="buy">
          <h4 v-text="info.title"></h4>
          <p class="line"></p>
          <ul>
            <li class="price">
              市场价: <s>¥{{info.market_price}}</s> 销售价:<span>¥{{info.sell_price}}</span>
            </li>
            <li>
              购买数量:
            </li>
            <li>
              <mt-button type="primary" size="small">立即购买</mt-button>
              <mt-button type="danger" size="small">加入购物车</mt-button>
            </li>
          </ul>
        </div>
    
        <div id="params">
          <h6>商品参数</h6>
          <p class="line"></p>
          <ul>
            <li>商品货号:{{info.goods_no}}</li>
            <li>库存情况:{{info.stock_quantity}}</li>
            <li>上架时间:{{info.add_time}}</li>
          </ul>
        </div>
    
        <!--3.0 图文详情-->
        <!--4.0 商品评论-->
        <div id="other">
          <router-link v-bind="{to:'/goods/goodsdesc/'+id}">
                <mt-button class="imgdesc" type="primary" size="large">图文详情</mt-button>
                </router-link>
                <mt-button type="danger" size="large">商品评论</mt-button>
        </div>
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
    
      export default {
        components: {
          silder
        },
        data() {
          return {
            id: 0, //表示商品id
            imgs: [],
            info: {} //存储商品详细信息
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
          this.getinfo();
        },
        methods: {
          getimgs() {
            var url = '../../../statics/json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              //判断状态
              this.imgs = res.body.message;
            });
          },
          getinfo() {
            var url = '../../../statics/json/goodslist.json';
            this.$http.get(url).then(function(res) {
              var body = res.body;
              if(body.status != 0) {
                alert(body.message);
                return;
              }
    
              for(var i = 0; i < body.message.length; i++) {
                if(this.id == body.message[i].id) {
                  this.info = body.message[i];
                }
              }
            });
          }
    
        }
      }
    </script>
    
    <style scoped>
      .silder {
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
        margin: 5px;
      }  
      #buy,
      #params,
      #other {
        margin: 5px;
        padding: 5px;
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
      } 
      .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.2);
      }  
      #buy ul,
      #params ul {
        padding-left: 0px;
      }  
      #buy h4 {
        color: #0094ff;
        padding: 5px;
      } 
      #buy li,
      #params li {
        list-style: none;
        padding: 8px;
      }  
      #buy .price span {
        color: red;
      }  
      #other .imgdesc {
        margin-bottom: 20px;
      }
    </style>
    View Code

    步骤四:配置入口文件main.js的路由规则

    //导入vue核心包
    import Vue from 'vue';
    
    //导入App.vue的vue对象
    import App from './App.vue';
    
    //导入vue-router
    import vueRouter from 'vue-router';
    //将vueRouter对象绑定到Vue对象上
    Vue.use(vueRouter);
    
    //使用图片预览组件vue-preview
    import VuePreview from 'vue-preview';
    Vue.use(VuePreview);
    
    //导入mint-ui的css文件
    import 'mint-ui/lib/style.min.css';
    //导入mint-ui组件对象
    import mintui from 'mint-ui';
    //在Vue中全局使用mintui
    Vue.use(mintui);
    
    //注册mui的css样式
    import '../statics/mui/css/mui.css';
    
    //导入一个当前系统的全局基本样式
    import '../statics/css/site.css';
    
    //将vue-resource在vue中绑定,自动在vue对象实例上注入一个$http对象就可以使用ajax方法了
    import vueResource from 'vue-resource';
    Vue.use(vueResource);
    
    //导入路由规则对应的组件对象
    import home from './components/Home.vue';
    import shopcar from './components/shopcar/car.vue';
    import newslist from './components/news/newslist.vue';
    import newsinfo from './components/news/newsinfo.vue';
    import photolist from './components/photo/photolist.vue';
    import photoinfo from './components/photo/photoinfo.vue';
    import goodslist from './components/goods/goodslist.vue';
    import goodsinfo from './components/goods/goodsinfo.vue';
    import goodsdesc from './components/goods/goodsdesc.vue';
    
    //定义路由规则
    var router1 = new vueRouter({
        //改变路由激活时的class名称
      linkActiveClass: 'mui-active', 
      routes: [{
          path: '/',
          component: home 
        }, {
          path: '/home',
          component: home
        },
        {
          path: '/shopcar',
          component: shopcar
        },
        {
          path: '/news/newslist',
          component: newslist
        },
        {
          path: '/news/newsinfo/:id',
          component: newsinfo
        },
        {
          path: '/photo/photolist',
          component: photolist
        },
        {
          path: '/photo/photoinfo/:id',
          component: photoinfo
        },
        {
          path: '/goods/goodslist',
          component: goodslist
        },
        {
          path: '/goods/goodsinfo/:id',
          component: goodsinfo
        },
        {
          path: '/goods/goodsdesc/:id',
          component: goodsdesc
        }
      ]
    });
    
    //定义一个全局过滤器实现日期的格式化
    import moment from 'moment';
    Vue.filter('datefmt', function(input, fmtstring) {
      //使用momentjs这个日期格式化类库实现日期的格式化功能
      //input代表左值(原始时间格式),fmtstring代表右值括号内的规则
      return moment(input).format(fmtstring);
    });
    
    //利用Vue对象进行解析渲染
    new Vue({
      el: '#app',
      //使用路由对象实例
      router: router1,
      render: c => c(App) //es6写法
    })
    View Code

    实现购买功能区

    步骤一:创建一个组件inputNumber.vue

    <template>
      <div id="subtmpl">
        <div class="inleft div" @click="substrict">-</div>
        <div class="incenter div" v-text="count"></div>
        <div class="inright div" @click="add">+</div>
      </div>
    </template>
    
    <script>
      export default {
        data() {
          return {
            count: 1 //代表购买商品的数量
          }
        },
        methods: {
          substrict() {
            this.count--;
            //                确保最小值为1
            if(this.count < 1) {
              this.count = 1;
            }
            this.sendmessage();
          },
          add() {
            this.count++;
            this.sendmessage();
          },
          sendmessage() {
            this.$emit('dataobj', this.count);
          }
        }
      }
    </script>
    
    <style scoped>
      #subtmpl .div {
        width: 40px;
        height: 25px;
        line-height: 25px;
        border: 1px solid #000;
        display: inline-block;
        text-align: center;
      }
    </style>
    View Code

    步骤二:修改goodsinfo.vue文件

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <div class="silder">
          <silder :imgs="imgs"></silder>
        </div>
    
        <!--2.0 实现商品购买区-->
        <div id="buy">
          <h4 v-text="info.title"></h4>
          <p class="line"></p>
          <ul>
            <li class="price">
              市场价: <s>¥{{info.market_price}}</s> 销售价:<span>¥{{info.sell_price}}</span>
            </li>
            <li>
              <li class="inputli">
                购买数量:
                <inputnumber v-on:dataobj="getcount" class="inputnumber"></inputnumber>
              </li>
            </li>
            <li>
              <mt-button type="primary" size="small">立即购买</mt-button>
              <mt-button type="danger" size="small">加入购物车</mt-button>
            </li>
          </ul>
        </div>
    
        <div id="params">
          <h6>商品参数</h6>
          <p class="line"></p>
          <ul>
            <li>商品货号:{{info.goods_no}}</li>
            <li>库存情况:{{info.stock_quantity}}</li>
            <li>上架时间:{{info.add_time}}</li>
          </ul>
        </div>
    
        <!--3.0 图文详情-->
        <!--4.0 商品评论-->
        <div id="other">
          <router-link v-bind="{to:'/goods/goodsdesc/'+id}">
            <mt-button class="imgdesc" type="primary" size="large">图文详情</mt-button>
          </router-link>
          <mt-button type="danger" size="large">商品评论</mt-button>
        </div>
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
      import inputnumber from '../subcom/inputNumber.vue';
      export default {
        components: {
          silder,
          inputnumber
        },
        data() {
          return {
            inputNumberCount: 1, //表示当前购买商品的数量
            id: 0, //表示商品id
            imgs: [],
            info: {} //存储商品详细信息
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
          this.getinfo();
        },
        methods: {
          //获取inputnumber组件中传入的值
          getcount(count) {
            this.inputNumberCount = count;
            console.log(count);
          },
          getimgs() {
            var url = '../../json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              //判断状态
              this.imgs = res.body.message;
            });
          },
          getinfo() {
            var url = '../../json/goodslist.json';
            this.$http.get(url).then(function(res) {
              var body = res.body;
              if(body.status != 0) {
                alert(body.message);
                return;
              }
    
              for(var i = 0; i < body.message.length; i++) {
                if(this.id == body.message[i].id) {
                  console.log(body.message[i])
                  this.info = body.message[i];
                  console.log(this.info);
                }
              }
            });
          }
    
        }
      }
    </script>
    
    <style scoped>
      .silder {
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
        margin: 5px;
      }
      
      #buy,
      #params,
      #other {
        margin: 5px;
        padding: 5px;
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
      }
      
      .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.2);
      }
      
      #buy ul,
      #params ul {
        padding-left: 0px;
      }
      
      #buy h4 {
        color: #0094ff;
        padding: 5px;
      }
      
      #buy li,
      #params li {
        list-style: none;
        padding: 8px;
      }
      
      #buy .price span {
        color: red;
      }
      
      #other .imgdesc {
        margin-bottom: 20px;
      }
      
      .inputli {
        position: relative;
      }
      
      .inputnumber {
        position: absolute;
        left: 100px;
        top: 5px;
      }
    </style>
    View Code

    将底部的购物车图标中数字叠加

    步骤一:涉及到三个页面的通信,因此需要创建一个共同的Vue对象。

    vm.js
    
    import Vue from 'Vue';
    
    export const COUNTSTR = 'inputNumberCount';
    export var vm = new Vue();

    步骤二:修改根组件App.vue

    <!--以后项目的根组件-->
    <template>
      <div>
        <!--1.0利用mint-ui中的header组件实现整个系统的头部-->
        <mt-header fixed title="hello"></mt-header>
    
        <!--2.0利用vue-router的<router-view></router-view>进行占位-->
        <router-view></router-view>
    
        <!--3.0利用mui中的tabbar组件实现系统的底部-->
        <nav class="mui-bar mui-bar-tab">
          <router-link class="mui-tab-item" to="/home">
            <span class="mui-icon mui-icon-home"></span>
            <span class="mui-tab-label">首页</span>
          </router-link>
          <router-link class="mui-tab-item" to="#tabbar-with-chat">
            <span class="mui-icon mui-icon-email"></span>
            <span class="mui-tab-label">会员</span>
          </router-link>
          <router-link class="mui-tab-item" to="/shopcar">
            <span class="mui-icon mui-icon-contact"><span id="badge" class="mui-badge">0</span></span>
            <span class="mui-tab-label">购物车</span>
          </router-link>
          <router-link class="mui-tab-item" to="/tabbar-with-map">
            <span class="mui-icon mui-icon-gear"></span>
            <span class="mui-tab-label">搜索</span>
          </router-link>
        </nav>
      </div>
    </template>
    
    <script>
      import { vm, COUNTSTR } from './kits/vm.js';
      // 利用 vm.$on() 来注册 COUNT这个常量代表的事件
      vm.$on(COUNTSTR, function(count) {
        //1.0 将count值追加到购物车中
        var badgeobj = document.querySelector('#badge');
        badgeobj.innerText = parseInt(badgeobj.innerText) + count;
      });
    
      // 2.0负责导出.vue这个组件对象,它本质上是一个Vue对象
      // 所以Vue中该定义的元素都可以使用
      export default { // es6的导出对象的写法
        data() { //等价于 es5的 data:function(){
          return {
    
          }
        },
        methods: {
    
        },
        created() {
    
        }
      }
    </script>
    
    <style scoped>
      /* 3.0当前页面的CSS样式写到这里,其中scoped表示这个里面
          写的CSS代码知识在当前组件页面上有效,不会影响到其他组件页面
         * */
    </style>
    View Code

    步骤三:修改goodsinfo.vue文件

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <div class="silder">
          <silder :imgs="imgs"></silder>
        </div>
    
        <!--2.0 实现商品购买区-->
        <div id="buy">
          <h4 v-text="info.title"></h4>
          <p class="line"></p>
          <ul>
            <li class="price">
              市场价: <s>¥{{info.market_price}}</s> 销售价:<span>¥{{info.sell_price}}</span>
            </li>
            <li>
              <li class="inputli">
                购买数量:
                <inputnumber v-on:dataobj="getcount" class="inputnumber"></inputnumber>
              </li>
            </li>
            <li>
              <mt-button type="primary" size="small">立即购买</mt-button>
              <mt-button type="danger" size="small" @click="toshopcar">加入购物车</mt-button>
            </li>
          </ul>
        </div>
    
        <div id="params">
          <h6>商品参数</h6>
          <p class="line"></p>
          <ul>
            <li>商品货号:{{info.goods_no}}</li>
            <li>库存情况:{{info.stock_quantity}}</li>
            <li>上架时间:{{info.add_time}}</li>
          </ul>
        </div>
    
        <!--3.0 图文详情-->
        <!--4.0 商品评论-->
        <div id="other">
          <router-link v-bind="{to:'/goods/goodsdesc/'+id}">
            <mt-button class="imgdesc" type="primary" size="large">图文详情</mt-button>
          </router-link>
          <mt-button type="danger" size="large">商品评论</mt-button>
        </div>
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
      import inputnumber from '../subcom/inputNumber.vue';
      //使用vm对象
      import { vm, COUNTSTR } from '../../kits/vm.js';
      export default {
        components: {
          silder,
          inputnumber
        },
        data() {
          return {
            inputNumberCount: 1, //表示当前购买商品的数量
            id: 0, //表示商品id
            imgs: [],
            info: {} //存储商品详细信息
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
          this.getinfo();
        },
        methods: {
          //加入购物车方法
          toshopcar() {
            //触发事件
            vm.$emit(COUNTSTR, this.inputNumberCount);
          },
    
          //获取inputnumber组件中传入的值
          getcount(count) {
            this.inputNumberCount = count;
            console.log(count);
          },
          getimgs() {
            var url = '../../json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              //判断状态
              this.imgs = res.body.message;
            });
          },
          getinfo() {
            var url = '../../json/goodslist.json';
            this.$http.get(url).then(function(res) {
              var body = res.body;
              if(body.status != 0) {
                alert(body.message);
                return;
              }
    
              for(var i = 0; i < body.message.length; i++) {
                if(this.id == body.message[i].id) {
                  console.log(body.message[i])
                  this.info = body.message[i];
                  console.log(this.info);
                }
              }
            });
          }
    
        }
      }
    </script>
    
    <style scoped>
      .silder {
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
        margin: 5px;
      }
      
      #buy,
      #params,
      #other {
        margin: 5px;
        padding: 5px;
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
      }
      
      .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.2);
      }
      
      #buy ul,
      #params ul {
        padding-left: 0px;
      }
      
      #buy h4 {
        color: #0094ff;
        padding: 5px;
      }
      
      #buy li,
      #params li {
        list-style: none;
        padding: 8px;
      }
      
      #buy .price span {
        color: red;
      }
      
      #other .imgdesc {
        margin-bottom: 20px;
      }
      
      .inputli {
        position: relative;
      }
      
      .inputnumber {
        position: absolute;
        left: 100px;
        top: 5px;
      }
    </style>
    View Code

    项目结构:

    本地存储购物数据

    步骤一:创建一个负责操作localStorage的js文件

    localSg.js
    
    // 负责操作localStorage的文件
    /*
     *  获取数据:var Str  =localStorage.getItem(key);
     *  添加和追加数据: localStorage.setItem(key,value) ,value 是一个字符串
     *  移除数据 : localStorage.removeItem(key);
     * */
    
    // 1.0 定义常量key,将来操作的localStorage中的数据都以这个key来作为标识
    export const KEY = 'goodsdata';
    export var valueObj = {
      goodsid: 0,
      count: 0
    };
    
    // 2.0 实现数据的增加
    // value;格式: {goodsid:87,count:10}
    export function setItem(value) {
      //1.0 获取json格式
      var jsonString = localStorage.getItem(KEY);
      jsonString = jsonString || '[]';
      var arr = JSON.parse(jsonString);
      // 2.0 将value追加进入arr
      arr.push(value);
      // 3.0 将arr 转换成json字符串保存起来
      localStorage.setItem(KEY, JSON.stringify(arr));
    }
    
    // 3.0 获取数据
    export function getItem() {
      var jsonString = localStorage.getItem(KEY);
      //将json格式字符串转换成 js对象
      // jsonString:是一个标准的json格式
      jsonString = jsonString || '[]';
    
      return JSON.parse(jsonString);
    }
    
    // 4.0 移除数据
    export function remoteItem() {
    
    }
    View Code

    步骤二:修改goodsinfo.vue文件

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <div class="silder">
          <silder :imgs="imgs"></silder>
        </div>
    
        <!--2.0 实现商品购买区-->
        <div id="buy">
          <h4 v-text="info.title"></h4>
          <p class="line"></p>
          <ul>
            <li class="price">
              市场价: <s>¥{{info.market_price}}</s> 销售价:<span>¥{{info.sell_price}}</span>
            </li>
            <li>
              <li class="inputli">
                购买数量:
                <inputnumber v-on:dataobj="getcount" class="inputnumber"></inputnumber>
              </li>
            </li>
            <li>
              <mt-button type="primary" size="small">立即购买</mt-button>
              <mt-button type="danger" size="small" @click="toshopcar">加入购物车</mt-button>
            </li>
          </ul>
        </div>
    
        <div id="params">
          <h6>商品参数</h6>
          <p class="line"></p>
          <ul>
            <li>商品货号:{{info.goods_no}}</li>
            <li>库存情况:{{info.stock_quantity}}</li>
            <li>上架时间:{{info.add_time}}</li>
          </ul>
        </div>
    
        <!--3.0 图文详情-->
        <!--4.0 商品评论-->
        <div id="other">
          <router-link v-bind="{to:'/goods/goodsdesc/'+id}">
            <mt-button class="imgdesc" type="primary" size="large">图文详情</mt-button>
          </router-link>
          <mt-button type="danger" size="large">商品评论</mt-button>
        </div>
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
      import inputnumber from '../subcom/inputNumber.vue';
      //使用vm对象
      import { vm, COUNTSTR } from '../../kits/vm.js';
      import {setItem,valueObj} from '../../kits/localSg.js';
      export default {
        components: {
          silder,
          inputnumber
        },
        data() {
          return {
            inputNumberCount: 1, //表示当前购买商品的数量
            id: 0, //表示商品id
            imgs: [],
            info: {} //存储商品详细信息
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
          this.getinfo();
        },
        methods: {
          //加入购物车方法
          toshopcar() {
            //触发事件
            vm.$emit(COUNTSTR, this.inputNumberCount);
            //2.0 将数据保存到localStroage中
                    valueObj.goodsid = this.id;
                    valueObj.count = this.inputNumberCount;
                    setItem(valueObj);
          },
    
          //获取inputnumber组件中传入的值
          getcount(count) {
            this.inputNumberCount = count;
            console.log(count);
          },
          getimgs() {
            var url = '../../json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              //判断状态
              this.imgs = res.body.message;
            });
          },
          getinfo() {
            var url = '../../json/goodslist.json';
            this.$http.get(url).then(function(res) {
              var body = res.body;
              if(body.status != 0) {
                alert(body.message);
                return;
              }
    
              for(var i = 0; i < body.message.length; i++) {
                if(this.id == body.message[i].id) {
                  console.log(body.message[i])
                  this.info = body.message[i];
                  console.log(this.info);
                }
              }
            });
          }
    
        }
      }
    </script>
    
    <style scoped>
      .silder {
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
        margin: 5px;
      }
      
      #buy,
      #params,
      #other {
        margin: 5px;
        padding: 5px;
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
      }
      
      .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.2);
      }
      
      #buy ul,
      #params ul {
        padding-left: 0px;
      }
      
      #buy h4 {
        color: #0094ff;
        padding: 5px;
      }
      
      #buy li,
      #params li {
        list-style: none;
        padding: 8px;
      }
      
      #buy .price span {
        color: red;
      }
      
      #other .imgdesc {
        margin-bottom: 20px;
      }
      
      .inputli {
        position: relative;
      }
      
      .inputnumber {
        position: absolute;
        left: 100px;
        top: 5px;
      }
    </style>
    View Code

    实现加入购物车动态效果

    <template>
      <div id="tml">
        <!--1.0 商品轮播图-->
        <div class="silder">
          <silder :imgs="imgs"></silder>
        </div>
    
        <!--2.0 实现商品购买区-->
        <div id="buy">
          <h4 v-text="info.title"></h4>
          <p class="line"></p>
          <ul>
            <li class="price">
              市场价: <s>¥{{info.market_price}}</s> 销售价:<span>¥{{info.sell_price}}</span>
            </li>
            <li class="inputli">
              购买数量:
              <inputnumber v-on:dataobj="getcount" class="inputnumber"></inputnumber>
              <transition name="show" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
                <div v-if="isshow" class="ball"></div>
              </transition>
            </li>
            <li>
              <mt-button type="primary" size="small">立即购买</mt-button>
              <mt-button type="danger" size="small" @click="toshopcar">加入购物车</mt-button>
            </li>
          </ul>
        </div>
    
        <div id="params">
          <h6>商品参数</h6>
          <p class="line"></p>
          <ul>
            <li>商品货号:{{info.goods_no}}</li>
            <li>库存情况:{{info.stock_quantity}}</li>
            <li>上架时间:{{info.add_time}}</li>
          </ul>
        </div>
    
        <!--3.0 图文详情-->
        <!--4.0 商品评论-->
        <div id="other">
          <router-link v-bind="{to:'/goods/goodsdesc/'+id}">
            <mt-button class="imgdesc" type="primary" size="large">图文详情</mt-button>
          </router-link>
          <mt-button type="danger" size="large">商品评论</mt-button>
        </div>
      </div>
    </template>
    
    <script>
      import silder from '../subcom/slider.vue';
      import inputnumber from '../subcom/inputNumber.vue';
      //使用vm对象
      import { vm, COUNTSTR } from '../../kits/vm.js';
      import { setItem, valueObj } from '../../kits/localSg.js';
      export default {
        components: {
          silder,
          inputnumber
        },
        data() {
          return {
            isshow: false, //控制小球的显示状态
            inputNumberCount: 1, //表示当前购买商品的数量
            id: 0, //表示商品id
            imgs: [],
            info: {} //存储商品详细信息
          }
        },
        created() {
          //获取url传入的商品id值
          this.id = this.$route.params.id;
          this.getimgs();
          this.getinfo();
        },
        methods: {
          //动画3个方法
          beforeEnter(el) {
            //设定小球的初始位置
            el.style.transform = "translate(0px,0px)";
          },
          enter(el, done) {
            //保证小球出现动画
            el.offsetWidth;
    
            //设置小球的结束位置
            el.style.transform = "translate(75px,366px)";
    
            //结束动画
            done();
          },
          afterEnter(el) {
            //重置小球的初始状态
            this.isshow = !this.isshow;
          },
          //加入购物车方法
          toshopcar() {
            //触发事件
            vm.$emit(COUNTSTR, this.inputNumberCount);
            //2.0 将数据保存到localStroage中
            valueObj.goodsid = this.id;
            valueObj.count = this.inputNumberCount;
            setItem(valueObj);
            //3.0 实现小球动画
            this.isshow = !this.isshow;
          },
    
          //获取inputnumber组件中传入的值
          getcount(count) {
            this.inputNumberCount = count;
            console.log(count);
          },
          getimgs() {
            var url = '../../json/goodslunbo' + this.id + '.json';
            this.$http.get(url).then(function(res) {
              //判断状态
              this.imgs = res.body.message;
            });
          },
          getinfo() {
            var url = '../../json/goodslist.json';
            this.$http.get(url).then(function(res) {
              var body = res.body;
              if(body.status != 0) {
                alert(body.message);
                return;
              }
    
              for(var i = 0; i < body.message.length; i++) {
                if(this.id == body.message[i].id) {
                  console.log(body.message[i])
                  this.info = body.message[i];
                  console.log(this.info);
                }
              }
            });
          }
    
        }
      }
    </script>
    
    <style scoped>
      .silder {
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
        margin: 5px;
      }
      
      #buy,
      #params,
      #other {
        margin: 5px;
        padding: 5px;
        border: 1px solid rgba(0, 0, 0, 0.4);
        border-radius: 5px;
      }
      
      .line {
        height: 1px;
        border: 1px solid rgba(0, 0, 0, 0.2);
      }
      
      #buy ul,
      #params ul {
        padding-left: 0px;
      }
      
      #buy h4 {
        color: #0094ff;
        padding: 5px;
      }
      
      #buy li,
      #params li {
        list-style: none;
        padding: 8px;
      }
      
      #buy .price span {
        color: red;
      }
      
      #other .imgdesc {
        margin-bottom: 20px;
      }
      
      .inputli {
        position: relative;
      }
      
      .inputnumber {
        position: absolute;
        left: 100px;
        top: 5px;
      }
      
      .ball {
        background-color: red;
        height: 20px;
        width: 20px;
        border-radius: 50%;
        position: absolute;
        left: 150px;
        top: 10px;
        transition: all 0.4s ease;
        z-index: 100;
      }
    </style>
    View Code
  • 相关阅读:
    Linux 多路复用 select / poll
    Linux 驱动层实现阻塞和非阻塞
    Linux 中断下半部
    Nginx基本配置文件
    lnmp “.user.ini”无法删除解决方法
    阿里云服务器配置nginx和PHP
    PHP使用某个键值对二维数组排序
    Laravel 生成二维码的方法
    Redis五种数据类型-设置key的过期时间
    laravel中redis队列的使用
  • 原文地址:https://www.cnblogs.com/fengxiongZz/p/8108382.html
Copyright © 2011-2022 走看看