Vue nodejs商城项目-商品列表页面组件

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

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