2025-03-20 13:59:39 +08:00
|
|
|
|
<template>
|
|
|
|
|
<z-paging
|
|
|
|
|
ref="pagingRef"
|
|
|
|
|
v-model="multiRowProdListPar"
|
|
|
|
|
default-page-size="10"
|
|
|
|
|
empty-view-text="暂无商品"
|
|
|
|
|
:paging-style="{'top': '0','background-color': '#f2f3f7'}"
|
|
|
|
|
:loading-more-custom-style="{'padding-bottom': '3.13rem', 'margin-top': '-40rpx'}"
|
|
|
|
|
loading-more-no-more-text="没有更多了,看看别的吧"
|
|
|
|
|
@query="queryHotSalesOfShop"
|
|
|
|
|
@list-change="listChange"
|
|
|
|
|
>
|
|
|
|
|
<view class="Mall4j shop-page">
|
|
|
|
|
<view class="shop-index">
|
|
|
|
|
<!-- 头部 -->
|
|
|
|
|
<view class="header">
|
|
|
|
|
<view class="bg">
|
|
|
|
|
<image
|
|
|
|
|
style="width: 100%;height: 100%;"
|
|
|
|
|
:src="util.addDomain(shopInfo.mobileBackgroundPic) || defaultShopBG"
|
|
|
|
|
@error="shopInfo.mobileBackgroundPic=''"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
class="search"
|
|
|
|
|
@tap="toShopSearch"
|
|
|
|
|
>
|
|
|
|
|
<view class="icon">
|
|
|
|
|
<image
|
|
|
|
|
style="width: 100%; height: 100%;"
|
|
|
|
|
src="@/static/images/search.png"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="text">
|
|
|
|
|
搜索您想要的商品
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<!-- 店铺信息 -->
|
|
|
|
|
<view
|
|
|
|
|
class="shop-info"
|
|
|
|
|
:class="{'gradient-bg': !banners.length && !shopInfo.intro}"
|
|
|
|
|
>
|
|
|
|
|
<view class="logo">
|
|
|
|
|
<image
|
|
|
|
|
style="width: 100%; height: 100%;"
|
|
|
|
|
:src="shopInfo.shopLogo ? util.addDomain(shopInfo.shopLogo) : defaultShopLogo"
|
|
|
|
|
@error="shopInfo.shopLogo=''"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="text-box">
|
|
|
|
|
<view class="name">
|
|
|
|
|
{{ shopInfo.shopName }}
|
|
|
|
|
</view>
|
|
|
|
|
<view class="focus-box">
|
|
|
|
|
<view
|
|
|
|
|
v-if="shopInfo.type === 1"
|
|
|
|
|
class="self"
|
|
|
|
|
>
|
|
|
|
|
自营
|
|
|
|
|
</view>
|
|
|
|
|
<view class="focus">
|
|
|
|
|
关注人数:{{ wxs.parseCollectionNumber(shopInfo.collectionNum) }}
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
class="collect"
|
|
|
|
|
@tap="addOrCancelOfCollection"
|
|
|
|
|
>
|
|
|
|
|
<view
|
|
|
|
|
v-if="!isCollected"
|
|
|
|
|
class="img"
|
|
|
|
|
>
|
|
|
|
|
<image
|
|
|
|
|
style="width: 100%; height: 100%;"
|
|
|
|
|
src="@/package-shop/static/images/focus.png"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="text">
|
|
|
|
|
{{ isCollected ? '已关注' : '关注' }}
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
v-if="shopInfo.intro"
|
|
|
|
|
class="shop-des"
|
|
|
|
|
>
|
|
|
|
|
{{ shopInfo.intro }}
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 广告 -->
|
|
|
|
|
<view
|
|
|
|
|
v-if="banners.length > 0"
|
|
|
|
|
class="shop-adv"
|
|
|
|
|
>
|
|
|
|
|
<swiper
|
|
|
|
|
class="img"
|
|
|
|
|
:indicator-dots="true"
|
|
|
|
|
indicator-color="rgba(255,252,255, .3)"
|
|
|
|
|
indicator-active-color="rgba(255,252,255, .6)"
|
|
|
|
|
:autoplay="true"
|
|
|
|
|
:circular="true"
|
|
|
|
|
>
|
|
|
|
|
<swiper-item
|
|
|
|
|
v-for="(imgItem, imgIdx) in banners"
|
|
|
|
|
:key="imgIdx"
|
|
|
|
|
class="item"
|
|
|
|
|
@tap="toProdDetail(imgItem.spuId)"
|
|
|
|
|
>
|
|
|
|
|
<img-show :src="imgItem.imgUrl" />
|
|
|
|
|
</swiper-item>
|
|
|
|
|
</swiper>
|
|
|
|
|
</view>
|
|
|
|
|
|
|
|
|
|
<!-- 店铺热销 -->
|
|
|
|
|
<view class="shop-prods">
|
|
|
|
|
<view class="shop-tit">
|
|
|
|
|
<view class="text">
|
|
|
|
|
店铺热销
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
class="text-arrow"
|
|
|
|
|
@tap="goShopProds"
|
|
|
|
|
>
|
|
|
|
|
更多
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="prods">
|
|
|
|
|
<view
|
|
|
|
|
v-for="(prodList,listIndex) in multiRowProdList"
|
|
|
|
|
:key="listIndex"
|
|
|
|
|
class="list"
|
|
|
|
|
>
|
|
|
|
|
<view
|
|
|
|
|
v-for="(prod, index) in prodList"
|
|
|
|
|
:key="index"
|
|
|
|
|
class="item"
|
|
|
|
|
@tap="toProdDetail(prod.spuId)"
|
|
|
|
|
>
|
|
|
|
|
<view class="img">
|
|
|
|
|
<img-show
|
|
|
|
|
:src="prod.mainImgUrl"
|
|
|
|
|
img-mode="aspectFit"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="text-box">
|
|
|
|
|
<view
|
|
|
|
|
style="font-size: 24rpx"
|
|
|
|
|
class="name"
|
|
|
|
|
>
|
|
|
|
|
{{ prod.spuName }}
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
v-if="prod.sellingPoint"
|
|
|
|
|
style="font-size: 24rpx"
|
|
|
|
|
class="sku"
|
|
|
|
|
>
|
|
|
|
|
{{ prod.sellingPoint }}
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
v-if="prod.spuActivity.discountList
|
|
|
|
|
&& prod.spuActivity.discountList.length > 0
|
|
|
|
|
&& prod.spuActivity.discountList[0].discountItemList.length > 0"
|
|
|
|
|
class="discount-box"
|
|
|
|
|
>
|
|
|
|
|
<view
|
|
|
|
|
v-if="prod.spuActivity.discountList[0].discountRule === 0"
|
|
|
|
|
class="discount"
|
|
|
|
|
>
|
|
|
|
|
满减
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
v-if="prod.spuActivity.discountList[0].discountRule ===0"
|
|
|
|
|
class="coupons"
|
|
|
|
|
>
|
|
|
|
|
{{
|
|
|
|
|
'满' + util.accuracyCount(prod.spuActivity.discountList[0].discountItemList[0].needAmount, 100, 3) + '元减' +
|
|
|
|
|
util.accuracyCount(prod.spuActivity.discountList[0].discountItemList[0].discount, 100, 3) + '元'
|
|
|
|
|
}}
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
v-if="prod.spuActivity.discountList[0].discountRule ===3"
|
|
|
|
|
class="discount"
|
|
|
|
|
>
|
|
|
|
|
满折
|
|
|
|
|
</view>
|
|
|
|
|
<view
|
|
|
|
|
v-if="prod.spuActivity.discountList[0].discountRule ===3"
|
|
|
|
|
class="coupons"
|
|
|
|
|
>
|
|
|
|
|
{{
|
|
|
|
|
'满' + util.accuracyCount(prod.spuActivity.discountList[0].discountItemList[0].needAmount, 100, 3) + '件打' +
|
|
|
|
|
util.accuracyCount(prod.spuActivity.discountList[0].discountItemList[0].discount, 100, 3) + '折'
|
|
|
|
|
}}
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<view class="price-box">
|
|
|
|
|
<view class="price">
|
|
|
|
|
<view class="symbol">
|
|
|
|
|
¥
|
|
|
|
|
</view>
|
|
|
|
|
<view class="big">
|
|
|
|
|
{{ parsePrice(prod.priceFee)[0] }}
|
|
|
|
|
</view>
|
|
|
|
|
<view class="symbol">
|
|
|
|
|
.{{ parsePrice(prod.priceFee)[1] }}
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
<popup-ad
|
|
|
|
|
v-model="popupadShow"
|
|
|
|
|
:popup-info="popupInfo"
|
|
|
|
|
:shop-id="shopId"
|
|
|
|
|
/>
|
|
|
|
|
<!-- 店铺tabbar -->
|
|
|
|
|
<shop-tabbar
|
|
|
|
|
style="position:fixed;bottom:0;width:100%;left:0;right:0;"
|
|
|
|
|
:shop-id="shopId"
|
|
|
|
|
/>
|
|
|
|
|
</view>
|
|
|
|
|
</view>
|
|
|
|
|
</z-paging>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
|
import number from '@/wxs/number'
|
|
|
|
|
import defaultShopBG from '@/package-shop/static/images/default-shop-bg.png'
|
|
|
|
|
import defaultShopLogo from '@/package-shop/static/images/default-shop-logo.png'
|
|
|
|
|
import util from '@/utils/util.js'
|
|
|
|
|
|
|
|
|
|
const wxs = number()
|
|
|
|
|
|
|
|
|
|
const shopId = ref(0)
|
|
|
|
|
const categoryId = ref('') // 分类ID
|
|
|
|
|
const shopSecondaryCategoryId = ref('') // 二级分类ID
|
|
|
|
|
onLoad((options) => {
|
|
|
|
|
// options = {...$Route.query}
|
|
|
|
|
shopId.value = options.shopId
|
|
|
|
|
uni.setStorageSync('cloudShopId', shopId.value)
|
|
|
|
|
categoryId.value = options.categoryId || ''
|
|
|
|
|
shopSecondaryCategoryId.value = options.secondCategoryId || ''
|
|
|
|
|
queryShopInfo() // 店铺信息
|
|
|
|
|
queryCollectedStatus() // 根据店铺id获取该店铺是否在收藏夹中
|
|
|
|
|
queryShopBanners() // 轮播图
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 获取弹窗广告信息
|
|
|
|
|
const popupadShow = ref(false)
|
|
|
|
|
const popupInfo = ref({})
|
|
|
|
|
const onGetPopupInfo = async () => {
|
|
|
|
|
const info = await util.getPopupInfo({ pageType: 4, shopId: shopId.value })
|
|
|
|
|
if (info) {
|
|
|
|
|
popupInfo.value = info
|
|
|
|
|
popupadShow.value = true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
const shopInfo = ref({}) // 店铺信息
|
|
|
|
|
const queryShopInfo = () => {
|
|
|
|
|
// 获取店铺头部信息
|
|
|
|
|
http.request({
|
2025-03-25 23:27:44 +08:00
|
|
|
|
url: '/tmerclub_admin/ua/shop_detail/head_info',
|
2025-03-20 13:59:39 +08:00
|
|
|
|
method: 'GET',
|
|
|
|
|
data: {
|
|
|
|
|
shopId: shopId.value
|
|
|
|
|
}
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
shopInfo.value = res
|
|
|
|
|
if (shopInfo.value.renovationId) {
|
|
|
|
|
uni.redirectTo({
|
|
|
|
|
url: '/package-shop/shop-page/feature-index/feature-index?shopId=' + shopInfo.value.shopId + '&renovationId=' + shopInfo.value.renovationId
|
|
|
|
|
})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
onGetPopupInfo()
|
|
|
|
|
getShopStatus()
|
|
|
|
|
uni.setStorageSync('cloudShopInfo', res) // 将店铺信息存起来
|
|
|
|
|
}).catch((err) => {
|
|
|
|
|
// 如果不存在店铺或其他错误
|
|
|
|
|
uni.showModal({
|
|
|
|
|
title: '提示',
|
|
|
|
|
content: err.msg,
|
|
|
|
|
showCancel: false,
|
|
|
|
|
success: (res) => {
|
|
|
|
|
if (res.confirm) {
|
|
|
|
|
// 点击确定,返回上一页
|
|
|
|
|
uni.navigateBack()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const banners = ref([]) // 轮播图
|
|
|
|
|
/**
|
|
|
|
|
* 首页轮播图
|
|
|
|
|
*/
|
|
|
|
|
const queryShopBanners = () => {
|
|
|
|
|
http.request({
|
2025-03-25 23:27:44 +08:00
|
|
|
|
url: '/tmerclub_admin/ua/index_img/list',
|
2025-03-20 13:59:39 +08:00
|
|
|
|
method: 'GET',
|
|
|
|
|
data: {
|
|
|
|
|
shopId: shopId.value,
|
|
|
|
|
imgType: 0 // 图片类型:0.app(h5) 1.pc
|
|
|
|
|
}
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
// imgType 图片类型 0:小程序 1:pc
|
|
|
|
|
banners.value = []
|
|
|
|
|
res.forEach((item) => {
|
|
|
|
|
if (item.imgType === 0) {
|
|
|
|
|
banners.value.push(item)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const isCollected = ref(false) // 是否收藏
|
|
|
|
|
/**
|
|
|
|
|
* 根据店铺id获取该店铺是否在收藏夹中
|
|
|
|
|
*/
|
|
|
|
|
const queryCollectedStatus = () => {
|
|
|
|
|
if (!uni.getStorageSync('cloudToken') || !shopId.value) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
http.request({
|
2025-03-25 23:27:44 +08:00
|
|
|
|
url: '/tmerclub_admin/user_collection_shop/ma/is_collection',
|
2025-03-20 13:59:39 +08:00
|
|
|
|
method: 'get',
|
|
|
|
|
data: {
|
|
|
|
|
shopId: shopId.value
|
|
|
|
|
}
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
isCollected.value = res
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加收藏/取消收藏
|
|
|
|
|
*/
|
|
|
|
|
const addOrCancelOfCollection = () => {
|
|
|
|
|
http.request({
|
2025-03-25 23:27:44 +08:00
|
|
|
|
url: '/tmerclub_admin/user_collection_shop/add_or_cancel',
|
2025-03-20 13:59:39 +08:00
|
|
|
|
method: 'post',
|
|
|
|
|
data: shopId.value,
|
|
|
|
|
dontShowLogin: true
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
isCollected.value = res
|
|
|
|
|
queryShopInfo()
|
|
|
|
|
}).catch(() => {
|
|
|
|
|
const pagesPar = getCurrentPages()
|
|
|
|
|
uni.setStorageSync('cloudRouteUrlAfterLogin', pagesPar[pagesPar.length - 1].$page.fullPath)
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
url: '/package-user/pages/user-login/user-login'
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const searchKey = null // 搜索关键字
|
|
|
|
|
const multiRowProdList = ref([])
|
|
|
|
|
const multiRowProdListPar = ref([]) // 多行展示时商品列表
|
|
|
|
|
const pagingRef = ref(null)
|
|
|
|
|
/**
|
|
|
|
|
* 店铺热销
|
|
|
|
|
*/
|
|
|
|
|
const queryHotSalesOfShop = (pageNum, pageSize) => {
|
|
|
|
|
http.request({
|
2025-03-25 23:27:44 +08:00
|
|
|
|
url: '/tmerclub_search/ua/search/page',
|
2025-03-20 13:59:39 +08:00
|
|
|
|
method: 'GET',
|
|
|
|
|
data: {
|
|
|
|
|
shopId: shopId.value,
|
|
|
|
|
pageNum,
|
|
|
|
|
pageSize,
|
|
|
|
|
sort: 2,
|
|
|
|
|
keyword: searchKey || '',
|
|
|
|
|
categoryId: categoryId.value,
|
|
|
|
|
shopSecondaryCategoryId: shopSecondaryCategoryId.value,
|
|
|
|
|
needActivity: 1 // 是否需要活动信息 1:需要 0:不需要
|
|
|
|
|
}
|
|
|
|
|
}).then((res) => {
|
|
|
|
|
res.list[0].spus.forEach(item => {
|
|
|
|
|
item.priceFee = util.accuracyCount(item.priceFee, 100, 3)
|
|
|
|
|
item.marketPriceFee = util.accuracyCount(item.priceFee, 100, 3)
|
|
|
|
|
})
|
|
|
|
|
// 将请求结果通过complete传给z-paging处理,同时也代表请求结束,这一行必须调用
|
|
|
|
|
pagingRef.value.complete(res.list[0].spus)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const listChange = (list) => {
|
|
|
|
|
// 多列数据展示
|
|
|
|
|
const row1 = []
|
|
|
|
|
const row2 = []
|
|
|
|
|
list.forEach((prod, index) => {
|
|
|
|
|
if (index % 2 === 0) {
|
|
|
|
|
row1.push(prod)
|
|
|
|
|
} else {
|
|
|
|
|
row2.push(prod)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
multiRowProdList.value = [row1, row2]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 查看店铺是否下架
|
|
|
|
|
const getShopStatus = () => {
|
|
|
|
|
const startDate = new Date(shopInfo.value.contractStartTime).getTime()
|
|
|
|
|
const endtDate = new Date(shopInfo.value.contractEndTime).getTime()
|
|
|
|
|
const timestamp = Date.parse(new Date())
|
|
|
|
|
if (shopInfo.value.shopStatus === 0) {
|
|
|
|
|
let msg = ''
|
|
|
|
|
if (timestamp < startDate) {
|
|
|
|
|
msg = '商家尚未营业'
|
|
|
|
|
}
|
|
|
|
|
if (timestamp > endtDate) {
|
|
|
|
|
msg = '商家已暂停营业'
|
|
|
|
|
}
|
|
|
|
|
uni.showModal({
|
|
|
|
|
title: '提示',
|
|
|
|
|
content: msg,
|
|
|
|
|
showCancel: false,
|
|
|
|
|
success: (res) => {
|
|
|
|
|
if (res.confirm) {
|
|
|
|
|
// 点击确定,返回上一页
|
|
|
|
|
uni.navigateBack()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
if (shopInfo.value.shopStatus === 2 || shopInfo.value.shopStatus === 6) {
|
|
|
|
|
uni.showModal({
|
|
|
|
|
title: '提示',
|
|
|
|
|
content: '店铺已下线',
|
|
|
|
|
showCancel: false,
|
|
|
|
|
success: (res) => {
|
|
|
|
|
if (res.confirm) {
|
|
|
|
|
// 点击确定,返回上一页
|
|
|
|
|
uni.navigateBack()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const goShopProds = () => {
|
|
|
|
|
uni.redirectTo({
|
|
|
|
|
url: '/package-shop/shop-page/shop-prods/shop-prods?navStatus=1&sort=2'
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const toShopSearch = () => {
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
url: '/package-shop/shop-page/shop-search/shop-search?shopId=' + shopId.value
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 跳转商品详情
|
|
|
|
|
*/
|
|
|
|
|
const toProdDetail = (spuId) => {
|
|
|
|
|
if (!spuId) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
url: '/pages/detail/detail?spuId=' + spuId
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 价格处理
|
|
|
|
|
*/
|
|
|
|
|
const parsePrice = (value) => {
|
|
|
|
|
let val = Number(value)
|
|
|
|
|
if (!val) {
|
|
|
|
|
val = 0
|
|
|
|
|
}
|
|
|
|
|
// 截取小数点后两位,并以小数点为切割点将val转化为数组
|
|
|
|
|
return val.toFixed(2).split('.')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
@use "../shop-page";
|
|
|
|
|
</style>
|