You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

442 lines
9.1 KiB

<template>
<view class="container">
<!-- 搜索框 -->
<view class="search-box" customStyle="background-color: #ffffff;padding: 24upx;">
<u-search class="search" v-model="keyword" :clearabled="true" :showAction="false" bgColor="#ffffff"
@search="search" @clear="search"></u-search>
<navigator url="/pages/cart/cart" open-type="switchTab" class="icon-box">
<image class="cart-icon" src="../../static/index/cart.svg" mode=""></image>
<u-badge type="error" class="cart-badge" :overflow-count="9" :count="cartNum"></u-badge>
</navigator>
</view>
<!-- 服务列表 -->
<view class="server-list">
<view class="server-item" v-for="item in serverList" :key="item.code" @click="goto(item.code)">
<view class="server-icon">
<image :src="`../../static/index/${item.code}.svg`" mode=""></image>
</view>
<view class="server-text">{{item.title}}</view>
</view>
</view>
<!-- 头部轮播 -->
<view class="carousel-section">
<swiper autoplay class="carousel" circular>
<swiper-item v-for="(item, index) in newAdvertiseList" :key="index"
:class="['carousel-item',item.length == 1?'single':'']">
<image @click="navToAdvertisePage(subItem)" mode="aspectFill" :key="subItem.id"
v-for="subItem in item" :src="subItem.pic"></image>
</swiper-item>
</swiper>
</view>
<!-- 标签列表 -->
<u-sticky bgColor="#f5f5f5">
<u-tabs bgColor="#f5f5f5" class="tag-list" :list="categoryList" :current="tagCurrent" @change="changeTag"
:activeStyle="{
color: '#ffffff',
fontWeight: 'bold',
transform: 'scale(1.05)'
}" active-color="#ffffff" :bar-height="0" :active-item-style="{
backgroundColor: '#CC342D'
}"></u-tabs>
</u-sticky>
<!-- 商城列表 -->
<view class="product-section">
<view v-for="(item, index) in recommendProductList" :key="index" class="product-item"
@click="navToDetailPage(item)">
<view class="image-wrapper">
<image :src="item.pic" mode="aspectFill"></image>
</view>
<text class="title clamp">{{item.name}}</text>
<!-- <text class="title2 clamp">{{item.subTitle}}</text> -->
<text class="price">¥{{item.price}}</text>
</view>
</view>
<uni-load-more :status="loadingType"></uni-load-more>
</view>
</template>
<script>
import {
mapState
} from 'vuex';
import {
fetchContent,
fetchContentV2,
fetchRecommendProductList
} from '@/api/home.js';
import {
fetchCartList
} from '@/api/cart.js';
import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
import {
groupData
} from '@/utils/index.js'
export default {
components: {
uniLoadMore
},
data() {
return {
keyword: '',
cartNum: 0,
serverList: [{
code: 'myOrders',
title: '我的订单',
},
{
code: 'collections',
title: '收藏',
},
{
code: 'records',
title: '足迹',
},
{
code: 'serverCenter',
title: '客服中心',
},
],
advertiseList: [],
recommendProductList: [],
hotProductList: [],
recommendParams: {
pageNum: 1,
pageSize: 4,
categoryId: '',
searchStr: '',
},
loadingType: 'more',
tagCurrent: 0,
categoryList: [{
id: '',
name: '全部',
}]
};
},
onLoad() {
// this.loadData();
},
onShow() {
this.loadData();
},
//下拉刷新
onPullDownRefresh() {
this.recommendParams = {
pageNum: 1,
pageSize: 4,
searchStr: '',
categoryId: ''
};
this.tagCurrent = 0
this.keyword = ''
this.loadData();
},
//加载更多
onReachBottom() {
this.recommendParams.pageNum++;
this.loadingType = 'loading';
fetchRecommendProductList(this.recommendParams).then(response => {
let addProductList = response.data;
if (response.data.length === 0) {
//没有更多了
this.recommendParams.pageNum--;
this.loadingType = 'nomore';
} else {
this.recommendProductList = this.recommendProductList.concat(addProductList);
this.loadingType = 'more';
}
})
},
computed: {
...mapState(['hasLogin']),
newAdvertiseList() {
console.log(groupData(this.advertiseList, 2))
return groupData(this.advertiseList, 2)
}
},
filters: {},
methods: {
/**
* 加载数据
*/
async loadData() {
fetchContent().then(response => {
console.log("onLoad", response.data);
this.advertiseList = response.data.advertiseList;
this.hotProductList = response.data.hotProductList;
fetchRecommendProductList(this.recommendParams).then(response => {
this.recommendProductList = response.data;
uni.stopPullDownRefresh();
})
});
fetchContentV2().then(response => {
this.categoryList = [{
id: '',
name: "全部"
}].concat(response.data.categoryList)
});
if (!this.hasLogin) {
return;
}
fetchCartList().then(response => {
this.cartNum = response.data.reduce((sum, item) => sum + item.quantity, 0);
})
},
//商品详情页
navToDetailPage(item) {
let id = item.id;
uni.navigateTo({
url: `/pages/product/product?id=${id}`
})
},
//广告详情页
navToAdvertisePage(item) {
let id = item.id;
console.log("navToAdvertisePage", item)
},
// 跳转
goto(code) {
switch (code) {
case 'myOrders':
uni.navigateTo({
url: '/pages/order/order?state=0'
})
break;
case 'collections':
uni.navigateTo({
url: '/pages/user/productCollection'
})
break;
case 'records':
uni.navigateTo({
url: '/pages/user/readHistory'
})
break;
case 'serverCenter':
uni.showToast({
title: '开发中,尽请期待!',
icon: 'none',
duration: 2000
});
break;
default:
break;
}
},
changeTag(index) {
console.log('index', index, this.categoryList[index])
this.tagCurrent = index
const currentTag = this.categoryList[index]
this.recommendParams.pageNum = 1
this.recommendParams.pageSize = 4
this.recommendParams.categoryId = currentTag.id
this.getProductList()
},
search() {
this.recommendParams.searchStr = this.keyword
this.recommendParams.pageNum = 1
this.recommendParams.pageSize = 4
this.getProductList()
},
getProductList() {
fetchRecommendProductList(this.recommendParams).then(response => {
this.recommendProductList = response.data;
if (response.data.length === 0) {
this.loadingType = 'nomore';
} else {
this.loadingType = 'more';
}
uni.stopPullDownRefresh();
})
}
},
}
</script>
<style lang="scss">
page {
background: #f5f5f5;
}
.m-t {
margin-top: 16upx;
}
/* 搜索 */
.search-box {
padding: 8upx 12upx 32upx 36upx;
@include flex(x, center, center);
.search {
@include flex(x, center, center);
flex: 1;
}
.icon-box {
position: relative;
@include flex(x, center, center);
width: 56upx;
height: 56upx;
}
.cart-icon {
width: 48upx;
height: 48upx;
}
.cart-badge>view {
top: 0upx !important;
right: -12upx !important;
}
}
/* 服务列表 */
.server-list {
width: 100vw;
min-height: 120upx;
padding: 0 36upx;
display: flex;
flex-wrap: wrap;
.server-item {
width: 25%;
height: 120upx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.server-icon {
image {
width: 48upx;
height: 48upx;
}
}
.server-text {
color: rgba(0, 0, 0, 0.7);
}
}
}
/* 头部 轮播图 */
.carousel-section {
position: relative;
.carousel {
height: 180upx;
padding: 36rpx;
box-sizing: content-box;
.carousel-item {
width: 100%;
height: 100%;
padding: 0 28upx;
overflow: hidden;
@include flex(x, center, center);
image {
height: 180upx;
width: 328upx;
margin: 0upx 10upx;
}
}
.carousel-item.single {
image {
width: 656upx;
}
}
}
}
/* 标签列表 */
.tag-list {
// padding: 0 36upx;
.u-scroll-box {
view {
background-color: #ffffff;
border-radius: 60upx;
margin: 9upx;
}
}
}
/* 商品列表 */
.product-section {
display: flex;
flex-wrap: wrap;
padding: 0 36upx;
.product-item {
display: flex;
flex-direction: column;
width: 48%;
background-color: #ffffff;
margin-bottom: 36upx;
border-radius: 12upx;
&:nth-child(2n+1) {
margin-right: 4%;
}
}
.image-wrapper {
width: 100%;
height: 324upx;
border-radius: 3px;
overflow: hidden;
image {
width: 100%;
height: 100%;
opacity: 1;
}
}
.image-wrapper-brand {
width: 100%;
height: 150upx;
border-radius: 3px;
overflow: hidden;
image {
width: 100%;
height: 100%;
opacity: 1;
}
}
.title {
padding: 0 36upx;
font-size: $font-base;
color: $font-color-dark;
line-height: 80upx;
}
.title2 {
font-size: $font-sm;
color: $font-color-light;
line-height: 40upx;
}
.price {
padding: 0 36upx 36upx 36upx;
font-size: $font-lg;
color: #000000;
line-height: 1;
font-weight: 500;
}
}
</style>