<template> <view id="pageIndex" :style="colorStyle"> <!-- <skeleton v-if="!isIframe" :show="showSkeleton" :isNodes="isNodes" ref="skeleton" loading="chiaroscuro" selector="skeleton" bgcolor="#FFF"></skeleton> --> <skeletons :show="showSkeleton" loading="chiaroscuro" bgcolor="#FFF"></skeletons> <!-- #ifdef H5 --> <view class="followMe" v-if="$wechat.isWeixin()"> <view class="follow acea-row row-between-wrapper" v-if="followHid && followUrl && !subscribe"> <view>{{$t(`点击“立即关注”即可关注公众号`)}}</view> <view class="acea-row row-middle"> <view class="bnt" @click="followTap">{{$t(`立即关注`)}}</view> <span class="iconfont icon-guanbi" @click="closeFollow"></span> </view> </view> <view class="followCode" v-if="followCode"> <view class="pictrue"><img :src="followUrl" /></view> <view class="mask" @click="closeFollowCode"></view> </view> </view> <!-- #endif --> <!-- #ifdef MP --> <view class="indexTip" :style="'top:' + (navH + 50) + 'px'" :hidden="iShidden"> <view class="tip acea-row row-between-wrapper"> <view class="text">{{$t(`点击`)}}“<image src="/static/images/spot.png"></image> ”{{$t(`添加到我的小程序, 微信首页下拉即可访问商城。`)}}</view> <view class="iconfont icon-guanbi1" @click="closeTip"></view> </view> </view> <!-- #endif --> <!-- 顶部搜索 --> <view class="skeleton" id="pageIndexs" :style="{ visibility: showSkeleton ? 'hidden' : 'visible' }"> <headerSerch class="mp-header skeleton" :dataConfig="headerSerch.default" @click.native="bindEdit('headerSerch', 'default')"></headerSerch> <!-- 轮播 --> <swiperBg :dataConfig="swiperBg.default" @click.native="bindEdit('swiperBg', 'default')"></swiperBg> <!-- 金刚区 --> <menus :dataConfig="menus.default" @click.native="bindEdit('menus', 'default')"></menus> <!-- 新闻简报 --> <news :dataConfig="news.default" @click.native="bindEdit('news', 'default')"></news> <!-- 活动魔方 --> <activity :dataConfig="activity.default" @click.native="bindEdit('activity', 'default')"></activity> <!-- <seckill :dataConfig="seckill.default" @click.native="bindEdit('seckill','default')"></seckill> <adsRecommend :dataConfig="adsRecommend.default" @click.native="bindEdit('adsRecommend','default')"></adsRecommend> <combination :dataConfig="combination.default" @click.native="bindEdit('combination','default')"></combination> <bargain :dataConfig="bargain.default" @click.native="bindEdit('bargain','default')"></bargain> <picTxt :dataConfig="picTxt.default" @click.native="bindEdit('picTxt','default')"></picTxt> --> <alive :dataConfig="alive.default" @click.native="bindEdit('alive', 'default')"></alive> <!-- 优惠券 --> <coupon :dataConfig="coupon.default" @click.native="bindEdit('coupon', 'default')"></coupon> <!-- 快速选择 --> <scrollBox :dataConfig="scrollBox.default" @click.native="bindEdit('scrollBox', 'default')"></scrollBox> <!-- 促销精品 --> <recommend :dataConfig="goodList.aa" @click.native="bindEdit('goodList', 'aa')"></recommend> <!-- 排行榜 --> <popular :dataConfig="goodList.bb" @click.native="bindEdit('goodList', 'bb')"></popular> <!-- 商品轮播 --> <mBanner :dataConfig="swiperBg.aa" @click.native="bindEdit('swiperBg', 'aa')"></mBanner> <!-- 首发新品 --> <newGoods :dataConfig="goodList.cc" @click.native="bindEdit('goodList', 'cc')"></newGoods> <!-- 精品推荐 --> <!-- <mBanner :dataConfig="swiperBg.cc" @click.native="bindEdit('swiperBg','cc')"></mBanner> --> <!-- <titles :dataConfig="titles.default" :sty="'off'" @click.native="bindEdit('titles','default')"></titles> --> <!-- 商品轮播 --> <!-- <customerService :dataConfig="customerService.default" @click.native="bindEdit('customerService','default')"></customerService> --> <!-- 精选单品 --> <promotion :dataConfig="goodList.dd" @click.native="bindEdit('goodList', 'dd')"></promotion> <!-- 商品分类 --> <tabNav class="sticky-box" :style="'top:' + isTop + 'px;'" :dataConfig="tabNav.default" @click.native="bindEdit('tabNav', 'default')" @bindSortId="bindSortId" @bindHeight="bindHeighta"> </tabNav> <!-- 商品列表 --> <indexGoods v-if="!isIframe && tabNav.default && tabNav.default.isShow.val" :dataLists="goodLists" @click.native="bindEdit('List')"></indexGoods> <!-- <recommend :dataConfig="goodList.aa" @click.native="bindEdit('goodList','aa')"></recommend> --> <!-- <Loading class="loading-sty" :loaded="loaded" :loading="loading"></Loading> --> <view class="" v-if=" !isIframe && tabNav.default && tabNav.default.isShow.val && goodLists.length == 0 "> <view class='emptyBox'> <image :src="imgHost + '/statics/images/no-thing.png'"></image> <view class="tips">{{$t(`暂无商品,去看点别的吧`)}}</view> </view> </view> </view> <tabBar :dataConfig="tabBar.default" :pagePath="'/pages/index/index'" @click.native="bindEdit('tabBar', 'default')"></tabBar> <!-- #ifdef H5 --> <view v-if="site_config && !isIframe" class="site-config" @click="goICP">{{site_config}}</view> <!-- #endif --> <view class="uni-p-b-98"></view> <couponWindow style="position: relative; z-index: 10000" :window="isCouponShow" @onColse="couponClose" :couponImage="couponObj.image" :couponList="couponObj.list"></couponWindow> <!-- #ifdef APP-PLUS --> <app-update v-if="!privacyStatus" ref="appUpdate" :force="true" :tabbar="false"></app-update> <view class="privacy-wrapper" v-if="privacyStatus"> <view class="privacy-box"> <view class="title">{{$t(`服务协议与隐私政策`)}}</view> <view class="content"> {{$t(`请务必审慎阅读、充分理解“服务协议与 隐私政策”各条款,包括但不限于:为了 向你提供即时通讯、内容分享等服务,我 们需要收集你的设备信息、操作日志等个 人信息。你可以在“设置”中查看、变更、删除个人信息并管理你的授权。`)}}<br> {{$t(`你可以阅读`)}} <navigator url="/pages/users/privacy/index?type=3">{{$t(`《服务协议与隐私政策》`)}}</navigator> {{$t(`了解详细信息。如你同意,请点击“我同意”开始接受我们的服务。`)}} </view> <view class="btn-box"> <view class="btn-item" @click="confirmApp">{{$t(`我同意`)}}</view> <view class="btn" @click="closeModel">{{$t(`残忍拒绝`)}}</view> </view> </view> </view> <!-- #endif --> </view> </template> <script> import couponWindow from "@/components/couponWindow/index"; import indexGoods from "@/components/indexGoods/index"; import headerSerch from "./components/headerSerch"; import swiperBg from "./components/swiperBg"; import menus from "./components/menus"; import news from "./components/news"; import activity from "./components/activity"; import scrollBox from "./components/scrollBox"; import recommend from "./components/recommend"; import popular from "./components/popular"; import mBanner from "./components/mBanner"; import newGoods from "./components/newGoods"; import promotion from "./components/promotion"; import alive from "./components/alive"; import adsRecommend from "./components/adsRecommend"; import coupon from "./components/coupon"; import seckill from "./components/seckill"; import combination from "./components/combination"; import bargain from "./components/bargain"; import goodList from "./components/goodList"; import picTxt from "./components/picTxt"; import titles from "./components/titles"; import customerService from "./components/customerService"; import tabBar from "./components/tabBar"; import tabNav from "./components/tabNav"; import appUpdate from "@/components/update/app-update.vue"; import Loading from "@/components/Loading/index.vue"; import { getShare, follow } from "@/api/public.js"; // #ifdef MP || APP-PLUS import { SUBSCRIBE_MESSAGE, TIPS_KEY } from "@/config/cache"; // #endif import { getTempIds, siteConfig } from "@/api/api.js"; import { mapGetters } from "vuex"; import { getDiy, getIndexData, getCouponV2, getCouponNewUser, } from "@/api/api.js"; import { getGroomList, getCategoryList, getProductslist, getProductHot, } from "@/api/store.js"; import { goShopDetail, goPage } from "@/libs/order.js"; import { toLogin } from "@/libs/login.js"; import { HTTP_REQUEST_URL } from '@/config/app'; import colors from "@/mixins/color"; import skeletons from "./components/skeleton.vue"; let app = getApp(); let statusBarHeight = uni.getSystemInfoSync().statusBarHeight; export default { computed: mapGetters(["isLogin", "uid"]), components: { couponWindow, headerSerch, swiperBg, menus, news, activity, scrollBox, recommend, popular, mBanner, newGoods, promotion, alive, adsRecommend, coupon, seckill, combination, bargain, goodList, picTxt, titles, customerService, tabBar, tabNav, Loading, skeletons, indexGoods, appUpdate, //APP更新 }, mixins: [colors], data() { return { imgHost: HTTP_REQUEST_URL, showSkeleton: true, //骨架屏显示隐藏 isNodes: 0, //控制什么时候开始抓取元素节点,只要数值改变就重新抓取 isSortType: 0, sortList: {}, sortAll: [], goodPage: 1, goodLists: [], curSort: 0, sortMpTop: 0, loaded: false, hostProduct: [], hotScroll: false, hotPage: 1, hotLimit: 10, followHid: true, followUrl: "", followCode: false, navH: statusBarHeight, subscribe: false, iShidden: false, goodType: 3, loading: false, loadend: false, loadTitle: this.$t(`下拉加载更多`), //提示语 page: 1, limit: this.$config.LIMIT, numConfig: 0, couponObj: {}, isCouponShow: false, shareInfo: {}, site_config: "", isIframe: app.globalData.isIframe, headerSerch: {}, //头部搜索 swiperBg: {}, //轮播 menus: {}, //导航 news: {}, //消息公告 activity: {}, //活动魔方 alive: {}, scrollBox: {}, //快速选择分类 titles: {}, //标题 goodList: {}, //商品列表(商品列表、首发新品、热门榜单、促销单品、精品推荐) tabBar: {}, //导航 customerService: {}, //客服 picTxt: {}, //图文详情 bargain: {}, //砍价 combination: {}, //拼团 adsRecommend: {}, //广告位 seckill: {}, //秒杀 coupon: {}, //优惠券 tabNav: {}, //分类tab isBorader: "", domOffsetTop: 50, isTop: 0, privacyStatus: false, // 隐私政策是否同意过 isFixed: false, }; }, created() { uni.hideTabBar(); // #ifdef APP-PLUS uni.setStorageSync("privacyStatus", true); // try { // let val = uni.getStorageSync("privacyStatus") || false; // if (!val) { // this.privacyStatus = true; // } // } catch (e) {} // this.$nextTick(() => { // // this.$refs.appUpdate.update(); //调用子组件 检查更新 // }); // #endif let that = this; // #ifdef H5 if (app.globalData.isIframe) { this.showSkeleton = false; setTimeout(() => { let active; document.getElementById("pageIndexs").children.forEach((dom) => { dom.addEventListener("click", (e) => { e.stopPropagation(); e.preventDefault(); if (dom === active) return; dom.classList.add("borderShow"); active && active.classList.remove("borderShow"); active = dom; }); }); }, 1000); } if (app.globalData.isIframe) { uni.hideTabBar(); } this.getFollow(); // #endif this.diyData(); this.getIndexData(); // #ifdef MP if (this.$Cache.get(TIPS_KEY)) this.iShidden = true; this.getTempIds(); // #endif siteConfig() .then((res) => { this.site_config = res.data.record_No; }) .catch((err) => { return this.$util.Tips({ title: err.msg, }); }); // #ifdef APP-PLUS this.isTop = uni.getSystemInfoSync().statusBarHeight + 85; // #endif // #ifdef MP const query = uni.createSelectorQuery().in(this); query.select('.mp-header').boundingClientRect(data => { this.isTop = data.top; }).exec(); // #endif // #ifdef H5 this.isTop = 0; // #endif if (!app.globalData.isIframe) { if (this.isLogin) { this.getCoupon(); } } }, methods: { // #ifdef APP-PLUS // 同意隐私协议 confirmApp() { uni.setStorageSync("privacyStatus", true); this.privacyStatus = false; }, // 关闭Model closeModel() { //退出app uni.getSystemInfo({ success: function(res) { // 判断为安卓的手机 if (res.platform == "android") { // 安卓退出app plus.runtime.quit(); } else { // 判断为ios的手机,退出App plus.ios .import("UIApplication") .sharedApplication() .performSelector("exit"); } }, }); }, // #endif bindEdit(name, dataName) { if (app.globalData.isIframe) { window.parent.postMessage({ name: name, dataName: dataName, params: {}, }, "*" ); return; } }, getFollow() { follow() .then((res) => { this.followUrl = res.data.path; }) .catch((err) => { return this.$util.Tips({ title: err.msg, }); }); }, followTap() { this.followCode = true; this.followHid = false; }, closeFollow() { this.followHid = false; }, closeFollowCode() { this.followCode = false; this.followHid = true; }, closeTip: function() { this.$Cache.set(TIPS_KEY, true); this.iShidden = true; }, bindHeighta(data) { // #ifdef APP-PLUS this.sortMpTop = data.top + data.height; // #endif // #ifdef H5 this.domOffsetTop = data.top; // #endif // #ifndef H5 this.domOffsetTop = data.top - 110; // #endif }, // 优惠券弹窗 getCoupon() { const tagDate = uni.getStorageSync("tagDate") || "", nowDate = new Date().toLocaleDateString(); if (tagDate === nowDate) { this.getNewCoupon(); } else { getCouponV2().then((res) => { const { data } = res; if (data.list.length) { this.isCouponShow = true; this.couponObj = data; uni.setStorageSync("tagDate", new Date().toLocaleDateString()); } else { this.getNewCoupon(); } }); } }, // 新用户优惠券 getNewCoupon() { const oldUser = uni.getStorageSync("oldUser") || 0; if (!oldUser) { getCouponNewUser().then((res) => { const { data } = res; if (data.show) { if (data.list.length) { this.isCouponShow = true; this.couponObj = data; uni.setStorageSync("oldUser", 1); } } else { uni.setStorageSync("oldUser", 1); } }); } }, // 优惠券弹窗关闭 couponClose() { this.isCouponShow = false; if (!uni.getStorageSync("oldUser")) { this.getNewCoupon(); } }, // #ifdef MP getTempIds() { getTempIds().then((res) => { if (res.data) { wx.setStorageSync(SUBSCRIBE_MESSAGE, JSON.stringify(res.data)); } }); }, // #endif goICP() { // #ifdef H5 window.open("http://beian.miit.gov.cn/"); // #endif // #ifdef MP uni.navigateTo({ url: `/pages/annex/web_view/index?url=https://beian.miit.gov.cn/`, }); // #endif }, onLoadFun() {}, reconnect() { this.diyData(); this.getIndexData(); }, diyData() { let that = this; getDiy().then((res) => { console.log('222', res) let data = res.data; that.headerSerch = data.headerSerch; that.swiperBg = data.swiperBg; that.menus = data.menus; that.news = data.news; that.activity = data.activity; that.alive = data.alive; that.scrollBox = data.scrollBox; that.titles = data.titles; that.goodList = data.goodList; that.tabNav = data.tabNav; that.tabBar = data.tabBar; that.customerService = data.customerService; that.picTxt = data.picTxt; that.bargain = data.bargain; that.combination = data.combination; that.adsRecommend = data.adsRecommend; that.seckill = data.seckill; that.coupon = data.coupon; this.$Cache.set("TAB_BAR", data.tabBar.default.tabBarList); setTimeout(() => { this.showSkeleton = false; }, 300); uni.setStorageSync('VIS_DATA', res.data) }).catch(error => { // #ifdef APP-PLUS if (error.status) { uni.showToast({ title: this.$t(`连接失败`), icon: 'none', duration: 2000 }) } // #endif }); }, getIndexData() { getIndexData().then((res) => { this.subscribe = res.data.subscribe; // #ifdef H5 localStorage.setItem("itemName", res.data.site_name); // #endif uni.setNavigationBarTitle({ title: res.data.site_name, }); }); }, /** * 获取我的推荐 */ get_host_product: function() { let that = this; if (that.hotScroll) return; getProductHot(that.hotPage, that.hotLimit).then((res) => { that.hotPage++; that.hotScroll = res.data.length < that.hotLimit; that.hostProduct = that.hostProduct.concat(res.data); // that.$set(that, 'hostProduct', res.data) }); }, // 获取分类id bindSortId(data) { this.isSortType = data == -99 ? 0 : 1; // this.goodLists = []; this.getProductList(data); }, getProductList(data) { let tempObj = ""; this.curSort = 0; this.loaded = false; this.goodPage = 1; this.getGoodsList(data); }, getGoodsList(data) { if (this.loading || this.loaded) return; this.loading = true; getProductslist({ keyword: "", priceOrder: "", salesOrder: "", news: 0, page: this.goodPage, limit: 10, cid: data, }).then((res) => { this.goodLists = res.data; this.loading = false; this.loaded = res.data.length < 10; this.goodPage++; }); }, goGoodsDetail(item) { goPage().then((res) => { goShopDetail(item, this.uid).then((res) => { uni.navigateTo({ url: `/pages/goods_details/index?id=${item.id}`, }); }); }); }, }, onReachBottom: function() { // if (this.isSortType == 0) { // // this.getGroomList(); // } else { // this.getGoodsList(); // } }, onPageScroll(e) { // if (this.headerSerch.default.isShow.val) { // // if (this.domOffsetTop == 50) return // if (e.scrollTop > this.isTop) { // this.isFixed = true; // } // if (e.scrollTop < this.isTop) { // this.$nextTick(() => { // this.isFixed = false; // }); // } // } else { // this.isFixed = false; // } }, }; </script> <style lang="scss" scoped> page { // background: linear-gradient(180deg, #fff, #fff 20%, #f5f5f5); // overflow-x: hidden; // overflow-y: scroll; // height: max-content; } .bac-col { width: 100%; height: 300rpx; position: absolute; background-image: linear-gradient(135deg, #f97794 10%, #623aa2 100%); top: 0; background: linear-gradient(90deg, #f62c2c 0%, #f96e29 100%); } .swiperCon { margin: 20rpx 0 !important; /* #ifdef MP */ /deep/.swiperBg { margin: 20rpx 0 !important; } /* #endif */ /deep/.swiper { swiper, .swiper-item, image { height: 190rpx !important; } } } .site-config { margin: 40rpx 0; font-size: 24rpx; text-align: center; color: #666; &.fixed { position: fixed; bottom: 69px; left: 0; width: 100%; } } /* #ifdef MP */ .indexTip { position: fixed; right: 42rpx; z-index: 10000; .tip { width: 400rpx; border-radius: 6rpx; background-color: #fff; padding: 15rpx 22rpx; position: relative; &::before { content: ""; width: 0; height: 0; border-left: 15rpx solid transparent; border-right: 15rpx solid transparent; border-bottom: 17rpx solid #fff; position: absolute; top: -14rpx; right: 95rpx; } } .text { font-size: 22rpx; color: #333; width: 320rpx; image { width: 30rpx; height: 16rpx; display: inline-block; } } .iconfont { color: #cdcdcd; font-size: 32rpx; } } /* #endif */ /* #ifdef H5 */ .follow { position: fixed; top: 0; left: 0; width: 100%; background-color: rgba(0, 0, 0, 0.36); height: 80rpx; font-size: 28rpx; color: #fff; padding: 0 30rpx; z-index: 100000; .iconfont { font-size: 30rpx; margin-left: 29rpx; } .bnt { width: 160rpx; height: 50rpx; background-color: #e93323; border-radius: 25rpx; font-size: 24rpx; text-align: center; line-height: 50rpx; } } .followCode { .mask { z-index: 10000; } .pictrue { width: 500rpx; height: 720rpx; border-radius: 12px; left: 50%; top: 50%; margin-left: -250rpx; margin-top: -360rpx; position: fixed; z-index: 10001; img { width: 100%; height: 100%; } } } /* #endif */ .privacy-wrapper { z-index: 9999; position: fixed; left: 0; top: 0; width: 100%; height: 100%; background: #7f7f7f; .privacy-box { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 560rpx; padding: 50rpx 45rpx 0; background: #fff; border-radius: 20rpx; .title { text-align: center; font-size: 32rpx; text-align: center; color: #333; font-weight: 700; } .content { margin-top: 20rpx; line-height: 1.5; font-size: 26rpx; color: #666; navigator { display: inline-block; color: #e93323; } } .btn-box { margin-top: 40rpx; text-align: center; font-size: 30rpx; .btn-item { height: 82rpx; line-height: 82rpx; background: linear-gradient(90deg, #f67a38 0%, #f11b09 100%); color: #fff; border-radius: 41rpx; } .btn { padding: 30rpx 0; } } } } .sort-product { margin: 20rpx; } .emptyBox { text-align: center; padding: 150rpx 0; .tips { color: #aaa; font-size: 26rpx; } image { width: 414rpx; height: 304rpx; } } .nothing { // min-height: 800rpx; } .product-list { display: flex; flex-wrap: wrap; justify-content: space-between; margin-top: 0rpx; padding: 0 20rpx; .product-item { position: relative; width: 324rpx; background: #fff; border-radius: 10rpx; margin-bottom: 20rpx; image { width: 100%; // height: 344rpx; border-radius: 10rpx 10rpx 0 0; } .info { padding: 14rpx 16rpx; .title { font-size: 28rpx; } .price-box { font-size: 34rpx; font-weight: 700; margin-top: 8px; color: #fc4141; text { font-size: 26rpx; } } } } } .sticky-box { // /* #ifndef APP-PLUS-NVUE */ // display: flex; // position: -webkit-sticky; // /* #endif */ // position: sticky; // /* #ifdef H5*/ // top: var(--window-top); // /* #endif */ // z-index: 99; // flex-direction: row; // margin: 0px; // background: #f5f5f5; // padding: 30rpx 0; // /* #ifdef MP || APP-PLUS*/ // //top: 110rpx; // /* #endif /* #ifndef H5 */ display: flex; position: -webkit-sticky; overflow-x: scroll; /* #endif */ position: sticky; z-index: 998; flex-direction: row; margin: 0px; background: #f5f5f5; padding: 24rpx 0 24rpx 0; /* #ifdef MP || APP-PLUS*/ //top: 110rpx; /* #endif */ // overflow-x: scroll; } </style>