微信小程序微商城(六):动态API实现新品特卖商品流式布局

无毁的湖光-A 2018-06-29 15:54:02 ⋅ 908 阅读

上一篇:微信小程序微商城(五):动态API实现商品详情页(下)

看效果


开发计划

1、新品特卖商品列表布局
2、调用动态API获取数据并加载
3、点击商品跳转商品详情

根据商品ID获取商品详情API数据模型

访问:https://100boot.cn/ 选择微商城案例,如下图所示:



下方还有详细的数据模型可以查看哦!

brand.wxml

<scroll-view scroll-y="true" style="height:{{scrollH}}px" bindscrolltolower="brandShow">
  <view class="goods" style="width:100%">
    <view class="mg_item">
      <view wx:for="{{col1}}" wx:key="id">
      <view class="item_info" catchtap="catchTapCategory" data-goodsid="{{item.id}}">
        <image src="{{item.imgUrl}}" style="width:100%;height:{{item.height}}px"></image>
      </view>
            <view class="product-name">
              {{item.name}}            </view>
            <view class="product-price-wrap">
              <p class="product-price-new">¥{{item.price}}</p>  
              <p class="product-price-old">¥{{item.privilegePrice}}</p> 
               <p class="discount">{{item.discount}}折</p>   
            </view>
      </view>
    </view>
    <view class="mg_item">
      <view wx:for="{{col2}}" wx:key="id" >
      <view class="item_info" catchtap="catchTapCategory" data-goodsid="{{item.id}}">
        <image src="{{item.imgUrl}}" style="width:100%;height:{{item.height}}px"></image>
      </view>
            <view class="product-name">
              {{item.name}}            </view>
            <view class="product-price-wrap">
              <p class="product-price-new">¥{{item.price}}</p>  
              <p class="product-price-old">¥{{item.privilegePrice}}</p> 
               <p class="discount">{{item.discount}}折</p>   
            </view>
      </view>
    </view>
  </view></scroll-view>

 <view style="display:none">
  <image wx:for="{{brandGoods}}" wx:key="id" id="{{item.id}}" src="{{item.imgUrl}}" bindload="onImageLoad1"></image></view> 

  <view class="weui-loadmore" hidden="{{hidden}}">
    <view class="weui-loading"></view>
    <view class="weui-loadmore__tips">努力加载中</view>
  </view>   

brand.wxss

page{  
  height: 100%;  
  background-color: #F3F4F6;
} 
/* 单个图片容器的样式 */
.img_item {  
   width: 48.5%;  
   margin: 2px;  
   display: inline-block;  
   vertical-align: top;  
   background-color: #ffffff;  
   font-size: 24rpx; }
.item_info{  
   border-top:5px solid #F3F4F6; }
.product-name{  
   color: #000;  /* height: 28px; */    text-align:left;   margin: 0px 5px;    margin-bottom: 5px; }
.product-price-wrap .product-price-new{  
   color: #e80080;  
   margin-left:5px;  
   font-weight:900; }
.product-price-wrap .product-price-old{  
   color: #888;  
   text-decoration: line-through;  
   padding-left: 2px; }
.product-price-wrap .discount{  
   margin-left: 30px;  
   background-color: #000;  
   color: #fff; }
/*  加载更多   */

.weui-loading {  
   margin: 0 5px;  
   width: 20px;  
   height: 20px;  
   display: inline-block;      
   vertical-align: middle;  
   -webkit-animation: weuiLoading 1s steps(12, end) infinite;  
   animation: weuiLoading 1s steps(12, end) infinite;  
   background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;  
   background-size: 100%; }
.weui-loadmore {  
   width: 65%;  
   margin: 1.5em auto;  
   line-height: 1.6em;  
   font-size: 12px;  
   text-align: center; }
.weui-loadmore__tips {  
   display: inline-block;  
   vertical-align: middle;  
   color: #888; }

brand.js

const ajax = require('../../utils/ajax.js');
const utils = require('../../utils/util.js');
var sectionData = [];
var ifLoadMore = null;
var activityId = null;
var page = 1;//默认第一页

Page({  
   data: {    
       scrollH: 0,    
       imgWidth: 0,    
       loadingCount: 0,    
       images: [],    
       col1: [],    
       col2: []  },  
   onLoad: function (options) {    activityId = options.activityId;    page = 1;  
   console.log('activityId:' + activityId);    wx.getSystemInfo({      
   success: (res) => {        
   let ww = res.windowWidth;        
   let wh = res.windowHeight;        
   let imgWidth = ww * 0.48;        
   let scrollH = wh;        
   this.setData({          
   scrollH: scrollH,          
   imgWidth: imgWidth        });        
       //加载首组图片        // this.loadImages();        this.brandShow();      }    })  },  
onImageLoad1: function (e) {    
    let imageId = e.currentTarget.id;    
    let oImgW = e.detail.width;         //图片原始宽度    let oImgH = e.detail.height;        //图片原始高度    let imgWidth = this.data.imgWidth;  //图片设置的宽度    let scale = imgWidth / oImgW;        //比例计算    let imgHeight = oImgH * scale;      //自适应高度    let images = this.data.brandGoods;    
    let imageObj = null;    
    for (let i = 0; i < images.length; i++) {      
    let img = images[i];      
    if (img.id+"" === imageId) {        imageObj = img;        
        break;      }    }    imageObj.height = imgHeight;    
   let loadingCount = this.data.loadingCount - 1;    
   let col1 = this.data.col1;    
   let col2 = this.data.col2;    //判断当前图片添加到左列还是右列    if (col1.length <= col2.length) {      col1.push(imageObj);    } else {      col2.push(imageObj);    }    
   let data = {      
       loadingCount: loadingCount,      
       col1: col1,      
       col2: col2    };    
   //当前这组图片已加载完毕,则清空图片临时加载区域的内容    if (!loadingCount) {      data.images = [];    }    
   this.setData(data);  },  
   brandShow: function (success) {    
       var that = this;    
       console.log(page)        ajax.request({      
       method: 'GET',      
       url: 'goods/getActivityGoodsList?key=' + utils.key + '&activityId=' + activityId+'&page=' + page + '&size=10',      
       success: data => {        
       var newGoodsData = data.result.list;        page += 1;        
       if (ifLoadMore) {          //加载更多          if (newGoodsData.length > 0) {            
           console.log(newGoodsData)            sectionData['brandGoods'] = newGoodsData;          } else {            ifLoadMore = false;            
           this.setData({              
               hidden: true            })                        wx.showToast({              
               title: '暂无更多内容!',              
               icon: 'loading',              
               duration: 2000            })          }        } else {          
           if (ifLoadMore == null) {            ifLoadMore = true;            sectionData['brandGoods'] = newGoodsData;//刷新          }        }        that.setData({          
           brandGoods: sectionData['brandGoods'],          
           loadingCount: sectionData['brandGoods'].length,        });        
           console.log(that.data.brandGoods)        wx.stopPullDownRefresh();//结束动画      }    })  },  
catchTapCategory: function (e) {    
    var that = this;    
    var goodsId = e.currentTarget.dataset.goodsid;    
    console.log('goodsId:' + goodsId);    //新增商品用户点击数量    that.goodsClickShow(goodsId);    //跳转商品详情    wx.navigateTo({ url: '../detail/detail?goodsId=' + goodsId    })  },  goodsClickShow(goodsId) {    
    console.log('增加商品用户点击数量');    var that = this;    ajax.request({      
    method: 'GET',      
    url: 'goods/addGoodsClickRate?key=' + utils.key + '&goodsId=' + goodsId,      
    success: data => {        
    console.log("用户点击统计返回结果:" + data.message)      }    })  }, })

备注

微信小程序微商城系列 都是通过https 动态获取数据并展示的,建议从第一篇开始阅读。大家多多支持本系列文章会继续更新下去,谢谢各位!大家在使用过程中有哪些建议可以提出来,我们一起学习哈~~~

微信小程序微商城系列

微信小程序微商城:开发者key获取
微信小程序微商城(一):https框架搭建并实现导航功能
微信小程序微商城(二):电商首页轮播、分类导航和新品特卖实现
微信小程序微商城(三):电商首页福利专场无限下拉刷新动态API数据实现
微信小程序微商城(四):动态API实现商品详情页(上)
微信小程序微商城(五):动态API实现商品详情页(下)

关注我们

如果需要源码可以关注“IT实战联盟”公众号并留言(微商城源码,5个字会收到源码下载地址,一定要看源码里面的操作手册会少走很多弯路),也可以加入交流群和作者互撩哦~~~


全部评论: 0

    我有话说:

    程序商城(七):动态API实现商品分类

    程序商品分类页面布局并且调用动态API获取数据并加载

    程序电商实战-商品列表布局

    今天给大家分享一下程序商品列表的布局方式,根据文章内容操作就可以看到效果哦~~~

    程序商城(四):动态API实现商品详情页(上)

    1、实现商品详情页面布局(这篇实现3个模块,头部商品图片轮播、商品价格和商品描述、商品详情展示) 2、根据用户点击不同的商品请求API动态加载数据

    程序商城(二):电商首页轮播、分类导航和新品实现

    本案例所有模块都为https动态调用API数据服务获得

    程序商城(五):动态API实现商品详情页(下)

    加入购物车悬浮框、商品数量、价格计算、收藏和加入购物车功能开发

    程序商城(九):授权并实现个人中心页面页面

    实现商城授权并获取用户信息和个人中心页面布局

    程序实现商品数量加减

    这是一个用程序原生代码实现的数量加减demo,主要是用于商品购物车或者商品详情修改数量使用

    程序电商实战-商品详情(上)

    先看一下今天要实现程序商品详情页吧!

    程序商城(八):缓存实现商品购物车功能

    商品详情页将商品信息放入缓存,购物车页面读取缓存获取商品信息,购物车商品计算和删除缓存商品

    程序实战篇:商品属性联动选择(案例)

    本期的程序实战篇来做一个电商网站经常用到的-商品属性联动选择的效果,素材参考了一点点

    程序商城(三):电商首页福利专场无限下拉刷新动态API数据实现

    电商首页第5个模块-福利专场,通过https调用API数据模型来实现无限下拉刷新......

    程序商城(一):https框架搭建并实现导航功能

    本文将带领大家搭建https的程序框架,并实现动态获取数据展示效果!

    程序-template使用:实现购物车商品数量加减功能

    上一篇我们实现了购物车功能,里面有用到template模板功能来实现购物车商品数量加减和价格计算功能......

    程序-Image的widthFix属性和rpm尺寸的使用

    在做程序商品详情页,商品的详情是图片集合,渲染完成后发现图片加载的很不自然

    程序电商实战-商品详情加入购物车(下)

    今天会接着上一篇开始写商品详情页加入购物车的部分,直接看效果......

    程序抖音实战-首页(上)

    你也可以用程序编写一个抖音

    程序商城(十):用户收货地址管理

    布局收货地址列表和新增收货地址页

    程序电商实战-首页(下)

    上一篇:程序电商实战-首页(上)好了,上一期我们把首页搜索、导航栏和广告轮播给做完了,那么接下来会继续