<template> <div> <u-navbar :border-bottom="false"> <u-search v-model="keyword" @search="search" @click="search" placeholder="请输入搜索"></u-search> </u-navbar> <div class="wrapper"> <!-- 店铺信息模块 --> <div class="store flex"> <u-image border-radius="10" width="150" height="150" :src="storeInfo.storeLogo || config.logo" mode="aspectFit"> </u-image> <div class="box"> <div class="store-name" @click="getStoreLicencePhoto"> {{ storeInfo.storeName || ''}} <u-icon style="margin-left:10rpx;" name="arrow-right"></u-icon> </div> <div class="flex store-message"> <div> <span>{{ storeInfo.collectionNum || 0 }}</span>关注 </div> <div> <span>{{ storeInfo.goodsNum || 0 }}</span>件商品 </div> </div> </div> <div class="collection"> <div class="collection-btn" @click="whetherCollection"> {{ isCollection ? '已关注' : '+ 关注' }}</div> </div> </div> <!-- 店铺简介 --> <div class="store-desc wes-2"> {{storeInfo.storeDesc}} </div> <!-- 联系客服 --> <div class="kefu" @click="linkKefuDetail"> <u-icon name="kefu-ermai"></u-icon> 联系客服 </div> </div> <!-- 优惠券 --> <scroll-view scroll-x="true" show-scrollbar="false" class="discount" v-if="couponList.length > 0"> <view class="card-box" v-for="(item, index) in couponList" :key="index"> <view class="card" @click="getCoupon(item)"> <view class="money"> <view> <span v-if="item.couponType == 'DISCOUNT'">{{ item.couponDiscount }}折</span> <span v-else>{{ item.price }}元</span> </view> </view> <view class="xian"></view> <view class="text"> <text>{{'领取优惠券'}}</text> <text>满{{ item.consumeThreshold | unitPrice }}元可用</text> </view> </view> </view> </scroll-view> <!-- tab --> <u-tabs :list="tabs" :active-color="mainColor" :is-scroll="false" :current="current" @change="changeTab"></u-tabs> <!-- menu --> <!-- 商品 --> <div class="contant" v-if="current == 0"> <view v-if="!goodsList.length" class="empty">暂无商品信息</view> <view v-else class="item" v-for="(item,index) in goodsList" :key="index" @click="navigateToGoodsDetail(item)"> <u-image width="100%" height="330rpx" mode="aspectFit" :src="item.content.thumbnail"> <u-loading slot="loading"></u-loading> </u-image> <div class="name wes-2">{{ item.content.goodsName }}</div> <div class="price"> <div>¥{{ item.content.price | unitPrice }}</div> </div> <view class="buyCount"> <div>已售 {{ item.content.buyCount || "0" }}</div> </view> </view> </div> <!-- 全部分类 --> <div class="category" v-if="current == 1"> <div class="category-item" v-for="(item,index) in categoryList" :key="index"> <div class="flex" @click="getCategoryGoodsList(item)"> <div>{{item.labelName}}</div> <div> <u-icon color="#999" name="arrow-right"></u-icon> </div> </div> <!-- 分类子级 --> <div class="child-list" v-if="item.children && item.children.length!=0"> <div class="child" @click="getCategoryGoodsList(child)" v-for="(child,i) in item.children">{{child.labelName}} </div> </div> </div> </div> <u-back-top :scroll-top="scrollTop"></u-back-top> </div> </template> <script> import { getStoreBaseInfo, getStoreCategory } from "@/api/store.js"; import { receiveCoupons, deleteStoreCollection, collectionGoods, getGoodsIsCollect, } from "@/api/members.js"; import config from "@/config/config"; import storage from "@/utils/storage"; import { getGoodsList } from "@/api/goods.js"; import { getAllCoupons } from "@/api/promotions.js"; export default { data() { return { config, scrollTop: 0, mainColor: this.$mainColor, //主色调 current: 0, //初始tabs的索引 tabs: [{ name: "全部商品" }, { name: "分类查看" }], // 标签 storeId: "", keyword: "", storeInfo: {}, //店铺详情 isCollection: false, //是否关注 goodsList: [], //推荐货物 couponList: [], //优惠券列表 categoryList: [], couponParams: { pageNumber: 1, pageSize: 50, storeId: "" }, goodsParams: { pageNumber: 1, pageSize: 50, storeId: "" }, }; }, watch: { current(val) { val == 0 ? ()=>{ this.goodsList = []; this.getGoodsData()} : this.getCategoryData(); }, }, /** * 加载 */ async onLoad(options) { this.storeId = options.id; this.goodsParams.storeId = options.id; this.couponParams.storeId = options.id; }, onPageScroll(e) { this.scrollTop = e.scrollTop; }, onPullDownRefresh() { this.init(); }, mounted() { // #ifdef MP-WEIXIN // 小程序默认分享 uni.showShareMenu({ withShareTicket: true }); // #endif this.init(); }, // 下拉加载 onReachBottom() { this.goodsParams.pageNumber++; this.getGoodsData(); }, methods: { getStoreLicencePhoto() { uni.navigateTo({ url: `/pages/product/licencePhoto?id=${this.storeId}`, }); }, /** * 初始化信息 */ init() { this.goodsList = []; this.categoryList = []; this.couponList = []; this.goodsParams.pageNumber = 1; if (this.$options.filters.isLogin("auth")) { this.enableGoodsIsCollect(); } // 店铺信息 this.getStoreData(); // 商品信息 this.getGoodsData(); // 优惠券信息 this.getCouponsData(); // 店铺分类 this.getCategoryData(); }, /** * 联系客服 */ linkKefuDetail() { // 客服 // #ifdef MP-WEIXIN const params = { // originalPrice: this.goodsDetail.original || this.goodsDetail.price, uuid: storage.getUuid(), token: storage.getAccessToken(), sign: this.storeInfo.yzfSign, mpSign: this.storeInfo.yzfMpSign, }; uni.navigateTo({ url: "/pages/product/customerservice/index?params=" + encodeURIComponent(JSON.stringify(params)), }); // #endif // #ifndef MP-WEIXIN const sign = this.storeInfo.yzfSign; uni.navigateTo({ url: "/pages/tabbar/home/web-view?src=https://yzf.qq.com/xv/web/static/chat/index.html?sign=" + sign, }); // #endif }, /** 获取店铺分类 */ async getCategoryData() { let res = await getStoreCategory(this.storeId); if (res.data.success) { this.categoryList = res.data.result; } }, /**是否收藏店铺 */ async enableGoodsIsCollect() { let res = await getGoodsIsCollect("STORE", this.storeId); if (res.data.success) { this.isCollection = res.data.result; } }, /**商品分类中商品集合 */ getCategoryGoodsList(val) { uni.navigateTo({ url: `/pages/product/shopPageGoods?title=${val.labelName}&id=${val.id}&storeId=${this.storeId}`, }); }, /** * 搜索 */ search() { uni.navigateTo({ url: `/pages/navigation/search/searchPage?storeId=${this.storeId}&keyword=${this.keyword}`, }); }, /** 点击tab */ changeTab(index) { this.current = index; }, /** * 店铺信息 */ async getStoreData() { let res = await getStoreBaseInfo(this.storeId); res.data.success ? (this.storeInfo = res.data.result) : uni.reLaunch({ url: "/" }); }, /** 加载商品 */ async getGoodsData() { let res = await getGoodsList(this.goodsParams); if (res.data.success) { this.goodsList.push(...res.data.result.content); } }, /** 加载优惠券 */ async getCouponsData() { this.couponParams.storeId = this.storeId; let res = await getAllCoupons(this.couponParams); if (res.data.success) { this.couponList.push(...res.data.result.records); } }, /** * 跳转到商品详情 */ navigateToGoodsDetail(val) { uni.navigateTo({ url: `/pages/product/goods?id=${val.content.id}&goodsId=${val.content.goodsId}`, }); }, /** * 是否收藏 */ whetherCollection() { if (this.isCollection) { deleteStoreCollection(this.storeId).then((res) => { if (res.data.success) { this.isCollection = false; uni.showToast({ icon: "none", duration: 3000, title: "取消关注成功!", }); } }); } else { collectionGoods("STORE", this.storeId).then((res) => { if (res.data.success) { this.isCollection = true; uni.showToast({ icon: "none", duration: 3000, title: "关注成功!", }); } }); } }, /** * 领取 */ getCoupon(item) { if (!this.$options.filters.isLogin("auth")) { uni.showToast({ icon: "none", duration: 3000, title: "请先登录!", }); this.$options.filters.navigateToLogin("redirectTo"); return false; } receiveCoupons(item.id).then((res) => { if (res.data.success) { uni.showToast({ icon: "none", duration: 3000, title: "领取成功!", }); } }); }, }, }; </script> <style lang="scss" scoped> .wrapper { background: #fff; padding: 32rpx; } .store { align-items: center; > .box { display: flex; flex-direction: column; justify-content: center; margin-left: 30rpx; font-size: 24rpx; color: #999; flex: 2; > .store-name { font-size: 34rpx; color: #333; letter-spacing: 1rpx; font-weight: bold; } > .store-message { margin-top: 25rpx; > div { font-size: 26rpx; margin: 0 5rpx; > span { font-size: 26rpx; font-weight: bold; color: #333; margin-right: 8rpx; } } } } } .collection-btn { background: $main-color; padding: 6rpx 0; width: 140rpx; font-size: 24rpx; color: #fff; border-radius: 100px; text-align: center; } .store-desc { margin: 40rpx 0 0 0; color: #999; } .contant { margin-top: 20rpx; display: flex; flex-wrap: wrap; justify-content: space-between; > .empty { width: 100%; display: flex; justify-content: center; margin-top: 40rpx; } .item { overflow: hidden; background: #fff; width: 49%; height: 484rpx; font-size: 26rpx; display: flex; flex-direction: column; border: 1px solid #f8f8f8; margin-bottom: 20rpx; .name { text-align: left !important; color: #333; padding: 0 20rpx; margin-top: 20rpx; height: 80rpx; overflow: hidden; } .price { font-weight: 500; color: $main-color; font-size: 30rpx; padding: 0 20rpx; margin-top: 20rpx; white-space: nowrap; } .buyCount { display: flex; padding: 0 20rpx; font-size: 24upx; justify-content: space-between; color: #999; } } } .discount { height: 154rpx; border-top: 1px solid #f6f6f6; border-bottom: 18rpx solid #f6f6f6; background: #f6f6f6; overflow: hidden; white-space: nowrap; .card-box { display: inline-block; padding-top: 25rpx; } .card { width: 324rpx; height: 116rpx; background: #fff; margin-left: 20rpx; border-radius: 5px; display: flex; align-items: center; .money { width: 45%; color: #fd6466; font-weight: 500; text-align: center; text { font-size: 50rpx; } } .xian { height: 66rpx; border: 1px dashed #f6f6f6; position: relative; &:before, &:after { content: ""; width: 22rpx; height: 12rpx; position: absolute; background: #f6f6f6; } &:before { border-radius: 0 0 22rpx 22rpx; top: -30rpx; left: -10rpx; } &:after { border-radius: 22rpx 22rpx 0 0; bottom: -30rpx; left: -10rpx; } } .text { flex: 1; color: $aider-light-color; font-size: 24rpx; display: flex; flex-direction: column; margin-left: 14rpx; text:nth-of-type(2) { color: #ccc; } .cur:nth-of-type(1) { color: #ccc; } } } } .category-item { background: #fff; padding: 22rpx; margin: 20rpx 10rpx; > .flex { color: #666; justify-content: space-between; } > .child-list { display: flex; margin: 20rpx 0; flex-wrap: wrap; > .child { justify-content: center; margin: 1% 0; display: flex; width: 48%; font-size: 24rpx; color: #999; margin-right: 1%; border: 1rpx solid #ededed; box-sizing: border-box; height: 70rpx; text-align: center; line-height: 70rpx; } } } .kefu { background: #f7f7f7; height: 70rpx; display: flex; align-items: center; justify-content: center; margin-top: 32rpx; border-radius: 10rpx; font-size: 24rpx; color: #999; } </style>