送给正在学小程序或将开发小程序的你

声明:多粉商城小程序,不是官方的,此项目仅供学习参考,不用于商用。

微信小程序商城,持续更新。

项目布局

 

  • components  // 小程序公共组件
  • font  // 小程序字体 wxss 文件
  • images //小程序图片
  • pages //页面
  • utils //小程序的公共方法 如封装请求或接口
  • wxParse //微信小程序 富文本框
  • config.js  //二次封装微信请求方法

商城主要实现的功能

  •  小程序授权登陆 获取用户的信息
  •  首页 包含 活动商品 页面(秒杀商品、团购商品、套装商品、预售商品、周期购商品、批发商品)、首页商品、各分类列表
  •  商品详情页,包含 加入购物车收藏商品立即购买批发购买 各活动商品购买.选择商品的规格添加商品数量.商品的评论、长按关注公众号。 
  •  搜索功能,包含历史记录、热门搜索.
  • 分类页包含 价格高低排序时间最新排序商品销量排序.商品列表大图 和 详情列表显示.动态获取分类菜单的高度分类菜单大分类和详情分类. 上拉加载下拉刷新
  •  购物车,包含 商品全选 单选、左滑删除商品、记录勾选商品、下单 功能
  •  地址管理,包含新建地址和导入微信地址,地址编辑、左滑删除、设置默认地址
  •  我的页面,包含 查询全部订单、待支付、待收货、待发货、待评价、退款/售后、我的评价、我的收藏、我的秒杀、我的批发、我的团购、

微信小程序-rpx 

在实际项目开发中,一般ui小姐姐给的iphone6的设计稿,在iphone6 上,屏幕宽度为 375px,共有 750 个物理像素,则 750rpx = 375px = 750 物理像素,1rpx = 0.5px = 1 物理像素.

微信小程序-微信组件讲解

  1.   view 用的最多其实就是div.
  2. scroll-view 可滚动视图 可以横向和纵向滚动

* 横向滚动 css 设置 不然不能横向滚动
 "width:100%;white-space:nowrap;display:flex">
   "display:inline-block">
  "display:inline-block">
复制代码

     3.cover-image/cover-view 可以覆盖在微信小程序原生组件上 原生组件层级 设置最高 z-       index:999 都没有用

     4. banner 微信小程序轮播组件

微信小程序-常用UI

1. 清除页面布局浮动 

.clearfix:before,
.clearfix:after {    
  content: "";    
  display: table;
}
.clearfix:after {    clear: both;}
复制代码

2.单行文本溢出省略

.text-overflow {    white-space: nowrap;    overflow: hidden;    text-overflow: ellipsis;}
复制代码

3. 多行文本溢出省略

 .text-overflow2{、
   display: -webkit-box; 
   -webkit-line-clamp: 2;  
   overflow: hidden;  
   -webkit-box-orient: vertical; 
     text-overflow: ellipsis;
 } 复制代码

4.tab 选项卡


"navbar">  
  for="{{navbar}}" 
     data-idx="{{index}}" 
     class="item {{currentTab == index ? 'active' : ''}}" 
     wx:key="unique"        b
     bindtap="navbarTap">{{item}}
  

————————————————————————————————————————————————————————————————————————————————————————————————————
.navbar {    flex: none;    display: flex;    background: #fff;    margin-top: 20rpx;}
.navbar .item {  
  position: relative;    
  flex: auto;   
  text-align: center;    
  line-height: 80rpx;    
  font-size: 30rpx;
}
.navbar .item.active {    color: #f23030;}
.navbar .item.active:after { 
    content: "";    
    display: block; 
    position: absolute;    
    bottom: 0; 
    left: 0;    
    right: 0;    
    height: 4rpx;   
    background: #f23030;
}复制代码

微信小程序-新版登陆授权



微信小程序2018年 获取授权接口做了改变,需要用button 去调用 (详情>>)

微信小程序-请求二次封装




微信小程序-上拉加载

最开始做商城小程序用的scroll-view 里bindscrolltolower 做的下拉加载 但是随着万恶的产品经理一直添加修改需求 scroll-view 不能满足需求 只能改用微信官方的onReachBottom api,经过踩坑发现,在tab 的页面 ,推荐大家还是用官方的onReachBottom。

  /**   * 页面上拉触底事件的处理函数   */  
    onReachBottom: function () {  
      console.log('到底了')   
     this.curPage++  //当前页   
     if (this.curPage > this.data.pageCount) { 
     //当前页与总页数对比      t
    is.setData({        
     is_lower: true   
    }) //是否加载完到底了      
   return   
  }  
   this.getData() //获取下页数据  },复制代码

微信小程序-微信支付

/*   
   * 交定金   
   * 测试用的储蓄卡支付  
   * 正式转为微信支付(添加微信支付)   
*/  
addDeposit() {    
    let url, 
        data,
        res, 
       _this = this;
      url = app.globalData.subDomain + api.addDeposit;  // subdomin 请求的地址
      let depositParams = wx.getStorageSync('depositParams'); 
      let depositMoney = 
           _this.data.order.depositPercent.toString().indexOf(',') > -1 
           ? _this.data.order.depositPercent.replace(/,/, '') 
            : _this.data.order.depositPercent;   //把货币的格式“,”去掉
       let orderMoney = 
         _this.data.order.orderPrice.toString().indexOf(',') > -1 
        ? _this.data.order.orderPrice.replace(/,/, '') 
         : _this.data.order.orderPrice;  
       data = {      
           busId: app.globalData.busId,    //店铺商家id
           appId: wx.getStorageSync('appid'), //小程序appId   
           browerType: 100,  //浏览器类型    
           memberId: wx.getStorageSync('memberId'), 
           productId: depositParams.proId,  //商品id
           presaleId: app.globalData.activityId,  //活动商品的id
           depositMoney: depositMoney, //预售商品交定金     
           proName: _this.data.order.product.proName, //商品名称  
           proImgUrl: _this.data.order.imagelist.imageUrl,  // 商品图片地址
           payWay: _this.data.order.payWayList[0].id, //支付类型 默认第一个微信支付
           orderMoney: orderMoney, //定金    
           proNum: depositParams.num || 1   //商品数量
  }
    if (depositParams.proSpecificaIds) {    
          data["proSpecificaIds"] = depositParams.proSpecificaIds    
    }
     // 请求后台 获取微信支付参数的数据    
    ajax.request(url, data, 'POST').then(res => {     
      if (!utils.showMsg(res)) return;        
    wx.requestPayment({  
     //调取微信支付的接口       
      timeStamp: res.data.timeStamp,        
      nonceStr: res.data.nonceStr,        
      package: res.data.prepay_id,       
      signType: res.data.signType || 'MD5',       
      paySign: res.data.paySign,        
      success: () => {         
         utils.showTipMsg("支付成功", "success", function () {             
        utils.linkGoodDetail(depositParams.proId)  
         // 支付成功去商品详情页面           
         })        
       },       
      fail(err) {         
          utils.showTipMsg("支付失败!")        
       }      
     })    
     }).catch(error => {      
       utils.showErrMsg(error)   
      })
  }复制代码

微信小程序-图片上传

  chooseImage() {  
   let arr = this.data.imageList    
   if (arr.length === this.data.limitNum) { 
         util.showToast({          
                  text: `最多上传${this.data.limitNum}张图片!`   
                })        
            return     
        }      // console.log('选择图片')     
       wx.chooseImage({        
           count: 3, // 最多可以选择的图片张数,默认9       
           sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有      
           sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有    
           success: (res) => {  
             // console.log(res)
                let arr2 = res.tempFilePaths
                let arr3 = res.tempFiles
               if (arr.length + arr2.length > this.data.limitNum) {
                    util.showToast({              
                        text: `最多上传${this.data.limitNum}张图片!`          
                        })          
                   } else {  
                 if (this.data.isCheckBig) {  
                    let isBig = false
                    arr3.map((item, idx) => { 
                    if (item.size / 1024 > this.data.limitSize * 1024) {     
                       isBig = true              
                      arr2.splice(idx, 1)           
                      }              
                  })             
               if (isBig) {          
                  util.showToast({       
                        text: `图片大小不能超过${this.data.limitSize}M!`        
                       })            
                   }           
                  }          
                this.upLoadImg(arr2)       
                 arr = arr.concat(arr2)     
                 this.triggerEvent('change-img', arr)    
                  }          // success     
                },       
        fail: function () {         
            // fail      
          },        
         complete: function () {       
         // complete      
          }    
        })   
 },复制代码

微信小程序-商城购物车


 data: {       
       productList: [], //购物车里面没有失效商品  
       sxProductList: [], //购物车失效商品        
       checkedGoodsCount: 0, //选中产品的数量  
       totalPrice: 0, //选中商品总价格        
       checkAllStatus: false, //是否全部选中    
       baseImgUrl: app.globalData.picUrl,        
       memberId: wx.getStorageSync('memberId'),   
       isAdvert: '',       
       advertUrl: "",       
       isLoading: true, //正在加载      
       noSelectProductIds: [], //购物车id      
       navType: 0, //购物车导航类型  0: 普通购物车, 1: 批发购物车     
       goodsNum: '', // 购物车商品数量    
       wholesaleGoodsNum: '', // 批发购物车商品数量       
       delBtnWidth: 90, //删除按钮的宽度
    },    
      startY: 0,    
      endY: 0, 
      startX: 0, //触摸开始的位置  
      delBtnWidth: 0, //(删除按钮宽度单位 rpx)   
      swiperX: true,   
      swiperY: true,    
      expansion: null, //是否存在展开的商品   
     noCartIds: [],


  //勾选商品(单选)  
    checkedItem(e) {        
        let _this = this, 
            checked,      
            item,
            data1,
            data2,
            data3; 
            item = e.currentTarget.dataset.good;    
            data1 = this.data.productList.find(x => x.busId == item.busUserId);       
            data2 = data1 && data1.shopResultList.find(x => x.shopId == item.shopId);    
            data3 = data2 && data2.productResultList.find(x => x.id == item.id);       
            checked = data3.checked;   
            data3.checked = !checked; 
           if (this.data.navType === 1) {        
                 data3.pifaSpecificaList.map(item => item.checked = !checked)      
            }        
            data2.checked = data2.productResultList.every(x => x.checked) ? true : false   
            this.storageProductIds(data3)       
            this.setData({           
               productList: this.data.productList,         
              checkAllStatus: _this.isCheckedAll(this.data.productList),      
           })
        if (this.data.navType === 1) {    
            this.calcPfNum()    
          } else {        
             this.setData({               
                  checkedGoodsCount: _this.getCheckedGoodsCount(_this.data.productList),
                   totalPrice: _this.totalPrice(this.data.productList)     
                  })            t
                  his.setGoodsNum()       
            }    
},
复制代码

项目效果展示

1.首页展示(后台系统编辑的首页)


2.分类页面


3.购物车页面


4.我的页面


5.商品详情页


6.活动商品详情页


7.地址页面


项目总结和遇到的一些问题

 1.scrollview动态获取高度计算分类菜单的高度(效果看上面的分页图)


2.小程序视频原生组件层级搞遮挡住下面按钮


解决思路:视频播放开始前用一个视频播放的封面图片,播放时换成真的视频组件

3. 轮播图-动态计算录播图每张图片高度取最大的图片作为录播高度 且图片上下左右居中显示


4.微信小程序识别二维码问题

微信小程序识别图片二维码只能是微信自身生成的

5.长按保存图片到手机相册-android 和 ios 的差异

保存图片到相册 android 保存成功会提示 保存到手机相册(路径)

 ios 保存成功不提示

6.微信小程序授权弹框问题

微信小程序提示授权 你取消授权  微信那边将2小时内不会在弹去授权的窗口

最后

版本还在迭代中,后续会继续添加新的功能。

多粉商城小程序源码地址

第一次写文,喜欢的希望大家点个star鼓励一下,更有动力更新更多好的文章




你可能感兴趣的:(送给正在学小程序或将开发小程序的你)