zhwl-miniapp/pages/shop/list.vue

221 lines
9.6 KiB
Vue
Raw Normal View History

2025-06-26 12:38:35 +08:00
<template>
<view class="waper">
<u-navbar :autoBack="true" :bgColor="scrollTop > 20 ? '#fff' : 'transparent'" :left-icon-color="scrollTop > 20 ? '#303133' : '#FFF'">
<view slot='center' class="navbar_title">{{scrollTop > 20 ? '文创特产' : ''}}</view>
</u-navbar>
<view class="banner">
<swiper :autoplay="true" :interval="5000" :duration="1000">
<swiper-item>
<image src="https://common/shop_bg.png" mode=""></image>
</swiper-item>
</swiper>
</view>
<view class="waper_box">
<view class="search">
<view class="icon">
<u-icon name="search" color="#999" size="40rpx"></u-icon>
</view>
<input type="text" placeholder="搜索商品/关键词" v-model="title" placeholder-class="placeholder" @input="setTitle" />
</view>
<view class="hot" v-if="recommendList.length > 0">
<view class="home_title">
<view class="left">
<view>口碑榜</view>
</view>
<view class="right">
<u-icon name="arrow-right" color="rgba(0,0,0,0.45)" size="32rpx" top="2rpx"></u-icon>
</view>
</view>
<view class="hot_waper">
<scroll-view scroll-x="true">
<navigator hover-class="none" class="list" v-for="(i, index) in recommendList" :key="index" :url="'/pages/shop/detail?id=' + i.id">
<image :src="$utils.setImgUrl(i.image)" mode=""></image>
<view class="title">{{i.title}}</view>
<view class="money">
<text></text>
<text>{{i.price}}</text>
</view>
</navigator>
</scroll-view>
</view>
</view>
<view class="list_box">
<scroll-view scroll-x="true">
<view class="menu">
<view v-for="(i, index) in menu" :key="index" :class="{active: menuIndex === i.id}" @click="tabMenu(i)">
{{i.name}}
</view>
</view>
</scroll-view>
<view class="list_waper">
<navigator class="list" v-for="(i, index) in list" :key="index" hover-class="none" :url="'/pages/shop/detail?id=' + i.id">
<view class="img">
<image :src="$utils.setImgUrl(i.image)" mode=""></image>
</view>
<view class="info">
<view>{{i.title}}</view>
<view>
<text>{{i.price}}</text>
<text>已售{{(i.showSales ? i.showSales : 0) + i.sales}}</text>
</view>
</view>
</navigator>
<view class="null" v-if="list.length == 0">~ 暂无数据 ~</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data () {
return {
scrollTop: 0,
menu: [],
menuIndex: '',
list: [],
total: 0,
title: '',
categoryList: [],
recommendList: [],
page: 1,
loding: false
}
},
onPageScroll (e) {
this.scrollTop = e.scrollTop;
},
onReachBottom () {
if (this.loding) {
return false;
}
if (this.list.length >= this.total) {
return false;
}
this.page ++;
this.getList();
},
async onLoad () {
let config = uni.getStorageSync('configData');;
let category = await this.$shop.getCategoryList({ pid: 0, scenicId: this.$scenicId, storeId: 1 });
let arr = [{ name: '全部商品', id: '' }];
category.data.forEach((item) => {
arr.push({ name: item.name, id: item.id })
})
this.menu = arr;
let shop = await this.$shop.getGoodsList({ pageNum: 1, pageSize: 3, flag: 'recommend' });
this.recommendList = shop.rows;
this.getList();
},
methods: {
setTitle () {
this.page = 1;
this.getList();
},
async getList () {
this.loding = true;
let data = { pageNum: this.page, pageSize: 10 };
if (this.menuIndex) data.categoryIds = this.menuIndex;
if (this.title) data.title = this.title;
let info = await this.$shop.getGoodsList(data);
this.total = info.total;
if (this.page == 1) this.list = [];
this.list = this.list.concat(info.rows);
this.loding = false;
},
tabMenu (info) {
this.menuIndex = info.id;
this.page = 1;
this.getList();
}
}
}
</script>
<style lang="scss">
.banner{
width: 100%; height: 588rpx;
swiper{ width: 100%; height: 100%; }
}
.waper_box{
width: 100%; background: #FFFFFF; border-radius: 30rpx 30rpx 0 0; box-sizing: border-box; padding: 70rpx 24rpx; margin-top: -98rpx; position: relative; z-index: 5;
.search{
width: 100%; height: 80rpx; border-radius: 40rpx; box-sizing: border-box; padding-left: 82rpx; padding-right: 32rpx; position: relative; background: #F6F6F6; margin-bottom: 40rpx;
.icon{ position: absolute; left: 32rpx; top: 50%; transform: translateY(-50%); }
input{ width: 100%; height: 100%; font-size: 28rpx; color: rgba(0,0,0,0.25); }
.placeholder{ color: #999; }
}
.hot{
width: 100%;
.home_title{
width: 100%; display: flex; justify-content: space-between; align-items: center; height: 50rpx;
.left{
view{ line-height: 53rpx; color: rgba(0,0,0,0.85); font-size: 36rpx; font-weight: 500; position: relative; z-index: 3; }
}
.right{ display: flex; align-items: center; }
}
.hot_waper{
width: 100%; margin-top: 20rpx; box-sizing: border-box;
scroll-view{ width: 100%; white-space: nowrap; }
.list{
width: 220rpx; height: 100%; display: inline-block; vertical-align: top; margin-right: 21rpx; background: #FFFFFF; box-shadow: 0rpx 0rpx 32rpx 0rpx rgba(0,0,0,0.05); border-radius: 10rpx; padding-bottom: 14rpx; margin-bottom: 32rpx;
&:last-child{ margin-right: 0; }
image{ width: 220rpx; height: 220rpx; vertical-align: top; border-radius: 10rpx 10rpx 0 0; }
.title{ margin-top: 12rpx; height: 42rpx; line-height: 42rpx; color: rgba(0,0,0,0.85); font-size: 28rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; box-sizing: border-box; padding: 0 20rpx; }
.money{
margin-top: 4rpx; height: 38rpx; display: flex; align-items: flex-end; padding: 0 20rpx;
text{
color: #FF3333;
&:first-child{ font-size: 24rpx; position: relative; top: -2rpx; }
&:last-child{ font-size: 32rpx; }
}
}
}
}
}
.list_box{
width: 100%;
.menu{
width: 100%; display: flex; align-items: flex-end; flex-wrap: nowrap;
view{
vertical-align: top; margin-right: 36rpx; height: 42rpx; line-height: 33rpx; color: rgba(0,0,0,0.45); font-size: 28rpx; white-space: nowrap;
&.active{
font-weight: 500;
font-size: 36rpx;
color: rgba(0,0,0,0.85);
line-height: 42rpx;
height: 53rpx;
}
}
}
.list_waper{
width: 100%; font-size: 0;
.list{
width: 341rpx; display: inline-block; vertical-align: top; background: #fff; margin-right: 20rpx; margin-top: 22rpx; border-radius: 10rpx; overflow: hidden;box-shadow: 0px 0px 32px 0px rgba(0,0,0,0.05);
&:nth-child(2n){ margin-right: 0; }
.img{
width: 100%; height: 316rpx;
}
.info{
width: 100%; height: 196rpx; box-sizing: border-box; padding: 19rpx 24rpx 25rpx;
view{
&:nth-child(1){ line-height: 40rpx; height: 80rpx; color: rgba(0,0,0,0.85); font-size: 28rpx; font-weight: 500; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
&:nth-child(2){
height: 44rpx; margin-top: 24rpx; display: flex; justify-content: space-between; align-items: flex-end;
text{
&:first-child{
color: #FF3333; font-size: 40rpx; font-weight: bold; padding-left: 24rpx; position: relative;
&::after{ content: "¥"; color: #FD3306; font-weight: normal; font-size: 24rpx; line-height: 34rpx; position: absolute; left: 0; bottom: 2rpx; }
}
&:last-child{ color: rgba(0,0,0,0.45); font-size: 28rpx; }
}
}
}
}
}
.null{ text-align: center; color: rgba(0,0,0,0.45); font-size: 28rpx; padding: 40rpx 0; }
}
}
}
</style>