321 lines
7.7 KiB
Vue
Raw Normal View History

2025-03-20 13:59:39 +08:00
<template>
<z-paging
ref="pagingRef"
v-model="prodOrShopList"
:paging-style="{'top': '0','background-color': '#f2f3f7'}"
:empty-view-text="`您还没有收藏过${ navStatus === 1 ? '店铺' : '商品' }`"
loading-more-no-more-text="没有更多了,看看别的吧"
empty-view-img="/static/empty-img/collect-empty.png"
@query="onQueryCollectData"
>
<view class="Mall4j page-my-collection">
<!-- tab -->
<view class="tab">
<view
:class="['item', navStatus === 0 ? 'active' : '']"
@tap="onSwitchNav(0)"
>
商品({{ prodCollectedNum }})
</view>
<view
:class="['item', navStatus === 1 ? 'active' : '']"
@tap="onSwitchNav(1)"
>
店铺({{ shopCollectedNum }})
</view>
</view>
<!-- 产品列表 -->
<view
v-if="navStatus === 0 && prodOrShopList.length > 0"
class="line-prods"
>
<view
v-for="(item,index) in prodOrShopList"
:key="index"
class="item"
>
<view
class="img"
@tap="onToProdDetail(item.spuId, item.status)"
>
<img-show
:src="item.mainImgUrl"
img-mode="aspectFit"
/>
</view>
<view class="text-box">
<view
class="prod-info"
@tap="onToProdDetail(item.spuId, item.status)"
>
<view class="name">
{{ item.spuName }}
</view>
<view class="sku">
{{ item.sellingPoint }}
</view>
</view>
<view class="price-box">
<view
class="price"
@tap="onToProdDetail(item.spuId, item.status)"
>
<view class="symbol">
</view>
<view class="big">
{{ wxs.parsePrice(item.priceFee)[0] }}
</view>
<view class="symbol">
.{{ wxs.parsePrice(item.priceFee)[1] }}
</view>
</view>
<view
class="btn"
@tap="showDelPopup(item.spuId,'prod')"
>
取消收藏
</view>
</view>
</view>
</view>
</view>
<!-- 店铺列表 -->
<view
v-if="navStatus === 1 && prodOrShopList.length > 0"
class="shop-list"
>
<view
v-for="(item,index) in prodOrShopList"
:key="index"
class="item"
>
<view
class="logo"
@tap="onToShopIndex(item)"
>
<image
v-if="item.shopLogo"
:src="util.addDomain(item.shopLogo)"
@error="prodOrShopList[index].shopLogo = ''"
/>
<image
v-else
src="@/package-activities/static/images/default-shop-logo.png"
/>
</view>
<view
class="text-box"
@tap="onToShopIndex(item)"
>
<view class="shop-name">
{{ item.shopName }}
</view>
<view class="focus">
<view
v-if="item.type === 1"
class="self"
>
自营
</view>
<view class="number">
关注人数{{ wxs.parseCollectionNumber(item.collectionNum) }}
</view>
</view>
</view>
<view
class="del"
@tap="showDelPopup(item.shopId, 'shop')"
>
取消收藏
</view>
</view>
</view>
<!-- 取消收藏确认弹窗 -->
<confirm-pop
:show-pop="showPop"
:pop-content="popContent"
@handle-pop-cancel="onPopCancel"
@handle-pop-confirm="onPopConfirm"
/>
</view>
</z-paging>
</template>
<script setup>
import util from '@/utils/util.js'
const wxs = number()
const showPop = ref(false) // 弹窗显隐
const navStatus = ref(0) // 0商品 1店铺
let selectItemId = null // 选中的item id
const popContent = reactive({
title: '是否确认取消收藏',
content: '商品取消收藏后将不容易被找到哦~'
})
onLoad(() => {
onGetNumberOfProdCollected()
onGetNumberOfShopCollected()
})
/**
* 切换nav
*/
const onSwitchNav = (nav) => {
navStatus.value = nav
popContent.content = nav === 0 ? '商品取消收藏后将不容易被找到哦~' : '店铺取消收藏后将不容易被找到哦~'
pagingRef.value.reload()
}
/**
* 获取商品收藏数量
*/
const prodCollectedNum = ref(0)
const onGetNumberOfProdCollected = () => {
http.request({
2025-03-25 23:27:44 +08:00
url: '/tmerclub_product/spu_collection/count',
2025-03-20 13:59:39 +08:00
method: 'GET'
}).then(res => {
prodCollectedNum.value = res
})
}
/**
* 获取店铺收藏数量
*/
const shopCollectedNum = ref(0)
const onGetNumberOfShopCollected = () => {
http.request({
2025-04-13 23:40:58 +08:00
url: '/tmerclub_admin/user_collection_shop/count',
2025-03-20 13:59:39 +08:00
method: 'GET'
}).then(res => {
shopCollectedNum.value = res
})
}
/**
* 请求 商品/店铺 收藏列表
*/
const pagingRef = ref(null)
const prodOrShopList = ref([])
const onQueryCollectData = (pageNum, pageSize) => {
let url = ''
if (navStatus.value === 0) {
2025-03-25 23:27:44 +08:00
url = '/tmerclub_product/spu_collection/page'
2025-03-20 13:59:39 +08:00
} else if (navStatus.value === 1) {
2025-04-13 23:40:58 +08:00
url = '/tmerclub_admin/user_collection_shop/page'
2025-03-20 13:59:39 +08:00
}
http.request({
url,
method: 'GET',
data: {
pageNum,
pageSize,
needActivity: 1 // 是否需要活动信息 1需要 0不需要
}
}).then(res => {
// 将请求结果通过complete传给z-paging处理同时也代表请求结束这一行必须调用
pagingRef.value.complete(res.list)
})
}
/**
* 取消收藏
*/
const onCancelCollect = () => {
let url = ''
selectItemId = String(selectItemId)
if (navStatus.value === 0) {
2025-03-25 23:27:44 +08:00
url = '/tmerclub_product/spu_collection/add_or_cancel'
2025-03-20 13:59:39 +08:00
} else if (navStatus.value === 1) {
2025-04-13 23:40:58 +08:00
url = '/tmerclub_admin/user_collection_shop/add_or_cancel'
2025-03-20 13:59:39 +08:00
}
http.request({
url,
method: 'POST',
data: selectItemId
}).then(() => {
showPop.value = false
pagingRef.value.reload()
onGetNumberOfProdCollected()
onGetNumberOfShopCollected()
})
}
// 显示删除弹窗
const showDelPopup = (id) => {
selectItemId = id
showPop.value = true
}
/**
* 弹窗确认
*/
const onPopConfirm = () => {
onCancelCollect()
}
/**
* 弹窗取消事件
*/
const onPopCancel = () => {
showPop.value = false
}
/**
* 跳转到店铺首页
*/
const onToShopIndex = (shopInfo) => {
// shopStatus 店铺状态(-1:未开通 0: 停业中 1:营业中 2:平台下线 3:平台下线待审核)
if (shopInfo.shopStatus !== 1) {
uni.showToast({
title: '该店铺暂时无法访问',
icon: 'none'
})
return
}
let url
if (shopInfo.renovationId) {
url = '/package-shop/shop-page/feature-index/feature-index?shopId=' + shopInfo.shopId + '&renovationId=' + shopInfo.renovationId
} else {
url = '/package-shop/shop-page/shop-index/shop-index?shopId=' + shopInfo.shopId
}
uni.navigateTo({
url
})
}
/**
* 跳转到商品详情页
*/
const onToProdDetail = (spuId, status) => {
// status 商品状态 1:enable, 0:disable, -1:deleted
if (status === -1) {
uni.showToast({
title: '商品不存在',
icon: 'none'
})
return
}
if (status === 0) {
uni.showToast({
title: '商品已被下架',
icon: 'none'
})
return
}
uni.navigateTo({
url: '/pages/detail/detail?spuId=' + spuId
})
}
</script>
<style lang="scss" scoped>
@use "./my-collection.scss";
</style>