Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
U
uni-pdtravel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
panyongping
uni-pdtravel
Commits
e492f882
Commit
e492f882
authored
Aug 22, 2024
by
潘永坪
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into album
parents
ffeaaa84
3f9c3e3a
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
194 additions
and
1148 deletions
+194
-1148
pages.json
pages.json
+1
-8
distributionCombiChoose-old.vue
...n/distributionCombiChoose/distributionCombiChoose-old.vue
+191
-85
distributionCombiChoose.vue
...ation/distributionCombiChoose/distributionCombiChoose.vue
+2
-2
combinationProduct.vue
pages/scenic/combinationProduct/combinationProduct.vue
+0
-903
detail.vue
pages/scenic/combinationProduct/components/detail.vue
+0
-150
No files found.
pages.json
View file @
e492f882
...
...
@@ -304,14 +304,7 @@
"navigationBarTitleText"
:
"产品"
,
"enablePullDownRefresh"
:
false
}
},
{
"path"
:
"combinationProduct/combinationProduct"
,
"style"
:
{
"navigationBarTitleText"
:
"产品选择"
,
"enablePullDownRefresh"
:
false
}
},
},
{
"path"
:
"scenicIndex/scenicIndex"
,
"style"
:
{
...
...
pages/combination/distributionCombiChoose/distributionCombiChoose-old.vue
View file @
e492f882
<!-- 修改这个页面时,需要同步更新combiChoose页面的代码 -->
<
template
>
<view
class=
"wrap"
>
<scroll-view
@
scroll=
"scrollFull"
style=
"height: 100%;"
:scroll-into-view=
"toViewFull"
scroll-y
>
<view
class=
"banner"
>
<scroll-view
@
scroll=
"scrollFull"
style=
"height: 100%;"
:scroll-into-view=
"toViewFull"
scroll-y
enhanced
:bounces=
"false"
>
<view
class=
"banner"
id=
'banner'
>
<u-swiper
:list=
"imgList"
@
change=
"e => currentNum = e.current"
indicatorStyle=
"right: 20px;bottom:25px"
height=
"400"
circular
>
<view
slot=
"indicator"
class=
"indicator-num"
>
<text
class=
"indicator-num__text"
>
{{
currentNum
+
1
}}
/
{{
imgList
.
length
}}
</text>
</view>
</u-swiper>
</view>
<view
class=
"middle"
id=
"midd
le"
>
<view
class=
"middle"
:style=
"middleSty
le"
>
<!-- 中间上面部分 -->
<view
class=
"middle-top"
:style=
"middleTopStyle"
>
<view
class=
"middle-top"
>
<view
class=
"merchant-name"
>
{{
merchantTitl
e
||
''
}}
{{
currentMerchant
.
nam
e
||
''
}}
</view>
<u-transition
:show=
"showTransition"
:duration=
'600'
>
<view
class=
"merchant-info-bottom"
>
<view
class=
"merchant-info-bottom"
>
<view
class=
"merchant-bottom-left"
>
<view>
<text
style=
"color: #00B42B;"
>
营业时间
</text>
...
...
@@ -48,7 +48,7 @@
</view>
<!-- 列表部分 -->
<view
class=
"middle-bottom"
:style=
"middleBottomStyle
"
>
<view
class=
"middle-bottom"
id=
"middle-bottom
"
>
<!-- 左边滚动条 -->
<scroll-view
class=
"scroll-left"
:style=
"
{height:scrollHeight+'px'}" :scroll-into-view="toViewLeft" scroll-y>
<view
class=
"middle-left"
>
...
...
@@ -58,7 +58,8 @@
</view>
</scroll-view>
<!-- 右边滚动条 -->
<scroll-view
@
scroll=
"scrollRight"
:style=
"
{height:middleHeight+'px'}" :scroll-into-view="toViewRight" scroll-y>
<!-- enhanced和bounces是处理ios系统橡皮筋回弹bug -->
<scroll-view
class=
"scroll-right"
@
scroll=
"scrollRight"
:style=
"
{height:middleHeight+'px'}" :scroll-into-view="toViewRight" scroll-y enhanced :bounces="false">
<view
class=
"middle-right"
>
<checkbox-group
@
change=
"checkboxChange"
class=
"checkbox-box"
>
<view
class=
"merchantlist-wrap"
:id=
"'merchant'+index"
v-for=
"(item, index) in scenicList"
:key=
"index"
>
...
...
@@ -95,7 +96,7 @@
<text
class=
"product-status"
v-if=
"items.status == 2"
>
{{ items.statusName }}
</text>
</view>
<view
class=
"product-rule"
>
<
text>
随买随用
</text
>
<
!-- <text>随买随用</text> --
>
<
template
v-if=
"items.productRefundRuleVo"
>
<text
v-if=
"items.productRefundRuleVo.refundType == 0"
>
不可退
</text>
<text
v-if=
"items.productRefundRuleVo.refundType == 1"
>
有条件退
</text>
...
...
@@ -139,7 +140,7 @@
</view>
<view
class=
"bottom"
>
<view
class=
"bottom"
:style=
"bottomStyle"
>
<view
class=
"bottom-left"
@
click=
"showCustomer()"
>
<u-icon
name=
"chat"
size=
"42"
></u-icon>
客服
...
...
@@ -147,7 +148,7 @@
<view
class=
"bottom-right"
>
<view
class=
"bottom-choose"
>
<view
class=
"bottom-more"
v-show=
"chooseProduct.length > 0"
>
组合购更
优惠
组合购更
便捷
<text
class=
"bottom-triangle"
></text>
</view>
<view
class=
"bottom-detail"
@
click=
"showDetail()"
:style=
"{ top: chooseProduct.length > 0 ? '-28rpx' : '0' }"
>
...
...
@@ -188,6 +189,14 @@
</view>
</view>
</u-popup>
<!-- 自定义导航栏 -->
<view
class=
"tabbar"
:style=
"{height:topHeight+'px',opacity:tabbarOpacity}"
>
<view
class=
"tabbar-title"
>
<u-icon
@
click=
"goTop()"
name=
"arrow-left"
color=
"#333333"
size=
"48"
></u-icon>
<text>
选择产品
</text>
<text></text>
</view>
</view>
</view>
</template>
...
...
@@ -207,7 +216,6 @@ export default {
},
data
()
{
return
{
merchantTitle
:
''
,
//商家标题
currentMerchant
:
''
,
//当前入口商家信息
showTip
:
false
,
//系统调不通或者崩了跳出弹窗
detailData
:
''
,
//详情数据
...
...
@@ -228,14 +236,17 @@ export default {
merchantIndex
:
0
,
//选中的商家下标
middleHeight
:
0
,
//中间列表盒子高度
heightArr
:[],
//元素高度数组
scrollHeight
:
0
,
//中间盒子滚动时的高度
originHeight
:
0
,
//中间盒子原本高度
middleTopStyle
:
''
,
//中间盒子上部分样式
middleBottomStyle
:
''
,
//中间盒子下部分样式
toViewRight
:
''
,
//右边滚动到某个元素
toViewLeft
:
''
,
//左边滚动到某个元素
toViewFull
:
''
,
//全屏滚动到某个元素
showTransition
:
true
,
//控制动画显示隐藏
scrollHeight
:
0
,
//中间盒子滚动时的高度
originHeight
:
0
,
//中间盒子原本高度
middleTopHeight
:
0
,
//中间盒子上部分高度
topHeight
:
0
,
//上面状态栏+上面导航栏总高度
tabbarOpacity
:
0
,
//导航栏透明度
bottomStyle
:
''
,
//处理苹果手机的横线,单独增加一个样式
middleStyle
:
''
,
//中间盒子样式,单独增加一个样式
}
},
watch
:
{
...
...
@@ -295,21 +306,30 @@ export default {
}
},
onLoad
(
option
)
{
//如果是索道
if
(
this
.
merchantId
==
'z0015605022691a5945bbe463141668c'
){
this
.
showSuodaoImg
=
true
setTimeout
(()
=>
{
this
.
showSuodaoImg
=
false
},
2500
)
}
//获取公司Id,保存到本地,支付等逻辑需要入口companyId
this
.
companyId
=
this
.
$commonjs
.
getCompanyId
(
option
)
||
''
this
.
merchantId
=
this
.
$commonjs
.
getKey
(
option
,
'merchantId'
)
||
''
this
.
channelId
=
this
.
$commonjs
.
getKey
(
option
,
'channelId'
)
||
''
this
.
groupId
=
this
.
$commonjs
.
getKey
(
option
,
'groupId'
)
||
''
this
.
groupChannelId
=
this
.
$commonjs
.
getKey
(
option
,
'groupChannelId'
)
||
''
let
statusBarHeight
=
uni
.
getSystemInfoSync
().
statusBarHeight
// 状态栏高度
let
capsule
=
uni
.
getMenuButtonBoundingClientRect
()
// 胶囊大小、位置数据
this
.
topHeight
=
statusBarHeight
+
(
capsule
.
top
-
statusBarHeight
)
*
2
+
capsule
.
height
//整个上部分总高度
//处理苹果手机下面有根横线,影响选中产品明细的操作
let
platform
=
uni
.
getSystemInfoSync
().
platform
if
(
platform
==
'ios'
){
this
.
bottomStyle
=
'height:140rpx;padding-bottom:10rpx;'
this
.
middleStyle
=
'padding-bottom:140rpx;'
}
},
onShow
()
{
//如果是索道
if
(
this
.
merchantId
==
'z0015605022691a5945bbe463141668c'
){
this
.
showSuodaoImg
=
true
setTimeout
(()
=>
{
this
.
showSuodaoImg
=
false
},
2500
)
}
//清空之前选中的数据以及状态
this
.
detailData
=
''
this
.
chooseProduct
=
[]
...
...
@@ -325,7 +345,6 @@ export default {
let
token
=
uni
.
getStorageSync
(
'token'
)
if
(
token
)
{
uni
.
getLocation
({
type
:
'wgs84'
,
success
:
res
=>
{
let
latitude
=
res
.
latitude
//纬度
let
longitude
=
res
.
longitude
//经度
...
...
@@ -394,7 +413,6 @@ export default {
item
.
productListCopy
=
item
.
productList
//获取当前商家信息
this
.
currentMerchant
=
item
this
.
merchantTitle
=
item
.
name
}
else
{
// item.productListCopy = item.productList.slice(0, 2)不要更多,暂时注释
item
.
productListCopy
=
item
.
productList
...
...
@@ -424,39 +442,90 @@ export default {
this
.
$nextTick
(()
=>
{
//清空数组
this
.
heightArr
=
[]
//获取中间盒子需要滚动时的高度
// #ifdef MP-WEIXIN
uni
.
createSelectorQuery
().
in
(
this
).
select
(
'.middle-top'
).
boundingClientRect
(
data
=>
{
if
(
data
){
this
.
middleTopHeight
=
data
.
height
}
}).
exec
()
// #endif
// #ifdef MP-ALIPAY
uni
.
createSelectorQuery
().
select
(
'.middle-top'
).
boundingClientRect
(
data
=>
{
if
(
data
){
this
.
middleTopHeight
=
data
.
height
}
}).
exec
()
// #endif
//获取中间盒子原本高度
// #ifdef MP-WEIXIN
uni
.
createSelectorQuery
().
in
(
this
).
select
(
'.middle-right'
).
boundingClientRect
(
data
=>
{
//获取中间盒子原本高度,默认中间盒子等于原本高度,滚动之后等于滚动高度
if
(
data
){
this
.
originHeight
=
data
.
height
this
.
middleHeight
=
data
.
height
}
}).
exec
()
// #endif
// #ifdef MP-ALIPAY
uni
.
createSelectorQuery
().
select
(
'.middle-right'
).
boundingClientRect
(
data
=>
{
//获取中间盒子原本高度,默认中间盒子等于原本高度,滚动之后等于滚动高度
if
(
data
){
this
.
originHeight
=
data
.
height
this
.
middleHeight
=
data
.
height
}
}).
exec
()
// #endif
//不要这样 var query = uni.createSelectorQuery() query.in(this)放入循环里面会多次循环
for
(
let
i
=
0
;
i
<
this
.
scenicList
.
length
;
i
++
){
// #ifdef MP-WEIXIN
uni
.
createSelectorQuery
().
in
(
this
).
select
(
`#merchant
${
i
}
`
).
boundingClientRect
(
data
=>
{
//获取商家列表各个元素的高度,并且把他们前后相加添加到一个数组里面
if
(
data
){
if
(
i
==
0
){
//取整,由于高度多数为小数,防止点击左边,滚动右边时出现bug
this
.
heightArr
.
push
(
parseInt
(
data
.
height
))
}
else
{
this
.
heightArr
.
push
(
parseInt
(
data
.
height
)
+
this
.
heightArr
[
i
-
1
])
}
}
}).
exec
()
// #endif
// #ifdef MP-ALIPAY
uni
.
createSelectorQuery
().
select
(
`#merchant
${
i
}
`
).
boundingClientRect
(
data
=>
{
//获取商家列表各个元素的高度,并且把他们前后相加添加到一个数组里面
if
(
data
){
if
(
i
==
0
){
//取整,由于高度多数为小数,防止点击左边,滚动右边时出现bug
this
.
heightArr
.
push
(
parseInt
(
data
.
height
))
}
else
{
this
.
heightArr
.
push
(
parseInt
(
data
.
height
)
+
this
.
heightArr
[
i
-
1
])
}
}
}).
exec
()
// #endif
}
uni
.
getSystemInfo
({
complete
:(
info
)
=>
{
let
windowHeight
=
info
.
windowHeight
||
753
//获取中间盒子需要滚动时的高度
uni
.
createSelectorQuery
().
in
(
this
).
select
(
'.middle-top'
).
boundingClientRect
(
data
=>
{
if
(
data
){
this
.
scrollHeight
=
windowHeight
-
data
.
height
}
}).
exec
()
//获取中间盒子原本高度
uni
.
createSelectorQuery
().
in
(
this
).
select
(
'.middle-right'
).
boundingClientRect
(
data
=>
{
//获取中间盒子原本高度,默认中间盒子等于原本高度,滚动之后等于滚动高度
let
windowHeight
=
info
.
windowHeight
||
844
// #ifdef MP-WEIXIN
uni
.
createSelectorQuery
().
in
(
this
).
select
(
'.bottom'
).
boundingClientRect
(
data
=>
{
if
(
data
){
this
.
originHeight
=
data
.
height
this
.
middleHeight
=
this
.
originHeight
this
.
scrollHeight
=
windowHeight
-
data
.
height
-
this
.
topHeight
}
}).
exec
()
// #endif
// #ifdef MP-ALIPAY
uni
.
createSelectorQuery
().
select
(
'.bottom'
).
boundingClientRect
(
data
=>
{
if
(
data
){
this
.
scrollHeight
=
windowHeight
-
data
.
height
-
this
.
topHeight
}
}).
exec
()
// #endif
//不要这样 多个的时候就会循环 varquery = uni.createSelectorQuery()
for
(
let
i
=
0
;
i
<
this
.
scenicList
.
length
;
i
++
){
uni
.
createSelectorQuery
().
in
(
this
).
select
(
`#merchant
${
i
}
`
).
boundingClientRect
(
data
=>
{
//获取商家列表各个元素的高度,并且把他们前后相加添加到一个数组里面
if
(
data
){
if
(
i
==
0
){
//取整,由于高度多数为小数,防止点击左边,滚动右边时出现bug
this
.
heightArr
.
push
(
parseInt
(
data
.
height
))
}
else
{
this
.
heightArr
.
push
(
parseInt
(
data
.
height
)
+
this
.
heightArr
[
i
-
1
])
}
}
}).
exec
()
}
}
})
...
...
@@ -520,17 +589,20 @@ export default {
//---商家下标切换
merchantTabChange
(
index
){
//点击左边,全屏先置顶
this
.
toViewFull
=
'middle'
//为了让scrollview能检测到滚动数据的变化
this
.
toViewFull
=
'aaa'
// 数据更新后,视图的更新是异步的,防止点击无效
this
.
$nextTick
(()
=>
{
this
.
toViewFull
=
'middle-bottom'
})
//点击左边,右边可滚动
this
.
merchantIndex
=
index
this
.
middleHeight
=
this
.
scrollHeight
//加个延时,防止第一次点击时元素样式还未更新,导致不滑动到对应元素
//为了让scrollview能检测到滚动数据的变化
this
.
toViewRight
=
'aaa'
// 数据更新后,视图的更新是异步的,防止第一次点击无效
this
.
$nextTick
(()
=>
{
//this.$nextTick解决苹果手机
//settimeout解决安卓手机
setTimeout
(()
=>
{
this
.
toViewRight
=
'merchant'
+
index
},
100
)
this
.
toViewRight
=
'merchant'
+
index
})
},
//---展示明细弹窗
...
...
@@ -541,28 +613,33 @@ export default {
scrollFull
(
e
){
setTimeout
(()
=>
{
let
height
=
0
let
scrollTop
=
e
.
detail
.
scrollTop
let
selectFun
=
(
data
)
=>
{
if
(
data
){
//20为中间盒子的top-20
height
=
data
.
height
+
this
.
middleTopHeight
-
20
-
this
.
topHeight
let
opacity
=
scrollTop
/
(
data
.
height
)
this
.
tabbarOpacity
=
parseFloat
(
opacity
.
toFixed
(
2
))
if
(
scrollTop
>=
height
){
//中间上部分固定,中间下部分可滚动,全屏不滚动
this
.
middleHeight
=
this
.
scrollHeight
}
else
{
//中间上部分不固定,中间下部分不可滚动,全屏滚动'
this
.
middleHeight
=
this
.
originHeight
}
}
}
// #ifdef MP-WEIXIN
uni
.
createSelectorQuery
().
in
(
this
).
select
(
'.banner'
).
boundingClientRect
(
data
=>
{
if
(
data
){
//20=中间盒子top:-20的值
// height=data.height-70
height
=
data
.
height
-
20
if
(
e
.
detail
.
scrollTop
>=
height
){
//中间上部分固定,中间下部分可滚动,全屏不滚动
this
.
middleTopStyle
=
'top:0;position:fixed;'
this
.
middleBottomStyle
=
'margin-top:50px;'
this
.
middleHeight
=
this
.
scrollHeight
this
.
showTransition
=
false
this
.
merchantTitle
=
'组合购买更省钱'
}
else
{
//中间上部分不固定,中间下部分不可滚动,全屏滚动
this
.
middleTopStyle
=
'position:relative;'
this
.
middleBottomStyle
=
'margin-top:0;'
this
.
middleHeight
=
this
.
originHeight
this
.
showTransition
=
true
this
.
merchantTitle
=
this
.
scenicList
[
0
].
name
}
}
selectFun
(
data
)
}).
exec
()
// #endif
// #ifdef MP-ALIPAY
uni
.
createSelectorQuery
().
select
(
'.banner'
).
boundingClientRect
(
data
=>
{
selectFun
(
data
)
}).
exec
()
// #endif
},
5
)
},
...
...
@@ -587,6 +664,15 @@ export default {
},
5
)
},
//---回到顶部
goTop
(){
this
.
middleHeight
=
this
.
originHeight
//为了让scrollview能检测到滚动数据的变化
this
.
toViewFull
=
'aaa'
this
.
$nextTick
(()
=>
{
this
.
toViewFull
=
'banner'
})
},
//---导航
navigation
(
merchant
){
uni
.
openLocation
({
...
...
@@ -752,7 +838,7 @@ export default {
onShareAppMessage
(
options
)
{
let
url
=
'pages/combination/distributionCombiChoose/distributionCombiChoose'
return
{
title
:
'组合购
买更优惠
'
,
title
:
'组合购
更便捷
'
,
path
:
`
${
url
}
?channelId=
${
this
.
channelId
}
&merchantId=
${
this
.
merchantId
}
&groupId=
${
this
.
groupId
}
&groupChannelId=
${
this
.
groupChannelId
}
&companyId=
${
this
.
companyId
}
`
}
}
...
...
@@ -838,11 +924,14 @@ export default {
//中间下部分
.middle-bottom
{
display
:
flex
;
background
:
#f7f7f7
;
z-index
:
1
;
}
.scroll-left
{
width
:
130rpx
;
flex-shrink
:
0
;
margin
:
24rpx
24rpx
0
0
;
padding
:
12px
24rpx
0
0
;
box-sizing
:
border-box
;
width
:
154rpx
;
}
.middle-left
{
font-size
:
24rpx
;
...
...
@@ -864,7 +953,7 @@ export default {
}
.merchantlist-wrap
{
background
:
#f7f7f7
;
padding-top
:
24r
px
;
padding-top
:
12
px
;
}
.merchantlist
{
border-radius
:
20rpx
;
...
...
@@ -1055,9 +1144,7 @@ export default {
color
:
#ffffff
;
font-weight
:
bold
;
margin
:
0
10rpx
;
}
.bottom-btn
{
display
:
inline-block
;
width
:
200rpx
;
...
...
@@ -1078,4 +1165,23 @@ export default {
left
:
0
;
top
:
0
;
}
.tabbar
{
background
:
#fff
;
position
:
fixed
;
top
:
0
;
width
:
100%
;
opacity
:
0
;
}
.tabbar-title
{
position
:
absolute
;
bottom
:
10px
;
text-align
:
center
;
display
:
flex
;
width
:
100%
;
font-size
:
32rpx
;
font-weight
:
500
;
color
:
#000000
;
padding
:
0
24rpx
;
justify-content
:
space-between
;
}
</
style
>
pages/combination/distributionCombiChoose/distributionCombiChoose.vue
View file @
e492f882
...
...
@@ -73,8 +73,8 @@
</
template
>
</view>
<view
v-if=
"showDistance"
class=
"merchantlist-detail"
>
距您{{ item.distance ? parseFloat((item.distance / 1000).toFixed(2)) : 0 }}km
<view
class=
"merchantlist-detail"
>
<!-- <text v-if="showDistance">距您{{ item.distance ? parseFloat((item.distance / 1000).toFixed(2)) : 0 }}km</text> -->
<u-icon
name=
"arrow-right"
style=
"margin-left: 4rpx;"
size=
'26'
color=
'#B4B4B4'
></u-icon>
</view>
</view>
...
...
pages/scenic/combinationProduct/combinationProduct.vue
deleted
100644 → 0
View file @
ffeaaa84
<
template
>
<view
class=
"wrap"
>
<scroll-view
@
scroll=
"scroll"
style=
"height: 100%;"
scroll-y
>
<view
class=
"banner"
>
<u-swiper
:list=
"imgList"
@
change=
"e => currentNum = e.current"
indicatorStyle=
"right: 20px;bottom:25px"
height=
"400"
circular
>
<view
slot=
"indicator"
class=
"indicator-num"
>
<text
class=
"indicator-num__text"
>
{{
currentNum
+
1
}}
/
{{
imgList
.
length
}}
</text>
</view>
</u-swiper>
</view>
<view
class=
"middle"
>
<!--
<view
class=
"tabbar"
:style=
"tabbarObj"
>
<text
v-for=
"(item, index) in tabbar"
:key=
"index"
@
click=
"tabbarChange(index)"
:class=
"
{ on: active == index }">
{{
item
}}
</text>
</view>
-->
<swiper
:current=
"active"
@
animationfinish=
"animationfinish"
class=
"swiper-box"
:style=
"
{ height: swiperHeight + 'px' }">
<swiper-item
class=
"swiper-item"
>
<checkbox-group
@
change=
"checkboxChange"
class=
"checkbox-box"
>
<view
class=
"merchant"
v-for=
"(item, index) in scenicList"
:key=
"index"
>
<view
class=
"merchant-title"
@
click=
"clikDetail(item.id)"
>
<view
class=
"title-left"
>
<text>
{{
item
.
name
}}
</text>
<template
v-if=
"item.couponVoList && item.couponVoList.length > 0"
>
<image
src=
"@/static/img/scenic/coupon.png"
></image>
<text
class=
"title-coupon"
>
劵惠
</text>
</
template
>
</view>
<view
v-if=
"showDistance"
class=
"title-right"
>
距您{{ item.distance ? parseFloat((item.distance / 1000).toFixed(2)) : 0 }}km
<u-icon
name=
"arrow-right"
style=
"margin-left: 4rpx;"
></u-icon>
</view>
</view>
<label
v-for=
"(items, a) in item.productListCopy"
:key=
"a"
:class=
"{ off: items.status == 2 }"
>
<view
class=
"product"
:class=
"{ on: items.ifChangeBg }"
>
<view
class=
"product-left"
>
<checkbox
style=
"transform: scale(0.8)"
class=
"blue"
:disabled=
"items.status == 2"
:value=
"JSON.stringify(items)"
:checked=
"items.ifChecked"
/>
</view>
<view
class=
"product-right"
>
<view
class=
"product-name"
>
<text>
{{ items.name }}
</text>
<text
class=
"product-status"
v-if=
"items.status == 2"
>
{{ items.statusName }}
</text>
</view>
<view
class=
"product-price"
>
<view
style=
"font-size: 24rpx;display: flex;"
>
<text
class=
"product-rule"
v-if=
"items.productRefundRuleVo"
>
<text
v-if=
"items.productRefundRuleVo.refundType == 0"
>
不可退
</text>
<text
v-if=
"items.productRefundRuleVo.refundType == 1"
>
有条件退
</text>
<text
v-if=
"items.productRefundRuleVo.refundType == 2"
>
随时可退
</text>
</text>
<text
class=
"product-rule"
>
无需取票
</text>
<text
@
click
.
stop=
"showBuyKnow(items)"
>
购买须知
</text>
<u-icon
name=
"arrow-right"
></u-icon>
</view>
<view>
<text
class=
"product-orange"
>
¥{{ items.originalPrice }}
</text>
<text
class=
"product-sell"
>
<text
style=
"font-size: 28rpx"
>
¥
</text>
{{ items.sellingPrice }}
</text>
</view>
</view>
</view>
</view>
</label>
<view
class=
"product-more"
v-if=
"index > 0 && item.productList.length > 2"
>
<view
style=
"display: flex;justify-content: center;"
v-if=
"item.productListCopy.length != item.productList.length"
@
click=
"showMoreProduct(item)"
>
更多
<u-icon
name=
"arrow-down"
></u-icon>
</view>
<view
style=
"display: flex;justify-content: center;"
v-else
@
click=
"retractProduct(item)"
>
收起
<u-icon
name=
"arrow-up"
></u-icon>
</view>
</view>
</view>
</checkbox-group>
<u-empty
text=
"空空如也..."
mode=
"list"
v-if=
"scenicList.length == 0"
width=
"320"
height=
"320"
></u-empty>
</swiper-item>
<swiper-item
class=
"swiper-item"
>
<u-waterfall
v-model=
"albumList"
class=
"waterfall"
style=
"padding-top: 8rpx;"
>
<
template
v-slot:left=
"{leftList}"
>
<view
v-for=
"(item, index) in leftList"
:key=
"index"
class=
"album-left"
@
click=
"goAlbum(index)"
>
<view
class=
"album-list-top"
>
<image
:src=
"item.image"
mode=
"widthFix"
></image>
</view>
<view
class=
"album-list-bottom"
:style=
"
{'background': item.color}">
<view>
{{
item
.
title
}}
</view>
<view>
快来定制吧
</view>
<view>
<view
class=
"album-btn"
>
点击定制
<u-icon
name=
"arrow-right"
style=
"margin-left: 4rpx;"
></u-icon>
</view>
<text
class=
"count"
>
{{
item
.
count
}}
</text>
</view>
</view>
</view>
</
template
>
<
template
v-slot:right=
"{rightList}"
>
<view
v-for=
"(item, index) in rightList"
:key=
"index"
class=
"album-right"
@
click=
"goAlbum(index)"
>
<view
class=
"album-list-top"
>
<image
:src=
"item.image"
mode=
"widthFix"
></image>
</view>
<view
class=
"album-list-bottom"
:style=
"
{'background': item.color}">
<view>
{{
item
.
title
}}
</view>
<view>
快来定制吧
</view>
<view>
<view
class=
"album-btn"
>
点击定制
<u-icon
name=
"arrow-right"
style=
"margin-left: 4rpx;"
></u-icon>
</view>
<text
class=
"count"
>
{{
item
.
count
}}
</text>
</view>
</view>
</view>
</
template
>
</u-waterfall>
</swiper-item>
<swiper-item
class=
"swiper-item"
>
<u-empty
text=
"空空如也..."
mode=
"list"
width=
"320"
height=
"320"
></u-empty>
</swiper-item>
<swiper-item
class=
"swiper-item"
>
<u-empty
text=
"空空如也..."
mode=
"list"
width=
"320"
height=
"320"
></u-empty>
</swiper-item>
</swiper>
</view>
<view
class=
"bottom"
>
<view
class=
"bottom-left"
@
click=
"showCustomer()"
>
<u-icon
name=
"chat"
size=
"36"
></u-icon>
客服
</view>
<view
class=
"bottom-middle"
>
<view
class=
"bottom-more"
v-show=
"chooseProduct.length > 0"
>
组合购更优惠
<text
class=
"bottom-three"
></text>
</view>
<view
class=
"bottom-detail"
@
click=
"showDetail()"
:style=
"{ top: chooseProduct.length > 0 ? '-28rpx' : '0' }"
>
<text
style=
"margin-right: 10rpx;"
>
明细
</text>
<u-icon
name=
"arrow-up"
size=
"32"
></u-icon>
<text
class=
"bottom-number"
>
{{ chooseProduct.length }}
</text>
</view>
</view>
<view
class=
"bottom-right"
>
<text
class=
"btn"
@
click=
"goFillorder()"
>
去预定
</text>
</view>
</view>
<!-- 客服组件 -->
<customer
:scenicList=
"scenicList"
ref=
"customer"
></customer>
<!-- 购买须知 -->
<buyKnow
:buyKnowData=
"buyKnowData"
ref=
"buyKnow"
></buyKnow>
<!-- 产品明细 -->
<detail
:chooseProduct=
"chooseProduct"
ref=
"detail"
></detail>
<!-- 商户详情 -->
<merchantDetail
:detailData=
'detailData'
ref=
'merchantDetail'
></merchantDetail>
<!-- 模态框 -->
<u-modal
:show=
"showModal"
@
confirm=
"chooseConfirm"
@
cancel=
"chooseCancel"
title=
"提示"
content=
"该产品不支持多选"
show-cancel-button=
"true"
>
</u-modal>
</scroll-view>
<image
class=
"suodaoImg"
v-if=
"showSuodaoImg"
src=
"https://lx.pangdly.com/img/cjsdFirst.50a2e63.jpg"
></image>
</view>
</template>
<
script
>
import
customer
from
'@/components/customer.vue'
//客服
import
buyKnow
from
'@/components/buyKnow.vue'
//购买须知
import
detail
from
'./components/detail.vue'
//购买须知
import
UWaterfall
from
'@/uview-ui/components/u-waterfall/u-waterfall.vue'
import
merchantDetail
from
'@/components/merchantDetail'
//详情弹窗
export
default
{
components
:
{
customer
,
buyKnow
,
detail
,
UWaterfall
,
merchantDetail
},
data
()
{
return
{
detailData
:
''
,
//详情数据
showSuodaoImg
:
false
,
//索道耳麦图片是否显示隐藏
companyId
:
''
,
//公司Id
merchantId
:
''
,
//商户Id
// tabbar:['热门景点','一日游','摄影/旅拍','文创DIY'],//tabbar标题列表
tabbar
:
[
'热门景点'
,
'摄影/旅拍'
,
'一日游'
],
//tabbar标题列表
active
:
0
,
//导航栏下标
currentNum
:
0
,
//轮播图下标
imgList
:
[],
//图片列表
scenicList
:
[],
//景区数据
showDistance
:
false
,
//定位成功显示距离
buyKnowData
:
''
,
//购买须知数据
chooseProduct
:
[],
//选中的产品
showModal
:
false
,
//是否显示模态框
chooseMerchantProduct
:
''
,
//不支持多产品购买时,选中的景区产品
groupId
:
''
,
//组合Id
groupChannelId
:
''
,
//组合渠道Id
channelType
:
0
,
//渠道类型
swiperHeight
:
0
,
//swiper高度
tabbarObj
:
''
,
albumList
:
[{
title
:
'精彩瞬间'
,
count
:
'10W+'
,
image
:
'../static/scenic/wonderfulMoment.png'
,
color
:
'#037EFF'
},
{
title
:
'网红旅拍'
,
count
:
'8W+'
,
image
:
'../static/scenic/travalphoto.png'
,
color
:
'#826847'
},
{
title
:
'抱枕DIY'
,
count
:
'4W+'
,
image
:
'../static/scenic/pillow.png'
,
color
:
'#1175B4'
},
{
title
:
'明信片'
,
count
:
'4W+'
,
image
:
'../static/scenic/postcard.png'
,
color
:
'#3478DC'
},
{
title
:
'旅游台历定制'
,
count
:
'4W+'
,
image
:
'../static/scenic/deskCalender.png'
,
color
:
'#1A9B45'
},
{
title
:
'定制相册'
,
count
:
'4W+'
,
image
:
'../static/scenic/customPic.png'
,
color
:
'#D48D46'
}
],
}
},
watch
:
{
//选中产品的数量变化
chooseProduct
:
{
handler
(
newValue
,
oldValue
)
{
//当选中产品时
if
(
newValue
.
length
>
oldValue
.
length
)
{
//找到当前选中的产品
let
product
=
newValue
[
newValue
.
length
-
1
]
//商家一级
let
merchant
=
''
//通过产品一级找到商家一级
this
.
scenicList
.
forEach
(
item
=>
{
if
(
item
.
id
==
product
.
merchantId
)
{
merchant
=
item
}
})
//当选中产品的景区有2个以上选中产品时
let
number
=
0
this
.
chooseProduct
.
forEach
(
item
=>
{
if
(
merchant
.
id
==
item
.
merchantId
)
{
number
+=
1
}
})
if
(
product
.
isMoreBuy
!==
0
)
{
if
(
number
>
1
)
{
//显示确认弹窗
this
.
showModal
=
true
//当前选中的景区产品,用于确定以及取消方法取值
this
.
chooseMerchantProduct
=
product
}
}
else
{
//支持多产品购买时,删除该景区其他产品不支持多产品购买的产品
this
.
chooseProduct
.
forEach
((
item
,
index
)
=>
{
if
(
merchant
.
id
==
item
.
merchantId
&&
item
.
isMoreBuy
!==
0
)
{
//取消选中状态和选中背景颜色
this
.
scenicList
.
forEach
(
item2
=>
{
item2
.
productList
.
forEach
(
item3
=>
{
if
(
item
.
id
==
item3
.
id
)
{
item3
.
ifChecked
=
false
item3
.
ifChangeBg
=
false
}
})
})
delete
this
.
chooseProduct
[
index
]
}
})
this
.
chooseProduct
=
this
.
chooseProduct
.
filter
(
function
(
val
)
{
return
val
})
}
}
},
deep
:
true
,
immediate
:
false
}
},
onLoad
(
option
)
{
//获取公司Id,保存到本地,支付等逻辑需要入口companyId
this
.
companyId
=
this
.
$commonjs
.
getCompanyId
(
option
)
this
.
channelType
=
option
.
channelType
||
0
this
.
merchantId
=
option
.
merchantId
||
''
},
onShow
()
{
//如果是索道
if
(
this
.
merchantId
==
'z0015605022691a5945bbe463141668c'
){
this
.
showSuodaoImg
=
true
setTimeout
(()
=>
{
this
.
showSuodaoImg
=
false
},
2500
)
}
//清空之前选中的数据
this
.
detailData
=
''
this
.
chooseProduct
=
[]
let
token
=
uni
.
getStorageSync
(
'token'
)
if
(
token
)
{
uni
.
getLocation
({
type
:
'wgs84'
,
success
:
res
=>
{
let
latitude
=
res
.
latitude
//纬度
let
longitude
=
res
.
longitude
//经度
this
.
showDistance
=
true
this
.
initList
(
latitude
,
longitude
)
},
fail
:
res
=>
{
let
latitude
=
''
let
longitude
=
''
this
.
initList
(
latitude
,
longitude
)
}
})
}
},
methods
:
{
//---页面滚动事件
scroll
(
e
)
{
if
(
e
.
detail
.
scrollTop
>
200
){
//固定导航栏
this
.
tabbarObj
=
'top:0;position:fixed;border-radius:0'
}
else
{
this
.
tabbarObj
=
'top:-40rpx;position:relative;border-radius:16rpx;'
}
},
//---导航栏切换
tabbarChange
(
index
)
{
this
.
active
=
index
if
(
index
==
0
){
this
.
countSwiper
()
}
if
(
index
==
1
){
this
.
countSwiper
(
'waterfall'
)
}
},
//---swiper滑动结束,分别设置tabs和swiper的状态
animationfinish
(
e
)
{
let
current
=
e
.
detail
.
current
this
.
active
=
current
},
//---展示客服组件
showCustomer
()
{
this
.
$refs
.
customer
.
showPop
=
true
},
//---展示购买须知
showBuyKnow
(
data
)
{
this
.
buyKnowData
=
data
this
.
$refs
.
buyKnow
.
showPop
=
true
},
//---点击详情
clikDetail
(
merchantId
){
this
.
$refs
.
merchantDetail
.
showPop
=
true
this
.
initDetail
(
merchantId
)
},
//---初始化详情
initDetail
(
merchantId
){
let
data
=
{
userId
:
uni
.
getStorageSync
(
'userId'
)
||
''
,
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
,
id
:
merchantId
,
//商户id
isDetail
:
1
,
//商户详情
}
this
.
detailData
=
''
this
.
$request
(
'scenic/user/merchant/findDetailInfo'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
){
this
.
detailData
=
res
.
data
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
},
//---展示明细弹窗
showDetail
()
{
this
.
$refs
.
detail
.
showPop
=
true
},
//计算第一个swiper高度
countSwiper
(
label
){
let
labels
=
label
||
'checkbox-box'
this
.
$nextTick
(()
=>
{
const
query
=
uni
.
createSelectorQuery
().
in
(
this
)
query
.
select
(
`.
${
labels
}
`
).
boundingClientRect
(
data
=>
{
this
.
swiperHeight
=
data
.
height
}).
exec
()
})
},
//---展示更多产品
showMoreProduct
(
item
)
{
item
.
productListCopy
=
item
.
productList
this
.
$forceUpdate
()
this
.
countSwiper
()
},
//---收起产品
retractProduct
(
item
)
{
item
.
productListCopy
=
item
.
productList
.
slice
(
0
,
2
)
this
.
$forceUpdate
()
this
.
countSwiper
()
},
//---多选框变化
checkboxChange
(
e
)
{
let
value
=
e
.
detail
.
value
let
arr
=
[]
value
.
forEach
(
item
=>
{
arr
.
push
(
JSON
.
parse
(
item
))
})
this
.
chooseProduct
=
arr
//判断是否选中产品,选中产品的背景颜色需要变化
this
.
scenicList
.
forEach
(
item
=>
{
item
.
productList
.
forEach
(
item2
=>
{
item2
.
ifChangeBg
=
false
this
.
chooseProduct
.
forEach
(
item3
=>
{
if
(
item2
.
id
==
item3
.
id
)
{
item2
.
ifChangeBg
=
true
//解决是否支持多产品购买弹窗2次之后,选中状态错误bug,需要在选中时修改状态
item2
.
ifChecked
=
true
}
})
})
})
},
//---不支持多选产品,选择确定事件
chooseConfirm
()
{
this
.
chooseProduct
.
forEach
((
item
,
index
)
=>
{
//删除选中产品以外的其他所有产品
if
(
this
.
chooseMerchantProduct
.
merchantId
==
item
.
merchantId
&&
JSON
.
stringify
(
item
)
!=
JSON
.
stringify
(
this
.
chooseMerchantProduct
))
{
//取消选中状态和选中背景颜色
this
.
scenicList
.
forEach
(
item2
=>
{
item2
.
productList
.
forEach
(
item3
=>
{
if
(
item
.
id
==
item3
.
id
)
{
item3
.
ifChecked
=
false
item3
.
ifChangeBg
=
false
}
})
})
delete
this
.
chooseProduct
[
index
]
}
})
this
.
chooseProduct
=
this
.
chooseProduct
.
filter
(
function
(
val
)
{
return
val
})
this
.
showModal
=
false
},
//---不支持多选产品,选择取消事件
chooseCancel
()
{
//删除选中产品
this
.
chooseProduct
.
forEach
((
item
,
index
)
=>
{
if
(
item
.
id
===
this
.
chooseMerchantProduct
.
id
)
{
//取消选中状态和选中背景颜色
this
.
scenicList
.
forEach
(
item2
=>
{
item2
.
productList
.
forEach
(
item3
=>
{
if
(
item
.
id
==
item3
.
id
)
{
item3
.
ifChecked
=
false
item3
.
ifChangeBg
=
false
}
})
})
this
.
chooseProduct
.
splice
(
index
,
1
)
}
})
this
.
showModal
=
false
},
//---商品列表
initList
(
latitude
,
longitude
)
{
let
data
=
{
merchantId
:
this
.
merchantId
,
//商户id
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
,
channelType
:
this
.
channelType
,
//渠道类型
latitude
,
longitude
}
this
.
$request
(
'/scenic/groupGood/getGroupProducts'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
scenicList
=
res
.
data
.
merchantList
||
[]
this
.
groupId
=
res
.
data
.
groupId
||
''
this
.
groupChannelId
=
res
.
data
.
groupChannelId
||
''
this
.
scenicList
.
forEach
((
item
,
index
)
=>
{
//获取当前景区图片,把当前景区放在第一位
if
(
item
.
id
==
this
.
merchantId
)
{
this
.
imgList
=
item
.
imgList
this
.
scenicList
.
splice
(
index
,
1
)
this
.
scenicList
.
unshift
(
item
)
item
.
productListCopy
=
item
.
productList
}
else
{
item
.
productListCopy
=
item
.
productList
.
slice
(
0
,
2
)
}
//预订时间为当天时,当前时间大于最早预订时间显示未开售,当前时间大于最晚预订时间显示已售罄
let
times
=
new
Date
().
Format
(
'hh:mm:ss'
)
let
timeNumber
=
parseInt
(
this
.
$commonjs
.
changeTime
(
times
))
//将当前时间转化为数字
item
.
productList
.
forEach
(
item2
=>
{
item2
.
timeNumber1
=
parseInt
(
this
.
$commonjs
.
changeTime
(
item2
.
earlyBookTime
))
item2
.
timeNumber2
=
parseInt
(
this
.
$commonjs
.
changeTime
(
item2
.
bookTime
))
if
(
item2
.
aheadBookDays
==
0
)
{
if
(
item2
.
status
==
2
)
{
item2
.
statusName
=
'已售罄'
}
else
{
if
(
timeNumber
<
item2
.
timeNumber1
)
{
item2
.
status
=
2
item2
.
statusName
=
'未开售'
}
if
(
timeNumber
>
item2
.
timeNumber2
)
{
item2
.
status
=
2
item2
.
statusName
=
'已售罄'
}
}
}
})
})
this
.
$nextTick
(()
=>
{
this
.
countSwiper
()
})
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
},
//---跳转填写订单页面
goFillorder
()
{
for
(
let
i
=
0
;
i
<
this
.
chooseProduct
.
length
;
i
++
)
{
let
item
=
this
.
chooseProduct
[
i
]
if
(
item
.
status
==
2
)
{
uni
.
showToast
({
title
:
'售罄产品不能进行购买'
,
icon
:
'none'
})
return
}
}
if
(
this
.
chooseProduct
.
length
==
0
)
{
uni
.
showToast
({
title
:
'请选择至少一个产品'
,
icon
:
'none'
})
return
}
else
if
(
this
.
chooseProduct
.
length
==
1
)
{
let
query
=
'?merchantId='
+
this
.
chooseProduct
[
0
].
merchantId
+
'&productId='
+
this
.
chooseProduct
[
0
].
id
+
'&orderSource=3'
if
(
this
.
chooseProduct
[
0
].
ticketType
==
2
)
{
//联票
uni
.
navigateTo
({
url
:
'/pages/scenic/scenicJointOrder/scenicJointOrder'
+
query
})
}
else
{
//普通票
uni
.
navigateTo
({
url
:
'/pages/scenic/scenicSingleOrder/scenicSingleOrder'
+
query
})
}
}
else
{
let
productIdList
=
this
.
chooseProduct
.
map
(
item
=>
{
return
item
.
id
})
let
query
=
'?productIdList='
+
JSON
.
stringify
(
productIdList
)
+
'&groupId='
+
this
.
groupId
+
'&groupChannelId='
+
this
.
groupChannelId
+
'&orderSource=3'
uni
.
navigateTo
({
url
:
'/pages/scenic/scenicCombiOrder/scenicCombiOrder'
+
query
})
}
},
//---跳转影集页面
goAlbum
(
index
){
if
(
index
==
0
){
let
data
=
{
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
}
this
.
$request
(
'wechatUser/pdFace/checkScanFace'
,
data
).
then
(
res
=>
{
if
(
res
.
code
===
'00'
)
{
let
merchantId
=
this
.
merchantId
||
'z0015605022691a5945bbe463141668c'
// 默认长江索道
if
(
res
.
data
.
isScanFace
==
0
)
{
//未扫脸
uni
.
navigateTo
({
url
:
`/pages/album/getPortrait?merchantId=
${
merchantId
}
`
})
}
else
if
(
res
.
data
.
isScanFace
==
1
)
{
//已扫脸
let
faceIds
=
JSON
.
stringify
(
res
.
data
.
faceIds
)
let
companyId
=
this
.
companyId
uni
.
navigateTo
({
url
:
`/pages/album/myPhotoAlbum/myPhotoAlbum?faceIds=
${
faceIds
}
&companyId=
${
companyId
}
&merchantId
${
merchantId
}
`
})
}
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
}
},
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.wrap
{
height
:
100%
;
display
:
flex
;
flex-direction
:
column
;
background
:
#fff
;
}
.middle
{
padding
:
0
24rpx
100rpx
24rpx
;
display
:
flex
;
flex-direction
:
column
;
// flex: 1;
background
:
#f7f7f7
;
}
.swiper-box
{
// flex: 1;
position
:
relative
;
top
:
-40rpx
;
}
.tabbar
{
transition
:
1s
;
width
:
100%
;
left
:
0
;
z-index
:
1
;
position
:
relative
;
top
:
-40rpx
;
background
:
#fff
;
box-shadow
:
0px
0px
8px
2px
rgba
(
0
,
0
,
0
,
0
.08
);
border-radius
:
16rpx
;
display
:
flex
;
justify-content
:
space-between
;
font-size
:
32rpx
;
text
{
padding
:
24rpx
32rpx
24rpx
20rpx
;
border-radius
:
16rpx
;
width
:
33
.3%
;
text-align
:
center
;
}
}
.tabbar
.on
{
// background: url('../../../static/img/scenic/tabbar.png') no-repeat;
background
:
$theme
;
background-size
:
100%
100%
;
color
:
#fff
;
font-weight
:
bold
;
}
.merchant
{
border-radius
:
16rpx
;
background
:
#ffffff
;
margin-top
:
24rpx
;
padding
:
24rpx
;
}
.merchant
label
{
width
:
100%
;
}
.merchant
label
.off
.product
{
background
:
#f3f3f3
;
color
:
#999999
;
}
.merchant
label
.off
.product-name
{
color
:
#999999
;
}
.merchant
label
.off
.product-rule
{
color
:
#999999
;
}
.merchant-title
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding-bottom
:
16rpx
;
}
.title-left
{
font-size
:
32rpx
;
margin-right
:
10rpx
;
font-weight
:
bold
;
image
{
width
:
36rpx
;
height
:
36rpx
;
position
:
relative
;
top
:
6rpx
;
margin
:
0
8rpx
;
}
}
.title-coupon
{
color
:
$red
;
font-size
:
24rpx
;
}
.title-right
{
color
:
$grey
;
font-size
:
24rpx
;
display
:
flex
;
}
.product
{
padding
:
10rpx
16rpx
;
background
:
#ffffff
;
border-radius
:
8rpx
;
display
:
flex
;
align-items
:
center
;
margin-top
:
10rpx
;
}
.product.on
{
background
:
#e2eeff
;
}
.product-left
{
margin-right
:
10rpx
;
}
.product-right
{
flex
:
1
;
}
.product-name
{
font-size
:
28rpx
;
font-weight
:
bold
;
color
:
#191919
;
display
:
flex
;
justify-content
:
space-between
;
}
.product-status
{
padding
:
6rpx
12rpx
;
border
:
2px
solid
#f40000
;
background
:
#ffffff
;
color
:
#f40000
;
font-size
:
24rpx
;
border-radius
:
4rpx
;
transform
:
rotate
(
-25deg
);
position
:
relative
;
top
:
30rpx
;
right
:
80rpx
;
}
.product-price
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
}
.product-rule
{
color
:
$theme
;
}
.
product-rule
:
:
after
{
display
:
inline-block
;
content
:
''
;
height
:
22rpx
;
margin
:
0
10rpx
;
background
:
#ccc
;
width
:
1px
;
}
.product-orange
{
font-size
:
20rpx
;
color
:
$grey
;
text-decoration
:
line-through
;
}
.product-sell
{
font-size
:
40rpx
;
color
:
$red
;
font-weight
:
bold
;
margin-left
:
10rpx
;
}
.product-more
{
padding
:
10rpx
;
text-align
:
center
;
}
.bottom
{
position
:
fixed
;
bottom
:
0
;
width
:
100%
;
height
:
100rpx
;
background
:
#fff
;
box-shadow
:
0px
4px
12px
rgba
(
0
,
0
,
0
,
0
.16
);
z-index
:
10
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
padding
:
0
32rpx
;
}
.bottom-left
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
}
.bottom-middle
{
position
:
relative
;
padding
:
0
40rpx
;
}
.bottom-more
{
position
:
relative
;
top
:
-40rpx
;
background
:
#f40000
;
border-radius
:
28px
;
opacity
:
0
.64
;
padding
:
10rpx
20rpx
;
color
:
#ffffff
;
}
.bottom-three
{
width
:
14rpx
;
height
:
14rpx
;
display
:
inline-block
;
background
:
#f40000
;
opacity
:
0
.64
;
position
:
absolute
;
right
:
42rpx
;
bottom
:
-7rpx
;
transform
:
rotate
(
45deg
);
}
.bottom-detail
{
position
:
relative
;
text-align
:
center
;
display
:
flex
;
justify-content
:
center
;
}
.bottom-number
{
display
:
inline-block
;
width
:
36rpx
;
height
:
36rpx
;
border-radius
:
50%
;
text-align
:
center
;
background
:
#f40000
;
color
:
#ffffff
;
font-weight
:
bold
;
margin-left
:
10rpx
;
}
.btn
{
font-size
:
32rpx
;
width
:
200rpx
;
}
//摄影、旅拍
.album-left
{
margin
:
8rpx
6rpx
0
0
;
}
.album-right
{
margin
:
8rpx
0
0
6rpx
;
}
.album-list-top
image
{
width
:
100%
;
}
.album-list-bottom
{
border-radius
:
0
0
16rpx
16rpx
;
position
:
relative
;
top
:
-4px
;
padding
:
20rpx
16rpx
;
color
:
#fff
;
view
:first-child
{
font-weight
:
bold
;
}
view
:nth-child
(
2
)
{
font-size
:
24rpx
;
margin-top
:
16rpx
;
}
view
:nth-child
(
3
)
{
display
:
flex
;
justify-content
:
space-between
;
margin-top
:
20rpx
;
}
}
.album-btn
{
display
:
flex
;
width
:
160rpx
;
height
:
44rpx
;
background
:
#E1E1D9
;
border-radius
:
20rpx
20rpx
20rpx
20rpx
;
font-size
:
22rpx
;
color
:
#333333
;
align-items
:
center
;
justify-content
:
center
;
padding-left
:
8rpx
;
}
.suodaoImg
{
position
:
fixed
;
z-index
:
9999
;
width
:
100%
;
height
:
100%
;
}
.swiper-item
/
deep
/
.u-waterfall
{
padding-top
:
8rpx
;
}
.swiper-item
/
deep
/
.u-empty
{
height
:
300px
;
}
</
style
>
pages/scenic/combinationProduct/components/detail.vue
deleted
100644 → 0
View file @
ffeaaa84
<
template
>
<!-- 详情 -->
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop = false"
>
<view
class=
"son-wrap"
>
<view
class=
"title"
>
<view
style=
"flex: 1; text-align: center"
>
明细
</view>
<u-icon
name=
"close"
@
click=
"showPop = false"
></u-icon>
</view>
<view
style=
"flex: 1;overflow-y: scroll;"
>
<view
class=
"middle"
>
<view
class=
"merchantlist"
v-for=
"(item,index) in merchantList"
:key=
"index"
>
<view
class=
"merchant-title"
>
{{
item
.
merchantName
}}
</view>
<view
class=
"productlist"
v-for=
"(items,a) in item.productlist"
:key=
'a'
>
<text>
{{
items
.
name
}}
</text>
<text
style=
"font-weight: bold;"
>
¥
{{
items
.
sellingPrice
}}
</text>
</view>
</view>
</view>
<view
class=
"bottom"
>
<view
class=
"bottom-left"
>
合计:¥
<text
style=
"font-weight: bold;font-size: 40rpx;"
>
{{
priceTotal
}}
</text>
</view>
<view
class=
"bottom-right"
>
<text
class=
"btn"
@
click=
"goFillorder()"
>
去预订
</text>
</view>
</view>
</view>
</view>
</u-popup>
</
template
>
<
script
>
export
default
{
props
:
[
'chooseProduct'
],
data
()
{
return
{
showPop
:
false
,
//控制弹窗显示隐藏
priceTotal
:
0
,
//总价
merchantList
:[],
//商家列表
}
},
watch
:
{
//选中产品的数量变化
chooseProduct
:
{
handler
(
newValue
,
oldValue
){
this
.
priceTotal
=
0
this
.
chooseProduct
.
forEach
((
item
)
=>
{
this
.
priceTotal
+=
item
.
sellingPrice
})
this
.
priceTotal
=
parseFloat
(
this
.
priceTotal
.
toFixed
(
2
))
this
.
merchantList
=
[]
this
.
chooseProduct
.
forEach
(
item
=>
{
if
(
!
this
.
merchantList
.
find
(
item2
=>
item2
.
merchantId
==
item
.
merchantId
)){
this
.
merchantList
.
push
({
merchantName
:
item
.
merchantName
,
merchantId
:
item
.
merchantId
,
productlist
:[]
})
}
})
//一级数组转化成二级数组
this
.
merchantList
.
forEach
(
item
=>
{
this
.
chooseProduct
.
forEach
(
item2
=>
{
if
(
item
.
merchantId
==
item2
.
merchantId
){
item
.
productlist
.
push
(
item2
)
}
})
})
},
deep
:
true
,
immediate
:
false
},
},
methods
:
{
//---跳转填写订单页面
goFillorder
(){
this
.
$parent
.
goFillorder
()
}
}
}
</
script
>
<
style
scoped=
"scoped"
lang=
"scss"
>
.son-wrap
{
position
:
relative
;
height
:
80vh
;
display
:
flex
;
flex-direction
:column
;
}
.title
{
display
:
flex
;
font-size
:
32rpx
;
font-weight
:
bold
;
padding
:
30rpx
;
background
:
#fff
;
border-radius
:
20rpx
20rpx
0
0
;
}
.middle
{
padding
:
0
24rpx
100rpx
24rpx
;
}
.merchantlist
{
border-bottom
:
2rpx
solid
#ececec
;
padding-bottom
:
40rpx
;
margin-top
:
24rpx
;
}
.merchant-title
{
font-size
:
36rpx
;
font-weight
:
bold
;
color
:
#191919
;
}
.productlist
{
display
:
flex
;
justify-content
:
space-between
;
font-size
:
32rpx
;
margin-top
:
20rpx
;
}
.bottom
{
display
:
flex
;
justify-content
:
space-between
;
padding
:
0
24rpx
;
height
:
100rpx
;
align-items
:
center
;
position
:
fixed
;
bottom
:
0
;
width
:
100%
;
z-index
:
9
;
background
:
#FFFFFF
;
box-sizing
:
border-box
;
}
.bottom-left
{
color
:
$red
;
font-size
:
32rpx
;
}
.btn
{
font-size
:
32rpx
;
width
:
200rpx
;
}
</
style
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment