<template>
|
|
<view>
|
|
<view class="bg" :style="{display : isSearch ? 'block' : 'none'}"></view>
|
|
<view class="flex">
|
|
<view
|
|
class="languageUpdate"
|
|
>
|
|
<languageUpdate color="#fff"/>
|
|
</view>
|
|
<view class="search">
|
|
<u-search
|
|
v-model="searchKey"
|
|
:showAction="false"
|
|
@change="changeSearch"
|
|
style="position: relative;z-index: 999999999;"
|
|
:placeholder="$t('page.home.searchPlaceholder')">
|
|
</u-search>
|
|
<!-- <u-overlay :show="isSearch"></u-overlay> -->
|
|
<!-- <view @tap.stop :class="{'product-box' : true, 'product-box-active' : isSearch && searchList.length}">
|
|
<productList :list="searchList"/>
|
|
</view> -->
|
|
</view>
|
|
|
|
<u-scroll-list class="classList">
|
|
<view
|
|
class="classList-item"
|
|
:style="{color : class_id == item.id ? '#0f0' : '#fff'}"
|
|
v-for="(item, index) in classList"
|
|
:key="index" @click="toProductList(item)">
|
|
{{item.title}}
|
|
</view>
|
|
</u-scroll-list>
|
|
</view>
|
|
|
|
|
|
<view class="swipe" :style="{display : isSearch ? 'block' : 'none'}">
|
|
<u-swiper
|
|
:list="banner"
|
|
indicator
|
|
keyName="image"
|
|
indicatorMode="line"
|
|
circular
|
|
></u-swiper>
|
|
</view>
|
|
|
|
<u-notice-bar
|
|
bgColor="#fff"
|
|
color="#e3392f"
|
|
:text="notice.keyVal"
|
|
class="notice" :style="{display : isSearch ? 'block' : 'none'}"></u-notice-bar>
|
|
|
|
<view class="product" :style="{display : isSearch ? 'block' : 'none'}">
|
|
<view class="title">
|
|
<text>{{ $t('page.home.product.flash-sales') }}</text>
|
|
</view>
|
|
<view class="productFlashSales">
|
|
<view class="productFlashSales-top">
|
|
<!-- <productFlashSales :list="shopPage.records"/> -->
|
|
<productFlashSales :list="productFlashSales"/>
|
|
</view>
|
|
<!-- <view class="productFlashSales-bottom">
|
|
{{ $t('page.home.product.View-more-flash-sales') }}
|
|
</view> -->
|
|
</view>
|
|
</view>
|
|
|
|
<view class="active-image" :style="{display : isSearch ? 'block' : 'none'}" v-if="IndexImage.keyImage">
|
|
<img style="border-radius: 10px;" width="100%" v-for="(item,index) in IndexImage.keyImage.split(',')" :src="item" alt="" />
|
|
</view>
|
|
|
|
<view class="product">
|
|
<view class="title">
|
|
<text>{{ $t('page.home.product.title1') }}</text>
|
|
<!-- <u-icon name="arrow-right" size="17"></u-icon> -->
|
|
</view>
|
|
<productList :list="searchList"/>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import productList from '@/components/product/productList.vue'
|
|
import languageUpdate from '@/components/base/languageUpdate.vue'
|
|
import productFlashSales from '@/components/product/productFlashSales.vue'
|
|
export default {
|
|
components : {
|
|
productList,
|
|
languageUpdate,
|
|
productFlashSales
|
|
},
|
|
computed : {
|
|
searchList(){
|
|
if(this.shopPage){
|
|
return this.shopPage.filter(n => {
|
|
return !this.searchKey || n.title.includes(this.searchKey)
|
|
})
|
|
}
|
|
return []
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
notice : {
|
|
keyVal : ''
|
|
},
|
|
isSearch : true,
|
|
searchKey : '',
|
|
bgColor : '#000',
|
|
banner: [],
|
|
classList : [],
|
|
productFlashSales : [],
|
|
shopPage : [],
|
|
IndexImage : {},
|
|
class_id : undefined,
|
|
}
|
|
},
|
|
onShow(){
|
|
this.getData()
|
|
},
|
|
methods: {
|
|
getData(){
|
|
this.request('getBanner').then(res => {
|
|
this.banner = parseList(res.result)
|
|
})
|
|
|
|
this.request('getNotice').then(res => {
|
|
this.notice = res.result || {}
|
|
})
|
|
|
|
this.request('getIndexImage').then(res => {
|
|
this.IndexImage = res.result || {};
|
|
})
|
|
|
|
this.request('getClassList').then(res => {
|
|
res.result.unshift({
|
|
title : this.$t('page.home.all'),
|
|
})
|
|
this.classList = parseList(res.result);
|
|
})
|
|
|
|
this.getProduct()
|
|
|
|
this.request('getShopHost').then(res => {
|
|
this.productFlashSales = parseList(res.result)
|
|
})
|
|
},
|
|
getProduct(id){
|
|
this.request('getShopPage', {},
|
|
{
|
|
"classId": id,
|
|
"pageSize":999,
|
|
"currentPage": 0
|
|
}
|
|
)
|
|
.then(res => {
|
|
this.shopPage = parseList(res.result.records);
|
|
})
|
|
},
|
|
toProductList(item){
|
|
// uni.navigateTo({
|
|
// url: '/pages/productList/productList?title=' + item.title + '&id=' + item.id
|
|
// })
|
|
this.class_id = item.id
|
|
this.getProduct(item.id)
|
|
this.isSearch = !this.searchKey && !this.class_id
|
|
},
|
|
SearchBlur(){
|
|
setTimeout(() => this.isSearch = true, 200)
|
|
},
|
|
changeSearch(){
|
|
this.isSearch = !this.searchKey && !this.class_id
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.bg{
|
|
background-color: #E3392F;
|
|
height: 220px;
|
|
width: 100%;
|
|
top: 0;
|
|
left: 0;
|
|
z-index: -1;
|
|
position: absolute;
|
|
border-bottom-left-radius: 25px;
|
|
border-bottom-right-radius: 25px;
|
|
}
|
|
|
|
.languageUpdate{
|
|
height: 50px;
|
|
display: flex;
|
|
padding: 0 10px;
|
|
}
|
|
.flex{
|
|
padding: 0 10px;
|
|
padding-top: 10px;
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 99;
|
|
background-color: #E3392F;
|
|
::v-deep .u-scroll-list__indicator {
|
|
display: none !important;
|
|
}
|
|
.search{
|
|
position: relative;
|
|
margin-bottom: 20px;
|
|
.product-box{
|
|
position: absolute;
|
|
top: 110%;
|
|
left: -10px;
|
|
width: 100vw;
|
|
z-index: 99;
|
|
height: 0;
|
|
overflow: hidden;
|
|
overflow-y: auto;
|
|
z-index: 999999999;
|
|
}
|
|
.product-box-active{
|
|
height: auto;
|
|
min-height: 200px;
|
|
max-height: calc(100vh - 50px);
|
|
}
|
|
}
|
|
.classList{
|
|
.classList-item{
|
|
flex-shrink: 0;
|
|
color: #fff;
|
|
white-space: nowrap;
|
|
padding: 0 10px;
|
|
padding-bottom: 10px;
|
|
font-size: 26rpx;
|
|
}
|
|
}
|
|
}
|
|
.swipe{
|
|
width: 100%;
|
|
padding: 0 10px;
|
|
box-sizing: border-box;
|
|
z-index: 6;
|
|
}
|
|
.notice{
|
|
margin: 10px;
|
|
border-radius: 15px;
|
|
border: 1px solid #FCDEB2;
|
|
}
|
|
.productFlashSales{
|
|
border-radius: 10px;
|
|
margin: 10px;
|
|
background-color: #fff;
|
|
box-shadow: 1px 1px 1px 1px #00000005;
|
|
.productFlashSales-top{
|
|
|
|
}
|
|
.productFlashSales-bottom{
|
|
border-top: 1px solid #00000024;
|
|
margin: 10px;
|
|
padding: 15px;
|
|
text-align: center;
|
|
color: #666666;
|
|
font-size: 26rpx;
|
|
}
|
|
}
|
|
.active-image{
|
|
margin: 20px 10px;
|
|
}
|
|
.product{
|
|
.title{
|
|
border-left: 5px solid #E3392F;
|
|
margin: 10px;
|
|
padding: 0 5px;
|
|
display: flex;
|
|
font-weight: 900;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
color: #E3392F;
|
|
}
|
|
}
|
|
</style>
|