2025-04-13 23:40:58 +08:00

321 lines
7.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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({
url: '/tmerclub_product/spu_collection/count',
method: 'GET'
}).then(res => {
prodCollectedNum.value = res
})
}
/**
* 获取店铺收藏数量
*/
const shopCollectedNum = ref(0)
const onGetNumberOfShopCollected = () => {
http.request({
url: '/tmerclub_admin/user_collection_shop/count',
method: 'GET'
}).then(res => {
shopCollectedNum.value = res
})
}
/**
* 请求 商品/店铺 收藏列表
*/
const pagingRef = ref(null)
const prodOrShopList = ref([])
const onQueryCollectData = (pageNum, pageSize) => {
let url = ''
if (navStatus.value === 0) {
url = '/tmerclub_product/spu_collection/page'
} else if (navStatus.value === 1) {
url = '/tmerclub_admin/user_collection_shop/page'
}
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) {
url = '/tmerclub_product/spu_collection/add_or_cancel'
} else if (navStatus.value === 1) {
url = '/tmerclub_admin/user_collection_shop/add_or_cancel'
}
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>