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
3c2a558a
Commit
3c2a558a
authored
Nov 28, 2023
by
qipeng
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' into chargeback
parents
bf4400a5
7a7e3a5b
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
2130 additions
and
2152 deletions
+2130
-2152
App.vue
App.vue
+34
-15
common.js
common/common.js
+4
-1
buyKnow.vue
components/buyKnow.vue
+7
-15
customer.vue
components/customer.vue
+3
-4
merchantDetail.vue
components/merchantDetail.vue
+3
-6
orderCoupon.vue
components/orderCoupon.vue
+141
-82
albumOrderdetail.vue
pages/album/albumOrderdetail/albumOrderdetail.vue
+2
-2
index.vue
pages/indexs/index/index.vue
+1
-1
merchantListIndex.vue
pages/indexs/merchantListIndex/merchantListIndex.vue
+3
-3
numberChoose.vue
pages/my/takeNumber/numberChoose/numberChoose.vue
+1
-1
numberIndex.vue
pages/my/takeNumber/numberIndex/numberIndex.vue
+5
-2
orderPayment.vue
pages/payment/orderPayment/orderPayment.vue
+73
-66
ourPayment.vue
pages/payment/ourPayment/ourPayment.vue
+19
-19
combinationProduct.vue
pages/scenic/combinationProduct/combinationProduct.vue
+2
-2
calendar.vue
pages/scenic/scenicComponents/calendar.vue
+17
-39
chooseArea.vue
pages/scenic/scenicComponents/chooseArea.vue
+81
-93
contactList.vue
pages/scenic/scenicComponents/contactList.vue
+191
-152
detail.vue
pages/scenic/scenicComponents/detail.vue
+83
-124
editContacts.vue
pages/scenic/scenicComponents/editContacts.vue
+133
-142
times.vue
pages/scenic/scenicComponents/times.vue
+88
-96
scenicOrder.vue
pages/scenic/scenicOrder/scenicOrder.vue
+674
-689
uni.scss
uni.scss
+17
-63
u-icon.vue
uview-ui/components/u-icon/u-icon.vue
+81
-82
u-popup.vue
uview-ui/components/u-popup/u-popup.vue
+155
-155
dayjs.js
uview-ui/libs/util/dayjs.js
+312
-298
No files found.
App.vue
View file @
3c2a558a
...
...
@@ -80,16 +80,7 @@ export default {
<
style
lang=
"scss"
>
@import
"uview-ui/index.scss"
;
/*
1.页面背景颜色#f7f7f7
2.分隔线颜色#DBDBDB
3.正常字体颜色#333333
4.灰色字体颜色#666666或者#999999
5.主题颜色#3688FF
6.正常字体大小28rpx,偏小一点的24rpx
8.页面最外层与里面的第一层为padding:0 12px;
9.css单位为rpx
*/
page
{
font-size
:
28rpx
;
color
:
#333333
;
...
...
@@ -110,14 +101,42 @@ export default {
textarea
{
box-sizing
:
border-box
;
}
.btn
{
background
:
linear-gradient
(
132deg
,
#ED400C
0%
,
#FB862C
100%
);
//小按钮
.btn
{
background
:
#3688FF
;
display
:
inline-block
;
color
:
#FFFFFF
;
font-size
:
28rpx
;
border-radius
:
8rpx
;
width
:
135rpx
;
height
:
70rpx
;
line-height
:
70rpx
;
font-size
:
28rpx
;
border-radius
:
16rpx
;
text-align
:
center
;
}
//中等按钮
.middle-btn
{
background
:linear-gradient
(
132deg
,
#ED400C
0
%
,
#FB862C
100
%
)
;
display
:
inline-block
;
color
:
#FFFFFF
;
width
:
180rpx
;
height
:
80rpx
;
line-height
:
80rpx
;
font-size
:
32rpx
;
border-radius
:
20rpx
;
text-align
:
center
;
}
//大按钮
.big-btn
{
background
:linear-gradient
(
132deg
,
#ED400C
0
%
,
#FB862C
100
%
)
;
display
:
inline-block
;
color
:
#FFFFFF
;
width
:
240rpx
;
height
:
100rpx
;
line-height
:
100rpx
;
font-size
:
36rpx
;
border-radius
:
28rpx
;
text-align
:
center
;
padding
:
10rpx
20rpx
;
font-weight
:
bold
;
}
/*单行溢出*/
...
...
common/common.js
View file @
3c2a558a
...
...
@@ -96,11 +96,14 @@ export default{
return
d
*
(
1
+
fl
*
(
h1
*
sf
*
(
1
-
sg
)
-
h2
*
(
1
-
sf
)
*
sg
))
},
phoneReg
:
function
(){
//手机正则
return
/^
(
13
[
0-9
]
|14
[
0-9
]
|15
[
0-9
]
|18
[
0-9
]
|17
[
0-9
]
|19
[
0-9
]
|16
[
0-9
])\d{8}
$/
return
/^
(
13
[
0-9
]
|14
[
0-9
]
|15
[
0-9
]
|18
[
0-9
]
|17
[
0-9
]
|19
[
0-9
]
|16
[
0-9
]
|12
[
0-9
]
)\d{8}
$/
},
idReg
:
function
(){
//身份证正则
return
/^
[
1-9
]\d{5}[
1-9
]\d{3}((
0
\d)
|
(
1
[
0-2
]))(([
0|1|2
]\d)
|3
[
0-1
])\d{3}([
0-9
]
|X|x
)
$/
},
nameReg
:
function
(){
//中文名字正则
return
/^
[\u
4E00-
\u
9FA5
]{2,40}
$/
},
getUrlKey
:
function
(
name
,
url
){
//通过连接地址获取参数值
return
(
new
RegExp
(
'[?|&]'
+
name
+
'='
+
'([^&;]+?)(&|#|;|$)'
).
exec
(
decodeURIComponent
(
url
))
||
[,
''
])[
1
].
replace
(
/
\+
/g
,
'%20'
)
||
''
},
...
...
components/buyKnow.vue
View file @
3c2a558a
<
template
>
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop=false"
>
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop=false"
closeable
>
<view
class=
"son-wrap"
>
<view
class=
"head"
>
<view
class=
"head1"
>
<view
style=
"flex: 1;text-align: center;"
>
购买须知
</view>
<u-icon
name=
"close"
@
click=
"showPop=false"
></u-icon>
</view>
<view
class=
"head2"
>
{{
buyKnowData
.
name
}}
...
...
@@ -20,7 +17,7 @@
<view
style=
"flex: 1;overflow-y: scroll;"
>
<view
class=
"middle"
>
<view
class=
"middle-list"
v-for=
"(item,a) of buyKnowData.productTitle
ResVos
"
:key=
"a"
>
<view
class=
"middle-list"
v-for=
"(item,a) of buyKnowData.productTitle
Data
"
:key=
"a"
>
<view
class=
"middle-title"
>
{{
item
.
title
}}
</view>
...
...
@@ -45,7 +42,7 @@
¥
<text>
{{
buyKnowData
.
sellingPrice
}}
</text>
</text>
<view
class=
"bottom-right"
>
<text
class=
"btn"
@
click=
"showPop=false"
>
<text
class=
"
middle-
btn"
@
click=
"showPop=false"
>
去预订
</text>
</view>
...
...
@@ -71,8 +68,7 @@ export default {
<
style
scoped=
"scoped"
>
.son-wrap
{
position
:
relative
;
height
:
85vh
;
height
:
80vh
;
display
:
flex
;
flex-direction
:
column
;
}
...
...
@@ -80,7 +76,7 @@ export default {
padding
:
0
24
rpx
;
}
.head1
{
display
:
flex
;
text-align
:
center
;
font-size
:
32
rpx
;
font-weight
:
bold
;
padding
:
30
rpx
0
;
...
...
@@ -113,8 +109,9 @@ export default {
}
.middle-content
{
display
:
flex
;
margin-top
:
3
0
rpx
;
margin-top
:
2
0
rpx
;
position
:
relative
;
line-height
:
52
rpx
;
}
.middle-content
>
text
{
color
:
#666666
;
...
...
@@ -160,9 +157,4 @@ export default {
display
:
flex
;
align-items
:
center
;
}
.btn
{
padding
:
16
rpx
48
rpx
;
border-radius
:
20
rpx
;
font-size
:
32
rpx
;
}
</
style
>
components/customer.vue
View file @
3c2a558a
<
template
>
<!-- 客服 -->
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop = false"
>
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop = false"
closeable
>
<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
class=
"middle"
>
<view
class=
"list"
v-for=
"(item, index) in scenicList"
:key=
"index"
@
click=
"makePhone(item.phone)"
>
...
...
@@ -45,7 +44,7 @@ export default {
flex-direction
:
column
;
}
.title
{
display
:
flex
;
text-align
:
center
;
font-size
:
32rpx
;
font-weight
:
bold
;
padding
:
30rpx
;
...
...
components/merchantDetail.vue
View file @
3c2a558a
<
template
>
<!-- 商家详情弹窗 -->
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop=false"
>
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop=false"
closeable
>
<view
class=
"son-wrap"
>
<view
class=
"head"
>
<view
class=
"head-name"
>
{{
detailData
.
name
}}
</view>
<u-icon
name=
"close"
@
click=
"showPop=false"
></u-icon>
{{
detailData
.
name
}}
</view>
<view
style=
"flex: 1;overflow-y: scroll;"
>
<view
v-if=
"detailData.imgList&&detailData.imgList.length>0"
>
...
...
@@ -166,7 +163,7 @@ export default {
flex-direction
:column
;
}
.head
{
display
:
flex
;
text-align
:
center
;
font-size
:
32rpx
;
font-weight
:
bold
;
padding
:
30rpx
;
...
...
components/orderCoupon.vue
View file @
3c2a558a
<
template
>
<!----------------适用于订单选择券的时候展示券列表-------------------------->
<u-popup
:show=
"show"
:round=
"20"
closeable
@
close=
"show=false"
>
<view
class=
"title"
>
<view
class=
"titleContent"
v-for=
"(item,index) of navTitle"
:key=
"index"
:class=
"
{on:active==index}" @click="navClick(index)">
<view
style=
"position: relative;top:15rpx;"
>
{{
item
}}
</view>
<view
v-show=
"active==index"
>
<text></text>
<!-- -----------------------适用于下单页面选择券的时候展示券列表-------------------------- -->
<u-popup
:show=
"showPop"
:round=
"20"
closeable
@
close=
"showPop=false"
>
<view
class=
"son-wrap"
>
<view
class=
"head"
>
<view
class=
"headlist"
v-for=
"(item,index) of navTitle"
:key=
"index"
:class=
"
{on:active==index}" @click="navClick(index)">
<text>
{{
item
}}
</text>
</view>
</view>
</view>
<!----------------------------------------------------可用------------------------------------------>
<view
v-show=
"active==0"
>
<view
class=
"middle"
>
<checkbox-group
@
change=
"checkboxChange"
v-if=
"couponList.masterSlaveCouponList&&couponList.masterSlaveCouponList.length>0"
>
<view
v-for=
"(item,index) of couponList.masterSlaveCouponList"
:key=
"index"
class=
"listBox"
>
<label
class=
"listLabel"
>
<!------------------------------------可用-------------------------------------->
<view
class=
"middle"
v-if=
"active==0"
>
<checkbox-group
@
change=
"checkboxChange"
v-if=
"masterSlaveCouponList&&masterSlaveCouponList.length>0"
>
<view
v-for=
"(item,index) of masterSlaveCouponList"
:key=
"index"
class=
"list-box"
>
<label>
<view>
{{
item
.
couponName
}}
<checkbox
:value=
"
item.couponId"
:checked=
"item.couponId==chooseCoupon.couponId
"
/>
<checkbox
:value=
"
JSON.stringify(item)"
:checked=
"item.couponId==chooseCoupon.couponId"
class=
"blue
"
/>
</view>
<view>
{{
item
.
couponRule
}}
...
...
@@ -33,36 +31,37 @@
</label>
</view>
</checkbox-group>
<view
class=
"empty"
v-else
>
空空如也...
</view>
</view>
<view
class=
"empty"
v-if=
"!couponList.masterSlaveCouponList||couponList.masterSlaveCouponList.length==0"
>
空空如也...
</view>
</view>
<!--------------------------------------不可用------------------------------------------------------------>
<view
v-show=
"active==1"
>
<view
class=
"middle"
v-if=
"couponList.unusableCouponList&&couponList.unusableCouponList.length>0"
>
<view
v-for=
"(item,index) of couponList.unusableCouponList"
:key=
"index"
class=
"listBox"
>
<view>
{{
item
.
couponName
}}
</view>
<view>
{{
item
.
couponRule
}}
<text
v-if=
"item.savedMoney"
>
<text>
¥
</text>
{{
parseFloat
(
item
.
savedMoney
.
toFixed
(
2
))
}}
</text>
</view>
<view>
{{
item
.
useStartDate
}}
-
{{
item
.
useEndDate
}}
<!-- -------------------------------不可用-------------------------------- -->
<view
v-if=
"active==1"
class=
"middle"
>
<view
v-if=
"unusableCouponList&&unusableCouponList.length>0"
>
<view
v-for=
"(item,index) of unusableCouponList"
:key=
"index"
class=
"list-box"
>
<view>
{{
item
.
couponName
}}
</view>
<view>
{{
item
.
couponRule
}}
<text
v-if=
"item.savedMoney"
>
<text>
¥
</text>
{{
parseFloat
(
item
.
savedMoney
.
toFixed
(
2
))
}}
</text>
</view>
<view>
{{
item
.
useStartDate
}}
-
{{
item
.
useEndDate
}}
</view>
</view>
</view>
<view
class=
"empty"
v-else
>
空空如也...
</view>
</view>
<view
class=
"empty"
v-if=
"!couponList.unusableCouponList||couponList.unusableCouponList.length==0"
>
空空如也...
</view>
</view>
</view
>
<view
class=
"bottom-sure"
@
click=
"showPop=false"
>
确定
</view>
</u-popup>
</
template
>
...
...
@@ -72,16 +71,25 @@
export
default
{
props
:[
'couponData'
,
'chooseCouponObj'
],
watch
:
{
couponData
:{
//
couponData
:{
//
劵列表
handler
(
newValue
,
oldValue
){
if
(
newValue
){
this
.
couponList
=
this
.
couponData
//可用优惠券去重
this
.
masterSlaveCouponList
=
[]
if
(
newValue
.
masterSlaveCouponList
){
newValue
.
masterSlaveCouponList
.
forEach
(
item
=>
{
if
(
!
this
.
masterSlaveCouponList
.
find
(
item2
=>
item2
.
couponId
==
item
.
couponId
)){
this
.
masterSlaveCouponList
.
push
(
item
)
}
})
}
this
.
unusableCouponList
=
newValue
.
unusableCouponList
}
},
deep
:
true
,
immediate
:
true
},
chooseCouponObj
:{
//
chooseCouponObj
:{
//
选中的券
handler
(
newValue
,
oldValue
){
if
(
newValue
){
this
.
chooseCoupon
=
this
.
chooseCouponObj
...
...
@@ -94,36 +102,26 @@ export default{
data
(){
return
{
active
:
0
,
//导航栏下标
show
:
false
,
//控制弹窗显示隐藏
current
:
0
,
//控制选项卡默认显示第几个
couponList
:
''
,
//
券列表
show
Pop
:
false
,
//控制弹窗显示隐藏
masterSlaveCouponList
:[],
//可用优惠券列表
unusableCouponList
:[],
//不可用优惠
券列表
chooseCoupon
:
''
,
//选中的劵
navTitle
:[
'可用'
,
'不可用'
],
//导航标题
}
},
methods
:{
navClick
(
index
){
//------------------------------------------导航栏点击
//---导航栏点击
navClick
(
index
){
this
.
active
=
index
},
showCoupon
(){
//----------------------------------------展示弹窗
this
.
show
=
true
},
//---多选框值变化
checkboxChange
(
evt
){
if
(
evt
.
detail
.
value
.
length
==
2
){
//删除第一个
evt
.
detail
.
value
.
splice
(
0
,
1
)
//获取选中券,传值给父组件
this
.
chooseCoupon
=
this
.
couponList
.
masterSlaveCouponList
.
find
((
item
)
=>
{
return
item
.
couponId
==
evt
.
detail
.
value
[
0
]
})
this
.
$emit
(
'couponChoose'
,
this
.
chooseCoupon
)
}
else
if
(
evt
.
detail
.
value
.
length
==
1
){
this
.
chooseCoupon
=
this
.
couponList
.
masterSlaveCouponList
.
find
((
item
)
=>
{
return
item
.
couponId
==
evt
.
detail
.
value
[
0
]
})
this
.
$emit
(
'couponChoose'
,
this
.
chooseCoupon
)
}
else
if
(
evt
.
detail
.
value
.
length
==
0
){
checkboxChange
(
e
){
let
value
=
e
.
detail
.
value
if
(
value
.
length
>
0
){
let
obj
=
JSON
.
parse
(
value
[
value
.
length
-
1
])
this
.
$emit
(
'couponChoose'
,
obj
)
}
if
(
value
.
length
==
0
){
this
.
$emit
(
'couponChoose'
,
''
)
}
}
...
...
@@ -133,19 +131,80 @@ export default{
</
script
>
<
style
scoped=
"scoped"
lang=
"scss"
>
.title
{
display
:
flex
;
height
:
80rpx
;}
.titleContent
{
flex
:
1
;
text-align
:
center
;
font-size
:
30rpx
;}
.titleContent.on
{
color
:
$blue
;
font-weight
:
bold
;}
.titleContent
view
text
{
width
:
40rpx
;
height
:
6rpx
;
background
:
$blue
;
border-radius
:
6rpx
;
display
:inline-block
;
position
:
relative
;
top
:
-10rpx
;}
.middle
{
padding
:
24rpx
;
background
:
#f5f5f5
;}
.listBox
{
background
:
#FFFFFF
;
padding
:
24rpx
;
border-radius
:
10rpx
;}
.middle
.listBox
:not
(
:first-child
)
{
margin-top
:
20rpx
;}
.middle
view
view
:not
(
:first-child
)
{
margin-top
:
20rpx
;}
.middle
view
view
{
display
:
flex
;
justify-content
:
space-between
;}
.middle
view
view
:first-child
{
font-weight
:
bold
;}
.middle
view
view
:nth-child
(
2
)
{
font-size
:
24rpx
;}
.middle
view
view
:last-child
{
color
:
#666666
;
font-size
:
24rpx
;}
.middle
view
text
{
color
:
#f9690e
;
font-size
:
30rpx
;
font-weight
:
bolder
;}
.middle
view
text
text
{
font-size
:
24rpx
;
font-weight
:
400
;}
.empty
{
padding
:
100rpx
0
;
text-align
:
center
;
background
:
#f5f5f5
;}
.son-wrap
{
height
:
80vh
;
display
:
flex
;
flex-direction
:column
;
}
.head
{
display
:
flex
;
}
.headlist
{
width
:
50%
;
height
:
90rpx
;
line-height
:
90rpx
;
text-align
:
center
;
font-size
:
30rpx
;
}
.headlist.on
text
{
border-bottom
:
6rpx
solid
$theme
;
color
:
$theme
;
font-weight
:
bold
;
}
.middle
{
padding
:
24rpx
24rpx
100rpx
24rpx
;
background
:
#f5f5f5
;
flex
:
1
;
overflow-y
:
scroll
;
}
.list-box
{
background
:
#FFFFFF
;
padding
:
24rpx
;
border-radius
:
10rpx
;
}
.middle
.list-box
:not
(
:first-child
)
{
margin-top
:
20rpx
;
}
.list-box
view
:not
(
:first-child
)
{
margin-top
:
20rpx
;
}
.list-box
view
{
display
:
flex
;
justify-content
:
space-between
;
}
.list-box
view
:first-child
{
font-weight
:
bold
;
}
.list-box
view
:last-child
{
color
:
#999999
;
font-size
:
24rpx
;
}
.list-box
text
{
color
:
#f9690e
;
font-size
:
32rpx
;
font-weight
:
bold
;
}
.list-box
text
text
{
font-size
:
24rpx
;
font-weight
:
400
;
}
.empty
{
padding
:
160rpx
0
;
text-align
:
center
;
color
:
$red
;
}
.bottom-sure
{
position
:
fixed
;
bottom
:
0
;
left
:
0
;
width
:
100%
;
height
:
100rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
background
:
$theme
;
font-size
:
32rpx
;
font-weight
:
bold
;
color
:
#ffffff
;
}
</
style
>
pages/album/albumOrderdetail/albumOrderdetail.vue
View file @
3c2a558a
...
...
@@ -365,7 +365,7 @@ export default {
.button
{
width
:
144rpx
;
height
:
64rpx
;
background
:
$
blu
e
;
background
:
$
them
e
;
border-radius
:
8rpx
;
display
:
inline-block
;
color
:
#ffffff
;
...
...
@@ -411,7 +411,7 @@ export default {
display
:
inline-block
;
width
:
212rpx
;
height
:
80rpx
;
background
:
$
blu
e
;
background
:
$
them
e
;
border-radius
:
44rpx
;
text-align
:
center
;
line-height
:
80rpx
;
...
...
pages/indexs/index/index.vue
View file @
3c2a558a
...
...
@@ -20,7 +20,7 @@
</view>
<view
class=
"banner"
>
<u-swiper
:list=
"list"
@
change=
"e => currentNum = e.current"
indicatorStyle=
"right: 20px"
height=
"300"
circular
>
<u-swiper
:list=
"list"
@
change=
"e => currentNum = e.current"
indicatorStyle=
"right: 20px"
height=
"300"
circular
@
click=
'swiperClick(currentNum)'
>
<view
slot=
"indicator"
class=
"indicator-num"
>
<text
class=
"indicator-num__text"
>
{{
currentNum
+
1
}}
/
{{
list
.
length
}}
</text>
</view>
...
...
pages/indexs/merchantListIndex/merchantListIndex.vue
View file @
3c2a558a
...
...
@@ -344,7 +344,7 @@ export default {
padding-right
:
40rpx
;
}
.search-btn
{
background
:
$
blu
e
;
background
:
$
them
e
;
color
:
#fff
;
border-radius
:
32rpx
;
padding
:
12rpx
24rpx
;
...
...
@@ -388,8 +388,8 @@ export default {
justify-content
:
space-between
;
}
.right2-left
text
{
color
:
$
blu
e
;
border
:
1px
solid
$
blu
e
;
color
:
$
them
e
;
border
:
1px
solid
$
them
e
;
font-size
:
20rpx
;
padding
:
2rpx
4rpx
;
border-radius
:
2rpx
;
...
...
pages/my/takeNumber/numberChoose/numberChoose.vue
View file @
3c2a558a
...
...
@@ -125,7 +125,7 @@ export default {
white-space
:
nowrap
;
}
.choose-content.on
{
background
:
$
blu
e
;
background
:
$
them
e
;
color
:
#ffffff
;
}
.choose-name
{
...
...
pages/my/takeNumber/numberIndex/numberIndex.vue
View file @
3c2a558a
...
...
@@ -55,7 +55,9 @@ export default {
let
data
=
{
search
:
this
.
search
,
//输入框的值
userId
:
uni
.
getStorageSync
(
'openid'
)
||
''
,
merchantCode
:
this
.
merchantCode
merchantCode
:
this
.
merchantCode
,
startPlayDate
:
new
Date
().
Format
(
'yyyy-MM-dd'
)
+
' 00:00:00'
,
//开始日期
endPlayDate
:
new
Date
().
Format
(
'yyyy-MM-dd'
)
+
' 23:59:59'
,
//结束日期
}
uni
.
showLoading
({
title
:
'加载中'
...
...
@@ -258,6 +260,7 @@ export default {
}
.mark-close
{
margin-top
:
60rpx
;
text-align
:
center
;
display
:
flex
;
justify-content
:
center
;
}
</
style
>
pages/payment/orderPayment/orderPayment.vue
View file @
3c2a558a
<
template
>
<view
v-show=
"bodyShow"
>
<view
class=
"middle"
>
<view
class=
"m
ain
"
>
<view
v-if=
"orderList.length>0"
v-for=
"item of orderList"
:key=
"item.id"
class=
"product"
>
<view>
<view
class=
"middle"
v-show=
"orderList.length>0"
>
<view
class=
"m
iddle-wrap
"
>
<view
v-for=
"item of orderList"
:key=
"item.id"
class=
"product"
>
<view>
<text>
{{
item
.
merchantName
}}
(
{{
item
.
productName
}}
)
</text>
...
...
@@ -15,16 +15,14 @@
<text>
券
</text>
<text>
<text
style=
"font-size:24rpx;"
>
-¥
</text>
{{
item
.
pdDiscountMoney
}}
</text>
</view>
</view>
<view
class=
"mainP3"
>
<text>
实际支付
</text>
<text>
<!--
<i>
¥
{{
totalMoney
}}
</i>
-->
<text>
<text
style=
"font-size:28rpx;"
>
¥
</text>
{{
pdOrderMoney
}}
</text>
</text>
<view
class=
"middle-money"
>
<view>
实际支付
</view>
<view>
<text
style=
"font-size:28rpx;"
>
¥
</text>
{{
pdOrderMoney
}}
</view>
</view>
<view
class=
"m
ainview
"
>
<view
class=
"m
iddle-image
"
>
<!-- #ifdef MP-WEIXIN -->
<image
src=
"@/static/img/orderPayment/weixin.png"
style=
"width:70rpx;height:62rpx;"
/>
<view>
微信支付
</view>
<!-- #endif -->
...
...
@@ -36,16 +34,20 @@
</view>
</view>
</view>
<view
v-show=
"errorMessage1||errorMessage2"
>
错误1:
{{
errorMessage1
}}
错误2:
{{
errorMessage2
}}
</view>
<view
class=
"bottom"
>
<view
class=
"bottomFirst"
>
<text>
实付款
</text>
<text>
<text>
¥
</text>
{{
pdOrderMoney
}}
</text>
<view
class=
"bottom-left"
>
<text>
实付款
</text>
<text
v-show=
"pdOrderMoney"
>
<text
style=
"font-size: 28rpx;"
>
¥
</text>
{{
pdOrderMoney
}}
</text>
</view>
<view
class=
"bottomLast"
>
<text
href=
"tel:400-072-0368"
>
<!--
<img
src=
"@/assets/img/combination/kefu11.png"
style=
"width: 0.31rpx;"
/>
-->
</text>
<view
class=
"bottom-right"
>
<u-icon
name=
"chat"
size=
"40"
@
click=
"makePhone()"
></u-icon>
<text
@
click=
"goPay()"
:style=
"
{ background: background }">去支付
</text>
</view>
</view>
...
...
@@ -59,14 +61,14 @@ export default {
orderList
:[],
//订单列表
pdOrderMoney
:
''
,
//实际总价
totalMoney
:
''
,
//原价总价
errorMessage
:
''
,
//
错误信息
bodyShow
:
false
,
//控制初始化数据成功显示
errorMessage
1
:
''
,
//错误信息1,接口成功返回的
错误信息
errorMessage2
:
''
,
//错误信息2,接口失败返回的错误信息
payType
:
''
,
//支付类型
timeStamp
:
''
,
//支付参数
nonceStr
:
''
,
package
:
''
,
signType
:
''
,
paySign
:
''
,
timeStamp
:
''
,
//
微信
支付参数
nonceStr
:
''
,
//微信支付参数
package
:
''
,
//微信支付参数
signType
:
''
,
//微信支付参数
paySign
:
''
,
//微信支付参数
orderInfo
:
''
,
//支付宝订单号
background
:
''
,
//去支付的背景颜色
orderId
:
''
,
//订单Id
...
...
@@ -141,13 +143,22 @@ export default {
}
})
},
//---拨打电话
makePhone
()
{
uni
.
makePhoneCall
({
phoneNumber
:
'400-072-0368'
})
},
//---初始化产品信息,以及获取支付需要的参数
initDetail
()
{
//---初始化产品信息,以及获取支付需要的参数
let
data
=
{
orderId
:
this
.
orderId
,
//订单Id
userId
:
this
.
openid
,
//用户Id
payType
:
this
.
payType
//支付类型
}
uni
.
showLoading
({
mask
:
true
})
this
.
$request
(
'orderc/order/findOrderInfo'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
if
(
this
.
albumOrderdetail
==
1
){
...
...
@@ -159,8 +170,6 @@ export default {
this
.
afterBuyUrl
=
'/pages/my/order/orderList/orderList'
}
}
this
.
bodyShow
=
true
//支付参数开始
this
.
timeStamp
=
res
.
data
.
timestamp
this
.
nonceStr
=
res
.
data
.
noncestr
...
...
@@ -176,7 +185,7 @@ export default {
url
:
'/pages/payment/paySuccess/paySuccess?orderId='
+
this
.
orderId
+
'&afterBuyUrl='
+
this
.
afterBuyUrl
+
'&ifyukuaiCode='
+
this
.
ifyukuaiCode
})
}
this
.
errorMessage
=
res
.
data
.
errorMessage
this
.
errorMessage
1
=
res
.
data
.
errorMessage
this
.
totalMoney
=
res
.
data
.
totalMoney
this
.
orderList
=
res
.
data
.
orderList
||
[]
if
(
this
.
orderList
.
length
==
0
)
{
...
...
@@ -195,14 +204,15 @@ export default {
title
:
res
.
message
,
icon
:
'none'
})
this
.
errorMessage2
=
res
.
message
}
})
},
//----去支付
goPay
()
{
//-------------------------------------------------------去支付
if
(
this
.
errorMessage
)
{
if
(
this
.
errorMessage1
)
{
uni
.
showToast
({
title
:
this
.
errorMessage
,
title
:
this
.
errorMessage
1
,
icon
:
'none'
})
return
...
...
@@ -211,8 +221,14 @@ export default {
setTimeout
(()
=>
{
this
.
background
=
'f9690e'
},
1000
)
// #ifdef MP-WEIXIN
if
(
!
this
.
timeStamp
||!
this
.
nonceStr
||!
this
.
package
||!
this
.
signType
||!
this
.
paySign
){
uni
.
showToast
({
title
:
'缺少支付参数'
,
icon
:
'none'
})
return
}
uni
.
requestPayment
({
provider
:
'wxpay'
,
timeStamp
:
this
.
timeStamp
,
...
...
@@ -235,6 +251,13 @@ export default {
//#endif
// #ifdef MP-ALIPAY
if
(
!
this
.
orderInfo
){
uni
.
showToast
({
title
:
'缺少支付参数'
,
icon
:
'none'
})
return
}
uni
.
requestPayment
({
provider
:
'alipay'
,
// 服务提供商 支付宝支付: alipay 微信支付: wxpay
orderInfo
:
this
.
orderInfo
,
// 支付宝订单号
...
...
@@ -264,7 +287,7 @@ export default {
.middle
{
padding
:
30
rpx
24
rpx
0
24
rpx
;
}
.m
ain
{
.m
iddle-wrap
{
padding
:
10
rpx
24
rpx
20
rpx
24
rpx
;
background
:
#ffffff
;
border-radius
:
20
rpx
;
...
...
@@ -296,7 +319,7 @@ export default {
.product
view
.coupon
text
{
font-size
:
30
rpx
;
}
.m
ainP3
{
.m
iddle-money
{
height
:
120
rpx
;
color
:
#000000
;
border-bottom
:
1px
solid
#e5e5e5
;
...
...
@@ -306,25 +329,24 @@ export default {
box-sizing
:
border-box
;
justify-content
:
space-between
;
}
.m
ainP3
text
:nth-child
(
2
)
{
.m
iddle-money
view
:nth-child
(
2
)
{
font-size
:
24
rpx
;
color
:
#666666
;
}
.m
ainP3
text
:nth-child
(
2
)
text
:nth-child
(
1
)
{
.m
iddle-money
view
:nth-child
(
2
)
{
font-size
:
36
rpx
;
color
:
#f9690e
;
margin-left
:
20
rpx
;
font-weight
:
bold
;
}
.m
ainview
{
.m
iddle-image
{
margin-top
:
50
rpx
;
display
:
flex
;
align-items
:
center
;
}
.m
ainview
>
image
:first-child
{
.m
iddle-image
>
image
:first-child
{
margin
:
0
20
rpx
0
10
rpx
;
}
.m
ainview
>
view
{
.m
iddle-image
>
view
{
flex
:
1
;
}
.bottom
{
...
...
@@ -337,41 +359,25 @@ export default {
display
:
flex
;
align-items
:
center
;
}
.bottom
Firs
t
{
.bottom
-lef
t
{
border-right
:
1px
solid
#cccccc
;
padding-left
:
40
rpx
;
width
:
40%
;
box-sizing
:
border-box
;
}
.bottom
Firs
t
text
:nth-child
(
2
)
{
.bottom
-lef
t
text
:nth-child
(
2
)
{
font-size
:
40
rpx
;
color
:
#f9690e
;
margin-left
:
10
rpx
;
font-weight
:
bold
;
}
.bottomFirst
text
:nth-child
(
2
)
text
{
font-size
:
28
rpx
;
}
.bottomLast
{
padding-left
:
20
rpx
;
.bottom-right
{
padding-left
:
30
rpx
;
display
:
flex
;
width
:
60%
;
padding-right
:
20
rpx
;
box-sizing
:
border-box
;
padding-right
:
30
rpx
;
align-items
:
center
;
}
.bottomLast
text
:first-child
{
display
:
block
;
text-align
:
center
;
width
:
60
rpx
;
}
.bottomLast
text
:first-child
text
{
margin-top
:
10
rpx
;
display
:
inline-block
;
font-size
:
24
rpx
;
color
:
#666666
;
}
.bottomLast
text
:nth-child
(
2
)
{
.bottom-right
text
:nth-child
(
2
)
{
flex
:
1
;
height
:
70
rpx
;
display
:
inline-block
;
...
...
@@ -382,5 +388,6 @@ export default {
margin-left
:
30
rpx
;
border-radius
:
20
rpx
;
font-size
:
32
rpx
;
font-weight
:
bold
;
}
</
style
>
pages/payment/ourPayment/ourPayment.vue
View file @
3c2a558a
...
...
@@ -84,7 +84,7 @@
</view>
</view>
</
template
>
<!-- 显示增加数量页面 -->
<
template
v-if=
"showNumber"
>
<view
class=
"top2"
>
<view
class=
"top2-name"
>
...
...
@@ -100,9 +100,10 @@
v-model=
"buyNum"
bg-color=
'#3688FF'
color=
'#ffffff'
:input-height=
"60"
:min=
"1"
size=
'28'
>
iconStyle=
'color:#ffffff;font-size:32rpx;'
buttonSize=
'60'
input-width=
"100"
:min=
"1"
>
</u-number-box>
</view>
<view
class=
"top2-price"
>
...
...
@@ -363,7 +364,7 @@ export default {
},
showCoupon
()
{
//---展示券列表
this
.
$refs
.
orderCoupon
.
show
Coupon
()
this
.
$refs
.
orderCoupon
.
show
Pop
=
true
},
//---初始化获取商家名称,大商家
initMerchant
()
{
...
...
@@ -396,20 +397,21 @@ export default {
this
.
$request
(
'user/newCompany/findCompanyById'
,
data
).
then
(
res
=>
{
uni
.
hideLoading
()
if
(
res
.
code
==
'00'
)
{
this
.
companyAttribute
=
res
.
data
.
companyAttribute
this
.
paydJumpUrl
=
res
.
data
.
paydJumpUrl
if
(
this
.
companyAttribute
==
5
)
{
//出租车显示联系人姓名,其他显示公司名称
this
.
companyName
=
res
.
data
.
contactName
}
else
{
this
.
companyName
=
res
.
data
.
companyName
}
let
list
=
res
.
data
.
companyTollPointVoList
let
list
=
res
.
data
.
companyTollPointVoList
||
[]
list
.
forEach
(
item
=>
{
if
(
item
.
tollPoints
==
this
.
extendInfo
){
this
.
tollPoint
=
item
}
})
this
.
companyAttribute
=
res
.
data
.
companyAttribute
if
(
this
.
companyAttribute
==
5
)
{
//出租车显示联系人姓名
this
.
companyName
=
res
.
data
.
contactName
}
else
{
//优先取收费点名称,然后是公司名称,然后是联系人名称
this
.
companyName
=
this
.
tollPoint
.
tollPointByname
||
res
.
data
.
companyName
||
res
.
data
.
contactName
}
if
(
this
.
tollPoint
.
tollPointsModel
==
0
){
//显示输入金额页面
this
.
showMoney
=
true
...
...
@@ -426,8 +428,6 @@ export default {
icon
:
'none'
})
}
//优先取收费点名称,然后是公司名称,然后是联系人名称
this
.
companyName
=
this
.
tollPoint
.
tollPointByname
||
res
.
data
.
companyName
||
res
.
data
.
contactName
}
}
else
{
uni
.
showToast
({
...
...
@@ -604,11 +604,11 @@ export default {
success
:
res
=>
{
if
(
this
.
companyAttribute
==
5
)
{
//出租车跳转分销组合票页面
uni
.
navigateTo
({
uni
.
reLaunch
({
url
:
this
.
paydJumpUrl
})
}
else
{
uni
.
navigateTo
({
uni
.
reLaunch
({
url
:
'/pages/payment/paySuccess/paySuccess?orderId='
+
this
.
orderId
})
}
...
...
@@ -629,11 +629,11 @@ export default {
success
:
res
=>
{
if
(
this
.
companyAttribute
==
5
)
{
//出租车跳转分销组合票页面
uni
.
navigateTo
({
uni
.
reLaunch
({
url
:
this
.
paydJumpUrl
})
}
else
{
uni
.
navigateTo
({
uni
.
reLaunch
({
url
:
'/pages/payment/paySuccess/paySuccess?orderId='
+
this
.
orderId
})
}
...
...
pages/scenic/combinationProduct/combinationProduct.vue
View file @
3c2a558a
...
...
@@ -660,7 +660,7 @@ export default {
}
.tabbar
.on
{
// background: url('../../../static/img/scenic/tabbar.png') no-repeat;
background
:
$
blu
e
;
background
:
$
them
e
;
background-size
:
100%
100%
;
color
:
#fff
;
font-weight
:
bold
;
...
...
@@ -750,7 +750,7 @@ export default {
align-items
:
center
;
}
.product-rule
{
color
:
$
blu
e
;
color
:
$
them
e
;
}
.
product-rule
:
:
after
{
display
:
inline-block
;
...
...
pages/scenic/scenicComponents/calendar.vue
View file @
3c2a558a
<
template
>
<div>
<u-calendar
:show=
"show"
@
confirm=
"onConfirm"
...
...
@@ -8,51 +7,37 @@
:defaultDate=
"defaultDate"
:formatter=
'formatter'
ref=
"calendar2"
rowHeight=
'112'
round=
'20'
closeOnClickOverlay=
'true'
></u-calendar>
</div>
</
template
>
<
script
>
export
default
{
props
:
[
'dateList'
],
watch
:
{
dateList
:{
handler
(
newValue
,
oldValue
){
if
(
newValue
&&
newValue
.
length
>
0
){
this
.
maxDate
=
newValue
[
newValue
.
length
-
1
].
startTime
.
substr
(
0
,
10
)
}
},
deep
:
true
,
immediate
:
true
}
dateList
:{
handler
(
newValue
,
oldValue
){
if
(
newValue
&&
newValue
.
length
>
0
){
this
.
maxDate
=
newValue
[
newValue
.
length
-
1
].
startTime
.
substr
(
0
,
10
)
}
},
deep
:
true
,
immediate
:
true
}
},
data
()
{
return
{
date
:
''
,
//选择的日期
show
:
false
,
//控制日历显示隐藏
defaultDate
:
''
,
//默认日期
maxDate
:
''
,
//最大日期
}
},
mounted
()
{
//默认为第一天
mounted
()
{
this
.
$refs
.
calendar2
.
setFormatter
(
this
.
formatter
)
},
methods
:
{
//---年月日转化
formatDate
(
date
)
{
let
year
=
date
.
getFullYear
()
let
month
=
date
.
getMonth
()
+
1
if
(
month
<
10
)
{
month
=
'0'
+
month
}
let
days
=
date
.
getDate
()
if
(
days
<
10
)
{
days
=
'0'
+
days
}
let
dates
=
year
+
'-'
+
month
+
'-'
+
days
return
dates
},
//---日期确认事件
onConfirm
(
date
)
{
this
.
show
=
false
...
...
@@ -73,23 +58,16 @@ export default {
//真机调试手极端报错,暂时注释
// this.dateList.forEach((item, index) => {
// if (item.startTime.substr(0, 10) == dates) {
// day.bottomInfo =
"¥"
+ item.sellingPrice
// day.bottomInfo =
'¥'
+ item.sellingPrice
// day.dot = true
// }
// })
// if (!day.bottomInfo) {
// day.type =
"disabled"
// day.type =
'disabled'
// }
return
day
},
//---设置默认日期方法
setDefaultDate
(
val
)
{
let
dates
=
val
.
split
(
'-'
)
let
year
=
parseInt
(
dates
[
0
])
let
month
=
parseInt
(
dates
[
1
])
-
1
let
day
=
parseInt
(
dates
[
2
])
this
.
defaultDate
=
new
Date
(
year
,
month
,
day
)
},
}
}
}
</
script
>
...
...
pages/scenic/scenicComponents/chooseArea.vue
View file @
3c2a558a
<
template
>
<view
class=
"area-box"
>
<view
class=
"top"
@
click=
"
sure
()"
>
<view
class=
"top"
@
click=
"
closeSon
()"
>
<view
class=
"top-left"
>
选择(索道)出发站点
</view>
<view>
<u-icon
name=
"close"
></u-icon>
<u-icon
name=
"close"
bold
></u-icon>
</view>
</view>
<view
v-if=
"defaultAreaCode"
class=
"defaultArea"
>
<view>
<text>
当前站点:
</text>
<text>
{{
areaObj
.
areaName
}}
</text>
</view>
<view>
<text>
当前排队人数:
</text>
<text>
{{
sortIfo
.
peopleNumber
}}
</text>
</view>
<view>
<text>
预计进入排队等候区时间:
</text>
<text>
{{
sortIfo
.
sortTotalTime
}}
</text>
</view>
<view>
<text>
退票规则:
</text>
<text>
不可退
</text>
</view>
<view>
<image
src=
"../static/scenic/chooseArea.jpg"
mode=
"widthFix"
></image>
</view>
<view>
<a
class=
"middle-btn"
@
click=
"sure()"
>
确定
</a>
</view>
</view>
<template
v-else
>
</view>
<!-- 没有默认站点时-->
<template
v-if=
"!defaultAreaCode"
>
<view
class=
"bottom"
>
<view
class=
"bottom1"
>
<view>
...
...
@@ -72,7 +21,7 @@
</view>
<view
class=
"bottom1-btn"
>
<text
class=
"btn"
@
click=
"
getSort
(item)"
v-for=
"(item,index) of areaList"
:key=
"index"
>
<text
class=
"btn"
@
click=
"
chooseArea
(item)"
v-for=
"(item,index) of areaList"
:key=
"index"
>
{{
item
.
areaName
}}
</text>
</view>
...
...
@@ -121,7 +70,7 @@
</text>
</view>
</
template
>
<view>
<
!-- <
view>
<text>
退票规则:
</text>
...
...
@@ -129,19 +78,19 @@
<text>
不可退
</text>
</view>
</view>
-->
<view>
返程时,根据现场情况需重新取号
</view>
<view
v-if=
"!sortIfo"
style=
"font-size:32rpx;color:
#ff0000
;"
>
<view
v-if=
"!sortIfo"
style=
"font-size:32rpx;color:
#FC6703
;"
>
未找到本站信息,请根据现场大屏幕信息合理购票
</view>
<view
style=
"text-align: center;"
>
<text
class=
"
middle-btn"
@
click=
"hidePop()"
style=
"color: #333
;margin-right: 48rpx;"
>
<text
class=
"
btn"
@
click=
"hidePop()"
style=
"color: #555
;margin-right: 48rpx;"
>
取消
</text>
<text
class=
"
middle-
btn"
@
click=
"sure()"
>
<text
class=
"btn"
@
click=
"sure()"
>
确定
</text>
</view>
...
...
@@ -149,7 +98,56 @@
</view>
</template>
<!-- 有默认站点时 -->
<view
v-else
class=
"defaultArea"
>
<view>
<text>
当前站点:
</text>
<text>
{{areaObj.areaName}}
</text>
</view>
<view>
<text>
当前排队人数:
</text>
<text>
{{sortIfo.peopleNumber}}
</text>
</view>
<view>
<text>
预计进入排队等候区时间:
</text>
<text>
{{sortIfo.sortTotalTime}}
</text>
</view>
<!-- <view>
<text>
退票规则:
</text>
<text>
不可退
</text>
</view> -->
<view>
<image
src=
"../static/scenic/chooseArea.jpg"
mode=
"widthFix"
></image>
</view>
<view>
<a
class=
"btn"
@
click=
"closeSon()"
>
确定
</a>
</view>
</view>
</view>
</template>
...
...
@@ -162,7 +160,7 @@ export default {
showPop
:
false
,
//控制弹窗显示隐藏
distanceIndex
:
0
,
//最小距离下标
distanceList
:
[],
//所有距离列表
sortIfo
:
''
,
//排
队
信息
sortIfo
:
''
,
//排
号
信息
areaObj
:
{
areaCode
:
''
,
//选中的区域编码
areaName
:
''
,
//选中的区域名字
...
...
@@ -174,18 +172,12 @@ export default {
created
()
{
//如果有默认站点
if
(
this
.
defaultAreaCode
&&
this
.
sortArr
.
length
>
0
){
this
.
sortArr
.
forEach
(
item
=>
{
if
(
item
.
projectId
==
this
.
defaultAreaCode
){
this
.
sortIfo
=
item
this
.
sortIfo
.
peopleNumber
=
Math
.
max
(
item
.
sortTotalCapacity
-
item
.
showEnd
,
0
)
}
})
this
.
areaList
.
forEach
(
item
=>
{
if
(
item
.
areaCode
==
this
.
defaultAreaCode
){
this
.
areaObj
.
areaCode
=
item
.
areaCode
this
.
areaObj
.
areaName
=
item
.
areaName
}
})
this
.
sortArr
.
forEach
(
item
=>
{
if
(
item
.
projectId
==
this
.
defaultAreaCode
){
this
.
sortIfo
=
item
this
.
sortIfo
.
peopleNumber
=
Math
.
max
(
item
.
sortTotalCapacity
-
item
.
showEnd
,
0
)
}
})
return
}
uni
.
getLocation
({
...
...
@@ -198,27 +190,23 @@ export default {
})
},
methods
:
{
//---关闭组件
closeSon
(){
this
.
$parent
.
closeArea
()
},
//---隐藏弹窗
hidePop
()
{
this
.
showPop
=
false
},
//---返回隐藏该组件
returnClose
()
{
this
.
$parent
.
closeArea
()
},
//---隐藏该组件
//---确定选择站点
sure
()
{
this
.
showPop
=
false
this
.
$parent
.
closeArea
()
this
.
$emit
(
'areaSure'
,
this
.
areaObj
)
},
//---获取排号信息
getSort
(
item
)
{
//---
选择站点,
获取排号信息
chooseArea
(
item
)
{
this
.
showPop
=
true
let
data
=
{
areaCode
:
item
.
areaCode
,
merchantCode
:
this
.
merchantCode
,
//商户code
}
this
.
areaObj
.
areaCode
=
item
.
areaCode
//获取选中的站点code,便于找到返回数据的下标
this
.
areaObj
.
areaName
=
item
.
areaName
this
.
sortArr
.
forEach
((
item
)
=>
{
...
...
@@ -255,7 +243,7 @@ export default {
text-align
:
center
;
}
.defaultArea
view
text
:last-child
{
color
:
#e70313
;
color
:
$red
;
font-size
:
32rpx
;
font-weight
:
bold
;
}
...
...
@@ -266,7 +254,7 @@ export default {
right
:
0
;
bottom
:
0
;
z-index
:
99
;
background
:
#
f5f5f5
;
background
:
#
ECF3FE
;
}
.top
{
display
:
flex
;
...
...
@@ -288,7 +276,7 @@ export default {
}
.bottom1-choose
{
font-size
:
32rpx
;
color
:
#ff0000
;
color
:
$red
;
text
{
font-weight
:
bold
;
font-size
:
36rpx
;
...
...
@@ -300,12 +288,12 @@ export default {
.bottom2
{
margin-top
:
60rpx
;
font-size
:
32rpx
;
color
:
#ff0000
;
color
:
$red
;
text-align
:
center
;
}
// 弹窗
.pop-wrap
{
background
:
rgba
(
0
,
0
,
0
,
0
.
1
);
background
:
rgba
(
0
,
0
,
0
,
0
.
4
);
position
:
fixed
;
top
:
0
;
left
:
0
;
...
...
@@ -328,6 +316,6 @@ export default {
.pop-content
view
:not
(
:last-child
)
text
:last-child
{
font-size
:
36rpx
;
font-weight
:
bolder
;
color
:
#f40000
color
:
$red
;
}
</
style
>
pages/scenic/scenicComponents/contactList.vue
View file @
3c2a558a
<
template
>
<view
class=
"contact-box
"
>
<
u-popup
:show=
"contactsShow"
@
close=
"contactsShow=false
"
>
<view
v-show=
"showPop
"
>
<
view
class=
"list-box
"
>
<view
class=
"top"
>
<u-icon
name=
"close"
@
click=
"contactsShow=false"
></u-icon>
<text>
需填写
{{
buyNum
}}
位联系人
<text
v-if=
"buyNum-chooseContact.length>0"
>
,还需
<text
class=
"top-number"
>
{{
buyNum
-
chooseContact
.
length
}}
</text>
位出行人
<view
class=
"top-num"
>
<text>
需填写
{{
contactNum
}}
位联系人
</text>
</text>
<text
@
click=
"config()"
class=
"top-sure"
>
确定
</text>
</view>
<view
class=
"bottom"
>
<view
@
click=
"showEdit()"
class=
"bottom-add"
>
<view
class=
"top-icon"
@
click=
"showPop=false"
>
<u-icon
name=
"close"
bold
></u-icon>
</view>
</view>
<view
@
click=
"showEdit()"
class=
"top-add"
>
<text>
+添加旅客信息
</text>
</view>
</view>
<view
class=
"bottom"
>
<checkbox-group
@
change=
"chooseContactChange"
>
<view
class=
"bottom-list"
v-for=
"(item,index) of
contactData
"
:key=
"item.id"
>
<view
class=
"bottom-list"
v-for=
"(item,index) of
listTotal
"
:key=
"item.id"
>
<label>
<checkbox
:value=
"JSON.stringify(item)"
:checked=
"item.ifChoose"
color=
"#3688ff"
/>
<checkbox
class=
"blue"
:value=
"JSON.stringify(item)"
:checked=
"item.ifChoose"
color=
"#3688ff"
/>
<view
class=
"bottom-content"
>
<view>
{{
item
.
name
}}
</view>
</view>
<view>
<text>
身份证
</text>
{{
item
.
credentialNumber
?
item
.
credentialNumber
.
substr
(
0
,
3
)
+
"****"
+
item
.
credentialNumber
.
substr
(
14
,
4
):
"无"
}}
</view>
<view>
<text>
手机号
</text>
{{
item
.
phone
?
item
.
phone
.
substr
(
0
,
3
)
+
"****"
+
item
.
phone
.
substr
(
7
,
4
):
"无"
}}
</view>
</view>
</label>
<view
@
click=
"goEdit(item)"
style=
"margin-right:20rpx;"
>
<u-icon
name=
"edit-pen"
color=
"#3688ff"
size=
"
28
"
></u-icon>
<u-icon
name=
"edit-pen"
color=
"#3688ff"
size=
"
56
"
></u-icon>
</view>
<view
@
click=
"clickDele(item.id)"
>
<u-icon
name=
"trash-fill"
color=
"#3688ff"
size=
"
28
"
></u-icon>
<u-icon
name=
"trash-fill"
color=
"#3688ff"
size=
"
56
"
></u-icon>
</view>
<u-modal
:show=
"showModal"
@
confirm=
"confirmDele"
@
cancel=
"showModal=false"
showCancelButton
title=
"确认删除该联系人"
></u-modal>
</view>
<view
style=
"margin: 40rpx 0;text-align: center;"
v-if=
'listTotal&&listTotal.length>0'
>
已展示所有联系人
</view>
</checkbox-group>
</view>
</u-popup>
<view
class=
"bottom-sure"
@
click=
"config()"
>
确定
</view>
</view>
</view>
<u-modal
:show=
"showModal"
@
confirm=
"confirmDele"
@
cancel=
"showModal=false"
showCancelButton
title=
"确认删除该联系人"
></u-modal>
</view>
</
template
>
<
script
>
export
default
{
props
:
[
"contactData"
,
"orderTouristList"
,
"buyNum"
],
watch
:
{
orderTouristList
:
{
handler
(
newValue
,
oldValue
)
{
if
(
newValue
)
{
this
.
chooseContact
=
this
.
orderTouristList
}
},
deep
:
true
,
immediate
:
true
}
},
data
()
{
return
{
contactsShow
:
false
,
//控制联系人弹窗显示隐藏
chooseContact
:
[],
//选中的
联系人
showModal
:
false
,
//确认弹窗显示隐藏
contactId
:
''
,
//删除联系人的Id
export
default
{
props
:
[
'contactTotal'
,
'contactNum'
],
watch
:
{
contactTotal
:
{
handler
(
newValue
,
oldValue
)
{
if
(
newValue
)
{
this
.
listTotal
=
this
.
contactTotal
}
},
deep
:
true
,
immediate
:
true
}
},
data
()
{
return
{
showPop
:
false
,
//控制联系人弹窗显示隐藏
listTotal
:[],
//所有
联系人
showModal
:
false
,
//确认弹窗显示隐藏
contactId
:
''
,
//删除联系人的Id
}
},
methods
:
{
//---点击新增,展示编辑联系人弹窗,并传空值给编辑弹窗
showEdit
()
{
this
.
contactsShow
=
false
this
.
$parent
.
showEdit
()
this
.
$emit
(
"getEditContact"
,
""
)
},
//---展示编辑弹窗,并传值给编辑弹窗
goEdit
(
obj
)
{
this
.
contactsShow
=
false
this
.
$parent
.
showEdit
()
this
.
$emit
(
"getEditContact"
,
obj
)
},
//---确定选中的联系人
config
()
{
this
.
contactsShow
=
false
this
.
$emit
(
"contactListConfig"
,
this
.
chooseContact
)
},
//---联系人姓名变化
chooseContactChange
(
e
){
let
value
=
e
.
detail
.
value
let
arr
=
[]
value
.
forEach
(
item
=>
{
arr
.
push
(
JSON
.
parse
(
item
))
})
this
.
chooseContact
=
arr
if
(
arr
.
length
==
this
.
buyNum
)
{
//当选择的人数等于需要填的人数时关闭弹窗
this
.
config
()
}
if
(
arr
.
length
>
this
.
buyNum
)
{
arr
.
shift
()
this
.
config
()
}
},
//---点击删除
clickDele
(
id
)
{
this
.
showModal
=
true
this
.
contactId
=
id
},
//---确认删除
confirmDele
(){
let
data
=
{
id
:
this
.
contactId
}
this
.
$request
(
'wechatUser/contact/deleteContact'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
)
{
uni
.
showToast
({
title
:
'删除成功'
,
icon
:
'none'
})
this
.
showModal
=
false
this
.
contactsShow
=
false
this
.
$parent
.
getContactList
()
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
}).
catch
(()
=>
{
this
.
showModal
=
false
})
}
}
}
}
},
methods
:
{
//---点击新增,展示编辑联系人弹窗,并传空值给编辑弹窗
showEdit
()
{
this
.
$parent
.
showEdit
()
this
.
$emit
(
'getEditContact'
,
''
)
},
//---展示编辑弹窗,并传值给编辑弹窗
goEdit
(
obj
)
{
this
.
$parent
.
showEdit
()
this
.
$emit
(
'getEditContact'
,
obj
)
},
//---确定选中的联系人
config
()
{
this
.
showPop
=
false
//选中的排在前面
this
.
listTotal
.
sort
(
function
(
a
,
b
)
{
return
b
.
ifChoose
-
a
.
ifChoose
})
this
.
$parent
.
contactTotal
=
this
.
listTotal
let
chooseArr
=
[]
this
.
listTotal
.
forEach
(
item
=>
{
if
(
item
.
ifChoose
){
chooseArr
.
push
(
item
)
}
})
this
.
$parent
.
chooseContact
=
chooseArr
},
//---联系人姓名变化
chooseContactChange
(
e
){
let
value
=
e
.
detail
.
value
if
(
value
.
length
>
this
.
contactNum
)
{
let
number
=
value
.
length
-
this
.
contactNum
value
=
value
.
slice
(
number
)
}
let
arr
=
[]
value
.
forEach
(
item
=>
{
arr
.
push
(
JSON
.
parse
(
item
))
})
//先全部取消选中,后面根据选中的值来判断谁选中
this
.
listTotal
.
forEach
(
item
=>
{
item
.
ifChoose
=
false
})
arr
.
forEach
(
item
=>
{
this
.
listTotal
.
forEach
(
item2
=>
{
if
(
item
.
id
==
item2
.
id
){
item2
.
ifChoose
=
true
}
})
})
},
//---点击删除
clickDele
(
id
)
{
this
.
showModal
=
true
this
.
contactId
=
id
},
//---确认删除
confirmDele
(){
let
data
=
{
id
:
this
.
contactId
}
this
.
$request
(
'wechatUser/contact/deleteContact'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
)
{
uni
.
showToast
({
title
:
'删除成功'
,
icon
:
'none'
})
this
.
showModal
=
false
this
.
$parent
.
getContactList
()
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
}).
catch
(()
=>
{
this
.
showModal
=
false
})
}
}
}
</
script
>
<
style
scoped=
"scoped"
lang=
"scss"
>
.top
{
height
:
100rpx
;
.list-box
{
background
:
#F5F5F5
;
position
:
fixed
;
top
:
0
;
left
:
0
;
right
:
0
;
bottom
:
0
;
z-index
:
999
;
display
:
flex
;
justify-content
:
space-between
;
background
:
#f0f0f0
;
align-items
:
center
;
padding
:
0
24rpx
;
flex-direction
:
column
;
}
.top-sure
{
color
:
var
(
--
main-color
);
font-size
:
28rpx
;
}
.top-number
{
color
:
#f9690e
;
.top-num
{
height
:
100rpx
;
display
:
flex
;
align-items
:
center
;
background
:
#FFF1E8
;
color
:
#FC771D
;
justify-content
:
center
;
font-weight
:
bold
;
font-size
:
32rpx
;
font-weight
:bold
;
position
:
relative
;
}
.bottom
{
padding
:
0
24rpx
80rpx
24rpx
;
.top-icon
{
position
:
absolute
;
right
:
24rpx
;
}
.bottom-add
{
height
:
130rpx
;
.top-add
{
height
:
150rpx
;
display
:
flex
;
align-items
:
center
;
border-bottom
:
1px
solid
#e6e6e6
;
width
:
100%
;
justify-content
:
center
;
border-bottom
:
1px
solid
#e6e6e6
;
padding
:
0
24rpx
;
background
:
#ECF3FE
;
}
.bottom-add
text
{
width
:
280rpx
;
height
:
65rpx
;
text-align
:
center
;
line-height
:
65rpx
;
border
:
1px
solid
var
(
--
main-color
);
color
:var
(
--main-color
)
;
.top-add
text
{
display
:
inline-block
;
width
:
100%
;
height
:
76rpx
;
text-align
:
center
;
line-height
:
76rpx
;
border
:
1px
solid
$theme
;
color
:
$theme
;
border-radius
:
5rpx
;
box-shadow
:
0px
0px
12px
2px
rgba
(
0
,
0
,
0
,
0
.08
);
}
.bottom
{
padding
:
0
24rpx
100rpx
24rpx
;
flex
:
1
;
overflow-y
:
scroll
;
}
.bottom-list
{
display
:
flex
;
justify-content
:
space-between
;
...
...
@@ -198,29 +228,38 @@
border-bottom
:
1px
solid
#E6E6E6
;
padding
:
25rpx
0
;
}
.bottom-list
label
{
display
:
flex
;
flex
:
1
;
align-items
:
center
;
}
.bottom-content
{
flex
:
1
;
margin-left
:
40rpx
;
}
.bottom-content
view
{
font-size
:
28rpx
;
color
:
#666666
;
}
.bottom-content
view
:not
(
:first-child
)
{
margin-top
:
10rpx
;
}
.bottom-content
view
text
{
display
:
inline-block
;
width
:
100rpx
;
}
.bottom-sure
{
position
:
fixed
;
bottom
:
0
;
left
:
0
;
width
:
100%
;
height
:
100rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
background
:
$theme
;
font-size
:
32rpx
;
font-weight
:
bold
;
color
:
#ffffff
;
}
</
style
>
pages/scenic/scenicComponents/detail.vue
View file @
3c2a558a
<
template
>
<view>
<u-popup
:show=
"show"
:round=
"10"
closeable
@
close=
"show=false"
>
<view
class=
"detail"
>
<view
class=
"detail-title"
>
费用明细
</view>
<view
class=
"detail-content"
>
<view
class=
"content-box"
>
<text>
{{
merchantName
}}
(
{{
name
}}
)
</text>
<u-popup
:show=
"showPop"
:round=
"20"
@
close=
"showPop = false"
closeable
>
<view
class=
"son-wrap"
>
<view
class=
"detail-title"
>
订单明细
</view>
<view
class=
"content-right"
>
<view>
¥
{{
sellingPrice
}}
x
{{
buyNum
}}
份
</view>
<view
v-if=
"productDepositTotal"
>
押金:
{{
productDepositTotal
}}
</view>
</view>
</view>
<!-- ---------------------------------------额外服务------------------------------------------- -->
<view
class=
"content-box"
v-for=
"(item,index) of choooseServiceData"
:key=
"index"
>
<text>
{{
item
.
name
}}
</text>
<view
style=
"flex: 1; overflow-y: scroll"
>
<view
class=
"content-box"
>
<text>
{{
merchantName
}}
(
{{
name
}}
)
</text>
<view
class=
"content-right"
>
<view>
¥
{{
item
.
sellingPrice
}}
x
{{
buyNum
}}
份
</view>
<view
v-if=
"item.depositTotal"
>
押金:
{{
item
.
depositTotal
}}
</view>
</view>
<view
class=
"content-right"
>
<view>
¥
{{
sellingPrice
}}
x
{{
buyNum
}}
份
</view>
<view
v-if=
"productDepositTotal"
>
押金:
{{
productDepositTotal
}}
</view>
</view>
<view
class=
"content-box"
v-if=
"chooseCouponObj&&chooseCouponObj.savedMoney>0"
>
<text>
券
</text>
</view>
<!-- ---------------------------------------额外服务------------------------------------------- -->
<view
class=
"content-box"
v-for=
"(item, index) of chooseService"
:key=
"index"
>
<text>
{{
item
.
name
}}
</text>
<text
class=
"content-right"
>
-¥
{{
parseFloat
(
chooseCouponObj
.
savedMoney
.
toFixed
(
2
))
}}
<
/text
>
<view
class=
"content-right"
>
<view>
¥
{{
item
.
sellingPrice
}}
x
{{
buyNum
}}
份
</view>
<
view
v-if=
"item.depositTotal"
>
押金:
{{
item
.
depositTotal
}}
</view
>
</view>
</view>
<view
class=
"content-box"
v-if=
"chooseCouponObj && chooseCouponObj.savedMoney > 0"
>
<text>
券
</text>
<view
class=
"content-box content-total"
>
<text>
合计
</text>
<text
class=
"content-right"
>
-¥
{{
parseFloat
(
chooseCouponObj
.
savedMoney
.
toFixed
(
2
))
}}
</text>
</view>
<text
class=
"content-right"
>
¥
<text
style=
"font-size:36rpx;"
>
{{
sellTotal
}}
</text>
</text>
</view>
<view
class=
"content-box content-total"
>
<text>
合计
</text>
<text
class=
"content-right"
>
¥
<text
style=
"font-size: 36rpx"
>
{{
sellTotal
}}
</text>
</text>
</view>
</view>
</u-popup>
</view>
</view>
</u-popup>
</
template
>
<
script
>
export
default
{
props
:
[
"merchantName"
,
"name"
,
"buyNum"
,
"sellingPrice"
,
"productDepositTotal"
,
"chooseCouponObj"
,
"choooseService"
],
watch
:
{
choooseService
:
{
handler
(
newValue
,
oldValue
)
{
if
(
newValue
)
{
this
.
choooseServiceData
=
this
.
choooseService
}
},
deep
:
false
,
immediate
:
false
}
},
data
()
{
return
{
show
:
false
,
//控制弹窗显示隐藏
extraPrice
:
0
,
//额外服务价格
depositTotal
:
0
,
//额外服务总押金
choooseServiceData
:
[],
//选中的服务
}
},
computed
:
{
sellTotal
()
{
//卖价总价
let
savedMoney
=
0
if
(
this
.
chooseCouponObj
){
savedMoney
=
this
.
chooseCouponObj
.
savedMoney
}
if
(
this
.
choooseServiceData
.
length
>
0
)
{
//额外服务价格
let
singleMoney
=
0
//单个产品总押金,用于算出总押金
this
.
extraPrice
=
0
this
.
depositTotal
=
0
//总押金
for
(
let
i
=
0
;
i
<
this
.
choooseServiceData
.
length
;
i
++
)
{
this
.
extraPrice
+=
parseFloat
((
this
.
choooseServiceData
[
i
].
sellingPrice
*
this
.
buyNum
).
toFixed
(
2
))
if
(
this
.
choooseServiceData
[
i
].
depositType
==
1
)
{
//---------------------------------------------------------------------------等于1,押金金额跟数量没关系
singleMoney
=
this
.
choooseServiceData
[
i
].
deposit
this
.
choooseServiceData
[
i
].
depositTotal
=
this
.
choooseServiceData
[
i
].
deposit
//单个产品总押金
}
else
if
(
this
.
choooseServiceData
[
i
].
depositType
==
2
)
{
//----------------------------------------------------------------------等于2,押金单价乘购买数量
singleMoney
=
parseFloat
((
this
.
choooseServiceData
[
i
].
deposit
*
this
.
buyNum
).
toFixed
(
2
))
this
.
choooseServiceData
[
i
].
depositTotal
=
parseFloat
((
this
.
choooseServiceData
[
i
].
deposit
*
this
.
buyNum
).
toFixed
(
2
))
//单个产品总押金
}
this
.
depositTotal
+=
singleMoney
}
}
else
{
this
.
extraPrice
=
0
this
.
depositTotal
=
0
}
return
parseFloat
((
this
.
sellingPrice
*
this
.
buyNum
+
this
.
extraPrice
+
this
.
depositTotal
+
this
.
productDepositTotal
-
savedMoney
).
toFixed
(
2
))
}
},
export
default
{
props
:
[
'merchantName'
,
'name'
,
'buyNum'
,
'sellingPrice'
,
'productDepositTotal'
,
'chooseCouponObj'
,
'chooseService'
,
'sellTotal'
],
data
()
{
return
{
showPop
:
false
,
//控制弹窗显示隐藏
}
},
methods
:
{
}
}
methods
:
{}
}
</
script
>
<
style
scoped=
"scoped"
>
.detail-title
{
height
:
120
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
font-size
:
32
rpx
;
border-bottom
:
var
(
--border-bottom
);
}
.content-box
{
padding
:
0
30
rpx
;
border-bottom
:
1px
solid
#f0f0f0
;
height
:
120
rpx
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
font-size
:
28
rpx
;
}
.content-right
{
text-align
:
right
;
flex-shrink
:
0
;
margin-left
:
20
rpx
;
}
.content-total
{
color
:
#f45803
;
font-weight
:
bolder
;
font-size
:
32
rpx
;
}
.son-wrap
{
position
:
relative
;
height
:
65vh
;
display
:
flex
;
flex-direction
:
column
;
}
.detail-title
{
text-align
:
center
;
font-size
:
32
rpx
;
font-weight
:
bold
;
padding
:
30
rpx
24
rpx
;
border-radius
:
20
rpx
20
rpx
0
0
;
}
.content-box
{
padding
:
0
30
rpx
;
border-bottom
:
1px
solid
#f0f0f0
;
height
:
120
rpx
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
font-size
:
28
rpx
;
}
.content-right
{
text-align
:
right
;
flex-shrink
:
0
;
margin-left
:
20
rpx
;
}
.content-total
{
color
:
#f45803
;
font-weight
:
bolder
;
font-size
:
32
rpx
;
}
</
style
>
pages/scenic/scenicComponents/editContacts.vue
View file @
3c2a558a
<
template
>
<view
class=
"editBox"
v-show=
"showEdit"
>
<view
@
click=
"close()"
class=
"return"
>
<u-icon
name=
"close"
></u-icon>
<view
class=
"return"
>
<!-- 新增的时候 -->
<view
v-if=
"!reviseContactId"
>
已新增
{{
contactTotal
.
length
}}
位联系人
</view>
<view
@
click=
"showEdit = false"
class=
"return-icon"
>
<u-icon
name=
"close"
bold
></u-icon>
</view>
</view>
<view
class=
"editTop"
>
</view>
<view
class=
"editBottom"
>
<view
class=
"bottomContent"
>
<view>
<text>
姓名:
</text>
<input
v-model
.
trim=
"name"
placeholder=
"请输入中文姓名"
/>
<input
v-model
.
trim=
"name"
placeholder=
"请输入中文姓名
,必填
"
/>
</view>
<view>
<text>
身份证:
</text>
<input
v-model
.
trim=
"credentialNumber"
maxlength=
"18"
placeholder=
"请输入身份证号码"
/>
<input
v-model
.
trim=
"credentialNumber"
maxlength=
"18"
placeholder=
"请输入身份证号码
,必填
"
/>
</view>
<view>
<!--编辑-->
<a
class=
"middle-btn"
@
click=
"keepEdit()"
v-if=
"editBtn"
>
完成
</a>
<!--新增-->
<a
class=
"middle-btn"
@
click=
"keepPlus()"
v-else=
""
>
完成
</a>
<text>
联系电话:
</text>
<input
v-model
.
trim=
"phone"
maxlength=
"11"
placeholder=
"用于接收行程信息"
/>
</view>
<view>
<a
class=
"complete"
@
click=
"keepSave()"
>
完成
</a>
</view>
</view>
...
...
@@ -37,147 +45,123 @@
</
template
>
<
script
>
export
default
{
props
:
[
"editContact"
],
data
()
{
return
{
showEdit
:
false
,
//控制组件显示隐藏
name
:
""
,
//姓名
credentialNumber
:
""
,
//身份证号
reviseContactId
:
""
,
//被修改人id
editBtn
:
""
,
//控制编辑完成按钮显示隐藏
}
},
watch
:
{
editContact
:
{
//
handler
(
newValue
,
oldValue
)
{
if
(
newValue
)
{
this
.
editBtn
=
true
}
else
{
this
.
editBtn
=
false
}
this
.
name
=
newValue
.
name
||
''
this
.
credentialNumber
=
newValue
.
credentialNumber
||
''
this
.
reviseContactId
=
newValue
.
id
||
''
},
deep
:
false
,
immediate
:
false
}
},
methods
:
{
//---关闭弹窗
close
()
{
this
.
showEdit
=
false
},
//---新增保存
keepPlus
()
{
if
(
!
this
.
$commonjs
.
nameReg
().
test
(
this
.
name
))
{
uni
.
showToast
({
title
:
'请输入正确的中文名字'
,
icon
:
'none'
})
return
}
if
(
!
this
.
$commonjs
.
idReg
().
test
(
this
.
credentialNumber
))
{
uni
.
showToast
({
title
:
'请输入正确身份证号'
,
icon
:
'none'
})
return
}
let
data
=
{
name
:
this
.
name
,
//保存姓名
phone
:
""
,
//电话号码
credentialNumber
:
this
.
credentialNumber
,
//身份证号
category
:
""
,
//成人或者儿童
openid
:
uni
.
getStorageSync
(
"openid"
),
//用户Id
credentialsType
:
""
,
//证件类型
merchantType
:
1
,
//商户类型,1.景区,2.酒店,3.餐饮
}
this
.
$request
(
"wechatUser/contact/saveContact"
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
"00"
)
{
uni
.
showToast
({
title
:
'保存成功'
,
icon
:
'none'
})
this
.
$parent
.
addChoose
()
this
.
showEdit
=
false
this
.
name
=
""
//成功之后清空数据,防止下次新增的时候出现之前的数据
this
.
credentialNumber
=
""
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
},
//---编辑保存
keepEdit
()
{
if
(
!
this
.
$commonjs
.
nameReg
().
test
(
this
.
name
))
{
uni
.
showToast
({
title
:
'请输入正确的中文名字'
,
icon
:
'none'
})
return
}
if
(
!
this
.
$commonjs
.
idReg
().
test
(
this
.
credentialNumber
))
{
uni
.
showToast
({
title
:
'请输入正确身份证号'
,
icon
:
'none'
})
return
}
let
data
=
{
name
:
this
.
name
,
//保存姓名
phone
:
""
,
//电话号码
credentialNumber
:
this
.
credentialNumber
,
//身份证号
category
:
""
,
//成人或者儿童
openid
:
uni
.
getStorageSync
(
"openid"
),
//用户Id
credentialsType
:
""
,
//证件类型
merchantType
:
1
,
//商户类型,1.景区,2.酒店,3.餐饮
id
:
this
.
reviseContactId
,
//被修改人id
}
this
.
$request
(
"wechatUser/contact/updateContact"
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
"00"
)
{
uni
.
showToast
({
title
:
'修改成功'
,
icon
:
'none'
})
this
.
$parent
.
getContactList
()
this
.
showEdit
=
false
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
}
}
}
export
default
{
props
:
[
'editContact'
,
'contactTotal'
],
data
()
{
return
{
showEdit
:
false
,
//控制组件显示隐藏
name
:
''
,
//姓名
credentialNumber
:
''
,
//身份证号
phone
:
''
,
//手机号码
reviseContactId
:
''
,
//被修改人id
}
},
watch
:
{
editContact
:
{
handler
(
newValue
,
oldValue
)
{
this
.
name
=
newValue
.
name
||
''
this
.
credentialNumber
=
newValue
.
credentialNumber
||
''
this
.
reviseContactId
=
newValue
.
id
||
''
this
.
phone
=
newValue
.
phone
||
''
},
deep
:
true
,
immediate
:
true
}
},
methods
:
{
//---保存
keepSave
()
{
if
(
!
this
.
$commonjs
.
nameReg
().
test
(
this
.
name
))
{
uni
.
showToast
({
title
:
'请输入正确的中文名字'
,
icon
:
'none'
})
return
}
if
(
!
this
.
$commonjs
.
idReg
().
test
(
this
.
credentialNumber
))
{
uni
.
showToast
({
title
:
'请输入正确身份证号'
,
icon
:
'none'
})
return
}
if
(
this
.
phone
&&!
this
.
$commonjs
.
phoneReg
().
test
(
this
.
phone
))
{
uni
.
showToast
({
title
:
'请输入正确电话号码'
,
icon
:
'none'
})
return
}
let
data
=
{
name
:
this
.
name
,
//保存姓名
phone
:
this
.
phone
,
//电话号码
credentialNumber
:
this
.
credentialNumber
,
//身份证号
openid
:
uni
.
getStorageSync
(
'openid'
),
//用户Id
merchantType
:
1
,
//商户类型,1.景区,2.酒店,3.餐饮
id
:
this
.
reviseContactId
,
//被修改人id
category
:
''
,
//成人或者儿童
credentialsType
:
''
,
//证件类型
}
let
queryUrl
=
''
if
(
this
.
reviseContactId
){
queryUrl
=
'wechatUser/contact/updateContact'
}
else
{
queryUrl
=
'wechatUser/contact/saveContact'
}
this
.
$request
(
queryUrl
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
)
{
uni
.
showToast
({
title
:
'保存成功'
,
icon
:
'none'
})
if
(
!
this
.
reviseContactId
){
//新增的时候
this
.
$parent
.
addChoose
()
//成功之后清空数据,防止下次新增的时候出现之前的数据
this
.
name
=
''
this
.
credentialNumber
=
''
this
.
phone
=
''
}
if
(
this
.
reviseContactId
){
//修改的时候
this
.
showEdit
=
false
}
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
icon
:
'none'
})
}
})
}
}
}
</
script
>
<
style
scoped=
"scoped"
>
<
style
scoped=
"scoped"
lang=
"scss"
>
.editBox
{
height
:
100%
;
background
:
#F5F5F5
;
position
:
fixed
;
top
:
0
;
left
:
0
;
right
:
0
;
bottom
:
0
;
z-index
:
10000
;
overflow-y
:
auto
;
font-size
:
28
rpx
;
z-index
:
1000
;
}
.return
{
height
:
100
rpx
;
padding
:
0
24
rpx
;
background
:
#FFFFFF
;
height
:
100rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
flex-end
;
background
:
#FFF1E8
;
color
:
#FC771D
;
justify-content
:
center
;
font-weight
:
bold
;
font-size
:
32rpx
;
position
:
relative
;
}
.return-icon
{
position
:
absolute
;
right
:
24rpx
;
}
.editTop
{
height
:
200rpx
;
...
...
@@ -201,7 +185,7 @@
}
.bottomContent
view
text
{
display
:
inline-block
;
width
:
1
2
0
rpx
;
width
:
1
4
0rpx
;
text-align-last
:
justify
;
margin-right
:
20rpx
;
}
...
...
@@ -209,10 +193,17 @@
flex
:
1
;
}
.bottomContent
view
:last-child
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
margin-top
:
60rpx
;
border
:
none
;
}
.complete
{
width
:
100%
;
height
:
70rpx
;
border-radius
:
16rpx
;
color
:
#FFFFFF
;
text-align
:
center
;
line-height
:
70rpx
;
background
:
$theme
;
display
:
inline-block
;
}
</
style
>
pages/scenic/scenicComponents/times.vue
View file @
3c2a558a
<
template
>
<u-popup
:show=
"show
"
:round=
"10"
closeable
@
close=
"show=false"
>
<view
class=
"
time
"
>
<u-popup
:show=
"show
Pop"
:round=
"20"
@
close=
"showPop=false"
closeable
>
<view
class=
"
son-wrap
"
>
<view
class=
"time-title"
>
时间选择
</view>
<view
class=
"time-content"
v-if=
"chooseTimeList&&chooseTimeList.length>0
"
>
<
!--库存大于零并且当前时间小于班次的开始时间才显示--
>
<view
class=
'time-list'
v-for=
"(item,index) of chooseTimeList"
:class=
"
{on:active==index}"
@click="chooseTime(index)"
:key="index" v-if="item.last>0"
>
<view>
{{
item
.
startPlanTime
?
item
.
startPlanTime
.
substr
(
0
,
5
):
""
}}
<text
v-if=
"item.endPlanTime"
>
-
</text>
{{
item
.
endPlanTime
?
item
.
endPlanTime
.
substr
(
0
,
5
):
""
}}
</
view>
<view>
剩余:
{{
item
.
last
}}
<view
style=
"flex: 1;overflow-y: scroll;padding: 0 30rpx;
"
>
<
view
class=
"time-content"
v-if=
"chooseTimeList&&chooseTimeList.length>0"
>
<!--库存大于零并且当前时间小于班次的开始时间才显示-->
<view
class=
'time-list'
v-for=
"(item,index) of chooseTimeList"
:class=
"
{on:active==index}"
@click="chooseTime(index)"
:key="index" v-if="item.last>0">
<view>
{{
item
.
startPlanTime
?
item
.
startPlanTime
.
substr
(
0
,
5
):
""
}}
<text
v-if=
"item.endPlanTime"
>
-
</text>
{{
item
.
endPlanTime
?
item
.
endPlanTime
.
substr
(
0
,
5
):
""
}}
</view>
<
view>
剩余:
{{
item
.
last
}}
</view>
</view>
</view>
<view
style=
"padding: 0.5rem 0rem;color: #FF0000;"
v-else
>
空空如也...
</view>
<view
class=
"time-sure"
>
<text
class=
"big-btn"
@
click=
"confirm()"
>
确定
</text>
</view>
</view>
<view
style=
"padding: 0.5rem 0rem;color: #FF0000;"
v-else
>
空空如也...
</view>
<view
class=
"time-sure"
>
<text
class=
"big-btn"
@
click=
"confirm()"
>
确定
</text>
</view>
</view>
</u-popup>
</
template
>
<
script
>
export
default
{
props
:
[
"chooseTimeList"
,
"chooseTimeData"
,
"timeActive"
],
watch
:
{
timeActive
:
{
//父组件选中的下标
handler
(
newValue
,
oldValue
)
{
if
(
newValue
>=
0
)
{
this
.
active
=
newValue
}
},
deep
:
false
,
immediate
:
false
},
},
data
()
{
return
{
show
:
false
,
//控制该组件显示隐藏
active
:
10000
,
//默认不选中
times
:
""
,
//时间
timeNumber
:
""
,
//当前时间转化为数字
}
},
methods
:
{
//---时间选择
chooseTime
(
i
)
{
this
.
active
=
i
this
.
times
=
this
.
chooseTimeList
[
i
].
startPlanTime
},
//---时间确认事件
confirm
(
date
)
{
this
.
show
=
false
;
this
.
$emit
(
"timeConfig"
,
this
.
times
)
},
},
mounted
()
{
let
times
=
new
Date
().
Format
(
"yyyy-MM-dd hh:mm:ss"
)
this
.
timeNumber
=
parseInt
(
this
.
$commonjs
.
changeTime
(
times
))
}
}
export
default
{
props
:
[
'chooseTimeList'
,
'chooseTimeData'
,
'timeActive'
],
watch
:
{
timeActive
:
{
//父组件选中的下标
handler
(
newValue
,
oldValue
)
{
if
(
newValue
>=
0
)
{
this
.
active
=
newValue
}
},
deep
:
false
,
immediate
:
false
},
},
data
()
{
return
{
showPop
:
false
,
//控制该组件显示隐藏
active
:
10000
,
//默认不选中
times
:
''
,
//时间
timeNumber
:
''
,
//当前时间转化为数字
}
},
methods
:
{
//---时间选择
chooseTime
(
i
)
{
this
.
active
=
i
this
.
times
=
this
.
chooseTimeList
[
i
].
startPlanTime
},
//---时间确认事件
confirm
(
date
)
{
this
.
showPop
=
false
this
.
$emit
(
'timeConfig'
,
this
.
times
)
},
},
mounted
()
{
let
times
=
new
Date
().
Format
(
'yyyy-MM-dd hh:mm:ss'
)
this
.
timeNumber
=
parseInt
(
this
.
$commonjs
.
changeTime
(
times
))
}
}
</
script
>
<
style
scoped=
"scoped"
>
.time
{
padding
:
30
rpx
20
rpx
60
rpx
20
rpx
;
text-align
:
center
;
<
style
scoped=
"scoped"
lang=
"scss"
>
.son-wrap
{
position
:
relative
;
height
:
65vh
;
display
:
flex
;
flex-direction
:column
;
}
.time-title
{
font-size
:
32
rpx
;
font-weight
:
bolder
;
text-align
:
center
;
font-size
:
32rpx
;
font-weight
:
bold
;
padding
:
30rpx
24rpx
;
border-radius
:
20rpx
20rpx
0
0
;
}
.time-content
{
display
:
flex
;
flex-wrap
:
wrap
;
}
.time-list
{
width
:
30%
;
height
:
80
rpx
;
text-align
:
center
;
width
:
30%
;
height
:
90rpx
;
line-height
:
30rpx
;
color
:
#666666
;
background
:
rgb
(
242
,
242
,
242
);
border-radius
:
16
rpx
;
margin-right
:
5%
;
margin-top
:
30
rpx
;
}
.time-list
view
:first-child
{
margin-top
:
10
rpx
;
text-align
:
center
;
margin-right
:
5%
;
border-radius
:
15rpx
;
display
:
inline-block
;
background
:
#f2f2f2
;
position
:
relative
;
padding-bottom
:
8rpx
;
}
.time-list
view
{
width
:
100%
;
text-align
:
center
;
margin-top
:
10rpx
;
}
.time-content
view
:nth-child
(
3n
)
{
margin-right
:
0
;
}
.time-list.on
{
background
:
none
;
color
:
#3dbcff
;
border
:
1px
solid
#3dbcff
;
box-sizing
:
border-box
;
border
:
1px
solid
$theme
;
background
:
#DAE6F6
;
}
.time-sure
{
margin-top
:
30
rpx
;
margin-top
:
60rpx
;
text-align
:
center
;
}
</
style
>
pages/scenic/scenicOrder/scenicOrder.vue
View file @
3c2a558a
...
...
@@ -2,18 +2,18 @@
<view
class=
"orderBox"
>
<view
class=
"head"
>
</view>
<view
class=
"middle"
>
<
!-- --------------------------------------------产品信息部分----------------------------------- --
>
<view
class=
"middle1"
>
<view
class=
"middle
1
Product"
>
<
view
class=
"middle-top"
>
<!-- --------------------------------------------产品信息部分------------------------------------- --
>
<view
class=
"middle
-
Product"
>
<view
class=
"merchantName"
>
<text>
<text
class=
"title-text"
>
{{
productIfo
.
merchantName
||
''
}}
</text>
<text>
{{
productIfo
.
name
||
''
}}
</text>
</view>
<view
@
click=
"showBuyKnow()"
class=
"buyKnow"
>
<view>
<text
v-if=
"productIfo.backChangeRule == 0"
>
不可退换
</text>
...
...
@@ -23,145 +23,229 @@
</view>
<view>
购买须知
<u-icon
name=
"arrow-right"
></u-icon>
<u-icon
name=
"arrow-right"
color=
'#FC6703'
></u-icon>
</view>
</view>
</view>
<!--需要排队并且站点数大于1-->
<view
class=
"middle-place"
@
click=
"openArea()"
v-if=
"productIfo.isFetch == 1 && productIfo.productAreaList.length > 1 && showOpenArea"
>
<view>
出发站点
</view>
<view>
{{
areaObj
.
areaName
||
'请选择站点'
}}
</view>
<view>
<u-icon
name=
"arrow-right"
color=
"#3688FF"
></u-icon>
</view>
</view>
<!--需要排队并且为一个站点-->
<view
class=
"middle-place"
v-if=
"productIfo.isFetch == 1 && productIfo.productAreaList.length == 1 && showOpenArea"
@
click=
"getSortInfor()"
>
<
!--
<
view
class=
"middle-place"
v-if=
"productIfo.isFetch == 1 && productIfo.productAreaList.length == 1 && showOpenArea"
@
click=
"getSortInfor()"
>
<view>
获取排队信息
</view>
<view>
{{
areaObj
.
areaName
}}
</view>
<view>
<u-icon
name=
"arrow-right"
color=
"#3688FF"
></u-icon>
</view>
</view>
<view
class=
"middle1Date"
>
<text>
游玩日期
</text>
<scroll-view
class=
"date-content"
scroll-x=
"true"
:scroll-left=
"dateScroll"
v-if=
"dateList.length > 0"
>
<view
class=
"date-list"
v-for=
"(item, index) of dateList"
:class=
"
{ on: active == index }" @click="dateChoose(index)" :key="index">
<view
class=
"date-time"
>
<text
v-if=
"item.week"
>
</view>
-->
<view
class=
"middle-Date"
>
<view
class=
"title-text"
>
游玩日期
</view>
<view
class=
"middle-Datelist"
>
<scroll-view
class=
"date-content"
scroll-x=
"true"
:scroll-left=
"dateScroll"
v-if=
"dateList.length > 0"
>
<view
class=
"date-list"
v-for=
"(item, index) of dateList"
:class=
"
{ on: active == index }" @click="dateChoose(index)" :key="index">
<view
v-if=
"item.week"
>
<text
v-if=
"item.week != '今天' && item.week != '明天' && item.week != '后天'"
>
周
</text>
{{
item
.
week
}}
</text>
{{
item
.
startTime
?
item
.
startTime
.
substr
(
5
,
5
)
:
''
}}
</view>
<view
class=
"date-price"
>
<text>
¥
</text><text>
{{
item
.
sellingPrice
}}
</text>
</view>
<view>
{{
item
.
startTime
?
item
.
startTime
.
substr
(
5
,
5
)
:
''
}}
</view>
<view
class=
"date-price"
>
¥
<text
style=
"font-weight: bold;"
>
{{
item
.
sellingPrice
}}
</text>
</view>
<view
v-if=
"active == index"
class=
"date-icon"
>
<u-icon
name=
"checkmark"
color=
"#ffffff"
></u-icon>
</view>
</view>
<view
v-if=
"active == index"
class=
"date-icon"
>
<u-icon
name=
"checkmark"
color=
"#ffffff"
></u-icon>
</scroll-view>
<text
v-else
class=
"no-date"
>
不可购买
</text>
<view
class=
"dateMore"
@
click=
"showCalendar()"
>
<view
class=
"date-more-content"
>
<view>
更多
</view>
<view>
日期
</view>
</view>
<u-icon
name=
"arrow-right"
></u-icon>
</view>
</scroll-view>
<text
v-else
class=
"no-date"
>
不可购买
</text>
<view
class=
"dateMore"
@
click=
"showCalendar()"
>
<view
class=
"date-more-content"
>
<view>
更多
</view>
<view>
日期
</view>
</view>
<u-icon
name=
"arrow-right"
color=
"#3688FF"
></u-icon>
</view>
</view>
<view
class=
"middle1Time"
v-if=
"productIfo.productType == 3"
>
<text>
游玩时间
</text>
<scroll-view
class=
"time-content"
scroll-x=
"true"
:scroll-left=
"timeScroll"
v-if=
"timeList > 0"
>
<view
class=
"time-list"
v-for=
"(item, index) of timeList"
@
click=
"chooseTime(index)"
:class=
"
{ on: timeActive == index }" :key="index">
<view>
{{
item
.
startPlanTime
?
item
.
startPlanTime
.
substr
(
0
,
5
)
:
''
}}
<text
v-if=
"item.endPlanTime"
>
-
</text>
{{
item
.
endPlanTime
?
item
.
endPlanTime
.
substr
(
0
,
5
)
:
''
}}
<view
class=
"middle-time"
v-if=
"productIfo.productType == 3"
>
<view
class=
"title-text"
>
场次
</view>
<view
class=
"middle-timelist"
>
<scroll-view
class=
"time-content"
scroll-x=
"true"
:scroll-left=
"timeScroll"
v-if=
"timeList.length> 0"
>
<view
class=
"time-list"
v-for=
"(item, index) of timeList"
@
click=
"chooseTime(index)"
:class=
"
{ on: timeActive == index }" :key="index">
<view>
{{
item
.
startPlanTime
?
item
.
startPlanTime
.
substr
(
0
,
5
)
:
''
}}
<text
v-if=
"item.endPlanTime"
>
-
</text>
{{
item
.
endPlanTime
?
item
.
endPlanTime
.
substr
(
0
,
5
)
:
''
}}
</view>
<view>
剩余:
{{
item
.
last
}}
</view>
<view
v-if=
"timeActive == index"
class=
"date-icon"
>
<u-icon
name=
"checkmark"
color=
"#ffffff"
></u-icon>
</view>
</view>
<view>
剩余:
{{
item
.
last
}}
</
view>
<
/view
>
</scroll-view
>
<text
class=
"no-time"
v-if=
"startDate && endDate && timeList.length == 0"
>
该日票种已售罄,请选择其他日期
</text
>
<text
class=
"no-time"
v-if=
"!startDate || !endDate"
>
请先选游玩日期
</text
>
<view
class=
"timeMore"
@
click=
"showTime()"
>
<view
class=
"time-more-content"
>
<
view>
更多
<
/view>
<
view>
时间
</view
>
</scroll-
view>
<
text
class=
"no-time"
v-if=
"startDate && endDate && timeList.length == 0"
>
该日票种已售罄,请选择其他日期
</text
>
<text
class=
"no-time"
v-if=
"!startDate || !endDate"
>
请先选游玩日期
</text
>
<view
class=
"timeMore"
@
click=
"showTime()"
>
<view
class=
"time-more-content"
>
<view>
更多
</view
>
<view>
场次
</view
>
</view>
<
u-icon
name=
"arrow-right"
></u-icon
>
</view>
<u-icon
name=
"arrow-right"
color=
"#3688FF"
></u-icon>
</view>
</view>
<view
class=
"middle1Number"
>
<view
style=
"font-size: 32rpx; font-weight: bolder"
>
购买数量
</view>
<view
class=
"middle-divider"
>
</view>
<view
class=
"middle-Number"
>
<view
class=
"title-text"
>
购买数量
</view>
<view>
<u-number-box
button-size=
"36"
inputWidth=
"40"
<u-number-box
v-model=
"buyNum"
>
<view
slot=
"minus"
class=
"number-minus"
>
<u-icon
name=
"minus"
color=
"#FFFFFF"
size=
"32"
></u-icon>
</view>
<text
slot=
"input"
class=
"number-input"
>
{{
buyNum
}}
</text>
<view
slot=
"plus"
class=
"number-plus"
>
<u-icon
name=
"plus"
color=
"#FFFFFF"
size=
"32"
></u-icon>
</view>
</u-number-box>
<!--
<u-number-box
@
change=
'buyNumChange'
v-model=
"buyNum"
bg-color=
'#3688FF'
color=
'#ffffff'
iconStyle=
'color:#ffffff;font-size:32rpx;'
buttonSize=
'60'
input-width=
"100"
:min=
"1"
:max=
"maxBookNum"
integer
v-model=
"buyNum"
@
change=
"buyNumChange"
color=
"#fff"
bgColor=
"#3688FF"
iconStyle=
"color: #fff"
></u-number-box>
:max=
"maxBookNum"
>
</u-number-box>
-->
</view>
</view>
</view>
<!------------------------------------------------------额外服务部分---------------------------------------------------->
<!--
<view
class=
"extraService"
v-if=
"loadProductResVoList.length>0&&showErmai"
>
<view
v-for=
"(item,index) of loadProductResVoList"
:key=
"item.id"
>
<text>
<text
style=
"font-size: 28rpx;font-weight: bold;"
>
{{
item
.
name
}}
</text>
<text
style=
"font-size:20rpx;color: #666666;"
v-if=
"item.deposit"
>
(押金:¥
{{
item
.
deposit
}}
)
</text>
</text>
<label>
¥
{{
item
.
sellingPrice
}}
<input
type=
"checkbox"
style=
"margin-left: 20rpx;"
:value=
"item"
v-model=
"choooseService"
@
change=
"extraChange(item,index)"
/>
</label>
<view
class=
" middle-coupon"
v-if=
"couponData.length>0"
@
click=
"showCoupon()"
>
<view>
券
</view>
<!-- 有可用优惠券,并且未选中 -->
<template
v-if=
"couponData.masterSlaveCouponList&&couponData.masterSlaveCouponList.length>0&&!chooseCouponObj"
>
<view>
{{
couponData
.
masterSlaveCouponList
[
0
].
couponName
}}
</view>
<view
>
未使用优惠券
</view>
</
template
>
<!-- 有可用优惠券 -->
<
template
v-if=
"chooseCouponObj&&savedMoney>0"
>
<view>
{{
chooseCouponObj
.
couponName
}}
</view>
<view
style=
"font-size: 32rpx;"
>
<text
style=
"font-size: 24rpx;position: relative;top: 6rpx;"
>
¥
</text>
{{
parseFloat
(
savedMoney
.
toFixed
(
2
))
}}
</view>
</
template
>
<!-- 可用优惠券条件-->
<
template
v-if=
"ableConpon"
>
<view>
{{
ableConpon
.
couponName
}}
</view>
<view>
{{
ableConpon
.
couponRule
}}
</view>
</
template
>
<u-icon
name=
"arrow-right"
color=
"#3688FF"
></u-icon>
</view>
</view>
-->
<!-- ----------------------------------------------游客信息----------------------------------------- -->
<view
class=
"middle2"
v-if=
"productIfo.tripTemplateFlag != 2"
>
<view
class=
"middle2Visitor"
>
<!-- --------------------------------------------额外服务部分-------------------------------------------- -->
<view
class=
"extraService"
v-if=
"serviceList.length>0&&showErmai"
>
<checkbox-group
@
change=
"extraChange"
>
<view
v-for=
"(item,index) of serviceList"
:key=
"item.id"
>
<label>
<view>
<text>
{{item.name}}
</text>
<text
style=
"font-size:20rpx;color: #666666;"
v-if=
"item.deposit"
>
(押金:¥{{item.deposit}})
</text>
</view>
<view>
<text
style=
"font-size: 24rpx;"
>
¥
</text>
<text
style=
"font-size: 32rpx;font-weight: bold;"
>
{{item.sellingPrice}}
</text>
<checkbox
class=
"blue"
:value=
"JSON.stringify(item)"
style=
"transform: scale(0.7);position: relative;left: 10rpx;"
:checked=
"item.ifChoose"
/>
</view>
</label>
</view>
</checkbox-group>
</view>
<!-- -----------------------------------支付之后有额外服务,没有选额外服务的弹窗------------------------- -->
<u-popup
:show=
"showExtraPop"
:round=
"20"
@
close=
"showExtraPop = false"
closeable
>
<view
class=
"extra-wrap"
>
<view
style=
"font-weight: bold;font-size: 32rpx;"
>
云智能导览耳机
</view>
<view
style=
"color: #666666;margin:40rpx 0;"
>
深度了解索道典故由来,周边攻略推荐
</view>
<view>
<text
@
click=
"extraNo()"
class=
"btn"
style=
"background: #fff;color: #333;border: 1px solid #c0c0c0;"
>
不需要
</text>
<text
@
click=
"extraYes()"
class=
"btn"
style=
"margin-left: 40rpx;"
>
需要
</text>
</view>
</view>
</u-popup>
</view>
<view
class=
"middle-divider"
>
</view>
<!-- ---------------------------------------------游客信息-------------------------------------------- -->
<view
class=
"middle-bottom"
v-if=
"productIfo.tripTemplateFlag != 2"
>
<view
class=
"middle-visitor"
>
<view
class=
"visitorTitle"
>
<text
>
游客
信息
</text>
<text
class=
"title-text"
>
用户
信息
</text>
<text>
需填
<text
class=
"title-bold"
>
{{
contactNum
}}
</text
>
位出行人
<text
class=
"title-bold"
v-if=
"contactNum - orderTouristList.length > 0"
>
,还需
{{
contactNum
-
orderTouristList
.
length
}}
位
</text>
需填
<text
class=
"title-bold"
>
{{ contactNum }}
</text>
位出行人
<!-- <text class="title-bold" v-if="contactNum - chooseContact.length > 0">,还需{{ contactNum - chooseContact.length }}位</text> -->
</text>
</view>
<view
class=
"visitorPlus"
>
<view
class=
"visitorPlus"
v-if=
"contactTotal.length>0"
>
<!-- 这里key必须是index,如果是id会出现数据改变和样式不改变的bug --
>
<view
class=
"plus-list"
:class=
"
{
on: item.ifChoose == true
}"
v-for="(item, index) of contact
Data
.slice(0, 3)"
:class=
"{
on:item.ifChoose
}"
v-for=
"(item, index) of contact
Total
.slice(0, 3)"
@
click=
"visitorChoose(index)"
:key="i
tem.id
"
:key=
"i
ndex
"
>
{{ item.name }}
<view
v-if=
"item.ifChoose"
class=
"date-icon"
>
<u-icon
name=
"checkmark"
color=
"#ffffff"
></u-icon>
</view>
</view>
<view
@
click=
"showContacts()"
class=
"plus-list plus-list-last"
>
...
...
@@ -169,11 +253,15 @@
<u-icon
name=
"arrow-right"
color=
"#3688FF"
></u-icon>
</view>
</view>
<view
class=
"visitorBtn"
v-else
@
click=
"$refs.editContacts.showEdit = true"
>
<u-icon
name=
"plus-circle"
color=
"#3688FF"
size=
"52"
></u-icon>
<text
style=
"margin-left:16rpx;"
>
新增
</text>
</view>
<view
class=
"visitorEdit"
v-show=
"
orderTouristLis
t.length > 0"
>
<view
class=
"edit-list"
v-for=
"(item, index) of
orderTouristLis
t"
:key=
"item.id"
>
<view
class=
"visitorEdit"
v-show=
"
chooseContac
t.length > 0"
>
<view
class=
"edit-list"
v-for=
"(item, index) of
chooseContac
t"
:key=
"item.id"
>
<view
@
click=
"delChooseContact(item, index)"
>
<u-icon
name=
"close-circle"
color=
"#3688ff"
size=
"
2
0"
></u-icon>
<u-icon
name=
"close-circle"
color=
"#3688ff"
size=
"
4
0"
></u-icon>
</view>
<view>
...
...
@@ -185,75 +273,27 @@
</view>
<view
@
click=
"showEdit(item)"
>
<u-icon
name=
"edit-pen-fill"
color=
"#3688ff"
size=
"
24
"
></u-icon>
<u-icon
name=
"edit-pen-fill"
color=
"#3688ff"
size=
"
48
"
></u-icon>
</view>
</view>
</view>
</view>
<view
class=
"middle2Phone"
v-if=
"productIfo.tripTemplateFlag != 2"
>
<view
class=
"phoneTitle"
>
联系信息
</view>
<view
class=
"phoneNumber"
>
<text>
联系电话:
</text>
<input
type=
"number"
maxlength=
"11"
placeholder=
"请输入联系电话"
v-model
.
trim=
"ticketPhone"
/>
</view>
<view
class=
"middle-phone"
v-if=
"productIfo.tripTemplateFlag != 2"
>
<text>
联系电话:
</text>
<input
type=
"number"
maxlength=
"11"
placeholder=
"请输入联系电话"
v-model
.
trim=
"ticketPhone"
/>
</view>
</view>
<!-- ---------------------------------------------
-----------产品押金部分----------
---------------------------------------- -->
<!-- ---------------------------------------------
产品押金部分
---------------------------------------- -->
<view
class=
"productDeposit"
v-if=
"productIfo.deposit"
>
<text>
{{
productIfo
.
name
}}
押金
</text>
<text
style=
"color: #ff0000"
>
{{
productIfo
.
deposit
}}
元
</text>
</view>
<!-- ----------------------------------选中了额外服务之后,不再选额外服务的弹窗 ------------------------------------------------ -->
<!--
<view
class=
"extraPop"
v-show=
"showExtraPop"
>
<view>
<view>
{{
extraChangeData
.
name
}}
</view>
<view>
{{
extraChangeData
.
details
}}
</view>
<view>
<text
@
click=
"extraNo()"
>
不想感受
</text>
<text
@
click=
"extraYes()"
>
取消
</text>
</view>
{{ productIfo.name }}
<text
style=
"color: #FC6703;margin-left: 10rpx;"
>
押金
</text>
</view>
</view>
-->
<!-- -----------------------------------支付之后有额外服务,没有选额外服务的弹窗------------------------------------- -->
<!--
<view
class=
"extraPop"
v-show=
"showPayExtraPop"
>
<view>
<view>
云智能导览耳机
</view>
<view
style=
"text-align: center;"
>
深度了解索道典故由来,周边攻略推荐
</view>
<view>
<text
@
click=
"payExtraNo()"
>
不需要
</text>
<text
@
click=
"payExtraYes()"
>
需要
</text>
</view>
</view>
</view>
-->
<view
style=
"color: #FC6703"
>
{{ productIfo.deposit }}元
</view>
</view>
</view>
<view
class=
"bottom"
>
...
...
@@ -269,25 +309,25 @@
<u-icon
name=
"arrow-down"
></u-icon>
</view>
<view
class=
"btn"
:style=
"
{ background: payBackground }">
<view
class=
"b
ottom-b
tn"
:style=
"{ background: payBackground }"
>
<text
v-if=
"productIfo.status == 1"
>
已下架
</text>
<text
v-if=
"parseInt(maxBookNum) <1"
style=
"background: #c0c0c0"
>
暂无库存
</text>
<text
v-if=
"productIfo.status != 1 && parseInt(maxBookNum) >= 1"
@
click=
"jugeOrder()"
>
去支付
</text>
<text
class=
"btn-paying"
v-show=
"showPaying"
>
支付中...
</text>
<text
class=
"mask"
v-show=
"showPaying"
></text>
<text
v-if=
"productIfo.status != 1 && parseInt(maxBookNum) >= 1"
@
click=
"goPay()"
>
去支付
</text>
</view>
</view>
</view>
<
!--
<calendar
ref=
"calendar"
@
dateConfig=
"dateConfig"
:dateList=
"dateList"
v-if=
"dateList.length > 0"
></calendar>
--
>
<
calendar
ref=
"calendar"
@
dateConfig=
"dateConfig"
:dateList=
"dateList"
v-if=
"dateList.length > 0"
></calendar
>
<buyKnow
ref=
"buyKnow"
:buyKnowData=
"buyKnowData"
></buyKnow>
<detail
ref=
"detail"
:sellTotal=
'sellTotal'
:merchantName=
"productIfo.merchantName"
:name=
"productIfo.name"
:buyNum=
"buyNum"
:sellingPrice=
"sellingPrice"
:choo
oseService=
"cho
ooseService"
:choo
seService=
"ch
ooseService"
:productDepositTotal=
"productDepositTotal"
:chooseCouponObj=
"chooseCouponObj"
></detail>
<chooseArea
v-if=
"showArea"
...
...
@@ -297,18 +337,16 @@
:defaultAreaCode=
"defaultAreaCode"
></chooseArea>
<times
ref=
"times"
:chooseTimeList=
"timeList"
@
timeConfig=
"timeConfig"
:chooseTimeData=
"chooseTimeData"
:timeActive=
"timeActive"
></times>
<editContacts
ref=
"editContacts"
:editContact=
"editContact"
></editContacts>
<editContacts
ref=
"editContacts"
:editContact=
"editContact"
:contactTotal=
"contactTotal"
></editContacts>
<contactList
ref=
"contactList"
@
getEditContact=
"getEditContact"
:contactData=
"contactData"
@
contactListConfig=
"contactListConfig"
:orderTouristList=
"orderTouristList"
:buyNum=
"contactNum"
:contactTotal=
"contactTotal"
:contactNum=
"contactNum"
></contactList>
<orderCoupon
:couponData=
"couponData"
ref=
"orderCoupon"
@
couponChoose=
"couponChoose"
:chooseCouponObj=
"chooseCouponObj"
></orderCoupon>
<!--一个站点时获取排队信息弹窗-->
<u-popup
:show=
"sortInforPop"
:round=
"10"
closeable
@
close=
"sortInforPop = false"
>
<
!-- <
u-popup :show="sortInforPop" :round="10" closeable @close="sortInforPop = false">
<view style="padding: 40rpx 60rpx">
<view>
景区名称:
...
...
@@ -333,13 +371,14 @@
<text class="middle-btn">确定</text>
</view>
</view>
</u-popup>
</u-popup>
-->
</view>
</template>
<
script
>
import
calendar
from
'../scenicComponents/calendar'
//日历组件
import
buyKnow
from
'@/components/buyKnow.vue'
//购票须知
import
orderCoupon
from
'@/components/orderCoupon'
//优惠券
import
detail
from
'../scenicComponents/detail.vue'
//明细弹窗
import
chooseArea
from
'../scenicComponents/chooseArea'
//选择站点
import
contactList
from
'../scenicComponents/contactList'
//联系人弹窗
...
...
@@ -354,7 +393,8 @@ export default {
contactList
,
editContacts
,
times
,
chooseArea
chooseArea
,
orderCoupon
},
data
()
{
return
{
...
...
@@ -378,13 +418,13 @@ export default {
merchantId
:
''
,
//商户Id
ticketPhone
:
''
,
//联系电话
productIfo
:
''
,
//初始化产品基本信息
originalPrice
:
0
,
//原价
sellingPrice
:
0
,
//卖价
originalPrice
:
0
,
//原价
单价
sellingPrice
:
0
,
//卖价
单价
interfaceCode
:
''
,
//接口编号
merchantCode
:
''
,
//商户code
productCode
:
''
,
//产品code
contact
Data
:
[],
//联系人列表数据
orderTouristLis
t
:
[],
//选中的游客信息列表
contact
Total
:
[],
//所有联系人列表
chooseContac
t
:
[],
//选中的游客信息列表
contactNum
:
1
,
//需要选择几位联系人数量
cruisePlanId
:
''
,
//班次Id
chooseTimeData
:
''
,
//选中的时间传给子组件
...
...
@@ -395,27 +435,26 @@ export default {
endPlayTime
:
''
,
//结束时间
areaObj
:
''
,
//区域组件的传值
templateList
:
[],
//该产品联系人必须要填写的信息
f
lag
:
''
,
//setTimeout函数
timeF
lag
:
''
,
//setTimeout函数
savedMoney
:
0
,
//优惠价格
loadProductResVo
List
:
[],
//所有额外服务
choo
o
seService
:
[],
//选中的额外服务
service
List
:
[],
//所有额外服务
chooseService
:
[],
//选中的额外服务
extraPrice
:
0
,
//额外服务总价格
showExtraPop
:
false
,
//控制额外服务弹窗显示隐藏
showPayExtraPop
:
false
,
//控制支付时有额外服务,没有选中额外服务的弹窗显示隐藏
extraChangeData
:
''
,
//额外服务变化时,变化的那个额外服务值
showExtraPop
:
false
,
//控制支付时有额外服务,没有选中额外服务的弹窗显示隐藏
orderProductList
:
[],
//额外服务,儿童票等入参
extraextraDepositTotal
:
0
,
//额外服务总押金
productDepositTotal
:
0
,
//产品总押金
orderSource
:
''
,
//订单来源 1公众号平台、2公众号组合页面1、3公众号组合页面2、4胖丁伙伴app、5第三方自助机、6第三方票房窗口
thirdOpenid
:
''
,
//第三方openid
beforeBookDays
:
''
,
//需提前预定天数
afterBuyUrl
:
''
,
//支付成功后页面跳转地址
companyId
:
''
,
//公司Id
docQuery
:
''
,
//元素变量
payBackground
:
''
,
//支付按钮背景颜色
showPaying
:
false
,
//是否显示支付中按钮
dateScroll
:
''
,
//日期滚动值
timeScroll
:
''
//时间滚动值
timeScroll
:
''
,
//时间滚动值
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
,
//openid
couponData
:[],
//所有劵数据
chooseCouponObj
:
''
,
//默认选中最优价格优惠券
ableConpon
:
''
,
//没有可用优惠券时,达到一定条件可用,显示达到的条件
}
},
onLoad
(
option
)
{
...
...
@@ -432,19 +471,19 @@ export default {
computed
:
{
originalTotal
()
{
//原价总价
if
(
this
.
choo
o
seService
.
length
>
0
)
{
if
(
this
.
chooseService
.
length
>
0
)
{
//额外服务价格和押金总价格
let
singleProduct
=
0
//单个产品押金
this
.
extraPrice
=
0
this
.
extraDepositTotal
=
0
//总押金
for
(
let
i
=
0
;
i
<
this
.
choo
o
seService
.
length
;
i
++
)
{
this
.
extraPrice
+=
parseFloat
((
this
.
choo
o
seService
[
i
].
sellingPrice
*
this
.
buyNum
).
toFixed
(
2
))
if
(
this
.
choo
o
seService
[
i
].
depositType
==
1
)
{
for
(
let
i
=
0
;
i
<
this
.
chooseService
.
length
;
i
++
)
{
this
.
extraPrice
+=
parseFloat
((
this
.
chooseService
[
i
].
sellingPrice
*
this
.
buyNum
).
toFixed
(
2
))
if
(
this
.
chooseService
[
i
].
depositType
==
1
)
{
//等于1,押金金额跟数量没关系
singleProduct
=
this
.
choo
o
seService
[
i
].
deposit
}
else
if
(
this
.
choo
o
seService
[
i
].
depositType
==
2
)
{
singleProduct
=
this
.
chooseService
[
i
].
deposit
}
else
if
(
this
.
chooseService
[
i
].
depositType
==
2
)
{
//等于2,押金单价乘购买数量
singleProduct
=
parseFloat
((
this
.
choo
o
seService
[
i
].
deposit
*
this
.
buyNum
).
toFixed
(
2
))
singleProduct
=
parseFloat
((
this
.
chooseService
[
i
].
deposit
*
this
.
buyNum
).
toFixed
(
2
))
}
this
.
extraDepositTotal
+=
singleProduct
}
...
...
@@ -468,7 +507,7 @@ export default {
},
sellTotal
()
{
//卖价总价
if
(
this
.
choo
o
seService
.
length
==
0
)
{
if
(
this
.
chooseService
.
length
==
0
)
{
this
.
extraPrice
=
0
this
.
extraDepositTotal
=
0
}
...
...
@@ -478,9 +517,6 @@ export default {
}
},
methods
:
{
xxx
(){
console
.
log
(
123
)
},
//---获取排号信息
getSortInfor
()
{
let
data
=
{
...
...
@@ -488,7 +524,8 @@ export default {
merchantCode
:
this
.
merchantCode
//商户code
}
uni
.
showLoading
({
title
:
'加载中'
title
:
'加载中'
,
mask
:
true
})
this
.
$request
(
'distribution/distribution/findNewFetchInfoFromSceinc'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
...
...
@@ -503,68 +540,23 @@ export default {
}
})
},
//---排号是否上下架
sortUpDown
()
{
let
data
=
{
merchantCode
:
this
.
merchantCode
//商户code
}
uni
.
showLoading
({
title
:
'加载中'
})
this
.
$request
(
'distribution/distribution/findNewFetchInfoFromSceinc'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
sortArr
=
res
.
data
.
data
let
data
=
res
.
data
if
(
this
.
productIfo
.
productAreaList
.
length
>
1
)
{
//有库存并且需要选择两个站点以上的票种,显示区域组件
for
(
let
item
in
data
.
main
)
{
if
(
data
.
main
[
item
].
sceneSortStatus
==
'1'
)
{
this
.
showArea
=
true
this
.
showOpenArea
=
true
}
}
}
else
if
(
this
.
productIfo
.
productAreaList
.
length
==
1
)
{
//只有一个站点时,直接选中站点
for
(
let
item
in
data
.
main
)
{
if
(
data
.
main
[
item
].
sceneSortStatus
==
'1'
)
{
this
.
areaObj
=
this
.
productIfo
.
productAreaList
[
0
]
this
.
showOpenArea
=
true
}
}
}
}
})
},
//---购买额外服务
extraYes
()
{
this
.
showExtraPop
=
false
this
.
choooseService
.
push
(
this
.
extraChangeData
)
},
//---不购买额外服务
extraNo
()
{
this
.
showExtraPop
=
false
},
//---额外服务多选框变化
extraChange
(
item
,
i
)
{
if
(
!
document
.
querySelectorAll
(
'.extraService input'
)[
i
].
checked
)
{
this
.
showExtraPop
=
true
this
.
extraChangeData
=
item
}
},
//---获取子组件的传值
areaSure
(
data
)
{
this
.
areaObj
=
data
if
(
this
.
areaObj
.
areaCode
==
'cjsd_project_0001'
)
{
//选择了南站不显示耳麦
this
.
showErmai
=
false
this
.
choooseService
=
[]
this
.
chooseService
=
[]
//多选框状态设置成未选中
this
.
serviceList
.
forEach
(
item
=>
{
item
.
ifChoose
=
false
})
}
else
{
this
.
showErmai
=
true
}
},
//---展示选择站点
openArea
()
{
this
.
areaObj
=
''
this
.
showArea
=
true
},
//---关闭选择站点
...
...
@@ -573,7 +565,7 @@ export default {
},
//---展示详情弹窗
showDetail
()
{
this
.
$refs
.
detail
.
show
=
true
this
.
$refs
.
detail
.
show
Pop
=
true
},
//---展示日历
showCalendar
()
{
...
...
@@ -593,8 +585,9 @@ export default {
//如果为班次票,点击时,请求班次票接口
this
.
cruisePlanId
=
''
//清空班次id
this
.
timeActive
=
10000
this
.
getTimeStock
(
)
uni
.
$u
.
throttle
(
this
.
getTimeStock
,
3000
)
}
this
.
initCoupon
()
},
//---日历确认事件
dateConfig
(
data
)
{
...
...
@@ -602,16 +595,13 @@ export default {
return
item
.
startTime
.
substr
(
0
,
10
)
==
data
})
this
.
dateChoose
(
index
)
//选中确认的日期
this
.
docQuery
.
selectAll
(
'.date-list'
)
.
boundingClientRect
(
data
=>
{
this
.
dateScroll
=
(
data
[
index
].
width
+
4
)
*
index
})
.
exec
()
this
.
docQuery
.
selectAll
(
'.date-list'
).
boundingClientRect
(
data
=>
{
this
.
dateScroll
=
(
data
[
index
].
width
+
4
)
*
index
}).
exec
()
},
//---展示更多时间
showTime
()
{
this
.
$refs
.
times
.
show
=
true
this
.
$refs
.
times
.
show
Pop
=
true
},
//---时间选择
chooseTime
(
i
)
{
...
...
@@ -631,12 +621,9 @@ export default {
if
(
index
>
-
1
)
{
//子组件点击确认之后有选择的时间
this
.
chooseTime
(
index
)
//选中确认的日期
this
.
docQuery
.
selectAll
(
'.time-list'
)
.
boundingClientRect
(
data
=>
{
this
.
timeScroll
=
(
data
[
index
].
width
+
4
)
*
index
})
.
exec
()
this
.
docQuery
.
selectAll
(
'.time-list'
).
boundingClientRect
(
data
=>
{
this
.
timeScroll
=
(
data
[
index
].
width
+
4
)
*
index
}).
exec
()
}
},
//---获取点击的编辑联系人信息,传给编辑联系人组件
...
...
@@ -646,52 +633,23 @@ export default {
//---删除选中的联系人
delChooseContact
(
item
,
index
)
{
//所有联系人中找到删除联系人下标,改成未选中状态
let
sub
=
this
.
contact
Data
.
findIndex
(
item2
=>
item2
.
id
==
item
.
id
)
this
.
contact
Data
[
sub
].
ifChoose
=
false
this
.
orderTouristLis
t
.
splice
(
index
,
1
)
//删除数组
let
sub
=
this
.
contact
Total
.
findIndex
(
item2
=>
item2
.
id
==
item
.
id
)
this
.
contact
Total
[
sub
].
ifChoose
=
false
this
.
chooseContac
t
.
splice
(
index
,
1
)
//删除数组
},
//---展示编辑联系人
showEdit
(
obj
)
{
this
.
$refs
.
editContacts
.
showEdit
=
true
this
.
editContact
=
obj
},
//---联系人列表选中确定之后传值事件
contactListConfig
(
data
)
{
//把选中的联系人放在前面
this
.
contactData
.
forEach
((
item
,
index
)
=>
{
data
.
forEach
(
item2
=>
{
if
(
item
.
id
==
item2
.
id
)
{
delete
this
.
contactData
[
index
]
}
})
})
this
.
contactData
=
this
.
contactData
.
filter
(
function
(
val
)
{
return
val
})
this
.
contactData
=
data
.
concat
(
this
.
contactData
)
//获取选中的联系人
this
.
orderTouristList
=
data
//清空之前的选中状态
this
.
contactData
.
forEach
(
item
=>
{
item
.
ifChoose
=
false
})
//选中的联系人,设为选中状态
this
.
contactData
.
forEach
(
item
=>
{
this
.
orderTouristList
.
forEach
(
item2
=>
{
if
(
item
.
id
==
item2
.
id
)
{
item
.
ifChoose
=
true
}
})
})
},
//---展示新增联系人,并获取联系人列表
showContacts
()
{
this
.
$refs
.
contactList
.
contactsShow
=
true
this
.
$refs
.
contactList
.
showPop
=
true
},
//---游客选择
visitorChoose
(
i
)
{
let
chooseList
=
this
.
orderTouristLis
t
let
data
=
this
.
contact
Data
let
chooseList
=
this
.
chooseContac
t
let
data
=
this
.
contact
Total
data
[
i
].
ifChoose
=
!
data
[
i
].
ifChoose
if
(
data
[
i
].
ifChoose
)
{
if
(
chooseList
.
length
==
this
.
contactNum
)
{
...
...
@@ -718,20 +676,35 @@ export default {
}
if
(
this
.
productIfo
.
tripTemplateFlag
==
1
)
{
//实名制
this
.
contactNum
=
e
.
value
//需要填写的联系人数量等于购买数量
if
(
this
.
c
ontactNum
<
this
.
orderTouristList
.
length
)
{
this
.
contactNum
=
e
.
value
if
(
this
.
c
hooseContact
.
length
>
this
.
contactNum
)
{
//当选中联系人数量大于购买数量时
this
.
orderTouristList
.
splice
(
this
.
orderTouristList
.
length
-
1
,
1
)
//删除多余的联系人
this
.
chooseContact
.
splice
(
this
.
chooseContact
.
length
-
1
,
1
)
//删除多余的联系人
//联系人列表重新判断是否选中
this
.
contactTotal
.
forEach
(
item
=>
{
item
.
ifChoose
=
false
})
this
.
chooseContact
.
forEach
(
item
=>
{
this
.
contactTotal
.
forEach
(
item2
=>
{
if
(
item
.
id
==
item2
.
id
){
item2
.
ifChoose
=
true
}
})
})
}
}
else
if
(
this
.
productIfo
.
tripTemplateFlag
==
0
)
{
}
if
(
this
.
productIfo
.
tripTemplateFlag
==
0
)
{
//非实名制
this
.
contactNum
=
1
}
clearTimeout
(
this
.
timeFlag
)
this
.
timeFlag
=
setTimeout
(()
=>
{
this
.
initCoupon
()
},
1500
)
},
//---展示购票须知
showBuyKnow
()
{
console
.
log
(
111
)
this
.
$refs
.
buyKnow
.
buyKnowShow
=
true
this
.
$refs
.
buyKnow
.
showPop
=
true
},
//---页面初始化数据,获取产品基本信息
initData
()
{
...
...
@@ -739,13 +712,14 @@ export default {
id
:
this
.
productId
//产品id
}
uni
.
showLoading
({
title
:
'加载中'
title
:
'加载中'
,
mask
:
true
})
this
.
$request
(
'scenic/groupGood/loadProduct'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
productIfo
=
res
.
data
this
.
defaultAreaCode
=
this
.
productIfo
.
defaultAreaCode
||
''
//
找到站点默认
站点数据
//
通过默认站点找到
站点数据
if
(
this
.
defaultAreaCode
)
{
this
.
productIfo
.
productAreaList
.
forEach
(
item
=>
{
if
(
item
.
areaCode
==
this
.
defaultAreaCode
)
{
...
...
@@ -760,9 +734,8 @@ export default {
this
.
merchantId
=
res
.
data
.
merchantId
//重新赋值商户id
this
.
beforeBookDays
=
res
.
data
.
beforeBookDays
||
0
//提前预定天数
this
.
buyKnowData
=
res
.
data
//购买须知,传给子组件
this
.
loadProductResVoList
=
res
.
data
.
loadProductResVoList
//额外服务
this
.
afterBuyUrl
=
res
.
data
.
afterBuyUrl
||
''
//支付成功后页面跳转
//this.choooseService=res.data.data.loadProductResVoList//默认全部选中
this
.
serviceList
=
res
.
data
.
loadProductResVoList
//额外服务
//this.chooseService=res.data.data.loadProductResVoList//默认全部选中
if
(
this
.
productIfo
.
status
==
1
)
{
//下架状态
this
.
payBackground
=
'#C0C0C0'
...
...
@@ -839,9 +812,9 @@ export default {
if
(
this
.
dateList
.
length
==
1
&&
this
.
beforeBookDays
==
0
)
{
//长度为1而且只能预订当天,默认选中第一个日期
//真机模拟的时候手机端不显示今天,明天后天,延迟执行
//
setTimeout(item => {
//
this.$refs.calendar.defaultDate = this.dateList[0].startTime.substr(0, 10)
//
}, 1000)
setTimeout
(
item
=>
{
this
.
$refs
.
calendar
.
defaultDate
=
this
.
dateList
[
0
].
startTime
.
substr
(
0
,
10
)
},
1000
)
this
.
maxBookNum
=
Math
.
min
(
this
.
dateList
[
0
].
surplus
,
this
.
productIfo
.
maxBookNum
)
//剩余量
this
.
startDate
=
this
.
dateList
[
0
].
startTime
//开始日期
this
.
endDate
=
this
.
dateList
[
0
].
endTime
//结束日期
...
...
@@ -852,6 +825,7 @@ export default {
//如果为班次票,请求班次票接口
this
.
getTimeStock
()
}
this
.
initCoupon
()
//获取优惠券
}
}
else
{
uni
.
showToast
({
...
...
@@ -884,6 +858,39 @@ export default {
}
})
},
//---排号是否上下架
sortUpDown
()
{
let
data
=
{
merchantCode
:
this
.
merchantCode
//商户code
}
uni
.
showLoading
({
title
:
'加载中'
,
mask
:
true
})
this
.
$request
(
'distribution/distribution/findNewFetchInfoFromSceinc'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
sortArr
=
res
.
data
.
data
let
data
=
res
.
data
if
(
this
.
productIfo
.
productAreaList
.
length
>
1
)
{
//有库存并且需要选择两个站点以上的票种,显示区域组件
for
(
let
item
in
data
.
main
)
{
if
(
data
.
main
[
item
].
sceneSortStatus
==
'1'
){
this
.
showArea
=
true
this
.
showOpenArea
=
true
}
}
}
else
if
(
this
.
productIfo
.
productAreaList
.
length
==
1
)
{
//只有一个站点时,直接选中站点(现目前还没有一个站点的景区)
for
(
let
item
in
data
.
main
)
{
if
(
data
.
main
[
item
].
sceneSortStatus
==
'1'
)
{
this
.
areaObj
=
this
.
productIfo
.
productAreaList
[
0
]
this
.
showOpenArea
=
true
}
}
}
}
})
},
//---获取班次票
getTimeStock
()
{
let
data
=
{
...
...
@@ -894,7 +901,8 @@ export default {
productCode
:
this
.
productIfo
.
code
//产品code
}
uni
.
showLoading
({
title
:
'加载中'
title
:
'加载中'
,
mask
:
true
})
this
.
$request
(
'distribution/distribution/getTimeStock'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
...
...
@@ -917,27 +925,27 @@ export default {
//---初始化联系人列表
getContactList
()
{
let
data
=
{
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
openid
:
this
.
openid
}
this
.
$request
(
'wechatUser/contact/findContactList'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
contact
Data
=
res
.
data
this
.
contact
Data
.
forEach
(
item
=>
{
this
.
contact
Total
=
res
.
data
this
.
contact
Total
.
forEach
(
item
=>
{
//用于判断是否被选中
item
.
ifChoose
=
false
})
//编辑成功重新调该方法时,把之前选中的游客,设为选中状态
this
.
contact
Data
.
forEach
(
item
=>
{
this
.
orderTouristLis
t
.
forEach
(
item2
=>
{
this
.
contact
Total
.
forEach
(
item
=>
{
this
.
chooseContac
t
.
forEach
(
item2
=>
{
if
(
item
.
id
==
item2
.
id
)
{
item
.
ifChoose
=
true
}
})
})
//删除联系人成功重新调该方法时,之前选中的联系人,数据库可能被删除,删除该联系人
this
.
orderTouristLis
t
.
forEach
((
item
,
index
)
=>
{
if
(
!
this
.
contact
Data
.
find
(
item2
=>
item
.
id
==
item2
.
id
))
{
this
.
orderTouristLis
t
.
splice
(
index
,
1
)
this
.
chooseContac
t
.
forEach
((
item
,
index
)
=>
{
if
(
!
this
.
contact
Total
.
find
(
item2
=>
item
.
id
==
item2
.
id
))
{
this
.
chooseContac
t
.
splice
(
index
,
1
)
}
})
}
else
{
...
...
@@ -951,18 +959,18 @@ export default {
//---添加并选中联系人--用于添加联系人之后直接从联系人列表选出需要填写的几位联系人
addChoose
()
{
let
data
=
{
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
openid
:
this
.
openid
}
this
.
$request
(
'wechatUser/contact/findContactList'
,
data
).
then
(
res
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
contact
Data
=
res
.
data
this
.
contact
Total
=
res
.
data
for
(
let
i
=
0
;
i
<
this
.
contactNum
;
i
++
)
{
let
item
=
this
.
contact
Data
[
i
]
||
null
let
item
=
this
.
contact
Total
[
i
]
||
null
if
(
item
)
{
item
.
ifChoose
=
true
}
}
this
.
orderTouristList
=
this
.
contactData
.
slice
(
0
,
this
.
contactNum
)
this
.
chooseContact
=
this
.
contactTotal
.
slice
(
0
,
this
.
contactNum
)
}
else
{
uni
.
showToast
({
title
:
res
.
message
,
...
...
@@ -971,40 +979,128 @@ export default {
}
})
},
//---加载优惠券
initCoupon
()
{
let
savedMoneyList
=
[]
this
.
chooseCouponObj
=
''
this
.
ableConpon
=
''
this
.
couponData
=
[]
let
data
=
{
productId
:
this
.
productId
,
//产品id
tickets
:
this
.
buyNum
,
//房间数量
singleMoney
:
this
.
sellingPrice
,
//单价
money
:
parseFloat
((
this
.
buyNum
*
this
.
sellingPrice
).
toFixed
(
2
)),
//订单总价,不算券,和现金红包
merchantId
:
this
.
merchantId
,
//商户Id
openid
:
this
.
openid
}
this
.
$request
(
'wechatUser/myPage/usableCouponList'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
)
{
this
.
couponData
=
res
.
data
let
masterSlaveCouponList
=
res
.
data
.
masterSlaveCouponList
if
(
masterSlaveCouponList
&&
masterSlaveCouponList
.
length
>
0
)
{
masterSlaveCouponList
.
forEach
((
item
)
=>
{
//获取最优券
savedMoneyList
.
push
(
item
.
savedMoney
)
})
let
maxMoney
=
Math
.
max
.
apply
(
null
,
savedMoneyList
)
let
arr
=
masterSlaveCouponList
.
filter
((
item
)
=>
{
//找到最大值的数组
return
item
.
savedMoney
==
maxMoney
})
if
(
arr
.
length
==
1
){
this
.
chooseCouponObj
=
arr
[
0
]
}
else
{
let
index
=
arr
.
findIndex
((
item
)
=>
{
//如果有多个,找到是否有平台券,平台劵优先
return
item
.
createSource
==
1
})
if
(
index
>-
1
){
this
.
chooseCouponObj
=
arr
[
index
]
}
else
{
this
.
chooseCouponObj
=
arr
[
0
]
}
}
this
.
savedMoney
=
this
.
chooseCouponObj
.
savedMoney
}
else
{
if
(
res
.
data
.
unusableCouponList
.
length
>
0
)
{
res
.
data
.
unusableCouponList
.
forEach
((
item
,
i
)
=>
{
//没有可用优惠券,有达到条件可以用的优惠券,先显示条件,达到条件时显示可用优惠券
if
(
item
.
isProduct
==
1
)
{
this
.
ableConpon
=
item
}
})
}
}
}
})
},
//---获取优惠价格
getDiscountPrice
()
{
let
data
=
{
productId
:
this
.
productId
,
//产品ID
merchantId
:
this
.
merchantId
,
//商家ID
companyId
:
this
.
companyId
,
//公司ID
openid
:
uni
.
getStorageSync
(
'openid'
)
||
''
//openid
openid
:
this
.
openid
//openid
}
this
.
$request
(
'scenic/user/productRule/getProductRule'
,
data
).
then
(
res
=>
{})
},
//---子组件券选择之后触发的事件
couponChoose
(
data
)
{
if
(
data
){
this
.
chooseCouponObj
=
data
this
.
savedMoney
=
this
.
chooseCouponObj
.
savedMoney
||
0
}
else
{
this
.
chooseCouponObj
=
''
this
.
savedMoney
=
0
}
},
//---展示券列表
showCoupon
()
{
this
.
$refs
.
orderCoupon
.
showPop
=
true
},
//---额外服务多选框变化
extraChange
(
e
)
{
this
.
chooseService
=
[]
//解决数据修改之后,多选框未选中bug
this
.
serviceList
.
forEach
(
item
=>
{
item
.
ifChoose
=
false
})
let
value
=
e
.
detail
.
value
value
.
forEach
(
item
=>
{
this
.
chooseService
.
push
(
JSON
.
parse
(
item
))
})
//获取选中的多选框为选中状态
this
.
serviceList
.
forEach
(
item
=>
{
this
.
chooseService
.
forEach
(
item2
=>
{
if
(
item
.
id
==
item2
.
id
){
item
.
ifChoose
=
true
}
})
})
},
//---不需要享受耳麦服务
payE
xtraNo
()
{
this
.
show
Pay
ExtraPop
=
false
e
xtraNo
()
{
this
.
showExtraPop
=
false
this
.
placeOrder
()
},
//---需要享受耳麦服务
payExtraYes
()
{
this
.
showPayExtraPop
=
false
this
.
choooseService
=
this
.
loadProductResVoList
extraYes
()
{
this
.
showExtraPop
=
false
this
.
serviceList
.
forEach
(
item
=>
{
item
.
ifChoose
=
true
})
this
.
chooseService
=
this
.
serviceList
this
.
placeOrder
()
},
//---点击去支付
判断是否直接下单
jugeOrder
()
{
if
(
this
.
loadProductResVo
List
.
length
==
0
)
{
//---点击去支付
goPay
()
{
if
(
this
.
service
List
.
length
==
0
)
{
//没有额外服务,直接支付
this
.
placeOrder
()
}
if
(
this
.
loadProductResVo
List
.
length
>
0
)
{
if
(
this
.
service
List
.
length
>
0
)
{
//有额外服务,并且选择了额外服务的,直接支付
if
(
this
.
choo
o
seService
.
length
>
0
)
{
if
(
this
.
chooseService
.
length
>
0
)
{
this
.
placeOrder
()
}
}
if
(
this
.
loadProductResVo
List
.
length
>
0
)
{
if
(
this
.
service
List
.
length
>
0
)
{
//有额外服务,没有选中额外服务的,弹出提示框
if
(
this
.
productIfo
.
tripTemplateFlag
!=
2
)
{
if
(
!
this
.
$commonjs
.
phoneReg
().
test
(
this
.
ticketPhone
))
{
...
...
@@ -1018,7 +1114,7 @@ export default {
}
if
(
this
.
productIfo
.
tripTemplateFlag
==
1
)
{
//实名制
if
(
this
.
orderTouristLis
t
.
length
!=
this
.
buyNum
)
{
if
(
this
.
chooseContac
t
.
length
!=
this
.
buyNum
)
{
uni
.
showToast
({
title
:
'需要添加'
+
this
.
buyNum
+
'位出行人'
,
icon
:
'none'
...
...
@@ -1027,7 +1123,7 @@ export default {
}
}
else
if
(
this
.
productIfo
.
tripTemplateFlag
==
0
)
{
//非实名制
if
(
this
.
orderTouristLis
t
.
length
<
1
)
{
if
(
this
.
chooseContac
t
.
length
<
1
)
{
uni
.
showToast
({
title
:
'需要添加一位出行人'
,
icon
:
'none'
...
...
@@ -1055,11 +1151,11 @@ export default {
return
}
}
if
(
this
.
choo
o
seService
.
length
==
0
&&
this
.
showErmai
)
{
if
(
this
.
chooseService
.
length
==
0
&&
this
.
showErmai
)
{
//没有购买额外服务,并且选择的北站,跳出弹窗
this
.
show
Pay
ExtraPop
=
true
this
.
showExtraPop
=
true
}
if
(
this
.
choo
o
seService
.
length
==
0
&&
!
this
.
showErmai
)
{
if
(
this
.
chooseService
.
length
==
0
&&
!
this
.
showErmai
)
{
//没有购买额外服务,并且选择的南站,直接购买
this
.
placeOrder
()
}
...
...
@@ -1095,7 +1191,7 @@ export default {
}
if
(
this
.
productIfo
.
tripTemplateFlag
==
1
)
{
//实名制
if
(
this
.
orderTouristLis
t
.
length
!=
this
.
buyNum
)
{
if
(
this
.
chooseContac
t
.
length
!=
this
.
buyNum
)
{
uni
.
showToast
({
title
:
'需要添加'
+
this
.
buyNum
+
'位出行人'
,
icon
:
'none'
...
...
@@ -1104,7 +1200,7 @@ export default {
}
}
else
if
(
this
.
productIfo
.
tripTemplateFlag
==
0
)
{
//非实名制
if
(
this
.
orderTouristLis
t
.
length
<
1
)
{
if
(
this
.
chooseContac
t
.
length
<
1
)
{
uni
.
showToast
({
title
:
'需要添加一位出行人'
,
icon
:
'none'
...
...
@@ -1132,102 +1228,116 @@ export default {
return
}
}
this
.
showPaying
=
true
setTimeout
(()
=>
{
this
.
showPaying
=
false
},
6000
)
// this.preOrder()
this
.
preOrder
()
},
//---预下单
preOrder
()
{
//时间戳转化
let
bookStartTime
=
''
if
(
this
.
$commonjs
.
today
()
==
this
.
startDate
.
substr
(
0
,
10
))
{
//如果是当天就取当前时间+10秒
bookStartTime
=
new
Date
().
getTime
()
+
10
*
1000
}
else
{
//不是当天就取开始时间
//手机兼容
let
startDate
=
this
.
startDate
.
replace
(
/-/g
,
'/'
)
bookStartTime
=
new
Date
(
startDate
).
getTime
()
}
//手机兼容
let
endDate
=
this
.
endDate
.
replace
(
/-/g
,
'/'
)
let
bookEndTime
=
new
Date
(
endDate
).
getTime
()
//参数游客信息组装
let
reservationInfoList
=
[]
this
.
orderTouristList
.
forEach
((
item
,
index
)
=>
{
reservationInfoList
.
push
({
let
orderTouristList
=
this
.
contactTotal
.
map
((
item
)
=>
{
return
{
category
:
0
,
name
:
item
.
name
,
identification
Number
:
item
.
credentialNumber
}
)
credential
Number
:
item
.
credentialNumber
}
})
//商品库 spu & 非商品库 sku
tt
.
createOrder
({
skuList
:
[
{
skuId
:
this
.
productIfo
.
distributionProductId
,
// sku 商品Id 必传
skuType
:
1
,
// sku 商品类型 必传 1-商品库商品 2-非商品库商品
quantity
:
this
.
buyNum
,
// 数量 必传
price
:
parseFloat
((
this
.
sellingPrice
*
100
).
toFixed
(
2
)),
// 价格 非商品库 sku 商品必传
goodsInfo
:
{
goodsName
:
this
.
productIfo
.
name
,
// 商品名称
goodsPhoto
:
'http://picture.pangdly.com/company/2022-02/2022-02-10/zip/z001644484223062b28c62cc60b0c65e.jpg'
,
// 商品图片链接
goodsId
:
this
.
productIfo
.
distributionProductId
,
// 商品ID
goodsType
:
1
,
//1-商品库商品2-非商品库商品
GoodsBookInfo
:
{
bookType
:
1
//预约类型:1. 不需要预约 2. 在线预约
}
let
couponList
=
[]
if
(
this
.
chooseCouponObj
)
{
if
(
this
.
chooseCouponObj
.
slaveList
.
length
>
0
){
//有从券取值从券,没有从券取值主劵
couponList
=
[
//券列表
{
couponId
:
this
.
chooseCouponObj
.
slaveCouponId
,
//券id
isMerchant
:
this
.
chooseCouponObj
.
slaveCreateSource
,
//是否是商户的券
myCouponId
:
this
.
chooseCouponObj
.
slaveId
,
//领取人编号
couponType
:
this
.
chooseCouponObj
.
couponType
,
//券类型
couponPrice
:
this
.
chooseCouponObj
.
savedMoney
,
//券价格
}
// extraInfo: {
// ticketName: '成人票', // 票种,非商品库门票类 sku 必传
// date: '2023-05-16', // 日期,非商品库门票类 sku 必传
// },
}
],
bookInfo
:
{
itemBookInfoList
:
[
]
}
else
{
couponList
=
[
{
poiId
:
this
.
productIfo
.
poiId
,
// 预约门店的 poiId,必填
shopName
:
this
.
productIfo
.
merchantName
,
// 预约店铺名称,必填
outShopId
:
this
.
productIfo
.
merchantId
,
// 预约门店的外部店铺id,必填
goodsId
:
this
.
productIfo
.
distributionProductId
,
// 商品id,必填
bookStartTime
,
// 预定开始时间(ms),13位毫秒时间戳,必填
bookEndTime
,
//预定结束时间(ms),13位毫秒时间戳,必填
reservationInfoList
// 留资信息 非必填
couponId
:
this
.
chooseCouponObj
.
couponId
,
//券id
isMerchant
:
this
.
chooseCouponObj
.
createSource
,
//是否是商户的券
myCouponId
:
this
.
chooseCouponObj
.
id
,
//领取人编号
couponType
:
this
.
chooseCouponObj
.
couponType
,
//券类型
couponPrice
:
this
.
chooseCouponObj
.
savedMoney
,
//券价格
}
]
},
payment
:
{
totalAmount
:
parseFloat
((
this
.
buyNum
*
this
.
sellingPrice
*
100
).
toFixed
(
2
))
// 订单总价 必填
},
contactInfo
:
{
//联系人
phoneNumber
:
this
.
ticketPhone
// 手机号 非必传
},
callbackData
:
{
productAreaCode
:
this
.
areaObj
.
areaCode
||
this
.
defaultAreaCode
//站点信息
},
success
:
res
=>
{
const
{
orderId
,
outOrderNo
}
=
res
uni
.
navigateTo
({
url
:
'/pages/salePay/paySuccess/paySuccess?orderId='
+
outOrderNo
})
},
fail
:
res
=>
{
const
{
orderId
,
outOrderNo
,
errNo
,
errMsg
,
errLogId
}
=
res
if
(
errLogId
)
{
console
.
log
(
'预下单失败'
,
errNo
,
errMsg
,
errLogId
)
}
}
//额外服务不为空,联票购买不为空,带有儿童票,组合购买不为空,单品购买为空
if
(
this
.
chooseService
.
length
>
0
)
{
this
.
orderProductList
=
this
.
chooseService
.
map
((
item
)
=>
{
return
{
distributionPrice
:
item
.
sellingPrice
,
//临时用
productId
:
item
.
id
,
//产品Id
buyNum
:
this
.
buyNum
,
//购买数量
subOrderType
:
0
,
//产品类型,网络
unitPrice
:
item
.
sellingPrice
,
//产品单价
merchantId
:
item
.
merchantId
,
//商户id
orderTouristList
,
//游客信息
playDate
:
this
.
startDate
.
substr
(
0
,
10
),
//开始日期
endPlayDate
:
this
.
endDate
.
substr
(
0
,
10
),
//结束日期
isMaster
:
1
,
//是否主产品 1 否, 0 是
startPlayTime
:
this
.
startPlayTime
,
//开始时间
endPlayTime
:
this
.
endPlayTime
,
//结束时间
}
if
(
errMsg
||
errNo
)
{
console
.
log
(
'支付失败'
,
errNo
,
errMsg
,
orderId
,
outOrderNo
)
})
}
else
{
this
.
orderProductList
=
[]
}
let
data
=
{
companyId
:
this
.
companyId
,
//公司Id
buyMethod
:
1
,
// 单品购买,2套票、联票购买,3组合购买
userId
:
this
.
openid
,
//用户id
ticketPhone
:
this
.
ticketPhone
,
//联系电话
cash
:
0
,
//现金红包
orderMoney
:
this
.
sellTotal
,
//订单总价 = 订单原价 - 优惠券价格 - 现金抵扣价格
orderType
:
1
,
//订单类型,景区
orderSource
:
this
.
orderSource
||
1
,
//订单来源 1公众号平台、2公众号组合页面1、3公众号组合页面2、4胖丁伙伴app、5第三方自助机、6第三方票房窗口
orderProductList
:
this
.
orderProductList
,
//额外服务不为空,联票购买不为空,带有儿童票,组合购买不为空,单品购买为空
orderProductVo
:
//产品信息列表
{
bookTime
:
this
.
productIfo
.
bookTime
,
//最晚预定时间
earlyBookTime
:
this
.
productIfo
.
earlyBookTime
,
//最早预定时间
extendContent
:
'{"openid":'
+
'"'
+
this
.
openid
+
'"'
+
','
+
'"zr":'
+
'"'
+
this
.
thirdOpenid
+
'"'
+
'}'
,
productId
:
this
.
productId
,
//产品Id
buyNum
:
this
.
buyNum
,
//购买数量
subOrderType
:
0
,
//产品类型,网络
cruisePlanId
:
this
.
cruisePlanId
,
//班次id
unitPrice
:
this
.
sellingPrice
,
//产品单价
distributionPrice
:
this
.
sellingPrice
,
//临时用
merchantId
:
this
.
merchantId
,
//商户id
orderTouristList
,
//游客信息
playDate
:
this
.
startDate
.
substr
(
0
,
10
),
//开始日期
endPlayDate
:
this
.
endDate
.
substr
(
0
,
10
),
//结束日期
isMaster
:
0
,
//是否主产品 1 否, 0 是
startPlayTime
:
this
.
startPlayTime
,
//开始时间
endPlayTime
:
this
.
endPlayTime
,
//结束时间
productAreaCode
:
this
.
areaObj
.
areaCode
,
//选择的站点编码
couponList
,
//券列表
}
}
uni
.
showLoading
({
title
:
'加载中'
,
mask
:
true
})
this
.
$request
(
'orderc/order/createOrder'
,
data
).
then
((
res
)
=>
{
if
(
res
.
code
==
'00'
)
{
if
(
res
.
data
.
id
)
{
uni
.
navigateTo
({
url
:
'/pages/payment/orderPayment/orderPayment?orderId='
+
res
.
data
.
id
})
}
else
{
uni
.
showToast
({
title
:
'下单失败'
,
icon
:
'none'
})
}
}
else
{
uni
.
showToast
({
title
:
errMsg
,
icon
:
'none'
,
duration
:
3000
title
:
res
.
message
,
icon
:
'none'
})
}
})
...
...
@@ -1241,49 +1351,30 @@ export default {
height
:
160rpx
;
background
:
linear-gradient
(
to
bottom
,
#2984ef
,
#d8eaf6
);
}
.orderBox
{
min-height
:
100%
;
background
:
#f5f5f5
;
}
.middle
{
position
:
relative
;
top
:
-100rpx
;
padding
:
0
20rpx
;
padding-bottom
:
20rpx
;
}
/*中间第一部分*/
.middle1
{
padding
:
32rpx
20rpx
0
20rpx
;
padding
:
30rpx
20rpx
;
background
:
#ffffff
;
border-radius
:
10rpx
;
}
.middle1
>
view
:not
(
:last-child
)
{
border-bottom
:
1px
solid
#e5e5e5
;
}
.middle1Product
{
padding-bottom
:
20rpx
;
.title-text
{
font-size
:
32rpx
;
font-weight
:
bold
;
}
/*中间上面部分*/
.merchantName
{
display
:
flex
;
align-items
:
center
;
}
.merchantName
text
:first-child
{
font-size
:
36rpx
;
font-weight
:
bolder
;
}
.merchantName
text
:nth-child
(
2
)
{
color
:
#666666
;
margin-left
:
20rpx
;
}
.buyKnow
{
margin-top
:
20rpx
;
background
:
#fef0e6
;
...
...
@@ -1294,97 +1385,69 @@ export default {
padding-left
:
10rpx
;
align-items
:
center
;
border-radius
:
5rpx
;
color
:
$red
;
}
.buyKnow
view
:first-child
{
color
:
#f9690e
;
}
.buyKnow
view
:nth-child
(
2
)
{
color
:
#6d4d00
;
display
:
flex
;
}
.middle-place
{
height
:
100rpx
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
}
.middle-place
view
:nth-child
(
2
)
{
flex
:
1
;
margin-left
:
20rpx
;
color
:
#f9690
e
;
color
:
$them
e
;
font-size
:
28rpx
;
font-weight
:
bolder
;
}
.middle1Date
{
.middle-Date
{
margin-top
:
40rpx
;
}
.middle-Datelist
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding
:
30rpx
0
;
}
.middle1Date
>
text
:first-child
{
flex-shrink
:
0
;
margin-top
:
30rpx
;
}
.date-content
{
flex
:
1
;
margin-left
:
20rpx
;
overflow-x
:
scroll
;
white-space
:
nowrap
;
height
:
90rpx
;
}
.
date-content
:
:-
webkit-scrollbar
{
display
:
none
;
}
.date-list
{
width
:
130rpx
;
height
:
90rpx
;
width
:
140rpx
;
text-align
:
center
;
border
:
1px
solid
#cccccc
;
margin-right
:
8rpx
;
margin-right
:
12rpx
;
border-radius
:
10rpx
;
position
:
relative
;
display
:
inline-block
;
background
:
#f2f2f2
;
padding-bottom
:
8rpx
;
}
.date-list.on
{
border
:
1px
solid
var
(
--
main-color
);
}
.no-date
{
color
:
#ff0000
;
flex
:
1
;
margin-left
:
30rpx
;
font-weight
:
bolder
;
border
:
1px
solid
$theme
;
background
:
#DAE6F6
;
}
.date-time
{
font-size
:
24rpx
;
margin-top
:
8rpx
;
.date-list
>
view
{
margin-top
:
6rpx
;
}
.date-price
{
margin-top
:
8
rpx
;
color
:
#f9690e
;
font-size
:
32
rpx
;
color
:
$red
;
}
.date-price
text
{
.no-date
{
color
:
$red
;
flex
:
1
;
margin-left
:
30rpx
;
font-weight
:
bolder
;
font-size
:
30rpx
;
}
.date-price
text
:first-child
{
font-weight
:
400
;
font-size
:
24rpx
;
}
.date-icon
{
position
:
absolute
;
right
:
-1px
;
...
...
@@ -1392,141 +1455,162 @@ export default {
display
:
inline-block
;
width
:
30rpx
;
height
:
28rpx
;
background
:
var
(
--
main-color
)
;
background
:
$theme
;
border-radius
:
10rpx
0
;
}
.dateMore
{
flex-shrink
:
0
;
width
:
100rpx
;
height
:
90rpx
;
border
:
1px
solid
var
(
--
main-color
);
border-radius
:
10rpx
;
padding
:
20rpx
0
;
width
:
120rpx
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.date-more-content
{
margin
:
0
4rpx
;
color
:
var
(
--
main-color
);
margin-right
:
8rpx
;
}
.middle1Time
{
.middle-time
{
margin-top
:
40rpx
;
}
.middle-timelist
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding
:
30rpx
0
;
}
.middle1Time
>
text
:first-child
{
flex-shrink
:
0
;
margin-top
:
30rpx
;
}
.time-content
{
flex
:
1
;
margin-left
:
20rpx
;
overflow-x
:
scroll
;
white-space
:
nowrap
;
height
:
90rpx
;
}
.
time-content
:
:-
webkit-scrollbar
{
display
:
none
;
}
.time-list
{
width
:
18
0rpx
;
width
:
20
0rpx
;
height
:
90rpx
;
line-height
:
30rpx
;
text-align
:
center
;
margin-right
:
8rpx
;
border-radius
:
15rpx
;
display
:
inline-block
;
background
:
rgb
(
242
,
242
,
242
);
background
:
#f2f2f2
;
position
:
relative
;
padding-bottom
:
8rpx
;
}
.time-list
view
{
margin-top
:
10rpx
;
}
.time-list.on
{
background
:
none
;
color
:
var
(
--
main-color
);
border
:
1px
solid
var
(
--
main-color
);
box-sizing
:
border-box
;
border
:
1px
solid
$theme
;
background
:
#DAE6F6
;
}
.timeMore
{
flex-shrink
:
0
;
width
:
100rpx
;
height
:
90rpx
;
border
:
1px
solid
var
(
--
main-color
);
border-radius
:
10rpx
;
width
:
120rpx
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.time-more-content
{
margin
:
0
4rpx
;
color
:
var
(
--
main-color
);
margin-right
:
8rpx
;
}
.no-time
{
color
:
#ff0000
;
color
:
$red
;
flex
:
1
;
margin-left
:
30rpx
;
font-weight
:
bolder
;
}
.middle1Number
{
.middle-divider
{
height
:
2rpx
;
background
:
$divider
;
margin
:
40rpx
0
;
}
.middle-Number
{
display
:
flex
;
justify-content
:
space-between
;
padding
:
36rpx
0
;
align-items
:
center
;
}
/*中间第二部分*/
.middle2
{
padding
:
40rpx
20rpx
;
background
:
#ffffff
;
border-radius
:
10rpx
;
margin-top
:
20rpx
;
.number-minus
{
width
:
52rpx
;
height
:
52rpx
;
background
:
#ccc
;
border-radius
:
50%
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.middle2Visitor
{
padding-bottom
:
40rpx
;
border-bottom
:
1px
solid
#e5e5e5
;
.number-input
{
padding
:
0
20rpx
;
width
:
100rpx
;
text-align
:
center
;
font-size
:
40rpx
;
}
.visitorTitle
{
position
:
relative
;
.number-plus
{
width
:
52rpx
;
height
:
52rpx
;
background
:
$theme
;
border-radius
:
50%
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.visitorTitle
>
text
:first-child
{
font-size
:
32rpx
;
font-weight
:
bolder
;
.middle-coupon
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding
:
30rpx
0
;
}
.middle-coupon
view
:first-child
{
width
:
36rpx
;
height
:
36rpx
;
background
:
$theme
;
color
:
#FFFFFF
;
text-align
:
center
;
line-height
:
32rpx
;
border-radius
:
4rpx
;
}
.middle-coupon
view
:nth-child
(
2
)
{
flex
:
1
;
margin-left
:
10rpx
;
}
.middle-coupon
view
:nth-child
(
3
)
{
display
:
flex
;
color
:
$theme
;
font-weight
:
bold
;
}
/*中间下面部分*/
.middle-visitor
{
padding-bottom
:
40rpx
;
border-bottom
:
1px
solid
$divider
;
}
.visitorTitle
>
text
:nth-child
(
2
)
{
font-size
:
24rpx
;
color
:
#666666
;
margin-left
:
10rpx
;
}
.title-bold
{
color
:
#f9690e
;
font-weight
:
bolder
;
font-size
:
28rpx
;
}
.visitorBtn
{
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
height
:
88rpx
;
background
:
#ECF3FE
;
margin-top
:
40rpx
;
color
:
$theme
;
font-size
:
32rpx
;
border-radius
:
20rpx
;
}
.visitorPlus
{
margin-top
:
3
0rpx
;
margin-top
:
2
0rpx
;
display
:
flex
;
flex-wrap
:
wrap
;
}
.plus-list
{
height
:
70rpx
;
display
:
flex
;
...
...
@@ -1536,44 +1620,35 @@ export default {
padding
:
5rpx
0
;
width
:
145rpx
;
text-align
:
center
;
color
:
#999999
;
border
:
1px
solid
#999999
;
margin-right
:
15rpx
;
background
:
#f2f2f2
;
border-radius
:
5rpx
;
position
:
relative
;
box-sizing
:
border-box
;
margin-top
:
20rpx
;
margin
:
20rpx
15rpx
0
0
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
}
.plus-list-last
{
color
:
var
(
--
main-color
)
;
color
:
$theme
;
background
:
#efefef
;
width
:
1
6
0rpx
;
width
:
1
7
0rpx
;
border
:
none
;
}
.plus-list.on
{
border
:
1px
solid
var
(
--
main-color
)
;
color
:
var
(
--
main-color
)
;
border
:
1px
solid
$theme
;
background
:
#DAE6F6
;
}
.visitorEdit
{
margin-top
:
40rpx
;
}
.visitorEdit
>
view
:not
(
first-child
)
{
margin-top
:
25rpx
;
}
.edit-list
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
}
.edit-list
view
:nth-child
(
2
)
{
display
:
inline-block
;
width
:
120rpx
;
...
...
@@ -1582,29 +1657,17 @@ export default {
overflow
:
hidden
;
margin-left
:
30rpx
;
}
.edit-list
view
:nth-child
(
3
)
{
flex
:
1
;
}
.phoneTitle
{
font-size
:
28rpx
;
font-weight
:
bolder
;
.middle-phone
{
margin-top
:
30rpx
;
}
.phoneNumber
{
margin-top
:
30rpx
;
border-bottom
:
1px
solid
#e6e6e6
;
display
:
flex
;
align-items
:
center
;
padding-bottom
:
10rpx
;
}
.phoneNumber
input
{
.middle-phone
input
{
flex
:
1
;
}
/*押金部分*/
.productDeposit
{
padding
:
40rpx
15rpx
;
...
...
@@ -1613,88 +1676,29 @@ export default {
margin-top
:
20rpx
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
}
/*额外服务部分*/
.extraService
{
padding
:
30rpx
20rpx
;
background
:
#ffffff
;
padding
:
20rpx
;
background
:
#DAE6F6
;
margin-top
:
30rpx
;
border-radius
:
10rpx
;
margin-top
:
20rpx
;
}
.extraService
view
{
.extraService
label
{
width
:
100%
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
line-height
:
30rpx
;
font-weight
:
bold
;
color
:
#f45803
;
}
.extraService
view
:not
(
:first-child
)
{
margin-top
:
30rpx
;
}
.extraService
view
label
{
font-weight
:
bolder
;
color
:
#f45803
;
flex-shrink
:
0
;
}
.extraPop
{
position
:
fixed
;
top
:
0
;
left
:
0
;
right
:
0
;
bottom
:
0
;
background
:
rgba
(
0
,
0
,
0
,
0
.3
);
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
z-index
:
99
;
}
.extraPop
view
{
width
:
85%
;
background
:
#ffffff
;
border-radius
:
10rpx
;
padding
:
40rpx
30rpx
;
}
.extraPop
view
view
:first-child
{
text-align
:
center
;
font-size
:
28rpx
;
font-weight
:
bolder
;
}
.extraPop
view
view
:nth-child
(
2
)
{
margin-top
:
20rpx
;
color
:
#666666
;
line-height
:
30rpx
;
}
.extraPop
view
view
:nth-child
(
3
)
{
margin-top
:
40rpx
;
text-align
:
center
;
}
.extraPop
view
view
:nth-child
(
3
)
text
{
display
:
inline-block
;
width
:
145rpx
;
height
:
60rpx
;
.extra-wrap
{
text-align
:
center
;
line-height
:
60rpx
;
border-radius
:
10rpx
;
}
.extraPop
view
view
:nth-child
(
3
)
text
:nth-child
(
1
)
{
border
:
1px
solid
#e8e8e8
;
color
:
#666666
;
margin-right
:
40rpx
;
}
.extraPop
view
view
:nth-child
(
3
)
text
:nth-child
(
2
)
{
background
:
linear-gradient
(
#ff5454
,
#ff8538
);
color
:
#ffffff
;
padding-top
:
100rpx
;
height
:
65vh
;
}
/*底部部分*/
.bottom
{
height
:
100rpx
;
...
...
@@ -1711,44 +1715,39 @@ export default {
box-sizing
:
border-box
;
box-shadow
:
0
0
3rpx
#666666
;
}
.bottom-left
>
text
:first-child
{
font-size
:
28rpx
;
text-decoration
:
line-through
;
margin-right
:
16rpx
;
}
.bottom-left
text
:nth-child
(
2
)
{
font-size
:
40rpx
;
font-weight
:
bolder
;
color
:
#f45803
;
}
.bottom-left
text
:nth-child
(
2
)
text
{
font-size
:
32rpx
;
}
.bottom-right
{
display
:
flex
;
align-items
:
center
;
}
.bottom-detail
{
display
:
flex
;
}
.btn
{
.bottom-btn
{
position
:
relative
;
width
:
2
0
0rpx
;
width
:
2
4
0rpx
;
height
:
80rpx
;
margin-left
:
20rpx
;
line-height
:
80rpx
;
font-size
:
32rpx
;
font-weight
:
bolder
;
border-radius
:
16rpx
;
border-radius
:
24rpx
;
background
:
$red
;
text-align
:
center
;
}
.btn
text
{
.bottom-btn
text
{
position
:
absolute
;
width
:
100%
;
height
:
100%
;
...
...
@@ -1757,20 +1756,6 @@ export default {
color
:
#ffffff
;
top
:
0
;
}
.btn-paying
{
z-index
:
1
;
background
:
#c0c0c0
;
border-radius
:
16rpx
;
}
.btn
.mask
{
position
:
fixed
;
top
:
0
;
left
:
0
;
right
:
0
;
bottom
:
0
;
background
:
rgba
(
0
,
0
,
0
,
0
.1
);
}
.sortPoptext
{
font-size
:
30rpx
;
font-weight
:
bolder
;
...
...
uni.scss
View file @
3c2a558a
...
...
@@ -12,74 +12,28 @@
*
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
*/
/*分割线颜色*/
$divider
:
#DBDBDB
;
/*
1.页面背景颜色#f7f7f7
2.分隔线颜色#DBDBDB
3.正常字体颜色#333333
4.灰色字体颜色#666666或者#999999
5.主题颜色#3688FF
6.正常字体大小28rpx,偏小一点的24rpx
8.页面最外层与里面的第一层为padding:0 12px;
9.css单位为rpx
*/
/*主题颜色*/
$blue
:
#3688FF
;
$theme
:
#3688FF
;
/*红色*/
$red
:
#FC6703
;
/*灰色*/
$grey
:
#999
;
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary
:
#007aff
;
$uni-color-success
:
#4cd964
;
$uni-color-warning
:
#f0ad4e
;
$uni-color-error
:
#dd524d
;
/* 文字基本颜色 */
$uni-text-color
:
#333
;
//基本色
$uni-text-color-inverse
:
#fff
;
//反色
$text-grey
:
#999
;
//辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder
:
#808080
;
$uni-text-color-disable
:
#c0c0c0
;
/* 背景颜色 */
$uni-bg-color
:
#ffffff
;
$uni-bg-color-grey
:
#f8f8f8
;
$uni-bg-color-hover
:
#f1f1f1
;
//点击状态颜色
$uni-bg-color-mask
:
rgba
(
0
,
0
,
0
,
0
.4
);
//遮罩颜色
/* 边框颜色 */
$border-color
:
#c8c7cc
;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm
:
24rpx
;
$uni-font-size-base
:
28rpx
;
$uni-font-size-lg
:
32rpx
;
/* 图片尺寸 */
$uni-img-size-sm
:
40rpx
;
$uni-img-size-base
:
52rpx
;
$uni-img-size-lg
:
80rpx
;
/* Border Radius */
$uni-border-radius-sm
:
4rpx
;
$uni-border-radius-base
:
6rpx
;
$uni-border-radius-lg
:
12rpx
;
$uni-border-radius-circle
:
50%
;
/* 水平间距 */
$uni-spacing-row-sm
:
10px
;
$uni-spacing-row-base
:
20rpx
;
$uni-spacing-row-lg
:
30rpx
;
/* 垂直间距 */
$uni-spacing-col-sm
:
8rpx
;
$uni-spacing-col-base
:
16rpx
;
$uni-spacing-col-lg
:
24rpx
;
// 分割线颜色
$divider
:
#f3f3f3
;
/* 透明度 */
$uni-opacity-disabled
:
0
.3
;
// 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title
:
#2C405A
;
// 文章标题颜色
$uni-font-size-title
:
40rpx
;
$uni-color-subtitle
:
#555555
;
// 二级标题颜色
$uni-font-size-subtitle
:
36rpx
;
$uni-color-paragraph
:
#3F536E
;
// 文章段落颜色
$uni-font-size-paragraph
:
30rpx
;
\ No newline at end of file
uview-ui/components/u-icon/u-icon.vue
View file @
3c2a558a
...
...
@@ -35,23 +35,23 @@
</
template
>
<
script
>
// #ifdef APP-NVUE
// nvue通过weex的dom模块引入字体,相关文档地址如下:
// https://weex.apache.org/zh/docs/modules/dom.html#addrule
const
fontUrl
=
'https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf'
const
domModule
=
weex
.
requireModule
(
'dom'
)
domModule
.
addRule
(
'fontFace'
,
{
'fontFamily'
:
"uicon-iconfont"
,
'src'
:
`url('
${
fontUrl
}
')`
})
// #endif
// 引入图标名称,已经对应的unicode
import
icons
from
'./icons'
// #ifdef APP-NVUE
// nvue通过weex的dom模块引入字体,相关文档地址如下:
// https://weex.apache.org/zh/docs/modules/dom.html#addrule
const
fontUrl
=
'https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf'
const
domModule
=
weex
.
requireModule
(
'dom'
)
domModule
.
addRule
(
'fontFace'
,
{
'fontFamily'
:
'uicon-iconfont'
,
'src'
:
`url('
${
fontUrl
}
')`
})
// #endif
// 引入图标名称,已经对应的unicode
import
icons
from
'./icons'
import
props
from
'./props.js'
;;
import
props
from
'./props.js'
/**
/**
* icon 图标
* @description 基于字体的图标集,包含了大多数常见场景的图标。
* @tutorial https://www.uviewui.com/components/icon.html
...
...
@@ -77,72 +77,72 @@
* @event {Function} touchstart 事件触摸时触发
* @example <u-icon name="photo" color="#2979ff" size="28"></u-icon>
*/
export
default
{
name
:
'u-icon'
,
data
()
{
return
{
}
},
mixins
:
[
uni
.
$u
.
mpMixin
,
uni
.
$u
.
mixin
,
props
],
computed
:
{
uClasses
()
{
let
classes
=
[]
classes
.
push
(
this
.
customPrefix
+
'-'
+
this
.
name
)
// // uView的自定义图标类名为u-iconfont
// if (this.customPrefix == 'uicon') {
// classes.push('u-iconfont')
// } else {
// classes.push(this.customPrefix)
// }
// 主题色,通过类配置
if
(
this
.
color
&&
uni
.
$u
.
config
.
type
.
includes
(
this
.
color
))
classes
.
push
(
'u-icon__icon--'
+
this
.
color
)
// 阿里,头条,百度小程序通过数组绑定类名时,无法直接使用[a, b, c]的形式,否则无法识别
// 故需将其拆成一个字符串的形式,通过空格隔开各个类名
//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
classes
=
classes
.
join
(
' '
)
//#endif
return
classes
},
iconStyle
()
{
let
style
=
{}
style
=
{
fontSize
:
uni
.
$u
.
addUnit
(
this
.
size
),
lineHeight
:
uni
.
$u
.
addUnit
(
this
.
size
),
fontWeight
:
this
.
bold
?
'bold'
:
'normal'
,
// 某些特殊情况需要设置一个到顶部的距离,才能更好的垂直居中
top
:
uni
.
$u
.
addUnit
(
this
.
top
)
}
// 非主题色值时,才当作颜色值
if
(
this
.
color
&&
!
uni
.
$u
.
config
.
type
.
includes
(
this
.
color
))
style
.
color
=
this
.
color
return
style
},
// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
isImg
()
{
return
this
.
name
.
indexOf
(
'/'
)
!==
-
1
},
imgStyle
()
{
let
style
=
{}
// 如果设置width和height属性,则优先使用,否则使用size属性
style
.
width
=
this
.
width
?
uni
.
$u
.
addUnit
(
this
.
width
)
:
uni
.
$u
.
addUnit
(
this
.
size
)
style
.
height
=
this
.
height
?
uni
.
$u
.
addUnit
(
this
.
height
)
:
uni
.
$u
.
addUnit
(
this
.
size
)
return
style
},
// 通过图标名,查找对应的图标
icon
()
{
// 如果内置的图标中找不到对应的图标,就直接返回name值,因为用户可能传入的是unicode代码
return
icons
[
'uicon-'
+
this
.
name
]
||
this
.
name
}
},
methods
:
{
clickHandler
(
e
)
{
this
.
$emit
(
'click'
,
this
.
index
)
// 是否阻止事件冒泡
this
.
stop
&&
this
.
preventEvent
(
e
)
}
}
}
export
default
{
name
:
'u-icon'
,
data
()
{
return
{
}
},
mixins
:
[
uni
.
$u
.
mpMixin
,
uni
.
$u
.
mixin
,
props
],
computed
:
{
uClasses
()
{
let
classes
=
[]
classes
.
push
(
this
.
customPrefix
+
'-'
+
this
.
name
)
// // uView的自定义图标类名为u-iconfont
// if (this.customPrefix == 'uicon') {
// classes.push('u-iconfont')
// } else {
// classes.push(this.customPrefix)
// }
// 主题色,通过类配置
if
(
this
.
color
&&
uni
.
$u
.
config
.
type
.
includes
(
this
.
color
))
classes
.
push
(
'u-icon__icon--'
+
this
.
color
)
// 阿里,头条,百度小程序通过数组绑定类名时,无法直接使用[a, b, c]的形式,否则无法识别
// 故需将其拆成一个字符串的形式,通过空格隔开各个类名
//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
classes
=
classes
.
join
(
' '
)
//#endif
return
classes
},
iconStyle
()
{
let
style
=
{}
style
=
{
fontSize
:
uni
.
$u
.
addUnit
(
this
.
size
),
lineHeight
:
uni
.
$u
.
addUnit
(
this
.
size
),
fontWeight
:
this
.
bold
?
'bold'
:
'normal'
,
// 某些特殊情况需要设置一个到顶部的距离,才能更好的垂直居中
top
:
uni
.
$u
.
addUnit
(
this
.
top
)
}
// 非主题色值时,才当作颜色值
if
(
this
.
color
&&
!
uni
.
$u
.
config
.
type
.
includes
(
this
.
color
))
style
.
color
=
this
.
color
return
style
},
// 判断传入的name属性,是否图片路径,只要带有"/"均认为是图片形式
isImg
()
{
return
this
.
name
.
indexOf
(
'/'
)
!==
-
1
},
imgStyle
()
{
let
style
=
{}
// 如果设置width和height属性,则优先使用,否则使用size属性
style
.
width
=
this
.
width
?
uni
.
$u
.
addUnit
(
this
.
width
)
:
uni
.
$u
.
addUnit
(
this
.
size
)
style
.
height
=
this
.
height
?
uni
.
$u
.
addUnit
(
this
.
height
)
:
uni
.
$u
.
addUnit
(
this
.
size
)
return
style
},
// 通过图标名,查找对应的图标
icon
()
{
// 如果内置的图标中找不到对应的图标,就直接返回name值,因为用户可能传入的是unicode代码
return
icons
[
'uicon-'
+
this
.
name
]
||
this
.
name
}
},
methods
:
{
clickHandler
(
e
)
{
this
.
$emit
(
'click'
,
this
.
index
)
// 是否阻止事件冒泡
this
.
stop
&&
this
.
preventEvent
(
e
)
}
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -162,7 +162,6 @@
font-family
:
'uicon-iconfont'
;
src
:
url('https://at.alicdn.com/t/font_2225171_8kdcwk4po24.ttf')
format
(
'truetype'
);
}
/* #endif */
.u-icon
{
...
...
uview-ui/components/u-popup/u-popup.vue
View file @
3c2a558a
...
...
@@ -34,7 +34,7 @@
<u-icon
name=
"close"
color=
"#909399"
size=
"
18
"
size=
"
36
"
bold
></u-icon>
</view>
...
...
@@ -45,9 +45,9 @@
</
template
>
<
script
>
import
props
from
'./props.js'
;
import
props
from
'./props.js'
/**
/**
* popup 弹窗
* @description 弹出层容器,用于展示弹窗、信息提示等内容,支持上、下、左、右和中部弹出。组件只提供容器,内部内容由用户自定义
* @tutorial https://www.uviewui.com/components/popup.html
...
...
@@ -71,158 +71,158 @@
* @event {Function} close 弹出层收起
* @example <u-popup v-model="show"><text>出淤泥而不染,濯清涟而不妖</text></u-popup>
*/
export
default
{
name
:
'u-popup'
,
mixins
:
[
uni
.
$u
.
mpMixin
,
uni
.
$u
.
mixin
,
props
],
data
()
{
return
{
overlayDuration
:
this
.
duration
+
50
}
},
watch
:
{
show
(
newValue
,
oldValue
)
{
if
(
newValue
===
true
)
{
// #ifdef MP-WEIXIN
const
children
=
this
.
$children
this
.
retryComputedComponentRect
(
children
)
// #endif
}
}
},
computed
:
{
transitionStyle
()
{
const
style
=
{
zIndex
:
this
.
zIndex
,
position
:
'fixed'
,
display
:
'flex'
,
}
style
[
this
.
mode
]
=
0
if
(
this
.
mode
===
'left'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
bottom
:
0
,
top
:
0
,
})
}
else
if
(
this
.
mode
===
'right'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
bottom
:
0
,
top
:
0
,
})
}
else
if
(
this
.
mode
===
'top'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
left
:
0
,
right
:
0
})
}
else
if
(
this
.
mode
===
'bottom'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
left
:
0
,
right
:
0
,
})
}
else
if
(
this
.
mode
===
'center'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
alignItems
:
'center'
,
'justify-content'
:
'center'
,
top
:
0
,
left
:
0
,
right
:
0
,
bottom
:
0
})
}
},
contentStyle
()
{
const
style
=
{}
// 通过设备信息的safeAreaInsets值来判断是否需要预留顶部状态栏和底部安全局的位置
// 不使用css方案,是因为nvue不支持css的iPhoneX安全区查询属性
const
{
safeAreaInsets
}
=
uni
.
$u
.
sys
()
if
(
this
.
mode
!==
'center'
)
{
style
.
flex
=
1
}
// 背景色,一般用于设置为transparent,去除默认的白色背景
if
(
this
.
bgColor
)
{
style
.
backgroundColor
=
this
.
bgColor
}
if
(
this
.
round
)
{
const
value
=
uni
.
$u
.
addUnit
(
this
.
round
)
if
(
this
.
mode
===
'top'
)
{
style
.
borderBottomLeftRadius
=
value
style
.
borderBottomRightRadius
=
value
}
else
if
(
this
.
mode
===
'bottom'
)
{
style
.
borderTopLeftRadius
=
value
style
.
borderTopRightRadius
=
value
}
else
if
(
this
.
mode
===
'center'
)
{
style
.
borderRadius
=
value
}
}
return
uni
.
$u
.
deepMerge
(
style
,
uni
.
$u
.
addStyle
(
this
.
customStyle
))
},
position
()
{
if
(
this
.
mode
===
'center'
)
{
return
this
.
zoom
?
'fade-zoom'
:
'fade'
}
if
(
this
.
mode
===
'left'
)
{
return
'slide-left'
}
if
(
this
.
mode
===
'right'
)
{
return
'slide-right'
}
if
(
this
.
mode
===
'bottom'
)
{
return
'slide-up'
}
if
(
this
.
mode
===
'top'
)
{
return
'slide-down'
}
},
},
methods
:
{
// 点击遮罩
overlayClick
()
{
if
(
this
.
closeOnClickOverlay
)
{
this
.
$emit
(
'close'
)
}
},
close
(
e
)
{
this
.
$emit
(
'close'
)
},
afterEnter
()
{
this
.
$emit
(
'open'
)
},
clickHandler
()
{
// 由于中部弹出时,其u-transition占据了整个页面相当于遮罩,此时需要发出遮罩点击事件,是否无法通过点击遮罩关闭弹窗
if
(
this
.
mode
===
'center'
)
{
this
.
overlayClick
()
}
this
.
$emit
(
'click'
)
},
// #ifdef MP-WEIXIN
retryComputedComponentRect
(
children
)
{
// 组件内部需要计算节点的组件
const
names
=
[
'u-calendar-month'
,
'u-album'
,
'u-collapse-item'
,
'u-dropdown'
,
'u-index-item'
,
'u-index-list'
,
'u-line-progress'
,
'u-list-item'
,
'u-rate'
,
'u-read-more'
,
'u-row'
,
'u-row-notice'
,
'u-scroll-list'
,
'u-skeleton'
,
'u-slider'
,
'u-steps-item'
,
'u-sticky'
,
'u-subsection'
,
'u-swipe-action-item'
,
'u-tabbar'
,
'u-tabs'
,
'u-tooltip'
]
// 历遍所有的子组件节点
for
(
let
i
=
0
;
i
<
children
.
length
;
i
++
)
{
const
child
=
children
[
i
]
// 拿到子组件的子组件
const
grandChild
=
child
.
$children
// 判断如果在需要重新初始化的组件数组中名中,并且存在init方法的话,则执行
if
(
names
.
includes
(
child
.
$options
.
name
)
&&
typeof
child
?.
init
===
'function'
)
{
// 需要进行一定的延时,因为初始化页面需要时间
uni
.
$u
.
sleep
(
50
).
then
(()
=>
{
child
.
init
()
})
}
// 如果子组件还有孙组件,进行递归历遍
if
(
grandChild
.
length
)
{
this
.
retryComputedComponentRect
(
grandChild
)
}
}
}
// #endif
}
}
export
default
{
name
:
'u-popup'
,
mixins
:
[
uni
.
$u
.
mpMixin
,
uni
.
$u
.
mixin
,
props
],
data
()
{
return
{
overlayDuration
:
this
.
duration
+
50
}
},
watch
:
{
show
(
newValue
,
oldValue
)
{
if
(
newValue
===
true
)
{
// #ifdef MP-WEIXIN
const
children
=
this
.
$children
this
.
retryComputedComponentRect
(
children
)
// #endif
}
}
},
computed
:
{
transitionStyle
()
{
const
style
=
{
zIndex
:
this
.
zIndex
,
position
:
'fixed'
,
display
:
'flex'
,
}
style
[
this
.
mode
]
=
0
if
(
this
.
mode
===
'left'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
bottom
:
0
,
top
:
0
,
})
}
else
if
(
this
.
mode
===
'right'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
bottom
:
0
,
top
:
0
,
})
}
else
if
(
this
.
mode
===
'top'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
left
:
0
,
right
:
0
})
}
else
if
(
this
.
mode
===
'bottom'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
left
:
0
,
right
:
0
,
})
}
else
if
(
this
.
mode
===
'center'
)
{
return
uni
.
$u
.
deepMerge
(
style
,
{
alignItems
:
'center'
,
'justify-content'
:
'center'
,
top
:
0
,
left
:
0
,
right
:
0
,
bottom
:
0
})
}
},
contentStyle
()
{
const
style
=
{}
// 通过设备信息的safeAreaInsets值来判断是否需要预留顶部状态栏和底部安全局的位置
// 不使用css方案,是因为nvue不支持css的iPhoneX安全区查询属性
const
{
safeAreaInsets
}
=
uni
.
$u
.
sys
()
if
(
this
.
mode
!==
'center'
)
{
style
.
flex
=
1
}
// 背景色,一般用于设置为transparent,去除默认的白色背景
if
(
this
.
bgColor
)
{
style
.
backgroundColor
=
this
.
bgColor
}
if
(
this
.
round
)
{
const
value
=
uni
.
$u
.
addUnit
(
this
.
round
)
if
(
this
.
mode
===
'top'
)
{
style
.
borderBottomLeftRadius
=
value
style
.
borderBottomRightRadius
=
value
}
else
if
(
this
.
mode
===
'bottom'
)
{
style
.
borderTopLeftRadius
=
value
style
.
borderTopRightRadius
=
value
}
else
if
(
this
.
mode
===
'center'
)
{
style
.
borderRadius
=
value
}
}
return
uni
.
$u
.
deepMerge
(
style
,
uni
.
$u
.
addStyle
(
this
.
customStyle
))
},
position
()
{
if
(
this
.
mode
===
'center'
)
{
return
this
.
zoom
?
'fade-zoom'
:
'fade'
}
if
(
this
.
mode
===
'left'
)
{
return
'slide-left'
}
if
(
this
.
mode
===
'right'
)
{
return
'slide-right'
}
if
(
this
.
mode
===
'bottom'
)
{
return
'slide-up'
}
if
(
this
.
mode
===
'top'
)
{
return
'slide-down'
}
},
},
methods
:
{
// 点击遮罩
overlayClick
()
{
if
(
this
.
closeOnClickOverlay
)
{
this
.
$emit
(
'close'
)
}
},
close
(
e
)
{
this
.
$emit
(
'close'
)
},
afterEnter
()
{
this
.
$emit
(
'open'
)
},
clickHandler
()
{
// 由于中部弹出时,其u-transition占据了整个页面相当于遮罩,此时需要发出遮罩点击事件,是否无法通过点击遮罩关闭弹窗
if
(
this
.
mode
===
'center'
)
{
this
.
overlayClick
()
}
this
.
$emit
(
'click'
)
},
// #ifdef MP-WEIXIN
retryComputedComponentRect
(
children
)
{
// 组件内部需要计算节点的组件
const
names
=
[
'u-calendar-month'
,
'u-album'
,
'u-collapse-item'
,
'u-dropdown'
,
'u-index-item'
,
'u-index-list'
,
'u-line-progress'
,
'u-list-item'
,
'u-rate'
,
'u-read-more'
,
'u-row'
,
'u-row-notice'
,
'u-scroll-list'
,
'u-skeleton'
,
'u-slider'
,
'u-steps-item'
,
'u-sticky'
,
'u-subsection'
,
'u-swipe-action-item'
,
'u-tabbar'
,
'u-tabs'
,
'u-tooltip'
]
// 历遍所有的子组件节点
for
(
let
i
=
0
;
i
<
children
.
length
;
i
++
)
{
const
child
=
children
[
i
]
// 拿到子组件的子组件
const
grandChild
=
child
.
$children
// 判断如果在需要重新初始化的组件数组中名中,并且存在init方法的话,则执行
if
(
names
.
includes
(
child
.
$options
.
name
)
&&
typeof
child
?.
init
===
'function'
)
{
// 需要进行一定的延时,因为初始化页面需要时间
uni
.
$u
.
sleep
(
50
).
then
(()
=>
{
child
.
init
()
})
}
// 如果子组件还有孙组件,进行递归历遍
if
(
grandChild
.
length
)
{
this
.
retryComputedComponentRect
(
grandChild
)
}
}
}
// #endif
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
uview-ui/libs/util/dayjs.js
View file @
3c2a558a
!
(
function
(
t
,
e
)
{
typeof
exports
===
'object'
&&
typeof
module
!==
'undefined'
?
module
.
exports
=
e
()
:
typeof
define
===
'function'
typeof
exports
===
'object'
&&
typeof
module
!==
'undefined'
?
module
.
exports
=
e
()
:
typeof
define
===
'function'
&&
define
.
amd
?
define
(
e
)
:
t
.
dayjs
=
e
()
}(
this
,
()
=>
{
'use strict'
'use strict'
const
t
=
'millisecond'
const
e
=
'second'
const
n
=
'minute'
const
r
=
'hour'
const
i
=
'day'
const
s
=
'week'
const
u
=
'month'
const
a
=
'quarter'
const
o
=
'year'
const
f
=
'date'
const
h
=
/^
(\d{4})[
-
/]?(\d{1,2})?[
-
/]?(\d{0,2})[^
0-9
]
*
(\d{1,2})?
:
?(\d{1,2})?
:
?(\d{1,2})?
.
?(\d
+
)?
$/
const
c
=
/
\[([^\]]
+
)
]|Y
{1,4}
|M
{1,4}
|D
{1,2}
|d
{1,4}
|H
{1,2}
|h
{1,2}
|a|A|m
{1,2}
|s
{1,2}
|Z
{1,2}
|SSS/g
const
d
=
{
name
:
'en'
,
weekdays
:
'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'
.
split
(
'_'
),
months
:
'January_February_March_April_May_June_July_August_September_October_November_December'
.
split
(
'_'
)
const
t
=
'millisecond'
const
e
=
'second'
const
n
=
'minute'
const
r
=
'hour'
const
i
=
'day'
const
s
=
'week'
const
u
=
'month'
const
a
=
'quarter'
const
o
=
'year'
const
f
=
'date'
const
h
=
/^
(\d{4})[
-
/]?(\d{1,2})?[
-
/]?(\d{0,2})[^
0-9
]
*
(\d{1,2})?
:
?(\d{1,2})?
:
?(\d{1,2})?
.
?(\d
+
)?
$/
const
c
=
/
\[([^\]]
+
)
]|Y
{1,4}
|M
{1,4}
|D
{1,2}
|d
{1,4}
|H
{1,2}
|h
{1,2}
|a|A|m
{1,2}
|s
{1,2}
|Z
{1,2}
|SSS/g
const
d
=
{
name
:
'en'
,
weekdays
:
'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'
.
split
(
'_'
),
months
:
'January_February_March_April_May_June_July_August_September_October_November_December'
.
split
(
'_'
)
}
const
$
=
function
(
t
,
e
,
n
)
{
const
r
=
String
(
t
)
return
!
r
||
r
.
length
>=
e
?
t
:
`
${
Array
(
e
+
1
-
r
.
length
).
join
(
n
)}${
t
}
`
}
const
l
=
{
s
:
$
,
z
(
t
)
{
const
e
=
-
t
.
utcOffset
()
const
n
=
Math
.
abs
(
e
)
const
r
=
Math
.
floor
(
n
/
60
)
const
i
=
n
%
60
return
`
${(
e
<=
0
?
'+'
:
'-'
)
+
$
(
r
,
2
,
'0'
)}
:
${
$
(
i
,
2
,
'0'
)}
`
},
m
:
function
t
(
e
,
n
)
{
if
(
e
.
date
()
<
n
.
date
())
return
-
t
(
n
,
e
)
const
r
=
12
*
(
n
.
year
()
-
e
.
year
())
+
(
n
.
month
()
-
e
.
month
())
const
i
=
e
.
clone
().
add
(
r
,
u
)
const
s
=
n
-
i
<
0
const
a
=
e
.
clone
().
add
(
r
+
(
s
?
-
1
:
1
),
u
)
return
+
(
-
(
r
+
(
n
-
i
)
/
(
s
?
i
-
a
:
a
-
i
))
||
0
)
},
a
(
t
)
{
return
t
<
0
?
Math
.
ceil
(
t
)
||
0
:
Math
.
floor
(
t
)
},
p
(
h
)
{
return
{
M
:
u
,
y
:
o
,
w
:
s
,
d
:
i
,
D
:
f
,
h
:
r
,
m
:
n
,
s
:
e
,
ms
:
t
,
Q
:
a
}[
h
]
||
String
(
h
||
''
).
toLowerCase
().
replace
(
/s$/
,
''
)
},
u
(
t
)
{
return
void
0
===
t
}
const
$
=
function
(
t
,
e
,
n
)
{
const
r
=
String
(
t
)
return
!
r
||
r
.
length
>=
e
?
t
:
`
${
Array
(
e
+
1
-
r
.
length
).
join
(
n
)}${
t
}
`
}
let
y
=
'en'
const
M
=
{}
M
[
y
]
=
d
const
m
=
function
(
t
)
{
return
t
instanceof
S
}
const
D
=
function
(
t
,
e
,
n
)
{
let
r
if
(
!
t
)
return
y
if
(
typeof
t
===
'string'
)
M
[
t
]
&&
(
r
=
t
),
e
&&
(
M
[
t
]
=
e
,
r
=
t
)
else
{
const
i
=
t
.
name
M
[
i
]
=
t
,
r
=
i
}
const
l
=
{
s
:
$
,
z
(
t
)
{
const
e
=
-
t
.
utcOffset
()
const
n
=
Math
.
abs
(
e
)
const
r
=
Math
.
floor
(
n
/
60
)
const
i
=
n
%
60
return
`
${(
e
<=
0
?
'+'
:
'-'
)
+
$
(
r
,
2
,
'0'
)}
:
${
$
(
i
,
2
,
'0'
)}
`
},
m
:
function
t
(
e
,
n
)
{
if
(
e
.
date
()
<
n
.
date
())
return
-
t
(
n
,
e
)
const
r
=
12
*
(
n
.
year
()
-
e
.
year
())
+
(
n
.
month
()
-
e
.
month
())
const
i
=
e
.
clone
().
add
(
r
,
u
)
const
s
=
n
-
i
<
0
const
a
=
e
.
clone
().
add
(
r
+
(
s
?
-
1
:
1
),
u
)
return
+
(
-
(
r
+
(
n
-
i
)
/
(
s
?
i
-
a
:
a
-
i
))
||
0
)
},
a
(
t
)
{
return
t
<
0
?
Math
.
ceil
(
t
)
||
0
:
Math
.
floor
(
t
)
},
p
(
h
)
{
return
{
M
:
u
,
y
:
o
,
w
:
s
,
d
:
i
,
D
:
f
,
h
:
r
,
m
:
n
,
s
:
e
,
ms
:
t
,
Q
:
a
}[
h
]
||
String
(
h
||
''
).
toLowerCase
().
replace
(
/s$/
,
''
)
},
u
(
t
)
{
return
void
0
===
t
}
}
let
y
=
'en'
const
M
=
{}
M
[
y
]
=
d
const
m
=
function
(
t
)
{
return
t
instanceof
S
}
const
D
=
function
(
t
,
e
,
n
)
{
let
r
if
(
!
t
)
return
y
if
(
typeof
t
===
'string'
)
M
[
t
]
&&
(
r
=
t
),
e
&&
(
M
[
t
]
=
e
,
r
=
t
)
else
{
const
i
=
t
.
name
M
[
i
]
=
t
,
r
=
i
}
return
!
n
&&
r
&&
(
y
=
r
),
r
||
!
n
&&
y
return
!
n
&&
r
&&
(
y
=
r
),
r
||
!
n
&&
y
}
const
v
=
function
(
t
,
e
)
{
if
(
m
(
t
))
return
t
.
clone
()
const
n
=
typeof
e
===
'object'
?
e
:
{}
return
n
.
date
=
t
,
n
.
args
=
arguments
,
new
S
(
n
)
}
const
g
=
l
g
.
l
=
D
,
g
.
i
=
m
,
g
.
w
=
function
(
t
,
e
)
{
return
v
(
t
,
{
locale
:
e
.
$L
,
utc
:
e
.
$u
,
x
:
e
.
$x
,
$offset
:
e
.
$offset
})
}
var
S
=
(
function
()
{
function
d
(
t
)
{
this
.
$L
=
D
(
t
.
locale
,
null
,
!
0
),
this
.
parse
(
t
)
}
const
v
=
function
(
t
,
e
)
{
if
(
m
(
t
))
return
t
.
clone
()
const
n
=
typeof
e
===
'object'
?
e
:
{}
return
n
.
date
=
t
,
n
.
args
=
arguments
,
new
S
(
n
)
}
const
g
=
l
g
.
l
=
D
,
g
.
i
=
m
,
g
.
w
=
function
(
t
,
e
)
{
return
v
(
t
,
{
locale
:
e
.
$L
,
utc
:
e
.
$u
,
x
:
e
.
$x
,
$offset
:
e
.
$offset
})
}
var
S
=
(
function
()
{
function
d
(
t
)
{
this
.
$L
=
D
(
t
.
locale
,
null
,
!
0
),
this
.
parse
(
t
)
}
const
$
=
d
.
prototype
return
$
.
parse
=
function
(
t
)
{
this
.
$d
=
(
function
(
t
)
{
const
e
=
t
.
date
const
n
=
t
.
utc
if
(
e
===
null
)
return
new
Date
(
NaN
)
if
(
g
.
u
(
e
))
return
new
Date
()
if
(
e
instanceof
Date
)
return
new
Date
(
e
)
if
(
typeof
e
===
'string'
&&
!
/Z$/i
.
test
(
e
))
{
const
r
=
e
.
match
(
h
)
if
(
r
)
{
const
i
=
r
[
2
]
-
1
||
0
const
s
=
(
r
[
7
]
||
'0'
).
substring
(
0
,
3
)
return
n
?
new
Date
(
Date
.
UTC
(
r
[
1
],
i
,
r
[
3
]
||
1
,
r
[
4
]
||
0
,
r
[
5
]
||
0
,
r
[
6
]
||
0
,
s
))
:
new
Date
(
r
[
1
],
i
,
r
[
3
]
const
$
=
d
.
prototype
return
$
.
parse
=
function
(
t
)
{
this
.
$d
=
(
function
(
t
)
{
const
e
=
t
.
date
const
n
=
t
.
utc
if
(
e
===
null
)
return
new
Date
(
NaN
)
if
(
g
.
u
(
e
))
return
new
Date
()
//由于苹果手机警告,修改了代码
if
(
e
instanceof
Date
){
if
(
e
&&
e
.
toString
().
includes
(
'000Z'
)){
return
new
Date
(
e
.
slice
(
0
,
-
5
))
}
else
{
return
new
Date
(
e
)
}
}
if
(
typeof
e
===
'string'
&&
!
/Z$/i
.
test
(
e
))
{
const
r
=
e
.
match
(
h
)
if
(
r
)
{
const
i
=
r
[
2
]
-
1
||
0
const
s
=
(
r
[
7
]
||
'0'
).
substring
(
0
,
3
)
return
n
?
new
Date
(
Date
.
UTC
(
r
[
1
],
i
,
r
[
3
]
||
1
,
r
[
4
]
||
0
,
r
[
5
]
||
0
,
r
[
6
]
||
0
,
s
))
:
new
Date
(
r
[
1
],
i
,
r
[
3
]
||
1
,
r
[
4
]
||
0
,
r
[
5
]
||
0
,
r
[
6
]
||
0
,
s
)
}
}
return
new
Date
(
e
)
}(
t
)),
this
.
$x
=
t
.
x
||
{},
this
.
init
()
},
$
.
init
=
function
()
{
const
t
=
this
.
$d
this
.
$y
=
t
.
getFullYear
(),
this
.
$M
=
t
.
getMonth
(),
this
.
$D
=
t
.
getDate
(),
this
.
$W
=
t
.
getDay
(),
this
.
$H
=
t
.
getHours
(),
this
.
$m
=
t
.
getMinutes
(),
this
.
$s
=
t
.
getSeconds
(),
this
.
$ms
=
t
.
getMilliseconds
()
},
$
.
$utils
=
function
()
{
return
g
},
$
.
isValid
=
function
()
{
return
!
(
this
.
$d
.
toString
()
===
'Invalid Date'
)
},
$
.
isSame
=
function
(
t
,
e
)
{
const
n
=
v
(
t
)
return
this
.
startOf
(
e
)
<=
n
&&
n
<=
this
.
endOf
(
e
)
},
$
.
isAfter
=
function
(
t
,
e
)
{
return
v
(
t
)
<
this
.
startOf
(
e
)
},
$
.
isBefore
=
function
(
t
,
e
)
{
return
this
.
endOf
(
e
)
<
v
(
t
)
},
$
.
$g
=
function
(
t
,
e
,
n
)
{
return
g
.
u
(
t
)
?
this
[
e
]
:
this
.
set
(
n
,
t
)
},
$
.
unix
=
function
()
{
return
Math
.
floor
(
this
.
valueOf
()
/
1
e3
)
},
$
.
valueOf
=
function
()
{
return
this
.
$d
.
getTime
()
},
$
.
startOf
=
function
(
t
,
a
)
{
const
h
=
this
const
c
=
!!
g
.
u
(
a
)
||
a
const
d
=
g
.
p
(
t
)
const
$
=
function
(
t
,
e
)
{
const
n
=
g
.
w
(
h
.
$u
?
Date
.
UTC
(
h
.
$y
,
e
,
t
)
:
new
Date
(
h
.
$y
,
e
,
t
),
h
)
return
c
?
n
:
n
.
endOf
(
i
)
}
const
l
=
function
(
t
,
e
)
{
return
g
.
w
(
h
.
toDate
()[
t
].
apply
(
h
.
toDate
(
's'
),
(
c
?
[
0
,
0
,
0
,
0
]
:
[
23
,
59
,
59
,
999
]).
slice
(
e
)),
h
)
}
const
y
=
this
.
$W
const
M
=
this
.
$M
const
m
=
this
.
$D
const
D
=
`set
${
this
.
$u
?
'UTC'
:
''
}
`
switch
(
d
)
{
case
o
:
return
c
?
$
(
1
,
0
)
:
$
(
31
,
11
)
case
u
:
return
c
?
$
(
1
,
M
)
:
$
(
0
,
M
+
1
)
case
s
:
var
v
=
this
.
$locale
().
weekStart
||
0
var
S
=
(
y
<
v
?
y
+
7
:
y
)
-
v
return
$
(
c
?
m
-
S
:
m
+
(
6
-
S
),
M
)
case
i
:
case
f
:
return
l
(
`
${
D
}
Hours`
,
0
)
case
r
:
return
l
(
`
${
D
}
Minutes`
,
1
)
case
n
:
return
l
(
`
${
D
}
Seconds`
,
2
)
case
e
:
return
l
(
`
${
D
}
Milliseconds`
,
3
)
default
:
return
this
.
clone
()
}
},
$
.
endOf
=
function
(
t
)
{
return
this
.
startOf
(
t
,
!
1
)
},
$
.
$set
=
function
(
s
,
a
)
{
let
h
;
const
c
=
g
.
p
(
s
)
const
d
=
`set
${
this
.
$u
?
'UTC'
:
''
}
`
const
$
=
(
h
=
{},
h
[
i
]
=
`
${
d
}
Date`
,
h
[
f
]
=
`
${
d
}
Date`
,
h
[
u
]
=
`
${
d
}
Month`
,
h
[
o
]
=
`
${
d
}
FullYear`
,
h
[
r
]
=
`
${
d
}
Hours`
,
h
[
n
]
=
`
${
d
}
Minutes`
,
h
[
e
]
=
`
${
d
}
Seconds`
,
h
[
t
]
=
`
${
d
}
Milliseconds`
,
h
)[
c
]
const
l
=
c
===
i
?
this
.
$D
+
(
a
-
this
.
$W
)
:
a
if
(
c
===
u
||
c
===
o
)
{
const
y
=
this
.
clone
().
set
(
f
,
1
)
y
.
$d
[
$
](
l
),
y
.
init
(),
this
.
$d
=
y
.
set
(
f
,
Math
.
min
(
this
.
$D
,
y
.
daysInMonth
())).
$d
}
else
$
&&
this
.
$d
[
$
](
l
)
return
this
.
init
(),
this
},
$
.
set
=
function
(
t
,
e
)
{
return
this
.
clone
().
$set
(
t
,
e
)
},
$
.
get
=
function
(
t
)
{
return
this
[
g
.
p
(
t
)]()
},
$
.
add
=
function
(
t
,
a
)
{
let
f
;
const
h
=
this
t
=
Number
(
t
)
const
c
=
g
.
p
(
a
)
const
d
=
function
(
e
)
{
const
n
=
v
(
h
)
return
g
.
w
(
n
.
date
(
n
.
date
()
+
Math
.
round
(
e
*
t
)),
h
)
}
if
(
c
===
u
)
return
this
.
set
(
u
,
this
.
$M
+
t
)
if
(
c
===
o
)
return
this
.
set
(
o
,
this
.
$y
+
t
)
if
(
c
===
i
)
return
d
(
1
)
if
(
c
===
s
)
return
d
(
7
)
const
$
=
(
f
=
{},
f
[
n
]
=
6
e4
,
f
[
r
]
=
36
e5
,
f
[
e
]
=
1
e3
,
f
)[
c
]
||
1
const
l
=
this
.
$d
.
getTime
()
+
t
*
$
return
g
.
w
(
l
,
this
)
},
$
.
subtract
=
function
(
t
,
e
)
{
return
this
.
add
(
-
1
*
t
,
e
)
},
$
.
format
=
function
(
t
)
{
const
e
=
this
if
(
!
this
.
isValid
())
return
'Invalid Date'
const
n
=
t
||
'YYYY-MM-DDTHH:mm:ssZ'
const
r
=
g
.
z
(
this
)
const
i
=
this
.
$locale
()
const
s
=
this
.
$H
const
u
=
this
.
$m
const
a
=
this
.
$M
const
o
=
i
.
weekdays
const
f
=
i
.
months
const
h
=
function
(
t
,
r
,
i
,
s
)
{
return
t
&&
(
t
[
r
]
||
t
(
e
,
n
))
||
i
[
r
].
substr
(
0
,
s
)
}
const
d
=
function
(
t
)
{
return
g
.
s
(
s
%
12
||
12
,
t
,
'0'
)
}
const
$
=
i
.
meridiem
||
function
(
t
,
e
,
n
)
{
const
r
=
t
<
12
?
'AM'
:
'PM'
return
n
?
r
.
toLowerCase
()
:
r
}
const
l
=
{
YY
:
String
(
this
.
$y
).
slice
(
-
2
),
YYYY
:
this
.
$y
,
M
:
a
+
1
,
MM
:
g
.
s
(
a
+
1
,
2
,
'0'
),
MMM
:
h
(
i
.
monthsShort
,
a
,
f
,
3
),
MMMM
:
h
(
f
,
a
),
D
:
this
.
$D
,
DD
:
g
.
s
(
this
.
$D
,
2
,
'0'
),
d
:
String
(
this
.
$W
),
dd
:
h
(
i
.
weekdaysMin
,
this
.
$W
,
o
,
2
),
ddd
:
h
(
i
.
weekdaysShort
,
this
.
$W
,
o
,
3
),
dddd
:
o
[
this
.
$W
],
H
:
String
(
s
),
HH
:
g
.
s
(
s
,
2
,
'0'
),
h
:
d
(
1
),
hh
:
d
(
2
),
a
:
$
(
s
,
u
,
!
0
),
A
:
$
(
s
,
u
,
!
1
),
m
:
String
(
u
),
mm
:
g
.
s
(
u
,
2
,
'0'
),
s
:
String
(
this
.
$s
),
ss
:
g
.
s
(
this
.
$s
,
2
,
'0'
),
SSS
:
g
.
s
(
this
.
$ms
,
3
,
'0'
),
Z
:
r
}
return
n
.
replace
(
c
,
(
t
,
e
)
=>
e
||
l
[
t
]
||
r
.
replace
(
':'
,
''
))
},
$
.
utcOffset
=
function
()
{
return
15
*
-
Math
.
round
(
this
.
$d
.
getTimezoneOffset
()
/
15
)
},
$
.
diff
=
function
(
t
,
f
,
h
)
{
let
c
;
const
d
=
g
.
p
(
f
)
const
$
=
v
(
t
)
const
l
=
6
e4
*
(
$
.
utcOffset
()
-
this
.
utcOffset
())
const
y
=
this
-
$
let
M
=
g
.
m
(
this
,
$
)
return
M
=
(
c
=
{},
c
[
o
]
=
M
/
12
,
c
[
u
]
=
M
,
c
[
a
]
=
M
/
3
,
c
[
s
]
=
(
y
-
l
)
/
6048
e5
,
c
[
i
]
=
(
y
-
l
)
/
864
e5
,
c
[
r
]
=
y
/
36
e5
,
c
[
n
]
=
y
/
6
e4
,
c
[
e
]
=
y
/
1
e3
,
c
)[
d
]
||
y
,
h
?
M
:
g
.
a
(
M
)
},
$
.
daysInMonth
=
function
()
{
return
this
.
endOf
(
u
).
$D
},
$
.
$locale
=
function
()
{
return
M
[
this
.
$L
]
},
$
.
locale
=
function
(
t
,
e
)
{
if
(
!
t
)
return
this
.
$L
const
n
=
this
.
clone
()
const
r
=
D
(
t
,
e
,
!
0
)
return
r
&&
(
n
.
$L
=
r
),
n
},
$
.
clone
=
function
()
{
return
g
.
w
(
this
.
$d
,
this
)
},
$
.
toDate
=
function
()
{
return
new
Date
(
this
.
valueOf
())
},
$
.
toJSON
=
function
()
{
return
this
.
isValid
()
?
this
.
toISOString
()
:
null
},
$
.
toISOString
=
function
()
{
return
this
.
$d
.
toISOString
()
},
$
.
toString
=
function
()
{
return
this
.
$d
.
toUTCString
()
},
d
}())
const
p
=
S
.
prototype
return
v
.
prototype
=
p
,
[
[
'$ms'
,
t
],
[
'$s'
,
e
],
[
'$m'
,
n
],
[
'$H'
,
r
],
[
'$W'
,
i
],
[
'$M'
,
u
],
[
'$y'
,
o
],
[
'$D'
,
f
]
].
forEach
((
t
)
=>
{
p
[
t
[
1
]]
=
function
(
e
)
{
return
this
.
$g
(
e
,
t
[
0
],
t
[
1
])
}
}
}),
v
.
extend
=
function
(
t
,
e
)
{
return
t
.
$i
||
(
t
(
e
,
S
,
v
),
t
.
$i
=
!
0
),
v
},
v
.
locale
=
D
,
v
.
isDayjs
=
m
,
v
.
unix
=
function
(
t
)
{
return
v
(
1
e3
*
t
)
},
v
.
en
=
M
[
y
],
v
.
Ls
=
M
,
v
.
p
=
{},
v
//由于苹果手机警告,修改了代码
if
(
e
&&
e
.
toString
().
includes
(
'000Z'
)){
return
new
Date
(
e
.
slice
(
0
,
-
5
))
}
else
{
return
new
Date
(
e
)
}
}(
t
)),
this
.
$x
=
t
.
x
||
{},
this
.
init
()
},
$
.
init
=
function
()
{
const
t
=
this
.
$d
this
.
$y
=
t
.
getFullYear
(),
this
.
$M
=
t
.
getMonth
(),
this
.
$D
=
t
.
getDate
(),
this
.
$W
=
t
.
getDay
(),
this
.
$H
=
t
.
getHours
(),
this
.
$m
=
t
.
getMinutes
(),
this
.
$s
=
t
.
getSeconds
(),
this
.
$ms
=
t
.
getMilliseconds
()
},
$
.
$utils
=
function
()
{
return
g
},
$
.
isValid
=
function
()
{
return
!
(
this
.
$d
.
toString
()
===
'Invalid Date'
)
},
$
.
isSame
=
function
(
t
,
e
)
{
const
n
=
v
(
t
)
return
this
.
startOf
(
e
)
<=
n
&&
n
<=
this
.
endOf
(
e
)
},
$
.
isAfter
=
function
(
t
,
e
)
{
return
v
(
t
)
<
this
.
startOf
(
e
)
},
$
.
isBefore
=
function
(
t
,
e
)
{
return
this
.
endOf
(
e
)
<
v
(
t
)
},
$
.
$g
=
function
(
t
,
e
,
n
)
{
return
g
.
u
(
t
)
?
this
[
e
]
:
this
.
set
(
n
,
t
)
},
$
.
unix
=
function
()
{
return
Math
.
floor
(
this
.
valueOf
()
/
1
e3
)
},
$
.
valueOf
=
function
()
{
return
this
.
$d
.
getTime
()
},
$
.
startOf
=
function
(
t
,
a
)
{
const
h
=
this
const
c
=
!!
g
.
u
(
a
)
||
a
const
d
=
g
.
p
(
t
)
const
$
=
function
(
t
,
e
)
{
const
n
=
g
.
w
(
h
.
$u
?
Date
.
UTC
(
h
.
$y
,
e
,
t
)
:
new
Date
(
h
.
$y
,
e
,
t
),
h
)
return
c
?
n
:
n
.
endOf
(
i
)
}
const
l
=
function
(
t
,
e
)
{
return
g
.
w
(
h
.
toDate
()[
t
].
apply
(
h
.
toDate
(
's'
),
(
c
?
[
0
,
0
,
0
,
0
]
:
[
23
,
59
,
59
,
999
]).
slice
(
e
)),
h
)
}
const
y
=
this
.
$W
const
M
=
this
.
$M
const
m
=
this
.
$D
const
D
=
`set
${
this
.
$u
?
'UTC'
:
''
}
`
switch
(
d
)
{
case
o
:
return
c
?
$
(
1
,
0
)
:
$
(
31
,
11
)
case
u
:
return
c
?
$
(
1
,
M
)
:
$
(
0
,
M
+
1
)
case
s
:
var
v
=
this
.
$locale
().
weekStart
||
0
var
S
=
(
y
<
v
?
y
+
7
:
y
)
-
v
return
$
(
c
?
m
-
S
:
m
+
(
6
-
S
),
M
)
case
i
:
case
f
:
return
l
(
`
${
D
}
Hours`
,
0
)
case
r
:
return
l
(
`
${
D
}
Minutes`
,
1
)
case
n
:
return
l
(
`
${
D
}
Seconds`
,
2
)
case
e
:
return
l
(
`
${
D
}
Milliseconds`
,
3
)
default
:
return
this
.
clone
()
}
},
$
.
endOf
=
function
(
t
)
{
return
this
.
startOf
(
t
,
!
1
)
},
$
.
$set
=
function
(
s
,
a
)
{
let
h
;
const
c
=
g
.
p
(
s
)
const
d
=
`set
${
this
.
$u
?
'UTC'
:
''
}
`
const
$
=
(
h
=
{},
h
[
i
]
=
`
${
d
}
Date`
,
h
[
f
]
=
`
${
d
}
Date`
,
h
[
u
]
=
`
${
d
}
Month`
,
h
[
o
]
=
`
${
d
}
FullYear`
,
h
[
r
]
=
`
${
d
}
Hours`
,
h
[
n
]
=
`
${
d
}
Minutes`
,
h
[
e
]
=
`
${
d
}
Seconds`
,
h
[
t
]
=
`
${
d
}
Milliseconds`
,
h
)[
c
]
const
l
=
c
===
i
?
this
.
$D
+
(
a
-
this
.
$W
)
:
a
if
(
c
===
u
||
c
===
o
)
{
const
y
=
this
.
clone
().
set
(
f
,
1
)
y
.
$d
[
$
](
l
),
y
.
init
(),
this
.
$d
=
y
.
set
(
f
,
Math
.
min
(
this
.
$D
,
y
.
daysInMonth
())).
$d
}
else
$
&&
this
.
$d
[
$
](
l
)
return
this
.
init
(),
this
},
$
.
set
=
function
(
t
,
e
)
{
return
this
.
clone
().
$set
(
t
,
e
)
},
$
.
get
=
function
(
t
)
{
return
this
[
g
.
p
(
t
)]()
},
$
.
add
=
function
(
t
,
a
)
{
let
f
;
const
h
=
this
t
=
Number
(
t
)
const
c
=
g
.
p
(
a
)
const
d
=
function
(
e
)
{
const
n
=
v
(
h
)
return
g
.
w
(
n
.
date
(
n
.
date
()
+
Math
.
round
(
e
*
t
)),
h
)
}
if
(
c
===
u
)
return
this
.
set
(
u
,
this
.
$M
+
t
)
if
(
c
===
o
)
return
this
.
set
(
o
,
this
.
$y
+
t
)
if
(
c
===
i
)
return
d
(
1
)
if
(
c
===
s
)
return
d
(
7
)
const
$
=
(
f
=
{},
f
[
n
]
=
6
e4
,
f
[
r
]
=
36
e5
,
f
[
e
]
=
1
e3
,
f
)[
c
]
||
1
const
l
=
this
.
$d
.
getTime
()
+
t
*
$
return
g
.
w
(
l
,
this
)
},
$
.
subtract
=
function
(
t
,
e
)
{
return
this
.
add
(
-
1
*
t
,
e
)
},
$
.
format
=
function
(
t
)
{
const
e
=
this
if
(
!
this
.
isValid
())
return
'Invalid Date'
const
n
=
t
||
'YYYY-MM-DDTHH:mm:ssZ'
const
r
=
g
.
z
(
this
)
const
i
=
this
.
$locale
()
const
s
=
this
.
$H
const
u
=
this
.
$m
const
a
=
this
.
$M
const
o
=
i
.
weekdays
const
f
=
i
.
months
const
h
=
function
(
t
,
r
,
i
,
s
)
{
return
t
&&
(
t
[
r
]
||
t
(
e
,
n
))
||
i
[
r
].
substr
(
0
,
s
)
}
const
d
=
function
(
t
)
{
return
g
.
s
(
s
%
12
||
12
,
t
,
'0'
)
}
const
$
=
i
.
meridiem
||
function
(
t
,
e
,
n
)
{
const
r
=
t
<
12
?
'AM'
:
'PM'
return
n
?
r
.
toLowerCase
()
:
r
}
const
l
=
{
YY
:
String
(
this
.
$y
).
slice
(
-
2
),
YYYY
:
this
.
$y
,
M
:
a
+
1
,
MM
:
g
.
s
(
a
+
1
,
2
,
'0'
),
MMM
:
h
(
i
.
monthsShort
,
a
,
f
,
3
),
MMMM
:
h
(
f
,
a
),
D
:
this
.
$D
,
DD
:
g
.
s
(
this
.
$D
,
2
,
'0'
),
d
:
String
(
this
.
$W
),
dd
:
h
(
i
.
weekdaysMin
,
this
.
$W
,
o
,
2
),
ddd
:
h
(
i
.
weekdaysShort
,
this
.
$W
,
o
,
3
),
dddd
:
o
[
this
.
$W
],
H
:
String
(
s
),
HH
:
g
.
s
(
s
,
2
,
'0'
),
h
:
d
(
1
),
hh
:
d
(
2
),
a
:
$
(
s
,
u
,
!
0
),
A
:
$
(
s
,
u
,
!
1
),
m
:
String
(
u
),
mm
:
g
.
s
(
u
,
2
,
'0'
),
s
:
String
(
this
.
$s
),
ss
:
g
.
s
(
this
.
$s
,
2
,
'0'
),
SSS
:
g
.
s
(
this
.
$ms
,
3
,
'0'
),
Z
:
r
}
return
n
.
replace
(
c
,
(
t
,
e
)
=>
e
||
l
[
t
]
||
r
.
replace
(
':'
,
''
))
},
$
.
utcOffset
=
function
()
{
return
15
*
-
Math
.
round
(
this
.
$d
.
getTimezoneOffset
()
/
15
)
},
$
.
diff
=
function
(
t
,
f
,
h
)
{
let
c
;
const
d
=
g
.
p
(
f
)
const
$
=
v
(
t
)
const
l
=
6
e4
*
(
$
.
utcOffset
()
-
this
.
utcOffset
())
const
y
=
this
-
$
let
M
=
g
.
m
(
this
,
$
)
return
M
=
(
c
=
{},
c
[
o
]
=
M
/
12
,
c
[
u
]
=
M
,
c
[
a
]
=
M
/
3
,
c
[
s
]
=
(
y
-
l
)
/
6048
e5
,
c
[
i
]
=
(
y
-
l
)
/
864
e5
,
c
[
r
]
=
y
/
36
e5
,
c
[
n
]
=
y
/
6
e4
,
c
[
e
]
=
y
/
1
e3
,
c
)[
d
]
||
y
,
h
?
M
:
g
.
a
(
M
)
},
$
.
daysInMonth
=
function
()
{
return
this
.
endOf
(
u
).
$D
},
$
.
$locale
=
function
()
{
return
M
[
this
.
$L
]
},
$
.
locale
=
function
(
t
,
e
)
{
if
(
!
t
)
return
this
.
$L
const
n
=
this
.
clone
()
const
r
=
D
(
t
,
e
,
!
0
)
return
r
&&
(
n
.
$L
=
r
),
n
},
$
.
clone
=
function
()
{
return
g
.
w
(
this
.
$d
,
this
)
},
$
.
toDate
=
function
()
{
return
new
Date
(
this
.
valueOf
())
},
$
.
toJSON
=
function
()
{
return
this
.
isValid
()
?
this
.
toISOString
()
:
null
},
$
.
toISOString
=
function
()
{
return
this
.
$d
.
toISOString
()
},
$
.
toString
=
function
()
{
return
this
.
$d
.
toUTCString
()
},
d
}())
const
p
=
S
.
prototype
return
v
.
prototype
=
p
,
[
[
'$ms'
,
t
],
[
'$s'
,
e
],
[
'$m'
,
n
],
[
'$H'
,
r
],
[
'$W'
,
i
],
[
'$M'
,
u
],
[
'$y'
,
o
],
[
'$D'
,
f
]
].
forEach
((
t
)
=>
{
p
[
t
[
1
]]
=
function
(
e
)
{
return
this
.
$g
(
e
,
t
[
0
],
t
[
1
])
}
}),
v
.
extend
=
function
(
t
,
e
)
{
return
t
.
$i
||
(
t
(
e
,
S
,
v
),
t
.
$i
=
!
0
),
v
},
v
.
locale
=
D
,
v
.
isDayjs
=
m
,
v
.
unix
=
function
(
t
)
{
return
v
(
1
e3
*
t
)
},
v
.
en
=
M
[
y
],
v
.
Ls
=
M
,
v
.
p
=
{},
v
}))
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