wepy代码知识点

index-page

<style lang="less">
.index-nood-modal {
  width: 100vw;
  height: 100vh;
  position: fixed;
  left: 0;
  top: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: 99999999999;
  .step1 {
    position: relative;
    width: 100%;
    height: 100%;
    .long-click {
      position: absolute;
      right: 53rpx;
      top: 21rpx;
      width: 532rpx;
      height: 488rpx;
    }
    .next {
      position: absolute;
      left: 0;
      right: 0;
      margin: 0 auto;
      bottom: 180rpx;
      width: 280rpx;
      height: 105rpx;
    }
  }
  .step2 {
    position: relative;
    width: 100%;
    height: 100%;
    .switch {
      position: absolute;
      width: 726rpx;
      height: 756rpx;
      left: 12rpx;
      right: 12rpx;
      top: 0;
      margin: 0 auto;
    }

    .known {
      position: absolute;
      left: 0;
      right: 0;
      margin: 0 auto;
      bottom: 180rpx;
      width: 280rpx;
      height: 105rpx;
    }
  }
}
#indexPage .wx-swiper-dot {
  margin-bottom: 20rpx;
  width: 12rpx;
  height: 12rpx;
  opacity: 0.2;
  background: #ffffff;
}
#indexPage .wx-swiper-dot-active {
  opacity: 1;
  background: #ffffff;
}
#indexPage::-webkit-scrollbar {
  display: none;
  height: 0;
  width: 0;
  color: transparent;
}
#indexPage {
  height: 100vh;
  .over::-webkit-scrollbar {
    display: none;
    height: 0;
    width: 0;
    color: transparent;
  }
  .ip-head {
    position: relative;
    z-index: 999;
    top: 0;
  }
  .head {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    padding: 42rpx;
    z-index: 9999;
    transition: all 0.5s linear;
    .search {
      height: 72rpx;
      line-height: 72rpx;
      position: relative;
      background: rgb(250, 250, 250);
      border-radius: 36rpx;
      .search-icon {
        position: absolute;
        top: 50%;
        left: 38rpx;
        width: 44rpx;
        height: 44rpx;
        transform: translateY(-50%);
      }
      input {
        height: 100%;
        padding-left: 94rpx;
        font-size: 28rpx;
        color: rgb(178, 178, 178);
      }
    }
  }
  .swipe {
    .item {
      height: 100%;
      image {
        width: 100%;
        height: 100%;
      }
    }
  }
}
.i-mango {
  width: 240rpx;
  height: 260rpx;
  margin: 0 auto;
  margin-top: 160rpx;
  margin-bottom: 160rpx;
  image {
    width: 100%;
    height: 100%;
  }
}

.topWord {
  width: 100%;
  height: 227rpx;
  margin-left: 36rpx;
  margin-bottom: -66rpx;
  position: relative;
  .tpArrow {
    width: 58rpx;
    height: 58rpx;
    position: absolute;
    right: 76rpx;
    bottom: 93rpx;
    display: none;
    image {
      width: 100%;
      height: 100%;
    }
  }
  view {
    width: 100%;
  }
  .topBox {
    height: 136rpx;
    view {
      width: 72rpx;
      height: 72rpx;
      background-color: white;
      margin-top: -7rpx;
    }
    .newProductCn {
      height: 72rpx;
      font-size: 36rpx;
      width: 267rpx;
      background-color: white;
    }
  }
  .bottomBox {
    .newProductEn {
      font-size: 18rpx;
      line-height: 22rpx;
      color: #c2c2c2;
      letter-spacing: 15rpx;
      background-color: white;
      height: 18rpx;
      line-height: 18rpx;
      width: 620rpx;
      overflow: hidden;
    }
    view {
      width: 72rpx;
      height: 72rpx;
      background-color: white;
    }
  }
}
.scroll-tab-bar {
  width: 100%;
  height: 120rpx;
  line-height: 120rpx;
  white-space: nowrap;
  padding: 0rpx 41rpx;
  background-color: #ffffff;
  box-sizing: border-box;
  position: sticky;
  position: -webkit-sticky;
  z-index: 99;
  top: 0;
  .cpb-bar-item {
    display: inline-block;
    line-height: 120rpx;
    height: 120rpx;
    padding: 0rpx 36rpx;
    font-size: 30rpx;
    color: #171717;
    letter-spacing: 3.44rpx;
    background-color: #ffffff;
    overflow: hidden;
  }
  .currentCategoryStyle {
    font-family: PingFangSC-Semibold;
    font-size: 42rpx;
    color: #353535;
    letter-spacing: 4.5rpx;
    font-weight: 700;
  }
  .categoryPoint {
    width: 3px;
    height: 15.9rpx;
    background-color: #ff8080;
    transform: rotate(-135deg);
    display: inline-block;
    position: relative;
    top: -4rpx;
  }
  .category-point-left {
    left: -12rpx;
  }
  .category-point-right {
    right: -12rpx;
  }
}
.cpb-products {
  width: 100%;
  // 开启3d加速
  transform: translate3d(0, 0, 0);
  .odd-bgc {
    background-color: #f4f4f4;
  }
  .even-bgc {
    background-color: #dcebf2;
  }
  .cpb-line {
    width: 100%;
    height: 86rpx;
    display: flex;
    flex-direction: row-reverse;
    align-items: center;
    .cpb-right-line {
      width: 387rpx;
      border-bottom: 1rpx solid #eeeeee;
      margin-right: 42rpx;
    }
  }
  .cpb-line:nth-last-child(1) {
    display: none;
  }
  .cpb-category-name {
    height: 122rpx; // 减去描述之后的高度, 标题距离顶部和底部都是21px
    .cpb-category-name-top {
      height: 45rpx;
      margin-top: 42rpx;
      position: relative;
      .tt {
        width: 20rpx;
        height: 20rpx;
        position: absolute;
        top: -140rpx;
        left: 0rpx;
      }
      .cpb-category-name-top-line {
        border: none;
        width: 168rpx;
        border-bottom: 1rpx solid #b2b2b2;
      }
      .cpb-category-name-top-text {
        font-size: 32rpx;
        letter-spacing: 3rpx;
        line-height: 45rpx;
        padding: 0rpx 24rpx;
        background-color: #ffffff;
        color: #353535;
        font-weight: 700;
      }
    }
    .cpb-category-name-bottom {
      font-size: 18rpx;
      letter-spacing: 2rpx;
      line-height: 25rpx;
      text-align: center;
      background-color: #ffffff;
      color: #b2b2b2;
      margin-top: 12rpx;
    }
  }
  .cpb-product {
    padding-left: 42rpx;

    .cpb-left-img {
      width: 240rpx;
      height: 240rpx;
      margin-right: 36rpx;
      position: relative;
      border-radius: 18rpx;
      overflow: hidden;
      image {
        width: 100%;
        height: 100%;
      }
      .idForScroll {
        position: absolute;
        top: -200rpx;
        left: 0rpx;
        width: 10rpx;
        height: 1rpx;
        background-color: rgba(0, 0, 0, 0);
      }
    }
    .cpb-right-text {
      width: 382rpx;
      justify-content: space-between;
      .cpb-title {
        overflow: hidden;
        display: -webkit-box;
        -webkit-line-clamp: 1;
        -webkit-box-orient: vertical;
        white-space: normal;
        word-wrap: break-word;
        font-size: 30rpx;
        letter-spacing: 3.4rpx;
        color: #353535;
        line-height: 42rpx;
      }
      .cpb-des {
        overflow: hidden;
        display: -webkit-box;
        -webkit-line-clamp: 1;
        -webkit-box-orient: vertical;
        white-space: normal;
        word-wrap: break-word;
        font-size: 22rpx;
        letter-spacing: 3rpx;
        color: rgba(155, 155, 155, 0.87);
        line-height: 30rpx;
        margin-top: 18rpx;
      }
      .pro-activity {
        background: #ff5b21;
        border-radius: 6rpx;
        padding: 11rpx 12rpx;
        height: 36rpx;
        font-size: 20rpx;
        line-height: 1;
        color: #ffffff;
        letter-spacing: 1rpx;
        box-sizing: border-box;
        text-align: center;
        margin-top: 30rpx;
        font-weight: bold;
      }

      .pro-new-upload {
        background: #78e6b2;
        border-radius: 6rpx;
        padding: 11rpx 12rpx;
        height: 36rpx;
        font-size: 20rpx;
        line-height: 1;
        color: #fff;
        letter-spacing: 1rpx;
        box-sizing: border-box;
        text-align: center;
        margin-right: 24rpx;
        margin-top: 30rpx;
        font-weight: bold;
      }
      .activityLabel {
        background-color: #ff8375;
        border-radius: 6rpx;
        font-family: PingFangTC-Regular;
        font-size: 18rpx;
        color: #ffffff;
        letter-spacing: 1px;
        display: inline-block;
        padding: 5rpx 12rpx;
        margin-top: 18rpx;
        line-height: 25rpx;
      }
      .cpb-bottom {
        align-items: center;
        justify-content: flex-start;
        width: 100%;
        overflow: hidden;
        margin-bottom: 10rpx;

        .cpb-after-account {
          font-size: 22rpx;
          height: 36rpx;
          width: 60rpx;
          box-sizing: border-box;
          border: 2rpx solid #ff5b21;
          color: #ff5b21;
          display: flex;
          flex-direction: row;
          justify-content: center;
          align-items: center;
          letter-spacing: 0;
        }
        .cpb-now-price {
          font-size: 36rpx;
          line-height: 36rpx;
          color: #ff675a;
          margin-right: 10rpx;
          align-self: center;
          .cpb-now-price-rmb {
            font-size: 36rpx;
            line-height: 36rpx;
            color: #ff5b21;
            letter-spacing: 0;
            margin-right: 6rpx;
          }
          .cpb-now-price-num {
            font-size: 36rpx;
            line-height: 36rpx;
            color: #ff5b21;
            letter-spacing: 0;
          }
          .cpb-now-price-param {
            font-size: 22rpx;
            color: #ff5b21;
            letter-spacing: 1.69rpx;
            margin-left: 10rpx;
          }
        }
        .cpb-old-price {
          font-size: 24rpx;
          color: #bbbbbb;
          letter-spacing: 1rpx;
          text-decoration: line-through;
          line-height: 24rpx;
          align-self: center;
        }
      }
    }
  }
}
.new-coupon-container {
  z-index: 99999;
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.75);
  align-items: center;
  .coupon-fail {
    margin-top: 492rpx;
    font-size: 32rpx;
    color: #ffffff;
    letter-spacing: 3rpx;
    text-align: center;
    line-height: 50rpx;
  }
  .coupon-item {
    margin-top: 415rpx;
    height: 250rpx;
    width: 590rpx;
    background: url(https://image.velo.top/image/product/1525333541120.jpg)
      no-repeat;
    background-size: 100% 100%;
    padding: 42rpx 88rpx 42rpx 182rpx;
    box-sizing: border-box;
    .coupon-item-content {
      align-items: center;
      width: 320rpx;
      color: #353535;
      .coupon-content-left {
        .coupon-icon {
          font-size: 36rpx;
          letter-spacing: 2rpx;
        }
        .conpon-price {
          font-size: 72rpx;
          letter-spacing: 0;
        }
      }
      .coupon-content-right {
        margin-left: 18rpx;
        .coupon-name {
          font-family: PingFang-SC-Medium;
          font-size: 28rpx;
          font-weight: bold;
        }
        .coupon-date {
          white-space: nowrap;
          font-family: PingFangSC-Regular;
          font-size: 22rpx;
          letter-spacing: 0;
        }
      }
    }
    .coupon-btn {
      line-height: 0;
      width: 320rpx;
      height: 52rpx;
      border-radius: 26rpx;
      background: #ff7e5a;
      font-size: 24rpx;
      color: #ffffff;
      letter-spacing: 2.4rpx;
    }
  }
}
</style>
<template>
  <view>
    <!-- 新人优惠券 -->
    <newerCoupon :isShow.sync="isShowNewerCoupon"></newerCoupon>
    <!-- 固定在顶部的标题, 需要商品有滚动效果时启用该代码 -->
    <view class="index-nood-modal" wx:if="{{noodStatus===1 || noodStatus===2}}">
      <view class="step1" wx:if="{{noodStatus===1}}">
        <image class="long-click" src="../asserts/img/long-click.png"></image>
        <image class="next" @tap="nextNoodGuide" src="../asserts/img/next.png"></image>
      </view>
      <view class="step2"  wx:if="{{noodStatus===2}}">
        <view class="switch-applet-box">
          <image class="switch" src="../asserts/img/switch-applet.png"></image>
        </view>
        <image class="known" @tap="knowNoodGuide" src="../asserts/img/know.png"></image>
      </view>
    </view>
    <scroll-view scroll-y="true" id="indexPage"  enable-back-to-top='{{true}}'  @scroll="mainScroll"  scroll-into-view="scrollId{{pageScrollTo}}"> 
      <!-- 新年物流通知 -->
      <newYearNotice wx:if='{{showMailTip}}'></newYearNotice>

      <view class='over'>
        <view class="ip-head">
          <view class="head flex-h flex-cc">
            <view class="search flex-1" @tap="toSearch">
              <image class="search-icon" src="../asserts/img/search.png"></image>
              <input placeholder="{{searchKeyWord?searchKeyWord:'搜索商品'}}" disabled="true" />
            </view>
          </view>
          <view class="swipe">
            <swiper style="height:660rpx" indicator-dots="{{indicatorDots}}"
                autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}" circular="true">
                <block wx:for="{{bannerData.imgUri}}" wx:key='{{index}}'>
                  <swiper-item class="item"  id="{{index}}" @tap.stop='bannerPush' >
                    <image src="{{item}}" class="slide-image" width="355" height="150"/>
                  </swiper-item>
                </block>
            </swiper>
          </view> 
        </view>
        <!-- 固定吸顶的tab list -->
        <scroll-view class="scroll-tab-bar" scroll-x="true" scroll-into-view="categoryTitleTop{{currentTitleIndex}}" scroll-with-animation="true"> 
          <repeat for="{{categArr}}" key="index"> 
            <view id="categoryTitleTop{{index}}" style="{{index==0?'padding-left:20rpx;':''}}" class="cpb-bar-item {{currentTitleIndex==index?'currentCategoryStyle':''}}" @tap.stop="showCurrentCategoryProducts" data-sourceid="{{item.sourceId}}" data-category="{{index}}" >
              <view class="categoryPoint category-point-left"  wx:if="{{currentTitleIndex===index}}"></view>
              {{item.title}}
              <view class="categoryPoint category-point-right" wx:if="{{currentTitleIndex===index}}"></view>
            </view>
          </repeat>
        </scroll-view>
        <!-- 商品列表 -->
        <view class="cpb-products flex-v">
          <repeat for="{{productArrs}}" key="idx" index="idx" item="item">
            <view class="cpb-category-name"  wx:if="{{item.title}}">
              <view class="cpb-category-name-top flex-h flex-cc">
                <view class="cpb-category-name-top-line"></view>
                <view class="cpb-category-name-top-text">{{item.title}}</view>
                <view class="cpb-category-name-top-line"></view>
                <view class="tt" style="{{idx == 0 ? 'top:0rpx;':''}}"></view>
              </view>
            </view>
            <view class="cpb-product flex-h" style=""  @tap.stop="gotoProductDetail" data-productid="{{item.productId}}" data-index="{{(idx+1)%2}}" >
              <view class="cpb-left-img flex-h flex-cc {{ (idx+1)%2?'pro-even-bk':'pro-odd-bk'}}">
                <image @load="bindloadImage" src="{{item.productUri}}"></image>
                <view class="idForScroll" id="scrollId{{item.sourceIndex}}" style="{{idx?'':'top:-240rpx;'}}"></view>
              </view>
              <view class="cpb-right-text flex-v">
                <view>
                  <view class="cpb-title" style='-webkit-line-clamp: {{item.actName||item.newProduct?1:2}}'> {{item.productName}} </view>
                  <view class="cpb-des">{{item.shortDescription}}</view>
                  <view class="flex-h">
                    <view class="{{android6?'pro-new-upload':'flex-h flex-cc pro-new-upload-flex'}}" wx:if="{{item.newProduct}}">上新</view>
                    <view class="{{android6?'pro-activity':'flex-h flex-cc pro-active'}}" wx:if='{{item.actName}}'>{{item.actName?item.actName:''}}</view>
                  </view>
                </view>
                
                <view class="cpb-bottom flex-h flex-cc">
                  <!-- <view class="cpb-after-account">券后</view> -->
                  <view class="cpb-now-price flex-h flex-cc">
                    <view class="cpb-now-price-rmb">¥</view>
                    <view class="cpb-now-price-num">{{item.priceAfterDiscount/100}}</view>
                    <view class="cpb-now-price-param" wx:if="{{item.params}}"> / {{item.params}}</view>
                  </view>
                  <view class="cpb-old-price" hidden='{{item.price==item.priceAfterDiscount}}'>¥{{(item.price/100)}}</view>
                </view>
              </view>
            </view>
            <view class="cpb-line" wx:if="{{item.isCategoryLastProduct!='yes'}}" >
              <view class="cpb-right-line"></view>
            </view>
          </repeat>
        </view>
        <!-- 新品推荐 -->
        <repeat for="{{ newProductMoreGoodsData }}" key="index" index="index" item="item">
          <newProduct wx:if="{{item.floorType == 'new_launch'}}" :allInfo="item" ></newProduct>
        </repeat>
        <!-- footer -->
        <view class="i-mango" style="{{addImangoMargin?'margin-top:100rpx;':''}}">
          <image src="../asserts/img/end_wanwei.png"></image>
        </view>
      </view>
      <custoast/>
    </scroll-view>
    <!-- new 优惠券组件 -->
    <view class="new-coupon-container flex-v" wx:if='{{detail.isPopup}}' catchtouchmove>
      <view class="coupon-item flex-v flex-bc" wx:if='{{detail.allowAccept}}'>
        <view class="coupon-item-content flex-h" >
          <view class="coupon-content-left flex-h flex-cc">
            <view class="coupon-icon">¥</view>
            <view class="conpon-price">{{(detail.couponInfo.discount||0)/100}}</view>
          </view>
          <view class="coupon-content-right">
            <view class="coupon-name">{{detail.couponInfo.couponName}}</view>
            <view class="coupon-date">{{detail.couponInfo.validTime}}</view>
          </view>
        </view>
        <view class='coupon-btn flex-h flex-cc' @tap='receiveCoupon'><view>立即领取</view></view>
      </view>

      <view class='coupon-fail flex-v flex-cc' hidden='{{detail.allowAccept}}' wx:if='{{detail.recieveResult===0}}'>
        <view>领券成功</view>
        <view>请通过购买链接下单~</view>
      </view>
       <view class='coupon-fail flex-v flex-cc' hidden='{{detail.allowAccept}}' wx:if='{{detail.recieveResult===1||detail.recieveResult===3}}'>
        <view>抱歉,你来晚啦~</view>
        <view>券已领完,下次要早点哦~</view>
      </view>
       <view class='coupon-fail flex-v flex-cc' hidden='{{detail.allowAccept}}' wx:if='{{detail.recieveResult===2}}'>
        <view>抱歉,您的领券数量已达上限</view>
      </view>
    </view>
  </view>
</template>

<script>
import wepy from 'wepy'
import toast from '../components/toast'
import moreGoodsProd from '../components/more-goods-prod'
import newProduct from '../components/new-product'
import tabBar from '../components/tab-bar'
import NewYearNotice from '../components/new-year-notice'
import newerCoupon from '../components/newer-coupon'
import { checkUpdateApplet } from '../utils/util.js'
var event = require('../utils/event.js')

import {
  getIndexFrame,
  getFloorProductList,
  shareProduct,
  getNotice,
  pageRecord,
  wanweiIndexProductListV2,
  linkBindFromMP,
  pushRegisterDot,
  getCouponConfig,
  receiveCoupon
  // generateShareId
} from '../service/api'

export default class Index extends wepy.page {
  config = {
    navigationBarTitleText: '大叔家Ocandy'
  }

  components = {
    newProduct: newProduct,
    moreGoodsProd: moreGoodsProd,
    custoast: toast,
    tabBar: tabBar,
    newYearNotice: NewYearNotice,
    newerCoupon: newerCoupon
  }

  data = {
    indicatorDots: true,
    autoplay: true,
    interval: 3000,
    duration: 300,
    bannerData: {},
    bannerTarget: null,
    bannerTargetTypeArr: null,
    bannerTargetTitle: null,
    addShopCarProductId: '',
    indexFrame: [],
    newProductMoreGoodsData: [],
    pageScrollTo: '',
    addImangoMargin: false,
    noodStatus: 0,
    showMailTip: false,
    // 是否显示新手的优惠券
    isShowNewerCoupon: false,
    // 主页和搜索页输入框里的推荐搜索文字
    searchKeyWord: '',
    noRepeat: false,
    pageLoadTime: {},
    categoryAllData: [],
    categArr: [],
    productArrs: [],
    currentTitleIndex: 0,
    noReapClick: false,
    iosFixed: false,
    isIOS: false,
    scrollTopArr: [],
    current: -1,
    tabHeight: 70,
    isTabClick: false,
    detail: null
  }

  methods = {
    gotoProductDetail(e) {
      if (this.$parent.globalData.preventMoreTap(e)) {
        return
      }
      var type = e.currentTarget.dataset.index
      var productId = e.currentTarget.dataset.productid
      wx.navigateTo({
        url: `/pages/product-detail-page?type=${type}&productId=${productId}`,
        complete: () => {
          this.$emit('clearTimeOut')
        }
      })
    },
    bindloadImage() {
      if (!this.noRepeat) {
        this.noRepeat = true
        // 第一张图片加载完毕去获取dom的高度数组
        this.getScrollArray()

        this.pageLoadTime.imgTime = new Date().getTime()
        pageRecord({
          path: 'pages/index-page',
          readyTime: this.pageLoadTime.startTime,
          loadTime: this.pageLoadTime.imgTime
        }).then(res => {})
        console.log(
          'index-page=>bindloadImage=>总耗时',
          this.pageLoadTime.imgTime - this.pageLoadTime.startTime
        )
        setTimeout(() => {
          this.noRepeat = true
          this.$apply()
        }, 3000)
      }
    },
    showCurrentCategoryProducts(e) {
      // 如果是点击tabbar 则禁止滚动事件触发,1s后解开
      this.isTabClick = true
      setTimeout(() => {
        this.isTabClick = false
        this.$apply()
      }, 1000)
      if (this.noReapClick === false) {
        this.noReapClick = true
        setTimeout(() => {
          this.noReapClick = false
          this.$apply()
        }, 500)
        this.pageScrollTo = e.currentTarget.dataset.sourceid + '0'
        setTimeout(() => {
          this.pageScrollTo = ''
          this.$apply()
        }, 1000)
        // title
        this.currentTitleIndex = e.currentTarget.dataset.category
        this.$apply()
      }
    },
    knowNoodGuide() {
      this.noodStatus = 3
      wx.showTabBar()
    },
    nextNoodGuide() {
      wepy.setStorageSync('indexNood', 1)
      this.noodStatus = 2
    },
    mainScroll(e) {
      if (this.isTabClick) {
        return
      }
      this.getCategoryNameTop()
    },
    toSearch(e) {
      if (this.$parent.globalData.preventMoreTap(e)) {
        return
      }
      wx.navigateTo({
        url: '/subPackage/search-page'
      })
    },
    bannerPush(e) {
      if (this.$parent.globalData.preventMoreTap(e)) {
        return
      }
      let target = this.bannerTarget[e.currentTarget.id]
      let targetType = this.bannerTargetTypeArr[e.currentTarget.id]
      let shareTitle = this.bannerTargetTitle[e.currentTarget.id]

      if (targetType === '0') {
        // 0不跳转
        console.log('index-page=>bannerPush=>不跳转')
      } else if (targetType === '1') {
        // 1跳转活动
        wx.navigateTo({
          url: `/pages/newer-coupon-page?shareTitle=${shareTitle}`
        })
      } else if (targetType === '2') {
        // 2跳转h5
        wx.navigateTo({
          url: `/pages/activity-page?url=${target}&shareTitle=${shareTitle}`
        })
      } else if (targetType === '3') {
        // 3跳转商品详情
        wx.navigateTo({
          url: `/pages/product-detail-page?productId=${target}`
        })
      }
    },
    receiveCoupon() {
      receiveCoupon({ couponConfigId: this.detail.couponConfigId }).then(
        res => {
          console.log('product-detial=>receiveCoupon=>领取优惠券', res)
          if (res && res.data) {
            return
          }
          if (res.allowWatch) {
            wx.showTabBar()
            this.detail.isPopup = false
            this.toast({ title: res.msg, time: 1000 })
          } else {
            this.detail.recieveResult = res.recieveResult
            this.detail.allowAccept = 0
          }

          this.$apply()
        }
      )
    }
  }

  onShareAppMessage(res) {
    var _this = this
    var productId = res.target ? res.target.dataset.productid : ''
    var shareId = res.target ? res.target.dataset.shareid : ''
    var type = res.target ? res.target.dataset.type : ''
    var floorIndex = res.target ? res.target.dataset.floorindex : ''
    var index = res.target ? res.target.dataset.index : ''
    var bindRelationshareId = this.$parent.globalData.bindRelationshareId

    console.log(
      'index-page =>onShareAppMessge =>bindRelationshareId',
      bindRelationshareId
    )
    var path =
      res.from !== 'menu'
        ? `/pages/index-page?productId=${productId}&isShare=1&type=${type}&shareId=${shareId}`
        : `/pages/index-page?bindRelationshareId=${bindRelationshareId}`
    return {
      title: res.target ? res.target.dataset.title : '好吃的,在大叔家Ocandy',
      path: path,
      imageUrl: res.target ? res.target.dataset.imgurl : '',
      success: function(_) {
        // 转发成功
        if (res.from !== 'menu') {
          shareProduct({ productId: productId }).then(res => {
            _this.newProductMoreGoodsData[floorIndex].products[index].shareNum++
            _this.$apply()
          })
        } else {
          // 更换shareId方法
          _this.$parent.changeRelationShareId()
        }
      }
    }
  }

  toast(obj) {
    return new Promise((resolve, reject) => {
      this.$invoke('custoast', 'showToast', obj).then(res => {
        resolve(res)
      })
    })
  }

  events = {
    emitCategoryAllData(categoryAllData) {
      this.$broadcast('broadcastCategoryAllData', categoryAllData)
    },
    'index-emit': (...args) => {
      let $event = args[args.length - 1]
      console.log(
        `index-page=>emitCategoryAllData=> ${this.$name} receive ${
          $event.name
        } from ${$event.source.$name}`
      )
    },
    openShopCar: arg => {
      this.addShopCarProductId = arg
      this.$invoke('attrbox', 'setAnimation', {
        productId: this.addShopCarProductId,
        from: 'index'
      })
      this.$apply()
    }
  }

  getIndexData() {
    this.newProductMoreGoodsData = []
    getIndexFrame({}).then(res => {
      this.indexFrame = res
      if (res[res.length - 1].floorType === 'recommend') {
        this.addImangoMargin = true
      }
      // 获取初始数据, 将先后顺序放到新数组
      res.forEach((item, index) => {
        var idx = this.newProductMoreGoodsData.length
        // 新品发布
        if (item.sourceId && item.floorType === 'new_launch') {
          this.newProductMoreGoodsData[idx] = {}
          this.newProductMoreGoodsData[idx].floorType = item.floorType // 楼层信息
          this.newProductMoreGoodsData[idx].sourceData = item // 原始数据, 用于渲染'新品发布'

          setTimeout(() => {
            getFloorProductList({ sourceId: item.sourceId }).then(res => {
              this.newProductMoreGoodsData[idx].products = res // 商品数据
              this.$apply()
            })
          }, 2000)
          // 更多优选
        } else if (item.sourceId && item.floorType === 'recommend') {
          this.newProductMoreGoodsData[idx] = {}
          this.newProductMoreGoodsData[idx].floorType = item.floorType // 楼层信息
          this.newProductMoreGoodsData[idx].sourceData = item // 原始数据,  用于渲染'更多优选'
          setTimeout(() => {
            getFloorProductList({ sourceId: item.sourceId }).then(res => {
              this.newProductMoreGoodsData[idx].products = res // 商品数据
              this.$apply()
            })
          }, 2000)
          // banner数据
        } else if (item.floorType === 'banner') {
          this.bannerData = item
          this.bannerData.imgUri = item.imgUri.split(',')
          this.bannerTarget = item.target.split(',')
          this.bannerTargetTypeArr = item.targetType.split(',')
          this.bannerTargetTitle = item.title.split(',')
          console.log(
            'index-page=>getIndexData=>this.bannerTargetTitle',
            this.bannerTargetTitle
          )
        }
      })
      this.$apply()
    })
  }

  indexNood() {
    const indexNood = wepy.getStorageSync('indexNood')
    if (indexNood === 0) {
      this.noodStatus = 1
      wx.hideTabBar()
    }
  }

  onReady() {
    this.pageLoadTime.domTime =
      new Date().getTime() - this.pageLoadTime.startTime
  }
  getScrollArray() {
    var query = wx.createSelectorQuery()
    query
      .selectAll('.cpb-category-name')
      .boundingClientRect(res => {
        res.forEach(element => {
          this.scrollTopArr.push(element.top - this.tabHeight)
        })
      })
      .exec()
    wx.hideLoading()
  }
  findPlace(code, arr) {
    let array = arr.slice(0)
    var codeMin = Math.min.apply(null, array)
    var codeIndex = 0
    if (code <= codeMin) {
      codeIndex = 0
    } else {
      array.push(code)
      array.sort(function(x, y) {
        return x - y
      })
      codeIndex = array.indexOf(code) - 1
    }
    return codeIndex
  }

  getCategoryNameTop() {
    wx
      .createSelectorQuery()
      .select('#indexPage')
      .fields({ scrollOffset: true }, res => {
        this.current = this.findPlace(res.scrollTop, this.scrollTopArr)
        if (this.current !== this.currentTitleIndex) {
          this.currentTitleIndex = this.current
          this.$apply()
        }
      })
      .exec()
  }

  async initData() {
    this.categoryAllData = await wanweiIndexProductListV2({})

    if (!this.categoryAllData.length) {
      return
    }

    this.categoryAllData.forEach((item, index) => {
      if (item.productList.length) {
        item.productList[item.productList.length - 1].isCategoryLastProduct =
          'yes'
      }

      let title = item.title
      let description = item.description
      let flag = true

      // 如果某个分类的商品个数为0则不往下执行
      if (!item.productList.length) {
        return
      }

      // 记录此分类的商品数量
      item.productsLength = item.productList.length

      item.productList.forEach((itm, idx) => {
        if (typeof item === 'object') {
          if (flag) {
            itm.title = title
            itm.description = description
            // 将此分类的商品数量挂载到此分类的第一个商品上
            itm.productsLength = item.productsLength
            flag = false
            this.productArrs.push(itm)
          } else {
            this.productArrs.push(itm)
          }
        }
      })
      // 获取分类的数据
      this.categArr.push({
        title: item.title,
        sourceId: item.sourceId,
        productsLength: item.productList[0].productsLength
      })
    })

    this.categoryScrollTo = this.categArr[0].sourceId
    this.$apply()
  }

  GZHToGroupDetail(opts) {
    if (opts.openRecordId) {
      wx.navigateTo({
        url: `/pages/group/group-detail-page?openRecordId=${opts.openRecordId}`
      })
    } else if (opts.toPage === 'couponPage') {
      wx.navigateTo({
        url: `/pages/coupon-page`
      })
    } else {
      if (opts.toPage) {
        wx.navigateTo({
          url: opts.toPage
        })
      }
    }
  }

  noticeCardCoupon() {
    event.emit('readyToGetGlobalData', 1)
  }

  async onLoad(opt) {
    wx.hideShareMenu()
    wx.showLoading({
      title: '加载中...'
    })
    console.log('index-page =>onload =>opt', opt)
    //  获取设备信息
    const deviceInfo = wx.getSystemInfoSync()
    if (deviceInfo.platform === 'ios') {
      this.isIOS = true
    } else {
      this.isIOS = false
    }
    this.$parent.globalData.isAndroid = deviceInfo.platform === 'android'

    // 初始化图片打点时间
    this.pageLoadTime.startTime = new Date().getTime()

    await this.$parent.userLogin()

    // 首页领取优惠券
    if (opt.scene) {
      this.getCoupon(opt.scene)
    }

    // 运营打点
    this.yyDot(opt)

    // 从首页或活动分享menu分享进来,绑定关系
    this.judgeRelation(opt)

    // 通知卡片, 获取优惠券信息
    this.noticeCardCoupon()
    // 公众号跳转到拼团详情
    this.GZHToGroupDetail(opt)
    // 输入框的搜索关键字
    this.searchKeyWord = this.$parent.globalData.searchKeyWord
    // 获取分类信息
    this.initData()
    this.getNoticeList()
    // 获取主页信息
    this.getIndexData()
    this.$apply()
    // 判断推手身份,展示推手新手引导
    if (this.$parent.globalData.isPush === 1) {
      this.indexNood()
    }

    // 判断不是推手且(此处不确定)
    console.log(
      'index-page=>onload=>opt.recommend',
      opt.recommend,
      this.$parent.globalData.isPush
    )
    if (opt.recommend && this.$parent.globalData.isPush === 0) {
      wx.navigateTo({
        url: `/pages/product-detail-page?type=${opt.type}&productId=${
          opt.productId
        }&shareId=${opt.shareId}`
      })
    }

    await this.$broadcast('onLoadFuc')
    // 如果为1则弹框, 领券
    this.isShowNewerCoupon = this.$parent.globalData.newWxCoupon
    this.$apply()
  }

  // 扫码首页领取优惠券
  getCoupon(couponConfigId) {
    getCouponConfig({ couponConfigId: couponConfigId }).then(res => {
      this.detail = res
      wx.hideTabBar()
      console.log('index-page=>getCoupon=>获取优惠券', res)
    })
  }

  // 运营来源打点
  yyDot(opts) {
    if (opts.yysource) {
      pushRegisterDot({
        yysource: opts.yysource,
        velo: 'ww',
        accId: this.$parent.globalData.accId || ''
      }).then(res => {
        console.log('index-page=>yyDot=>res', res)
      })
    }
  }

  onShow() {
    checkUpdateApplet()
  }
  getNoticeList() {
    getNotice({}).then(res => {
      console.log('index-page=>getNoticeList=>获取notice', res)
      this.noticeList = res || []
      if (res && res.length > 0) {
        this.showMailTip = true
        this.$parent.globalData.addBannerHeight = 72
      } else {
        this.showMailTip = false
        this.$parent.globalData.addBannerHeight = 0
      }
      this.$apply()
    })
  }

  /**
   * 请求绑定关系的接口,绑定上级关系
   */
  bindRelation(opt) {
    linkBindFromMP({ fromId: opt.bindRelationshareId }).then(
      res => {
        console.log(
          'index-page =>onload =>linkBindFromMP绑定成功',
          opt.bindRelationshareId,
          res
        )
      },
      err => {
        console.log('index-page =>onload =>linkBindFromMP绑定失败=>err', err)
      }
    )
  }

  /**
   * 判断是否需要绑定从首页和活动页右上角分享出来的页面
   */
  async judgeRelation(opt) {
    // 请求shareId
    await this.$parent.getIndexShareId().then(res => {
      console.log('index-page =>judgeRelation =>获取shareId成功')
      wx.showShareMenu()
    })

    // 判断是否需要绑定关系
    if (opt.bindRelationshareId && this.$parent.globalData.isPush !== 1) {
      this.bindRelation(opt)
    }

    // 判断是否需要跳转到活动页
    if (opt.pagePath) {
      var url = opt.actUrl
        ? `${opt.pagePath}?shareTitle=${opt.shareTitle}&url=${opt.actUrl}`
        : `${opt.pagePath}?shareTitle=${opt.shareTitle}`
      wx.navigateTo({
        url: url
      })
    }
  }
}
</script>

home-page-old

<style lang="less">
.homePage {
  .tabbar {
    height: 80rpx;
    width: 100%;
    align-items: center;
    .bar-item {
      height: 100%;
      .content {
        height: 100%;
        position: relative;
        .title {
          font-size: 30rpx;
          line-height: 50rpx;
          letter-spacing: 1rpx;
          color: #333333;
        }
        .select-bar {
          color: #ff8080;
        }
        .border-line {
          position: absolute;
          width: 100%;
          height: 5rpx;
          background: #ff8080;
          left: 0;
          bottom: 0;
        }
      }
    }
  }
  .banner {
    height: 400rpx;
    width: 100%;
    position: relative;
    .search-box {
      width: 691rpx;
      height: 80rpx;
      position: absolute;
      left: 30rpx;
      top: 20rpx;
      background: #fff;
      border-radius: 40rpx;
      align-items: center;
      font-size: 28rpx;
      color: #cccccc;
      z-index: 99;
      .icon {
        height: 24rpx;
        width: 24rpx;
        margin-left: 25rpx;
        margin-right: 21rpx;
      }
    }
    .swiper {
      width: 100%;
      height: 100%;
      .swiper-item {
        width: 100%;
        height: 100%;
        image {
          width: 100%;
          height: 100%;
        }
      }
    }
  }
  .discount {
    width: 690rpx;
    height: 140rpx;
    background: #000;
    margin: 40rpx 0;
  }
  .tag-bar {
    margin-top: 30rpx;
    width: 100%;
    justify-content: flex-start;
    .item {
      min-width: 25%;
      max-width: 25%;
      margin-bottom: 20rpx;
      .icon {
        height: 90rpx;
        width: 90rpx;
        min-width: 90rpx;
        margin-bottom: 20rpx;
      }
      .tag-name {
        font-size: 24rpx;
        color: #666666;
      }
    }
  }
  .activity {
    margin-top: 30rpx;
    width: 100%;
    .act-title {
      height: 140rpx;
      width: 100%;
      .act-name {
        padding: 0 38rpx;
        height: 60rpx;
        border: 2rpx solid #ff8080;
        border-radius: 30rpx;
        font-size: 32rpx;
        color: #333333;
        background: #fff5f1;
      }
    }
    .act-title-1 {
      height: 400rpx;
      width: 100%;
      .act-name {
        padding: 0 38rpx;
        height: 60rpx;
        border: 2rpx solid #ff8080;
        border-radius: 30rpx;
        font-size: 32rpx;
        color: #333333;
        background: #fff5f1;
      }
    }
    .goods-top {
      width: 100%;
    }
    .goods-item {
      margin-top: 40rpx;
      width: 100%;
      padding: 0 30rpx;
      box-sizing: border-box;
      .goods-img {
        height: 200rpx;
        width: 200rpx;
        border-radius: 20rpx;
      }
      .goods-right {
        margin-left: 20rpx;
        height: 200rpx;
        .goods-name {
          font-size: 28rpx;
          color: #333333;
          overflow: hidden;
          margin-bottom: 15rpx;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;
          white-space: normal;
          display: -webkit-box;
          text-overflow: ellipsis;
          word-wrap: break-word;
        }
        .goods-desc {
          font-size: 24rpx;
          color: #999999;
          overflow: hidden;
          -webkit-line-clamp: 1;
          -webkit-box-orient: vertical;
          white-space: normal;
          display: -webkit-box;
          text-overflow: ellipsis;
          word-wrap: break-word;
        }
        .goods-price {
          width: 100%;
          font-size: 36rpx;
          color: #ff8080;
          align-items: flex-end;
          line-height: 40rpx;
          .fail-price {
            line-height: 40rpx;
            font-size: 24rpx;
            color: #999;
            margin-left: 33rpx;
            text-decoration: line-through;
          }
        }
      }
    }
    .act-goods {
      margin-top: 40rpx;
      height: 280rpx;
      width: 100%;
      white-space: nowrap;
      .act-item {
        margin-right: 54rpx;
        display: inline-block;
        height: 240rpx;
        width: 636rpx;
        background: #f7f7f7;
        padding: 0 30rpx;
        box-sizing: border-box;
        .act-item-container {
          align-items: center;
          height: 100%;
          width: 100%;
        }

        .goods-img {
          height: 200rpx;
          width: 200rpx;
          border-radius: 20rpx;
        }
        .goods-right {
          margin-left: 20rpx;
          height: 200rpx;
          .goods-name {
            font-size: 26rpx;
            color: #666666;
            overflow: hidden;
            -webkit-line-clamp: 2;
            -webkit-box-orient: vertical;
            white-space: normal;
            display: -webkit-box;
            text-overflow: ellipsis;
            word-wrap: break-word;
          }
          .goods-desc {
            margin-bottom: 25rpx;
            font-size: 24rpx;
            color: #666666;
            overflow: hidden;
            -webkit-line-clamp: 1;
            -webkit-box-orient: vertical;
            white-space: normal;
            display: -webkit-box;
            text-overflow: ellipsis;
            word-wrap: break-word;
          }
          .goods-price {
            width: 100%;
            font-size: 36rpx;
            color: #ff8080;
            align-items: flex-end;
            line-height: 40rpx;
            .fail-price {
              line-height: 40rpx;
              font-size: 24rpx;
              color: #999;
              margin-left: 10rpx;
              text-decoration: line-through;
            }
          }
        }
      }
    }
  }
  .adv-title {
    width: 100%;
    height: 360rpx;
  }
  .adv-list {
    margin-top: 40rpx;
    // margin-bottom: 70rpx;
    width: 100%;
    white-space: nowrap;
    .adv-item-container {
      display: inline-block;
      margin-left: 30rpx;
      .adv-item {
        align-items: center;
        margin-bottom: 20rpx;
        .adv-img {
          width: 200rpx;
          height: 200rpx;
          border-radius: 20rpx;
          background: #f5f5f5;
          margin-bottom: 20rpx;
        }
        .adv-name {
          width: 200rpx;
          height: 60rpx;
          overflow: hidden;
          line-height: 30rpx;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;
          white-space: normal;
          display: -webkit-box;
          text-overflow: ellipsis;
          word-wrap: break-word;
          font-size: 26rpx;
          color: #333333;
          text-align: center;
          margin-bottom: 20rpx;
        }
        .adv-price {
          font-size: 28rpx;
          color: #ff8080;
          text-align: center;
        }
      }
    }
  }
}
</style>
<template>
  <view class='container homePage'>

     <view class="tabbar flex-h">
      <view class="bar-item flex-v flex-1 flex-cc" wx:for='{{tagBar}}' wx:key='index' @tap='tagChange' id='{{index}}'>
        <view class="content flex-v flex-cc">
          <view class="title {{currentIndex==index ? 'select-bar':''}}">{{item.title}}</view>
          <view class="border-line" wx:if='{{currentIndex==index}}'></view>
        </view>
      </view>
    </view>

    <view class="banner">
      <view class="search-box flex-h" @tap='toSearch'>
       <image class="icon"></image>
       <view class="search-content">搜索商品</view>
       <!-- 大家都在搜:水光针 -->
      </view>
      <!--轮播图-->
      <swiper class='swiper' autoplay interval='5000' circular>
        <swiper-item wx:for='{{banner}}' wx:key='index' class='swiper-item'>
          <image src='{{item.imgUri}}' @tap='bannerTap' id='{{item.target}}'></image>
        </swiper-item>
      </swiper>
    </view>

    <!-- 优惠券 -->
    <view class="discount" wx:if='{{false}}'></view>

    <!-- tag -->
    <view class="tag-bar flex-h flex-wrap">
      <view class="item flex-v flex-cc flex-1" wx:for='{{tabBar}}' wx:key='index' @tap='tagTap' id='{{index}}'>
        <image class="icon" src='{{item.icon}}'></image>
        <view class="tag-name">{{item.tagName}}</view>
      </view>
    </view>

    <block wx:for='{{floorList}}' wx:key='index'>
      <view class="activity flex-v flex-cc" wx:if='{{item.type==0}}'>
        <image class="act-title flex-cc flex-h" src='{{item.icon}}' @tap='tagTap' id='{{index}}' data-type='banner'>
          <!-- <view class="act-name flex-cc flex-h">限时购</view> -->
        </image>

        <view class="goods-item flex-h" wx:for='{{item.products}}' wx:key='index' wx:for-item='pItem'  @tap='toGoodsDetail' id='{{pItem.productId}}'>
          <image class="goods-img" src="{{pItem.imgUri}}"></image>
          <view class="goods-right flex-1 flex-v flex-bc">
            <view class="goods-top">
              <view class="goods-name">{{pItem.productName}}</view>
              <view class="goods-desc">{{pItem.shortDescription}}</view>
            </view>
            <view class="goods-price flex-h">
              <view class="real-price">¥{{pItem.SELL_PRICE/100 || 0}}</view>
              <view class="fail-price">¥{{pItem.underlinePrice/100 || 0}}</view>
            </view>
          </view>
        </view>

        <!-- <scroll-view class="act-goods" scroll-x=‘{{true}}’>
          <view class="act-item" wx:for='{{[0,0,0,0,0]}}'>
            <view class="act-item-container flex-h">
              <image class="goods-img"></image>
              <view class="goods-right flex-1 flex-v flex-bc">
                <view class="goods-top">
                  <view class="goods-desc">两盒大套装</view>
                  <view class="goods-name">私人定制美眼打造 超靓玻尿酸 极致美白享受  不一样的体验</view>
                </view>
                <view class="goods-price flex-h">
                  <view class="real-price">¥999</view>
                  <view class="fail-price">¥999</view>
                </view>
              </view>
            </view>
          </view>
        </scroll-view> -->
      </view>

      <block wx:if='{{item.type==1}}' >
        <image src='{{item.icon}}' class="adv-title" style='margin-top:30rpx;' @tap='tagTap' id='{{index}}' data-type='banner'></image>
        <view class="adv-list flex-h flex-wrap">
          <view class="adv-item-container" wx:for='{{item.products}}' wx:key='index' wx:for-item='pItem'>
            <view class="adv-item flex-v" @tap='toGoodsDetail' id='{{pItem.productId}}'>
              <image class="adv-img" src='{{pItem.imgUri}}'></image>
              <view class="adv-name">{{pItem.productName}}</view>
              <view class="adv-price">¥ {{pItem.SELL_PRICE/100||0}}</view>
            </view>
          </view>
        </view>
      </block>

      <view class="activity flex-v flex-cc" wx:if='{{item.type==2}}' style='margin-bottom:50rpx'>
        <image class="act-title-1 flex-cc flex-h" src='{{item.icon}}' @tap='tagTap' id='{{index}}' data-type='banner'>
          <!-- <view class="act-name flex-cc flex-h">限时购</view> -->
        </image>

        <view class="goods-item flex-h" wx:for='{{item.products}}' wx:key='index' wx:for-item='pItem'  @tap='toGroupGoodsDetail' id='{{pItem.groupId}}' data-opid='{{pItem.groupOpenRecordId}}'>
          <image class="goods-img" src='{{pItem.imgUri}}'></image>
          <view class="goods-right flex-1 flex-v flex-bc">
            <view class="goods-top">
              <view class="goods-name">{{pItem.productName}}</view>
              <view class="goods-desc">{{pItem.shortDescription}}</view>
            </view>
            <view class="goods-price flex-h">
              <view class="real-price">¥{{pItem.SELL_PRICE/100||0}}</view>
              <view class="fail-price">¥{{pItem.underlinePrice/100||0}}</view>
            </view>
          </view>
        </view>
      </view>

    </block>
    <authBox></authBox>
  </view>
</template>

<script>
import wepy from 'wepy'
import toast from '../components/toast'
import authBox from '../components/auth-box'
import { indexData, indexBannerAndTag } from '../service/api.js'
var event = require('../utils/event.js')
export default class Home extends wepy.page {
  config = {
    navigationBarTitleText: '大叔家Ocandy'
  }

  components = {
    custoast: toast,
    authBox: authBox
  }

  data = {
    banner: [],
    tabBar: [],
    // recommendList: [],
    floorList: [],
    currentIndex: 0
  }

  methods = {
    bannerTap(e) {
      if (e.currentTarget.id) {
        wx.navigateTo({ url: e.currentTarget.id })
      }
    },
    toSearch() {
      wx.navigateTo({
        url: '/subPackage/search-page?autoFocus=true'
      })
    },
    tagChange(e) {
      this.currentIndex = e.currentTarget.id
      this.$apply()
    },
    toGoodsDetail(e) {
      wx.navigateTo({
        url: '/pages/product-detail-page?productId=' + e.currentTarget.id
      })
    },
    toGroupGoodsDetail(e) {
      wx.navigateTo({
        url:
          '/pages/group/group-product-page?groupId=' +
          e.currentTarget.id +
          '&openRecordId=' +
          e.currentTarget.dataset.opid
      })
    },
    tagTap(e) {
      let index = e.currentTarget.id
      if (e.currentTarget.dataset.type == 'banner') {
        wx.navigateTo({
          url: this.floorList[index].redictTarget
            ? this.floorList[index].redictTarget
            : `/subPackage/search-page?tagId=${this.floorList[index].id}`
        })
      } else {
        wx.navigateTo({
          url: this.tabBar[index].redictTarget
            ? this.tabBar[index].redictTarget
            : `/subPackage/search-page?tagId=${this.tabBar[index].id}`
        })
      }
      console.log('index==:>', this.tabBar[index].redictTarget)
      // this.tabBar[index].redictTarget &&
      // wx.navigateTo({
      //   url: this.tabBar[index].redictTarget
      //     ? this.tabBar[index].redictTarget
      //     : `/subPackage/search-page?tagId=${this.tabBar[index].id}`
      // })
    }
  }

  onShareAppMessage(res) {
    return {
      title: '大叔家Ocandy'
    }
  }

  toast(obj) {
    return new Promise((resolve, reject) => {
      this.$invoke('custoast', 'showToast', obj).then(res => {
        resolve(res)
      })
    })
  }

  // _indexBannerAndTag() {
  //   indexBannerAndTag({}).then(res => {
  //     console.log('banner+tag==>', res)
  //     this.banner = res.banner
  //     this.tagBar = res.tagBar
  //     this.$apply()
  //   })
  // }

  _indexData() {
    indexData({}).then(res => {
      // this.recommendList = res.recommendList
      this.floorList = res.tagList
      this.banner = res.banners
      this.tabBar = res.tabBar
      this.$apply()
      console.log('indexData==>', res)
})
  }

  events = {}

  // onReady() {}

  async onLoad(opt) {
    // wx.hideShareMenu()
    wx.showLoading({
      title: '加载中...'
    })
    let isLogin = await this.$parent.userLogin()
    console.log('进入首页,当前登录状态===>', isLogin)
    wx.hideLoading()
    // 调起授权框 登陆&授权成功走请求
    if (!isLogin) {
      console.log('---------', !isLogin)
      this.$invoke('authBox', 'showAuthBox')
      event.on('getAuthSuc', this, () => this.onLoad())
    } else {
      // this._indexBannerAndTag()
      this._indexData()
    }
  }
}
</script>

home-page

<style lang="less">
  .box {
    position: relative;
    .images-box {
      width: 100%;
      height: 400rpx;
    }
    .sign {
      position: absolute;
      bottom: 32rpx;
      right: 30rpx;
      width: 100rpx;
      height: 46rpx;
      font-size: 26rpx;
      text-align: center;
      background: rgba(0, 0, 0, .4);
      border-radius: 20rpx;
      line-height: 46rpx;
      color: #ffffff;
    }
  }
  .group-person {
    align-items: center;
    background-color: #F5F5F5;
    height: 100rpx;
    text-align: center;
    .list-person {
      color: #666666;
      line-height: 100rpx;
      font-size: small;
      margin-left: 30rpx;
    }
    .avatar-list {
      margin-left: 280rpx;
      .avatar {
        width: 60rpx;
        height: 60rpx;
        line-height: 100rpx;
        border-radius: 50%;
        margin-right: -15rpx;
      }
    }
  }
  .clear{
    clear: both;
    overflow: hidden;
  }
  navigator{
    display:inline;
  }
  .list{
    margin-top: 20rpx;
    .list_item{
      margin-top:10px;
      margin-bottom: 30rpx;
      padding: 30rpx;
      height:100px;
      /*border-bottom:1px solid #E8E8E8;*/
      .img{
        float:left;
        image{
          width: 210rpx;
          height: 210rpx;
          border-radius: 10rpx;
        }
      }
    }
  }
  .list .list_item .info{
    width: 69%;
    float: right;
    height: 110px;
    position: relative;
  }
  .list .list_item .info .title{
    color:#333;
    margin-left: 22rpx;
    font-size: 30rpx;
  }
  .list .list_item .info .flex-h .group-price{
    color: #8d8d8d;
    margin-left: 22rpx;
    margin-top: 30rpx;
    margin-bottom: 58rpx;
    font-size: 26rpx;
  }
  .list .list_item .info .flex-h .price{
    color: #ff5050;
    margin-top: 30rpx;
    margin-bottom: 58rpx;
    font-size: 22rpx;
  }
  .list .list_item .info .flex-h .rel-price{
    color: #afafaf;
    margin-left: 24rpx;
    margin-bottom: 58rpx;
    margin-top: 30rpx;
    font-size: 20rpx;
  }
  .list .list_item .info .flex-h .num{
    position: absolute;
    right: 20rpx;
    bottom: 15rpx;
    color: #afafaf;
    font-size: 22rpx;
  }
  .line {
    background-color: #f5f5f5;
    height: 10rpx;
  }

  .scroll-view-x {
    height: 400rpx;
    white-space:nowrap;
    display:flex;
    padding-top:10rpx;
  }
  .scroll-view-x .pic {
    width: 260rpx;
    height: 260rpx;
    margin-left: 15rpx;
  }
  .slider {
    height: 452rpx;
    overflow-x: auto;
    white-space: nowrap;
  }
  .slider::-webkit-scrollbar {
    display: none; /*不展示横向滚动条*/
  }
  .slide_son{
    margin-left: 30rpx;
    width: 260rpx;
    display: inline-block;
  }
  .slide_son image{
    width: 260rpx;
    height: 260rpx;
    display: block;
    border-radius: 10rpx;
  }
  .slider_title {
    text-overflow: -o-ellipsis-lastline;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    white-space:normal;
    word-break: break-all;
    word-wrap : break-word;
    width: 208rpx;
    margin-top: 30rpx;
    margin-bottom: 30rpx;
    font-size: 26rpx;
  }
  .slide_price{
    color: #FF4D4D;
    font-size: 28rpx;
    line-height: 28rpx;
    height: 28rpx;
  }
  .slider_sale{
    color: #666666;
    font-size: 26rpx;
    line-height: 28rpx;
    height: 28rpx;
    margin-right: 10rpx;
  }
  .slider-v {
    float: left;
    margin-left: 0%;
    width: 50%;
    margin-top: 35rpx;
    /*margin-bottom: 44rpx;*/
    height: 512rpx;
    .slide_son{
      display: inline-block;
      width: 335rpx;
      margin: 20rpx;
    }
  }
  .slider-v .slide_son image{
    width: 320rpx;
    height: 320rpx;
    display: block;
  }
  .slider-v .slide_son .slider_title {
    text-overflow: -o-ellipsis-lastline;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    white-space:normal;
    word-break: break-all;
    word-wrap : break-word;
    width: 328rpx;
    margin-top: 30rpx;
    margin-bottom: 30rpx;
    font-size: 26rpx;
  }
  .slider-v .slide_son .slider_sale {
    color: #afafaf;
    font-size: 13px;
    line-height: 30px;
    height: 30px;
    margin-right: 5px;
    margin-left: 10rpx;
  }
  .slider-v .slide_son .slider_btn {
    color: white;
    text-align: center;
    width: 190rpx;
    height: 40rpx;
    margin-top: 20rpx;
    line-height: 40rpx;
    border-radius: 5rpx;
    background-color: #FF4D4D;
    display: block;
    font-size: 24rpx;
  }
  .list .list_item .info .flex-h .group-persons {
    position:absolute;
    left:20rpx;
    bottom:10rpx;
    color:white;
    text-align:center;
    width:110rpx;
    height:36rpx;
    line-height:40rpx;
    border-top-left-radius: 10rpx;
    border-bottom-left-radius: 10rpx;
    background: linear-gradient(to left,#FFB2B2,#FF4D4D);
    display:block;
    font-size:24rpx;
    border: 1rpx solid #ff4d4d;
    border-right:none;
  }
  .list .list_item .info .flex-h .group-persons-price {
    position: absolute;
    right: 180rpx;
    bottom: 10rpx;
    color: #ff4d4d;
    border: 1rpx solid #ff4d4d;
    border-left:none;
    text-align: center;
    width: 165rpx;
    height: 36rpx;
    line-height: 40rpx;
    border-top-right-radius: 10rpx;
    border-bottom-right-radius: 10rpx;
    display: block;
    font-size: 24rpx;
  }
  .newgroup {
    margin-bottom: 40rpx;
    width: 100%;
    height: 70rpx;
    line-height: 70rpx;
    text-align: center;
    position: relative;
    margin-top: 100rpx;
  }
  .newproduct {
    height: 100rpx;
    margin-top: 70rpx;
    margin-bottom: 40rpx;
    width: 100%;
    line-height: 70rpx;
    text-align: center;
    position: relative;
    margin-top: 100rpx;
  }
  .hotproduct {
    margin-top: 100rpx;
    margin-bottom: 40rpx;
    width: 100%;
    height: 70rpx;
    line-height: 70rpx;
    text-align: center;
    position: relative;
  }
  .newgroup .right image {
    position: absolute;
    height: 16rpx;
    width: 294rpx;
    float: left;
    left: 0rpx;
  }
  .newproduct .right image {
    position: absolute;
    height: 16rpx;
    width: 294rpx;
    float: left;
    left: 0rpx;
  }
  .hotproduct .right image {
    position: absolute;
    height: 16rpx;
    width: 294rpx;
    float: left;
    left: 0rpx;
  }
  .newgroup .title{
    width: 120rpx;
    height: 50rpx;
    position: absolute;
    top: -30rpx;
    margin-left: 317rpx;
    font-size: 30rpx;
    color: #333333;
  }
  .newproduct .title{
    width: 120rpx;
    height: 50rpx;
    text-align: center;
    position: absolute;
    top: -30rpx;
    margin-left: 317rpx;
    font-size: 30rpx;
    color: #333333;
  }
  .hotproduct .title{
    width: 120rpx;
    height: 50rpx;
    position: absolute;
    top: -30rpx;
    margin-left: 317rpx;
    font-size: 30rpx;
    color: #333333;
  }
  .newgroup .left image {
    position: absolute;
    height: 16rpx;
    width: 294rpx;
    float: right;
    right: 0rpx;
  }
  .newproduct .left image {
    position: absolute;
    height: 16rpx;
    width: 294rpx;
    float: right;
    right: 0rpx;
  }
  .hotproduct .left image {
    position: absolute;
    height: 16rpx;
    width: 294rpx;
    float: right;
    right: 0rpx;
  }
  .newgroup .us-title {
    font-size: 18rpx;
    margin-top: 20rpx;
    color: #333333;
  }
  .newproduct .us-title {
    font-size: 18rpx;
    margin-top: 20rpx;
    color: #333333;
  }
  .hotproduct .us-title {
    font-size: 18rpx;
    margin-top: 20rpx;
    color: #333333;
  }

  .wrap{
    margin-top: 30rpx;
    height: 300rpx;
    display: flex;
    justify-content: space-around;
    image {
      width: 150rpx;
      height: 230rpx;
    }
  }
</style>

<template>
  <view class="box">
    <swiper class="images-box" autoplay interval='5000' circular duration='500' @change="swiperChange">
      <block wx:for="{{banners}}" wx:key='index'>
        <swiper-item>
          <image src="{{item.imgUri}}"  style="width:100%; height:400rpx;" @tap='bannerTap' id='{{item.target}}'/>
        </swiper-item>
      </block>
    </swiper>
    <view class="sign" >{{currentIndex}}/{{banners.length}}</view>
  </view>

  <block wx:if="{{canGetCoupon}}">
    <view class="wrap">
      <image src="../pages/images/10@2x.png"></image>
      <image src="../pages/images/20@2x.png"></image>
      <image src="../pages/images/50@2x.png"></image>
      <image src="../pages/images/all@2x.png" @tap="getCoupon"></image>
    </view>
  </block>

  <block wx:for='{{floorList}}' wx:key='list'>
    <view wx:if='{{item.type==0}}'>
      <!--新品拼团 GROUP PURCHASE-->
      <view class="newgroup flex-v">
        <view class="flex-h">
          <view class="left"><image src="images/right.png"></image></view>
          <sapn class="title">{{item.tagName}}</sapn>
          <view class="right"><image src="images/left.png"></image></view>
        </view>
        <view class="us-title">{{item.remarks}}</view>
      </view>
      <!--新品拼团列表-->
      <view>
        <image src="{{item.icon}}" style="width: 100%; height: 360rpx;" @tap='toGroupListPage' id='{{item.redictTarget}}' data-type='banner'/>
      </view>
      <view class="group-person flex-h">
        <view class="list-person">
          已有900人拼团
        </view>
        <view class="avatar-list">
          <image class="avatar" src="images/1.png"></image>
          <image class="avatar" src="images/2.png"></image>
          <image class="avatar" src="images/3.png"></image>
          <image class="avatar" src="images/4.png"></image>
          <image class="avatar" src="images/5.png"></image>
        </view>
      </view>

      <!--团购详情页-->
      <view class="list">
        <block wx:for='{{item.products}}' wx:key='list'  wx:for-index='index' >
          <view class="list_item" @tap='toGroupGoodsDetail' id='{{item.groupId}}' data-opid='{{item.groupOpenRecordId}}'>
            <navigator url="details?id={{item.goods_id}}">
              <view class="img">
                <image src="{{item.imgUri}}"  mode="scaleToFill"/>
              </view>
              <view class="info">
                <view class="title">{{item.productName}}</view>
                <view class="flex-h" style="height: 26rpx; line-height: 26rpx;">
                  <view class="group-price">拼团价:</view>
                  <view class="price">¥{{item.SELL_PRICE/100}}</view>
                  <view class="rel-price">¥<span style="text-decoration: line-through;">{{item.underlinePrice/100}}</span></view>
                </view>
                <view class="flex-h" style="margin-top: 20rpx;">
                  <view class="group-persons">{{item.num}}人团</view>
                  <view class="group-persons-price" >拼团省{{item.currentPrice/100}}元</view>
                  <view class="num">已拼{{item.productNum}}件</view>
                </view>
              </view>
            </navigator>
            <view class="clear"></view>
          </view>
        </block>
        <view wx:if="{{index !== item.products.length-1}}" class="line"></view>
      </view>
    </view>

    <block wx:if='{{item.type==1}}'>
      <!--新品预售 NEW COMMODITY-->
      <view class="newproduct flex-v">
        <view class="flex-h">
          <view class="left"><image src="images/right.png"></image></view>
          <sapn class="title">{{item.tagName}}</sapn>
          <view class="right"><image src="images/left.png"></image></view>
        </view>
        <view class="us-title">{{item.remarks}}</view>
      </view>
      <!--新品预售列表-->
      <view style="margin-bottom: 30rpx; margin-top: -20rpx; height: 400rpx; background-color: white;">
        <image style="width: 100%; height: 360rpx;" src='{{item.icon}}' @tap='tagnewTap' id='{{item.redictTarget}}' data-type='banner'/>
      </view>
      <view class="slider" wx:for="{{item.products}}" wx:key='index' wx:for-item='item' @tap='toappointGoodsDetail' id='{{item.appointId}}'>
        <view class="slide_son">
          <image src="{{item.imgUri}}"/>
          <view class="slider_title">{{item.productName}}</view>
          <view class="flex-h" style="height: 26rpx; line-height: 26rpx;">
            <view class="slider_sale">定金:</view>
            <view class="slide_price">{{item.appointPrice/100}}抵{{item.currentPrice/100}}</view>
            <view class="slider_sale">元</view>
          </view>
        </view>
      </view>
    </block>

    <view wx:if='{{item.type==3}}'>
      <!--爆品推荐-->
      <view class="hotproduct flex-v">
        <view class="flex-h">
          <view class="left"><image src="images/right.png"></image></view>
          <sapn class="title">{{item.tagName}}</sapn>
          <view class="right"><image src="images/left.png"></image></view>
        </view>
        <view class="us-title">{{item.remarks}}</view>
      </view>
      <!--爆品推荐列表-->
      <view @tap='tagTap' id='{{item.redictTarget}}' data-type='banner'>
        <image src="{{item.icon}}" style="width: 100%; height: 360rpx;"/>
      </view>
      <view wx:for="{{item.products}}" @tap='toGoodsDetail' id='{{item.productId}}'>
        <view class="slider-v" style="margin-bottom: 100rpx;">
          <view class="slide_son" style="float: left; width: 40%; margin-left: 5%;">
            <image src="{{item.imgUri}}"/>
            <view class="slider_title">{{item.productName}}</view>
            <span class="slide_price">¥{{item.currentPrice/100}}</span>
            <span class="slider_sale">¥<span style="text-decoration: line-through;">{{item.underlinePrice/100}}</span></span>
            <!--<span class="slider_btn">领券享7折优惠</span>-->
          </view>
        </view>
      </view>
    </view>
  </block>
  <foot></foot>
  <authBox></authBox>
</template>
<script>
  import wepy from 'wepy'
  import toast from '../components/toast'
  import authBox from '../components/auth-box'
  import Foot from '../components/foot'
  import { indexData, getCoupon } from '../service/api.js'
  var event = require('../utils/event.js')
  export default class Home extends wepy.page {navigationBarTitleText
    config = {
      navigationBarTitleText: '大叔家Ocandy'
    }

    components = {
      custoast: toast,
      foot: Foot,
      authBox: authBox
    }

    data = {
      tabBar: [],
      // recommendList: [],
      floorList: [],
      banners: [],
      currentIndex: 1,
      canGetCoupon: false
    }

    methods = {
      getCoupon: function (e) {
        this._getCoupon()
      },
      swiperChange: function (e) {
        this.currentIndex = e.detail.current + 1
      },
      bannerTap(e) {
        if (e.currentTarget.id) {
          wx.navigateTo({
            url: e.currentTarget.id
          })
        }
      },
      toSearch() {
        wx.navigateTo({
          url: '/subPackage/search-page?autoFocus=true'
        })
      },
      tagChange(e) {
        this.currentIndex = e.currentTarget.id
        this.$apply()
      },
      // 爆品详情
      toGoodsDetail(e) {
        wx.navigateTo({
          url: '/pages/product-detail-page?productId=' + e.currentTarget.id
        })
      },
      // 新品拼团列表
      toGroupListPage(e) {
        if (e.currentTarget.id) {
          wx.navigateTo({
            url: e.currentTarget.id
          })
        }
      },
      // 新品拼团产品详情
      toGroupGoodsDetail(e) {
        wx.navigateTo({
          url:
            '/pages/group/group-product-page?groupId=' +
            e.currentTarget.id +
            '&openRecordId=' +
            e.currentTarget.dataset.opid
        })
      },
      // 预售列表
      tagnewTap(e) {
        if (e.currentTarget.id) {
          wx.navigateTo({
            url: e.currentTarget.id
          })
        }
      },
      // 新品预售详情
      toappointGoodsDetail(e) {
        wx.navigateTo({
          url: '/pages/appoint/appoint-product-page?appointId=' + e.currentTarget.id
        })
      },
      // 爆品列表
      tagTap(e) {
        if (e.currentTarget.id) {
          wx.navigateTo({
            url: e.currentTarget.id
          })
        }
      }
    }

    onShareAppMessage(res) {
      return {
        title: '大叔家Ocandy'
      }
    }

    toast(obj) {
      return new Promise((resolve, reject) => {
        this.$invoke('custoast', 'showToast', obj).then(res => {
          resolve(res)
        })
      })
    }

    // _indexBannerAndTag() {
    //   indexBannerAndTag({}).then(res => {
    //     console.log('banner+tag==>', res)
    //     this.banner = res.banner
    //     this.tagBar = res.tagBar
    //     this.$apply()
    //   })
    // }

    _indexData() {
      indexData({}).then(res => {
        this.floorList = res.tagList
        this.banners = res.banners
        this.$apply()
        console.log('indexData-page-new==>', res)
      })
    }

    _getCoupon() {
      getCoupon({}).then(res => {
        console.log('indexData-getCoupon==>', res)
      })
      wx.showToast({
        title: '获取成功',
        icon: 'success',
        duration: 1000,
        mask: true
      })
    }
    events = {}

    // onReady() {}

    async onLoad(opt) {
      // wx.hideShareMenu()
      wx.showLoading({
        title: '加载中...'
      })
      let isLogin = await this.$parent.userLogin()
      console.log('进入首页,当前登录状态===>', isLogin)
      wx.hideLoading()
      // 调起授权框 登陆&授权成功走请求
      if (!isLogin) {
        console.log('---------', !isLogin)
        this.$invoke('authBox', 'showAuthBox')
        event.on('getAuthSuc', this, () => this.onLoad())
      } else {
        // this._indexBannerAndTag()
        this._indexData()
        this.canGetCoupon = this.$parent.globalData.canGetCoupon
        console.log('进入首页,当前登录状态===>获取优惠券===>', this.canGetCoupon)
        this.$apply()
      }
    }
  }
</script>

请点赞!因为你的鼓励是我写作的最大动力!

官方微信公众号

吹逼交流群:711613774

吹逼交流群

posted @ 2019-05-30 23:16  达达前端  阅读(210)  评论(0编辑  收藏  举报