Files
xdd-uniapp-new/pages/home/landMark.vue
T

299 lines
6.6 KiB
Vue

<template>
<view class="pkg-product-land-mark">
<view v-if="isLoad">
<view class="top-box">
<view class="nav flex">
<view
v-for="(item,index) in navList"
:key="index"
:class="{
'active': navIndex === index
}"
class="flex flex-0 ai-center nav-item"
@click="changeNav(index)"
>
<image
:src="webUrl + '/home/landmark-icon.png'"
class="bg"
/>
{{ item.provinceName }}
</view>
</view>
<view class="view-box">
<view class="map-box">
<image
:src="mapData.mapImage"
mode="widthFix"
class="img-map"
/>
</view>
</view>
</view>
<view
v-if="mapData.middleImage"
class="middle-img-wrap"
>
<image
:src="mapData.middleImage"
mode="widthFix"
class="img"
/>
</view>
<view v-if="goods.length > 0" class="list-wrap">
<view class="list-box flex flex-wrap">
<view
v-for="item in goods"
:key="item.id"
class="item"
@click="goGoods(item.productId)"
>
<image
:src="webUrl + '/home/mark-land.png'"
class="mark-img"
/>
<image
:src="item.storeImage"
mode="scaleToFill"
class="good-img"
/>
<view class="content flex flex-col jc-between">
<view class="more-t bold">{{ item.title }}</view>
<view class="one-t desc">{{ item.description }}</view>
<view class="flex jc-between ai-center">
<text class="price">{{ item.price }}</text>
<image
:src="webUrl + '/home/icon-cart.png'"
class="btn"
/>
</view>
</view>
</view>
</view>
<image
v-if="isCompleteLoadGood"
:src="webUrl + '/home/no-data-bg.png'"
mode="widthFix"
class="loadend"
/>
</view>
<image
v-if="goods.length === 0"
:src="webUrl + '/20231023131208675588.png'"
class="img-nodata"
mode="scaleToFill"
/>
</view>
<goo-skeleton
v-else
:show-avatar="false"
/>
</view>
</template>
<script>
import {
getProvince,
getProvinceGoods,
getProvinceList
} from "@/api/product"
import { pageListenMixins } from '@/mixins/pageListenMixins'
export default {
name: 'LandMarkPage',
mixins: [pageListenMixins],
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
keyword: '',
isLoad: false,
page: 1,
navList: [],
navIndex: 0,
mapData: null,
goods: [],
isCompleteLoadGood: false,
pageKeyId: Object.freeze('landmarkGoodsIndex')
}
},
onLoad() {
this.getNavList()
},
onHide() {
this.pageToHideHandle()
},
onReachBottom() {
if (this.isCompleteLoadGood) {
return
}
this.page++
this.fetchGoods()
},
methods: {
getNavList() {
getProvinceList().then(({data}) => {
this.navList = data
this.changeNav(this.navIndex)
})
},
changeNav(index) {
this.navIndex = index
this.page = 1
this.goods = []
this.isCompleteLoadGood = false
this.getMap()
this.fetchGoods()
},
getMap() {
const id = this.navList[this.navIndex]['id']
getProvince(id).then(({data}) => {
this.mapData = data
this.isLoad = true
})
},
fetchGoods() {
const id = this.navList[this.navIndex]['id']
getProvinceGoods(id, this.keyword, this.page).then(({data}) => {
const len = data.length
for (let i = 0; i < len; i++) {
this.goods.push(data[i])
}
if (len === 0 || len < 10) {
this.isCompleteLoadGood = true
}
})
},
goGoods(id) {
uni.navigateTo({
url: `/pages/shop/GoodsCon/index?id=${id}&from=landmark`
})
}
}
}
</script>
<style scoped lang="less">
.pkg-product-land-mark {
padding: 20rpx;
background: #f0f0f0;
.top-box {
border-radius: 20rpx;
background-color: #fff;
.view-box {
position: relative;
padding: 20rpx;
border-radius: 20rpx;
overflow: hidden;
.img-map {
display: block;
width: 100%;
}
}
.nav {
padding: 20rpx 20rpx 0 20rpx;
overflow-x: scroll;
.nav-item + .nav-item {
margin: 0 0 0 20rpx;
}
.nav-item {
position: relative;
box-sizing: border-box;
padding: 0 32rpx 20rpx 0;
color: #333;
font-size: 32rpx;
.bg {
display: none;
position: absolute;
bottom: 0;
right: 6rpx;
width: 63rpx;
height: 42rpx;
}
}
.active {
font-size: 40rpx;
font-weight: bold;
.bg {
display: block;
}
}
}
}
.middle-img-wrap {
margin: 20rpx 0 0 0;
.img {
display: block;
width: 100%;
border-radius: 20rpx;
}
}
.list-box {
margin-top: 24rpx;
.item {
position: relative;
width: 344rpx;
margin-right: 22rpx;
margin-bottom: 22rpx;
border-radius: 20rpx;
background: #FFFFFF;
overflow: hidden;
.mark-img {
position: absolute;
top: 0;
right: 0;
z-index: 3;
display: block;
width: 84rpx;
height: 74rpx;
}
.good-img {
display: block;
width: 344rpx;
height: 344rpx;
}
.content {
height: 156rpx;
padding: 8rpx 8rpx 18rpx 8rpx;
.more-t {
font-size: 28rpx;
line-height: 36rpx;
color: #333;
}
.desc {
padding: 5rpx 0;
height: 34rpx;
color: #FFC543;
font-size: 24rpx;
}
.price {
font-size: 40rpx;
line-height: 40rpx;
font-weight: bold;
color: #C52733;
}
.btn {
display: block;
width: 48rpx;
height: 48rpx;
}
}
}
.item:nth-child(2n) {
margin-right: 0;
}
}
.list-wrap {
margin: 20rpx 0 0 0;
.loadend {
width: 100%;
}
}
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
}
</style>