1. data(){
  2.        return {
  3.            goodsList:[], // 商品列表
  4.            priceFilter:[ // 价格区间数组
  5.                {
  6.                    startPrice:'0.00',
  7.                    endPrice:'100.00'
  8.                },
  9.                {
  10.                    startPrice:'100.00',
  11.                    endPrice:'500.00'
  12.                },
  13.                {
  14.                    startPrice:'500.00',
  15.                    endPrice:'1000.00'
  16.                },
  17.                {
  18.                    startPrice:'1000.00',
  19.                    endPrice:'5000.00'
  20.                }
  21.            ],
  22.            priceChecked:'all', // 选中的价格区间
  23.            filterBy:false, // 控制价格菜单的显示
  24.            overLayFlag:false, // 遮罩的显示
  25.  
  26.            sortFlag:true, // 排序:默认升序
  27.            page:1, // 当前第一页
  28.            pageSize:8, // 一页有8条数据
  29.  
  30.            busy:true, // 滚动加载插件默认禁用
  31.  
  32.            loading:false, // 往下滚动"加载图标"的出现效果
  33.  
  34.            mdShow:false, // 未登录的模态框是否显示
  35.            mdShowCart:false // 已登录的模态框是否显示
  36.        }
  37.    },
  38.    components:{
  39.        NavHeader,
  40.        NavFooter,
  41.        NavBread,
  42.        Modal
  43.    },
  44.    mounted:function(){
  45.        this.getGoodsList();
  46.    },
  47.    methods:{
  48.        getGoodsList(flag){
  49.            var param = {
  50.              page:this.page,
  51.              pageSize:this.pageSize,
  52.              sort:this.sortFlag ? 1 : -1 , // sortFlag为true升序
  53.              priceLevel:this.priceChecked // 点击的价格区间
  54.            }
  55.            this.loading = true;
  56.            axios.get("/goods/list",{
  57.              params:param // 传参
  58.            }).then((res)=>{
  59.                var res = res.data;
  60.                this.loading = false;
  61.                "){
  62.                  if(flag){ // true.商品数据累加
  63.                    this.goodsList = this.goodsList.concat(res.result.list);
  64.  
  65.                    if(res.result.count == 0){ // 0条数据了,就不加载滚动加载方法了
  66.                      this.busy = true; // 禁用
  67.                    }else{
  68.                      this.busy = false; // 启用
  69.                    }
  70.  
  71.                  }else{ // 只加载一页
  72.                    this.goodsList = res.result.list;
  73.                    this.busy = false;
  74.                  }
  75.                }else{
  76.                  this.goodsList = [];
  77.                }
  78.            })
  79.        },
  80.        sortGoods(){ // 点击排序商品
  81.          this.sortFlag = !this.sortFlag;
  82.          this.page = 1; // 点击价格排序后从第一页开始
  83.          this.getGoodsList(); // 重新加载数据
  84.        },
  85.        setPriceFilter(index){ // 点击价格
  86.            this.priceChecked = index;
  87.            this.closePop();
  88.            this.getGoodsList();
  89.        },
  90.        showFilterPop(){ // 点击filterBy出现价格菜单和遮罩
  91.            this.filterBy = true;
  92.            this.overLayFlag = true;
  93.        },
  94.        closePop(){ // 关闭价格菜单和遮罩
  95.            this.filterBy = false;
  96.            this.overLayFlag = false;
  97.        },
  98.        loadMore(){ // 滚动加载插件方法
  99.          this.busy = true; // 滚动就禁用,防止下一个滚动
  100.          setTimeout(() => { // 一个滚动完成之后再滚动加载下一个
  101.            this.page++;
  102.            this.getGoodsList(true); // 滚动加载是累加数据,并不是只显示一页数据,so需要传参去请求数据的地方判断一下
  103.          }, 500);
  104.        },
  105.        addCart(productId){ // 点击加入购物车
  106.          axios.post("/goods/addCart",{ // 接口设置在server/routes/goods.js
  107.            productId:productId
  108.          }).then((res)=>{
  109.            var res = res.data;
  110.            if(res.status==0){
  111.              //alert("加入成功")
  112.              this.mdShowCart = true; // 加入购物车成功,成功的模态框显示
  113.  
  114.              // 购物车数量加1
  115.              this.$store.commit('updateCartCount',1);
  116.            }else{
  117.              // alert("msg:"+res.msg)
  118.              this.mdShow = true; // 未登录模态框显示
  119.            }
  120.          })
  121.        },
  122.        closeModal(){ // 关闭模态框
  123.              this.mdShow = false; // 未登录模态框消失
  124.              this.mdShowCart = false; // 未登录模态框消失
  125.        }
  126.    }

Node.js后端代码

  1. // 查询商品列表数据
  2. /* GET goods page. */
  3. router.get('/list', function(req, res, next) {
  4.    // res.send('hello,goods list'); // 测试路由,连接成功页面出现'hello,goods list'
  5.  
  6.    // express获取请求参数
  7.    let page = parseInt(req.param("page")); // get请求数据拿到数据:res.param()
  8.    let pageSize = parseInt(req.param("pageSize"));
  9.    let priceLevel = req.param("priceLevel"); // 传过来的价格区间
  10.    let sort = req.param("sort");
  11.    let skip = (page-1)*pageSize; // 跳过的数据条数,(分页的公式).
  12.    var priceGt = '',priceLte = '';
  13.    let params = {};
  14.    if(priceLevel != 'all'){ // 价格区间过滤功能
  15.       switch (priceLevel){
  16.          case '0':priceGt=0;priceLte =100;break;
  17.          case '1':priceGt=100;priceLte =500;break;
  18.          case '2':priceGt=500;priceLte =1000;break;
  19.          case '3':priceGt=1000;priceLte =5000;break;
  20.       }
  21.       params = {
  22.          salePrice:{
  23.             $gt:priceGt,
  24.             $lte:priceLte
  25.          }
  26.       }
  27.    }
  28.    let goodsModel = Goods.find(params).skip(skip).limit(pageSize); // 先查询所有,skip(skip)跳过skip条数据,limit(pageSize)一页多少条数据.即分页功能实现
  29.    goodsModel.sort({'salePrice':sort}); // 对价格排序功能
  30.  
  31.    goodsModel.exec(function(err, doc){
  32.       if(err) {
  33.          res.json({
  34.             status:'1',
  35.             msg:err.message
  36.          })
  37.       }else{
  38.          res.json({
  39.             status:'0',
  40.             msg:'',
  41.             result:{
  42.                count:doc.length,
  43.                list:doc
  44.             }
  45.          })
  46.       }
  47.    })
  48.  
  49. });

Vue nodejs商城项目-商品列表页面组件的更多相关文章

  1. Vue nodejs商城项目-商品列表价格过滤和加入购物车功能

    一.价格过滤功能 GoodsList.vue >>点击价格区间时发送请求 methods:{     getGoodsList(flag){         var param = {   ...

  2. Vue nodejs商城项目-商品的分页、排序、筛选

    .分页 ,要查第3页的数据,则跳过2*8条数据,然后返回8条数据. 在实现滚动加载时,页面刚一加载完成并不需要请求所有数据,当用户下拉到页面底部时,再去请求数据并拼接到商品数据列表中. 通过vue-i ...

  3. 12 Flutter仿京东商城项目 商品列表页面请求数据、封装Loading Widget、上拉分页加载更多

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  4. 11 Flutter仿京东商城项目 商品列表页面二级筛选导航布局

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  5. Vue nodejs商城项目-项目概述

    项目概况 用vue2.0 +node.js +MongonDB 做了一个商城系统 技术选型 Vue2.0+node.js+express+MongoDB+axios+vuex 构建工具 Webpack ...

  6. Vue nodejs商城项目-登录模块

    一.登录功能 后端server/routes/users.js var User = require('./../models/users.js');   // 二级路由 // 登录接口 router ...

  7. 商城项目:商品列表ajax加载,ajax加入购物车--五张表的联合查询

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ProductLists.a ...

  8. 13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  9. Vue nodejs商城项目- 前后端数据传递

    .利用Mongoose查询MongoDB 通过mongoose插件可以简捷地从mondodb中获取数据,首先安装mongoose: cnpm install mongoose --save   使用m ...

随机推荐

  1. DEM、DSM、DOM 名词解释

    1.DEM(Digital Elevation Matrix) 数字高程矩阵. 数字高程模型(Digital Elevation Model,缩写DEM)是一定范围内规则格网点的平面坐标(X,Y)及其 ...

  2. C#请求http post和get

    首先先要感谢博主小伟地方提供的博客,让我解决了问题. 同样是先提问题,我们要请求http干什么? 通过请求http,传入我的参数,我希望能够获取到项目里面的某些数据,比如这里,我们需要得到SceneL ...

  3. flutter initializing gradle终极解决方案

    自己开发的公众号,可以领取淘宝内部优惠券 修改flutter.gradle文件 这种做法网上一大堆的教程,如果你还没改过建议先试下,比如这篇 Flutter 运行 一直Initializing gra ...

  4. WCF寄宿在C#控制台,并用命令行启动

    公司运用wcf比较多,所以自己研究一下寄宿做个笔记,wcf寄宿在控制台有两种方式 第一种,直接在控制台程序内添加wcf服务. 第二种分别添加控制台程序和wcf服务应用程序,前者引用后者,并在app.c ...

  5. 循环结构 while

    while 循环语句可以根据某些条件重复执行一条t-sql 语句或一个语句块 语法: while (条件) begin 语句或语句块 end 程序调试 alt+f5 启动调试 f9 切换断点  f10 ...

  6. iframe中插入代码并执行

    最近有需求通过iframe插入代码.有蛮多方法,如下: 1 var iframe = document.getElementById('previewUrl'); 2 iframe.src = 'ab ...

  7. March 5 2017 Week 10 Sunday

    If you do what you love, you will never work a day in your life. 做你所爱的事情,你就不会觉得是在工作. Today, one mach ...

  8. ZT C++ 重载、覆盖和隐藏的区别

    重载.覆盖和隐藏的区别 分类: C++ 学习笔记 学习心得与方法 2013-09-26 11:21 50人阅读 评论(0) 收藏 举报 概念区分 “overload”翻译过来就是:超载,过载,重载,超 ...

  9. nginx-rtmp加入权限验证的简单方法

    nginx-rtmp-module默认不限制推流权限.播放权限.如果想加入权限验证,有很多种方法. 方法一:修改源码如: 如何给 nginx rtmp 服务加入鉴权机制 http://blog.csd ...

  10. 【LaTeX】E喵的LaTeX新手入门教程(3)

    [LaTeX]E喵的LaTeX新手入门教程(3) 数学公式作者: 郭英东.sty 昨天熄灯了真是坑爹.前情回顾 [LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新 ...