Files
2024-06-06 11:50:53 +08:00

526 lines
13 KiB
Vue
Raw Permalink 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>
<view v-if="XCXIsSelect=='是'">
<!-- #ifdef H5 -->
<view class="hdSwiper flex justify-center" style="top: 80rpx;">
<!-- #endif -->
<!-- #ifndef H5 -->
<view class="hdSwiper flex justify-center">
<!-- #endif -->
<view class="hdSwiper-box">
<swiper :circular="true" :indicator-dots="false" :autoplay="true" :interval="3000" :duration="1000">
<swiper-item v-for="(item,index) in huodongList.activityImage.split(',')" :key="index">
<image :src="item" style="width: 100%;height: 100%;border-radius: 24rpx;" mode="aspectFill"></image>
</swiper-item>
</swiper>
</view>
</view>
<!-- #ifdef H5 -->
<view style="position: fixed;top: 360rpx;width: 100%;z-index: 999;">
<!-- #endif -->
<!-- #ifndef H5 -->
<view style="position: fixed;top: 290rpx;width: 100%;z-index: 999;">
<!-- #endif -->
<view class="flex justify-between align-center bg-white padding-tb padding-lr-sm">
<view class="flex-sub text-center" :class="current==1?'select':''" @click="confirm(1)">综合排序</view>
<view class="flex-sub text-center" :class="current==3?'select':''" @click="confirm(3)">距离优先</view>
<view class="flex-sub text-center" :class="current==4?'select':''" @click="confirm(4)">销量优先</view>
<view class="flex-sub text-center flex" @click="isShow = !isShow">
<view class="flex align-center" style="margin: 0 auto;">
<view :class="isShow?'select':''">筛选</view>
<u-icon v-if="!isShow" name="arrow-down" size="28"></u-icon>
<u-icon v-if="isShow" name="arrow-up" color="#FCD202" size="28"></u-icon>
</view>
</view>
</view>
<view v-if="isShow"
style="position: absolute;top: 90rpx;width: 100%;z-index: 1000;background: rgba(0,0,0,.5);height: 100vh;"
@click="isShow =false">
<view class="padding-lr bg-white">
<view class="flex justify-between align-center padding-tb-sm u-border-bottom"
v-for="(item,index) in options4" :key='index' @click.stop="getSelect(item)">
<view class="text-df" :class="item.select?'select':''">{{item.shopTypeName}}</view>
<u-icon v-if="item.select" name="checkmark" color="#FCD202" size="28"></u-icon>
</view>
</view>
</view>
</view>
<!-- #ifdef H5 -->
<view class="padding-lr-sm" style="margin-top: 390rpx;">
<!-- #endif -->
<!-- #ifndef H5 -->
<view class="padding-lr-sm" style="margin-top: 400rpx;">
<!-- #endif -->
<view class="" v-for="(item,index) in shopList" :key='index'>
<view class="margin-tb-sm flex justify-between bg-white padding"
@click="goNav('/pages/index/shop/index?shopId='+item.shopId)">
<image :src="item.shopCover" class="radius" style="width: 160rpx;height: 160rpx;"></image>
<view class=" margin-left-sm" style="width: 450rpx;">
<view class=" flex flex-direction justify-between">
<view class="text-lg text-bold text-black">{{item.shopName}}</view>
<view class="flex align-center margin-top-xs" style="width: 100%;">
<u-icon name="star-fill" color="#FD6416" size="28"></u-icon>
<text class="text-lg" style=""> {{item.shopScore?item.shopScore:0}}</text>
<text
class="text-gray flex-sub margin-left-xs">销量{{item.shopSales?item.shopSales:0}}</text>
<text class="text-gray margin-left-xs">{{item.errandTime}}分钟</text>
<text class="text-gray margin-left-xs">{{item.distance}}</text>
</view>
<view class="text-gray margin-top-xs flex justify-between">
<view>起送 ¥{{item.minimumDelivery}} 配送 ¥{{item.errandMoney?item.errandMoney:0}}
</view>
<view style="color: #FCD202;">{{item.autoSendOrder==1?'商家配送':'平台配送'}}</view>
</view>
<view class="text-gray margin-top-xs" v-if="item.businessHours&&item.lockHours">
营业时间{{item.businessHours}}-{{item.lockHours}}</view>
<view class="flex margin-top-xs justify-between align-start" style="width: 100%;">
<view class="flex flex-wrap align-center" style="width: 100%;height: 100%;overflow: hidden;">
<view class="lable flex justify-center align-center" v-if="item.exemptMinMoney">{{item.exemptMinMoney}}免配送费</view>
<view class="lable flex justify-center align-center" v-for="(ite,ind) in item.shopLable" :key='ind'
v-if="item.shopLable">
{{ite}}
</view>
<view class="lable flex justify-center align-center" v-if="item.couponList" style="border-radius: 4rpx;border: 1rpx solid red;background-color: #ffffff;color: red;box-sizing: border-box;" v-for="(it,ide) in item.couponList" :key="ide">{{it.minMoney}}{{it.money}}</view>
</view>
</view>
</view>
<view class="flex margin-top-xs">
<view v-for="(ite,ind) in item.goodsList" :key='ind'
@click.stop="goDet(ite.goodsId,item.shopId)" style="width: 33%;">
<image :src="ite.goodsCover" style="width: 120rpx;height: 120rpx;" class="radius"
mode=""></image>
<view class="u-line-1 text-df text-bold margin-top-xs">{{ite.goodsName}}</view>
<view class="text-bold margin-top-xs" style="color: #FD6416;">
<text class="text-sm">¥</text> {{ite.goodsMoney}}
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<empty v-if="!shopList.length"></empty>
</view>
<view v-else>
<view style="font-size: 28upx;" v-html="content"></view>
</view>
</template>
<script>
import empty from '@/components/empty.vue'
export default {
components: {
empty
},
data() {
return {
isShow: false,
hintShow: false,
shop: {},
page: 1,
limit: 10,
shopList: [],
current: 1,
shopTypeId: '',
userId: '',
lng: '',
lat: '',
value1: 0,
value2: 0,
value3: 0,
value4: 0,
options1: [{
label: '综合排序',
value: 1,
}],
options2: [{
value: '3',
label: "距离优先"
}],
options3: [{
value: '4',
label: "销量优先"
}],
options4: [{
id: '',
select: true,
shopTypeName: "全部"
}],
title: '综合排序',
title1: '距离优先',
title2: '销量优先',
title3: '筛选',
totalCount: 0,
XCXIsSelect: '否',
content:'',
huodongList:[],
activityTitle:'',
activityId:'',
}
},
onLoad(e) {
console.log(e)
this.XCXIsSelect = this.$queue.getData('XCXIsSelect');
if (this.XCXIsSelect == '否') {
this.getGuize()
uni.setNavigationBarTitle({
title: '隐私政策'
});
}
let that = this
uni.showLoading({
title: '加载中'
})
that.shopTypeId = e.value ? e.value : ''
that.value2 = e.value ? e.value : 0
that.userId = uni.getStorageSync('userId')
that.getShopType()
uni.getLocation({
type: 'gcj02', //返回可以用于uni.openLocation的经纬度
success: function(res) {
that.lat = res.latitude;
that.lng = res.longitude;
}
});
// that.getShopList()
if(e.activityTitle){
that.activityTitle = e.activityTitle
uni.setNavigationBarTitle({
title: e.activityTitle
});
that.getHuoDongList()
}
if(e.activityId){
this.activityId = e.activityId
uni.setNavigationBarTitle({
title: '推荐商家'
});
that.getHuoDongList()
}
},
methods: {
// 跳转商品详情
goDet(goodsId, shopId) {
let userId = this.$queue.getData('userId');
if (!userId) {
uni.navigateTo({
url: '/pages/public/login'
})
return
}
uni.navigateTo({
url: '/pages/index/shop/goodsDet?goodsId=' + goodsId + '&shopId=' + shopId + '&orderType=2'
})
},
//活动列表
getHuoDongList(){
let data = {
activityTitle:this.activityTitle,
activityId:this.activityId?this.activityId:''
}
this.$Request.getT('/app/activityManage/getActivityList',data).then(res => {
if (res.code === 0) {
this.huodongList = res.data.records[0]
this.activityId = this.huodongList.activityId
this.getShopList()
}
});
},
getGuize() {
this.$Request.getT('/app/common/type/237').then(res => {
if (res.code == 0) {
this.content = res.data.value;
// this.tit = res.data.min
}
});
},
goBack() {
uni.navigateBack({
})
},
getSelect(e) {
console.log(e)
this.options4.forEach(res => {
if (res.id == e.id) {
res.select = true
this.page = 1
this.shopTypeId = e.id
this.getShopList();
this.isShow = false
} else {
res.select = false
}
})
},
confirm(e) {
console.log(e)
this.page = 1
this.current = e;
this.getShopList();
},
confirm2(e) {
console.log(e)
this.page = 1
this.current = e;
this.getShopList();
},
confirm3(e) {
console.log(e)
this.page = 1
this.current = e;
this.getShopList();
},
confirm4(e) {
console.log(e)
this.page = 1
this.shopTypeId = e
this.getShopList();
},
// 商户列表
getShopList() {
// this.lng = uni.getStorageSync('lng')
// this.lat = uni.getStorageSync('lat')
let data = {
page: this.page,
limit: this.limit,
screen: this.current,
shopTypeId: this.shopTypeId,
lng: uni.getStorageSync('lng'),
lat: uni.getStorageSync('lat'),
activityId:this.activityId
}
this.$Request.getT('/app/goods/selectShop', data).then(res => {
uni.hideLoading()
if (res.code == 0) {
console.log(res.data.list)
this.totalCount = res.data.totalCount
res.data.list.forEach(ret => {
if (ret.distance > 1000) {
ret.distance = Number((ret.distance / 1000)).toFixed(2) + "km"
} else {
if (ret.distance == 0) {
ret.distance = "0m";
} else {
ret.distance = Number(ret.distance).toFixed(1) + "m";
}
}
ret.shopLable = ret.shopLable ? ret.shopLable.split(',') : ''
ret.shopCover = ret.shopCover ? ret.shopCover.split(',') :
'../../static/logo.png'
ret.errandTime = Math.round(ret.errandTime)
ret.shopScore = ret.shopScore.toFixed(1)
})
if (this.page == 1) {
this.shopList = res.data.list
} else {
this.shopList = [...this.shopList, ...res.data.list]
}
console.log(this.shopList)
}
})
},
// 商户类型
getShopType() {
this.$Request.getT('/app/shoptype/selectShopTypeList').then(res => {
if (res.code == 0) {
res.data.forEach(res => {
res.select = false
})
this.options4 = [...this.options4, ...res.data]
}
})
},
goNav(url) {
console.log(url)
if (this.userId) {
uni.navigateTo({
url
})
} else {
uni.navigateTo({
url: '/pages/public/login'
})
}
},
goShopDet(url, e) {
this.shop = e
console.log(url)
if (this.userId) {
uni.navigateTo({
url
})
} else {
uni.navigateTo({
url: '/pages/public/login'
})
}
},
},
onReachBottom: function() {
if (this.shopList.length < this.totalCount) {
this.page = this.page + 1;
this.getShopList()
} else {
uni.showToast({
title: '已经到底了',
icon: 'none'
})
}
},
}
</script>
<style lang="scss">
.select {
color: #FCD202;
}
.hdSwiper{
width: 100%;
height: 290rpx;
position: fixed;
top: 0;
z-index: 999;
background-color: #ffffff;
.hdSwiper-box{
width: 686rpx;
height: 100%;
border-radius: 24rpx;
}
}
.tabs {
margin: 20rpx 0;
display: flex;
justify-content: space-between;
align-items: center;
}
.tabs_name {
flex: 1;
/* display: inline-block; */
text-align: center;
margin-bottom: 30rpx 0;
position: relative;
display: flex;
/* justify-content: space-between; */
align-items: center;
}
.tabs_name view {
margin: 0 auto;
display: flex;
align-items: center;
}
.tabs_2 {
/* width: 30%; */
}
.actives {
color: #007AFF;
}
.tabsicon {
position: absolute;
top: 0;
right: 22rpx;
width: 20rpx;
height: 40rpx;
z-index: 1;
}
.tabs_icon {
width: 12rpx;
height: 8rpx;
z-index: 1;
margin-left: 10rpx;
}
.icon1 {
/* position: absolute; */
/* top: 6rpx; */
}
.icon2 {
position: absolute;
bottom: 6rpx;
}
.hintPopul {
width: 100%;
height: 100vh;
position: fixed;
top: 0;
background: rgba(0, 0, 0, .4);
z-index: 999;
}
.content_ {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
text-align: center;
width: 500rpx;
height: 400rpx;
border-radius: 20rpx;
background-color: #fff;
padding-top: 120rpx;
}
.content_ image {
position: absolute;
top: -50rpx;
left: 0;
right: 0;
margin: auto;
}
.hintText {
font-size: 30rpx;
}
.skuBtn {
width: 460rpx;
height: 60rpx;
line-height: 60rpx;
text-align: center;
background: #FCD202;
font-size: 28rpx;
border: 2rpx solid #FCD202;
color: #333333;
border-radius: 50rpx;
font-weight: 700;
margin: auto;
}
.lable {
border: 1rpx solid #FFE6D9;
height: 40rpx;
padding: 0 14rpx;
background: #FFE6D9;
border-radius: 4rpx;
font-weight: 500;
color: #FD6416;
font-size: 20rpx;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
</style>