8 changed files with 109 additions and 534 deletions
@ -0,0 +1,100 @@ |
|||||
|
<template> |
||||
|
<view class="custom-tab-bar"> |
||||
|
<view class="tab-item" v-for="(item,i) in tabBarList" :key="i" @click="switchTab(i)"> |
||||
|
<text :style="{ 'color': currentTab === i?item.selectColor:'#fff' }">{{ item.text }}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
currentTab: { |
||||
|
type: Number, |
||||
|
default: 0 |
||||
|
} |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
tabBarList: [ |
||||
|
{ |
||||
|
"pagePath": "pages/map/map", |
||||
|
"selectColor": "#00FF00", |
||||
|
"text": "首页" |
||||
|
}, |
||||
|
{ |
||||
|
"pagePath": "pages/coupon/coupon", |
||||
|
"selectColor": "#00FF00", |
||||
|
"text": "阅读体" |
||||
|
}, |
||||
|
{ |
||||
|
"pagePath": "pages/index/index", |
||||
|
"selectColor": "#00FF00", |
||||
|
"text": "有感商店" |
||||
|
}, |
||||
|
{ |
||||
|
"pagePath": "pages/cart/cart", |
||||
|
"selectColor": "#00FF00", |
||||
|
"text": "智能体" |
||||
|
}, |
||||
|
{ |
||||
|
"pagePath": "pages/user/user", |
||||
|
"selectColor": "#00FF00", |
||||
|
"text": "iSoul" |
||||
|
} |
||||
|
] |
||||
|
|
||||
|
}; |
||||
|
}, |
||||
|
onLoad() { |
||||
|
this.getCurrentTab(); |
||||
|
}, |
||||
|
methods: { |
||||
|
getCurrentTab() { |
||||
|
const pages = getCurrentPages(); |
||||
|
const currentPage = pages[pages.length - 1]; |
||||
|
const currentPath = currentPage.route; |
||||
|
tabBarList.forEach((item, index) => { |
||||
|
if (item.pagePath === currentPath) { |
||||
|
this.currentTab = index; |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
switchTab(index) { |
||||
|
if (this.currentTab === index) return; |
||||
|
uni.switchTab({ |
||||
|
url: '/' + tabBarList[index].pagePath |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.custom-tab-bar { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
display: flex; |
||||
|
justify-content: space-around; |
||||
|
align-items: center; |
||||
|
height: 123rpx; |
||||
|
z-index: 30; |
||||
|
background: #989898; |
||||
|
} |
||||
|
|
||||
|
.tab-item { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
flex: 1; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.tab-item text { |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
</style> |
@ -1,58 +0,0 @@ |
|||||
<template> |
|
||||
<view> |
|
||||
<view class="searchBox flex-between"> |
|
||||
<view class="inputBox"> |
|
||||
<img src="https://static.ticket.sz-trip.com/taihu/images/scenic/searchGray.png" alt=""> |
|
||||
<view> |
|
||||
搜索你想要的产品 |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="btn"> |
|
||||
搜索 |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
</script> |
|
||||
|
|
||||
<style scoped lang="scss"> |
|
||||
.searchBox{ |
|
||||
width: 697rpx; |
|
||||
height: 67rpx; |
|
||||
background: rgba(242, 242, 242, .7); |
|
||||
border-radius: 33rpx; |
|
||||
margin: auto; |
|
||||
padding: 0 7rpx 0 29rpx; |
|
||||
box-sizing: border-box; |
|
||||
|
|
||||
.inputBox{ |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
font-size: 31rpx; |
|
||||
font-family: PingFang SC; |
|
||||
font-weight: 400; |
|
||||
color: #999999; |
|
||||
|
|
||||
img{ |
|
||||
width: 28rpx; |
|
||||
height: 30rpx; |
|
||||
margin-right: 19rpx; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
.btn{ |
|
||||
width: 107rpx; |
|
||||
height: 53rpx; |
|
||||
background: #00D7ED; |
|
||||
border-radius: 27rpx; |
|
||||
text-align: center; |
|
||||
line-height: 53rpx; |
|
||||
font-size: 28rpx; |
|
||||
font-family: PingFang SC; |
|
||||
font-weight: 400; |
|
||||
color: #FFFFFF; |
|
||||
} |
|
||||
} |
|
||||
</style> |
|
@ -1,101 +0,0 @@ |
|||||
<template> |
|
||||
<div class="title-header-box search" :style="{height:`${height}px`}"> |
|
||||
<div class="title-header" |
|
||||
:style="{height:`${height}px`,top:`${height+padHeight}px`,backgroundColor:bgColor || '#FFFFFF'}"> |
|
||||
<div class="search-box" :style="{backgroundColor:bgColor ? '#F2F2F2' : '#F2F2F2'}"> |
|
||||
<img src="https://static.ticket.sz-trip.com/taizhou/images/search.png" alt=""> |
|
||||
<input type="text" class="input" placeholder="请输入想要的产品或服务" v-model="keywords" @confirm="search" /> |
|
||||
<div class="btn" @click="search()">搜索</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
export default { |
|
||||
name: "SearchHeader", |
|
||||
props: ['bgColor'], |
|
||||
data() { |
|
||||
return { |
|
||||
keywords: '', |
|
||||
padHeight: 0, |
|
||||
height: 88, |
|
||||
} |
|
||||
}, |
|
||||
methods: { |
|
||||
search() { |
|
||||
uni.$emit('search', { |
|
||||
keywords: this.keywords |
|
||||
}) |
|
||||
}, |
|
||||
}, |
|
||||
created() { |
|
||||
// #ifdef MP-WEIXIN |
|
||||
let systemInfo = uni.getSystemInfoSync(), |
|
||||
rect = uni.getMenuButtonBoundingClientRect(); |
|
||||
this.height = (rect.top - systemInfo.statusBarHeight) * 2 + rect.height |
|
||||
this.padHeight = systemInfo.statusBarHeight |
|
||||
// #endif |
|
||||
|
|
||||
// #ifdef APP-PLUS |
|
||||
let systemInfo = uni.getSystemInfoSync() |
|
||||
this.height = systemInfo.statusBarHeight*1.5 |
|
||||
this.padHeight = systemInfo.statusBarHeight |
|
||||
// #endif |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<style scoped> |
|
||||
.title-header-box { |
|
||||
padding: 16rpx 0; |
|
||||
} |
|
||||
|
|
||||
.title-header { |
|
||||
padding: 16rpx 0; |
|
||||
width: 100%; |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
top: 0; |
|
||||
margin: auto; |
|
||||
z-index: 1000; |
|
||||
} |
|
||||
|
|
||||
.search-box { |
|
||||
width: 697rpx; |
|
||||
height: 68rpx; |
|
||||
margin: 0 auto; |
|
||||
border-radius: 60rpx; |
|
||||
padding: 6rpx 7rpx 6rpx 26rpx; |
|
||||
font-size: 26rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
box-sizing: border-box; |
|
||||
background: #F2F2F2; |
|
||||
} |
|
||||
|
|
||||
.search-box img { |
|
||||
width: 28rpx; |
|
||||
height: 30rpx; |
|
||||
} |
|
||||
|
|
||||
.search-box .input { |
|
||||
flex: 1; |
|
||||
border: none; |
|
||||
outline: none; |
|
||||
background: none; |
|
||||
color: #000000; |
|
||||
margin: 0 20rpx; |
|
||||
background-color: #F2F2F2; |
|
||||
} |
|
||||
|
|
||||
.search-box .btn { |
|
||||
/* background-color: #FFC825; */ |
|
||||
border-radius: 27rpx; |
|
||||
font-size: 28rpx; |
|
||||
color: #FFFFFF; |
|
||||
padding: 10rpx 26rpx; |
|
||||
background-color: #00AAFF; |
|
||||
} |
|
||||
</style> |
|
@ -1,99 +0,0 @@ |
|||||
<template> |
|
||||
<view class="title-header-box" :style="{height:`${height+padHeight}px`}"> |
|
||||
<view class="title-header" :style="{paddingTop:`${padHeight}px`,height:`${height}px`}"> |
|
||||
<view class="left" @click="goBack" v-if="title !== '太湖'"><i class="iconfont"></i></view> |
|
||||
<view class="center">{{title ? title.substr(0,10) : '太湖'}}</view> |
|
||||
<view class="right"></view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
export default { |
|
||||
name: "SearchHeader", |
|
||||
props: ['title', 'icon'], |
|
||||
watch: { |
|
||||
'title'(newVal, oldVal) { |
|
||||
this.title = newVal |
|
||||
} |
|
||||
}, |
|
||||
data() { |
|
||||
return { |
|
||||
keywords: '', |
|
||||
padHeight: 0, |
|
||||
height: 88 |
|
||||
} |
|
||||
}, |
|
||||
methods: { |
|
||||
search() { |
|
||||
uni.$emit('search', { |
|
||||
keywords: this.keywords |
|
||||
}) |
|
||||
}, |
|
||||
}, |
|
||||
created() { |
|
||||
let systemInfo = uni.getSystemInfoSync(), |
|
||||
rect = uni.getMenuButtonBoundingClientRect(); |
|
||||
let height = (rect.top - systemInfo.statusBarHeight) * 2 + rect.height |
|
||||
this.height = height |
|
||||
this.padHeight = systemInfo.statusBarHeight |
|
||||
this.right = (systemInfo.screenWidth - rect.right) + rect.width |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<style scoped> |
|
||||
.title-header-box { |
|
||||
background-color: #F8F8F8; |
|
||||
color: #000000; |
|
||||
} |
|
||||
|
|
||||
.title-header { |
|
||||
/* background-color: #FFC825; */ |
|
||||
background: white; |
|
||||
display: flex; |
|
||||
justify-content: center; |
|
||||
align-items: center; |
|
||||
height: 88rpx; |
|
||||
position: fixed; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
top: 0; |
|
||||
z-index: 1000; |
|
||||
padding-top: 40rpx; |
|
||||
} |
|
||||
|
|
||||
.title-header .left { |
|
||||
padding-left: 30rpx; |
|
||||
width: 58rpx; |
|
||||
display: flex; |
|
||||
position: absolute; |
|
||||
left: 0; |
|
||||
} |
|
||||
|
|
||||
.title-header .search-box { |
|
||||
width: 502rpx; |
|
||||
height: 58rpx; |
|
||||
border-radius: 29rpx; |
|
||||
background: #F0F0F0; |
|
||||
padding: 0 26rpx; |
|
||||
font-size: 26rpx; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.title-header .search-box .iconfont { |
|
||||
flex-shrink: 0; |
|
||||
color: #999999; |
|
||||
font-size: 30rpx; |
|
||||
margin-right: 10; |
|
||||
} |
|
||||
|
|
||||
.title-header .search-box .input { |
|
||||
flex: 1; |
|
||||
border: none; |
|
||||
outline: none; |
|
||||
background: none; |
|
||||
color: #666; |
|
||||
} |
|
||||
</style> |
|
@ -1,260 +0,0 @@ |
|||||
<template> |
|
||||
<view class="bg" :style="{backgroundColor:bgColor || '#F5F5F5'}"> |
|
||||
<view class="titles">为您推荐</view> |
|
||||
<view class="goodBox" v-if="type == 0 && (list && list.length>0)"> |
|
||||
<view> |
|
||||
<view class="goodItem" v-for="(item,index) in leftList" :key="item.id" @click="gotoDetail(item.id)"> |
|
||||
<image :src="showImg(item.image)" mode="widthFix"></image> |
|
||||
<view class="goodContent"> |
|
||||
<view class="title"> |
|
||||
{{item.title}} |
|
||||
</view> |
|
||||
<view class="tags" v-if="item.label"> |
|
||||
<view v-for="(tagItem,tagIndex) in item.label.split(',').slice(0,2)" :key="tagIndex" class="text-overflow"> |
|
||||
{{tagItem}} |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="price">{{showPrice(item.price)}}</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view> |
|
||||
<view class="goodItem" v-for="(item,index) in rightList" :key="item.id" @click="gotoDetail(item.id)"> |
|
||||
<image :src="showImg(item.image)" mode="widthFix"></image> |
|
||||
<view class="goodContent"> |
|
||||
<view class="title"> |
|
||||
{{item.title}} |
|
||||
</view> |
|
||||
<view class="tags" v-if="item.label"> |
|
||||
<view v-for="(tagItem,tagIndex) in item.label.split(',').slice(0,2)" :key="tagIndex" class="text-overflow"> |
|
||||
{{tagItem}} |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="price">{{showPrice(item.price)}}</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
|
|
||||
<view class="goodBox" v-if="type == 1 && (list && list.length>0)"> |
|
||||
<view> |
|
||||
<view class="goodItem" v-for="(item,index) in leftList" :key="item.id" @click="gotoDetail(item.goods.id)"> |
|
||||
<image :src="showImg(item.goods.image)" mode="widthFix"></image> |
|
||||
<view class="goodContent"> |
|
||||
<view class="title"> |
|
||||
{{item.goods.title}} |
|
||||
</view> |
|
||||
<view class="tags" v-if="item.goods.label"> |
|
||||
<view v-for="(tagItem,tagIndex) in item.goods.goods_new_tag.split(',').slice(0,2)" :key="tagIndex" class="text-overflow"> |
|
||||
{{tagItem}} |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="price">{{showPrice(item.goods.price)}}</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view> |
|
||||
<view class="goodItem" v-for="(item,index) in rightList" :key="item.id" @click="gotoDetail(item.goods.id)"> |
|
||||
<image :src="showImg(item.goods.image)" mode="widthFix"></image> |
|
||||
<view class="goodContent"> |
|
||||
<view class="title"> |
|
||||
{{item.goods.title}} |
|
||||
</view> |
|
||||
<view class="tags" v-if="item.goods.label"> |
|
||||
<view v-for="(tagItem,tagIndex) in item.goods.goods_new_tag.split(',').slice(0,2)" :key="tagIndex" class="text-overflow"> |
|
||||
{{tagItem}} |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="price">{{showPrice(item.goods.price)}}</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
</view> |
|
||||
<view class="finished-text" v-if="finished">没有更多数据了</view> |
|
||||
</view> |
|
||||
</template> |
|
||||
|
|
||||
<script> |
|
||||
import Base from "@/components/Base"; |
|
||||
export default{ |
|
||||
extends: Base, |
|
||||
// type:0,scenic_type_id:1景点,5酒店11民宿12美食;type:1,文创特产,tag_id:6=邮寄,7=自提 |
|
||||
props: ['scenic_type_id','tag_id','type','bgColor','exclude_id'], |
|
||||
data(){ |
|
||||
return { |
|
||||
list: [], |
|
||||
leftList: [], |
|
||||
rightList: [], |
|
||||
finished: false |
|
||||
} |
|
||||
}, |
|
||||
mounted() { |
|
||||
this.getList() |
|
||||
}, |
|
||||
methods: { |
|
||||
getList(){ |
|
||||
if(this.type == 0){ |
|
||||
this.Post({ |
|
||||
method: 'POST', |
|
||||
scenic_type_id: this.scenic_type_id, |
|
||||
exclude_id: this.exclude_id, |
|
||||
offset: this.list.length, |
|
||||
limit: 6 |
|
||||
},'/api/scenic/getScenicByType').then(res => { |
|
||||
res.data.forEach((item,index)=>{ |
|
||||
if(index%2 == 0){ |
|
||||
this.leftList.push(item) |
|
||||
}else{ |
|
||||
this.rightList.push(item) |
|
||||
} |
|
||||
}) |
|
||||
this.list = [...this.list, ...res.data]; |
|
||||
if (res.data.length < 6) { |
|
||||
this.finished = true |
|
||||
} |
|
||||
}) |
|
||||
}else{ |
|
||||
this.Post({ |
|
||||
method: 'POST', |
|
||||
type_id: 5, |
|
||||
exclude_id: this.exclude_id, |
|
||||
offset: this.list.length, |
|
||||
limit: 6, |
|
||||
tag_id: this.tag_id |
|
||||
},'/api/tag/getGoodsByTagId').then(res => { |
|
||||
res.data.forEach((item,index)=>{ |
|
||||
if(index%2 == 0){ |
|
||||
this.leftList.push(item) |
|
||||
}else{ |
|
||||
this.rightList.push(item) |
|
||||
} |
|
||||
}) |
|
||||
this.list = [...this.list, ...res.data]; |
|
||||
if (res.data.length < 6) { |
|
||||
this.finished = true |
|
||||
} |
|
||||
}) |
|
||||
} |
|
||||
}, |
|
||||
gotoDetail(id){ |
|
||||
if(this.scenic_type_id == 1){ |
|
||||
uni.navigateTo({ |
|
||||
url: '/subPackages/details/scenicDetails?id='+id |
|
||||
}) |
|
||||
}else if(this.scenic_type_id == 5){ |
|
||||
uni.navigateTo({ |
|
||||
url: '/subPackages1/hotel/hotelDetails?id='+id |
|
||||
}) |
|
||||
}else if(this.scenic_type_id == 11){ |
|
||||
|
|
||||
}else if(this.scenic_type_id == 12){ |
|
||||
uni.navigateTo({ |
|
||||
url: '/subPackages/details/eateryDetails?id='+id |
|
||||
}) |
|
||||
}else if(this.tag_id == 6){ |
|
||||
uni.navigateTo({ |
|
||||
url: '/subPackages/details/goodDetails?type=1&id='+id |
|
||||
}) |
|
||||
}else if(this.tag_id == 7){ |
|
||||
uni.navigateTo({ |
|
||||
url: '/subPackages/details/goodDetails?type=0&id='+id |
|
||||
}) |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
onReachBottom() { |
|
||||
setTimeout(() => { |
|
||||
if (!this.finished) this.getList() |
|
||||
},1000) |
|
||||
} |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<style scoped lang="scss"> |
|
||||
.bg{ |
|
||||
padding: 0 27rpx; |
|
||||
box-sizing: border-box; |
|
||||
} |
|
||||
.titles{ |
|
||||
font-size: 36rpx; |
|
||||
font-family: PingFang SC; |
|
||||
font-weight: 500; |
|
||||
color: #000000; |
|
||||
margin-bottom: 30rpx; |
|
||||
} |
|
||||
.goodBox{ |
|
||||
display: flex; |
|
||||
justify-content: space-between; |
|
||||
|
|
||||
.goodItem{ |
|
||||
margin-bottom: 28rpx; |
|
||||
|
|
||||
image{ |
|
||||
width: 340rpx; |
|
||||
border-radius: 20rpx 20rpx 0px 0px; |
|
||||
box-shadow: 0px 0px 41rpx 0px rgba(51,51,51,0.1); |
|
||||
display: block; |
|
||||
} |
|
||||
|
|
||||
.goodContent{ |
|
||||
width: 340rpx; |
|
||||
height: 150rpx; |
|
||||
background: #FFFFFF; |
|
||||
border-radius: 0 0 20rpx 20rpx; |
|
||||
padding: 13rpx; |
|
||||
box-sizing: border-box; |
|
||||
box-shadow: 0px 0px 20rpx 0px rgba(51,51,51,0.1); |
|
||||
display: flex; |
|
||||
flex-direction: column; |
|
||||
justify-content: space-between; |
|
||||
|
|
||||
.title{ |
|
||||
width: 286rpx; |
|
||||
font-size: 27rpx; |
|
||||
font-family: PingFang SC; |
|
||||
font-weight: 500; |
|
||||
color: #000000; |
|
||||
overflow-x: hidden; |
|
||||
overflow-y: inherit; |
|
||||
white-space: nowrap; |
|
||||
} |
|
||||
|
|
||||
.tags{ |
|
||||
display: flex; |
|
||||
|
|
||||
view{ |
|
||||
max-width: 115rpx; |
|
||||
padding: 0 10rpx; |
|
||||
height: 30rpx; |
|
||||
border: 1rpx solid #00D7ED; |
|
||||
border-radius: 7rpx; |
|
||||
font-size: 23rpx; |
|
||||
font-family: PingFang SC; |
|
||||
font-weight: 400; |
|
||||
color: #00D7ED; |
|
||||
text-align: center; |
|
||||
line-height: 30rpx; |
|
||||
margin-right: 12rpx; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
.price{ |
|
||||
font-size: 32rpx; |
|
||||
font-family: PingFang SC; |
|
||||
font-weight: 500; |
|
||||
color: #FF2D3B; |
|
||||
text-align: right; |
|
||||
} |
|
||||
.price::before{ |
|
||||
content: "¥"; |
|
||||
font-size: 20rpx; |
|
||||
} |
|
||||
.price::after{ |
|
||||
content: "起"; |
|
||||
font-size: 20rpx; |
|
||||
color: #8D8D8D; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
</style> |
|
@ -1,12 +0,0 @@ |
|||||
diff a/components/recommend.vue b/components/recommend.vue (rejected hunks) |
|
||||
@@ -142,9 +142,7 @@ |
|
||||
url: '/subPackages/details/scenicDetails?id='+id |
|
||||
}) |
|
||||
}else if(this.scenic_type_id == 5){ |
|
||||
- uni.navigateTo({ |
|
||||
- url: '/subPackages1/hotel/hotelDetails?id='+id |
|
||||
- }) |
|
||||
+ |
|
||||
}else if(this.scenic_type_id == 11){ |
|
||||
|
|
||||
}else if(this.scenic_type_id == 12){ |
|
Loading…
Reference in new issue